# -*- test-case-name: mv3d.test.test_igeterrain -*- # Copyright (C) 2010-2012 Mortal Coil Games # See LICENSE for details. """ @author: mike """ from mv3d.test.test_ige import FakeModifier import Image from array import array import os from twisted.trial.unittest import TestCase from twisted.internet import defer from twisted.internet.defer import inlineCallbacks, Deferred from zope.interface import implements from mv3d.server.ige.server import Terrain as TerrainServer from mv3d.test.ui.test_layout import WithFakeUI, FakeText from mv3d.test.mixins import WithDocTests from mv3d.util.conductor import IConductor try: from mv3d.client.ui.ige.terrain import Terrain as TerrainClient, GenerateWindow from mv3d.client.ui.image import newImage noOgre = "" except ImportError: noOgre = "Ogre is not available." class FakeAsset: """ Faked out asset """ def __init__(self, aid): self.aid = aid self.name = "george" def getCG(self): """ return true """ return True def getName(self): """ return our name """ return self.name class FakeConductor: """ A faked out conductor """ implements(IConductor) def __init__(self): self.groups = {} self.badassets = [] self.uint = None self.parent = self def getUI(self): """ return the ui """ return self.uint def getLocalService(self, typ): return self def getGroupInfo(self, agid): return dict(agid=self.groups[agid].agid, name=self.groups[agid].name) def getAssetInfo(self, aid): if aid in self.badassets: raise KeyError("Sorry dude") return dict(aid=aid, name="Assety", type="fluffer") def acquireAsset(self, aid): """ just return a fake one """ return defer.succeed(FakeAsset(aid)) class FakeTerrain: """ A fake terrain """ swayLength = None swaySpeed = None swayDistrib = None animated = None textureLayerAssetIds = None textureLayerMaps = None position = (20, 0, 30) rotation = (1, 0, 0, 0) destroyed = False created = None def __init__(self): self.iid = 1 self.rebuilt = 0 self.heights = [0, 1, 2, 3, 4, 5] self.resolution = (2, 3) self.neighbors = None self.vobs = [] self.size = (10, 10) self.mesh = self self.layers = [] self.textureLayerSettings = [] self.node = self self.area = self self.grass = self self.log = [] self.meshGen = self self.heightGenerator = self self.noise = self self.seed = 0 self.persistence = 0 self.octaves = 0 self.multiplier = (0, 0, 0) self.heightGenerationCount = 0 self.genMeshCount = 0 def getID(self): """ Return the id """ return self.iid def getObject(self): """ return myself """ return self def getPosition(self): """ return the position """ return self.position def getOrientation(self): """ return the rotation """ return self.rotation def destroy(self): """ record it """ self.destroyed = True def create(self, area, pos, rot): """ Record it """ self.created = (area, pos, rot) def getSection(self, _section): """ return myself """ return self def setDensityMap(self, layer, data): """ log it """ self.log.append(("setDensityMap", layer, data)) def getMaterialName(self): """ return a fake material """ return "SOLID/TEX/bark23.jpg" def getBody(self): """ faker """ return self def getMeshGen(self): """ Faker """ return self def setHeights(self, res, heights): """ set em """ self.resolution = res self.heights = heights def rebuild(self): """ Faker """ self.rebuilt += 1 def setHeight(self, pos, height): """ Fake it """ self.heights[pos[1] * self.resolution[0] + pos[0]] = height def getHeight(self, pos): """ Get the height """ return self.heights[int(pos[1] * self.resolution[0] + pos[0])] def addVisualObject(self, vob): """ append it """ self.vobs.append(vob) def getClassGenerators(self): """ return test string """ return ["classgens"] def setAnimation(self, layer, enabled): """ set it """ self.animated = (layer, enabled) def setSwaySpeed(self, layer, speed): """ set it """ self.swaySpeed = (layer, speed) def setSwayLength(self, layer, length): """ set it """ self.swayLength = (layer, length) def setSwayDistrib(self, layer, amount): """ Set it """ self.swayDistrib = (layer, amount) def getVisualObjects(self): """ return some """ return self.vobs def setupMaterial(self): """ do nothing """ def setColorMap(self, layer, data): """ log it """ self.log.append(("setColorMap", layer, data)) def setSeed(self, seed): """ set it """ self.seed = seed def setPersistence(self, persist): """ set it """ self.persistence = persist def setOctaves(self, octaves): """ set it """ self.octaves = octaves def generateHeights(self): """ increment """ self.heightGenerationCount += 1 def genMesh(self, forceRecalc=False): """ increment """ self.genMeshCount += 1 class FakeTerrainModifier: """ a fake modifier """ def __init__(self): """ do nothing """ self.log = [] def callRemote(self, method, *args, **keys): """ call locally """ return defer.succeed(getattr(self, method)(*args, **keys)) def getSelection(self): """ return an id """ return 1 def setTextureLayerSettings(self, layer, settings): """ log it """ self.log.append(("setTextureLayerSettings", layer, settings)) def setGrassLayerMainSettings(self, layer, setting1, setting2): """ log it """ self.log.append(("setGrassLayerMainSettings", layer, setting1, setting2)) def setGrassLayerAnimationSettings(self, layer, setting1, setting2, setting3): """ log it """ self.log.append(("setGrassLayerAnimationSettings", layer, setting1, setting2, setting3)) def setGrassLayerSizeSettings(self, layer, setting1, setting2): """ log it """ self.log.append(("setGrassLayerSizeSettings", layer, setting1, setting2)) def newTextureLayer(self, aid, settings, mappy): """ log it """ self.log.append(("newTextureLayer", aid, settings, mappy)) class FakeSim: """ A fake sim service """ def __init__(self, items=None): self.parent = self self.items = {} if items is not None: for item in items: self.items[item.iid] = item def getItem(self, itm): return defer.succeed(self.items[itm]) def getLocalService(self, svc): return self def getService(self, svc): return defer.succeed(self) def getAsset(self, aid): return FakeAsset(aid) def getAreas(self): return self.items.values() def getRealm(self, rid): return self def returnID(self, iid): pass def remItem(self, itm): del self.items[itm] class FakeClient: """ A fake client """ user = "mike" readied = None def __init__(self): self.groups = [] def getUsername(self): return self.user def getGroups(self): return self.groups def readyClass(self, classes): """ just log """ self.readied = classes class TerrainServerTests(TestCase, WithDocTests): """ Test the terrain server side editor """ checkItems = [TerrainServer] def setUp(self): """ Set up some basics """ self.conductor = FakeConductor() self.sim = FakeSim() self.item = FakeTerrain() self.item.parent = self.sim self.terrain = TerrainServer(self.item) def test_updateHeights(self): """ Test updating the heights """ newh = array("f") newh.extend([6, 5, 4, 3, 2, 1]) self.terrain.view_updateHeights(None, newh.tostring()) self.assertEqual(self.item.heights, newh) self.assertEqual(self.item.resolution, (2, 3)) self.assertEqual(self.item.rebuilt, 1) @inlineCallbacks def test_updateNeighbors(self): """ Test updating neighboring terrains """ self.sim.items[2] = FakeTerrain() self.item.neighbors = dict(north=2) yield self.terrain._updateNeighbors() self.assertNotEqual(self.item.heights, self.sim.items[2].heights) for xpos in range(0, 2): self.assertEqual(self.item.getHeight((xpos, 0)), self.sim.items[2].getHeight((xpos, 2))) def test_updateSouth(self): """ Test update south neighbors """ item2 = FakeTerrain() self.terrain._updateNorthSouth(self.item, item2, False) for xpos in range(0, 2): self.assertEqual(self.item.getHeight((xpos, 2)), item2.getHeight((xpos, 0))) def test_updateNorth(self): """ Test update north neighbors """ item2 = FakeTerrain() self.terrain._updateNorthSouth(self.item, item2, True) for xpos in range(0, 2): self.assertEqual(self.item.getHeight((xpos, 0)), item2.getHeight((xpos, 2))) def test_updateEast(self): """ Test update East neighbors """ item2 = FakeTerrain() self.terrain._updateEastWest(self.item, item2, True) for ypos in range(0, 3): self.assertEqual(self.item.getHeight((0, ypos)), item2.getHeight((1, ypos))) def test_updateWest(self): """ Test update west neighbors """ item2 = FakeTerrain() self.terrain._updateEastWest(self.item, item2, False) for ypos in range(0, 3): self.assertEqual(self.item.getHeight((1, ypos)), item2.getHeight((0, ypos))) @inlineCallbacks def test_addGrassVob(self): """ Test the view_addGrassVob method """ client = FakeClient() yield self.terrain.view_addGrassVob(client) self.assertEqual(client.readied[1], "classgens") self.assertEqual(len(client.readied), 2) self.assertEqual(len(self.item.vobs), 1) def test_setGrassLayerAnimationSettings(self): """ Test setting animation parameters """ self.item.vobs.extend([self.item, self.item]) self.terrain.view_setGrassLayerAnimationSettings(None, 0, 1, 2, 3) self.assertEqual(self.item.animated, (0, True)) self.assertEqual(self.item.swaySpeed, (0, 1)) self.assertEqual(self.item.swayLength, (0, 2)) self.assertEqual(self.item.swayDistrib, (0, 3)) def test_setGrassLayerAnimationSettingsTurnedOff(self): """ Test setting animation parameters when one is 0 """ self.item.vobs.extend([self.item, self.item]) self.terrain.view_setGrassLayerAnimationSettings(None, 0, 0, 2, 3) self.assertEqual(self.item.animated, (0, False)) self.assertEqual(self.item.swaySpeed, (0, 0)) self.assertEqual(self.item.swayLength, (0, 2)) self.assertEqual(self.item.swayDistrib, (0, 3)) class TerrainClientTests(WithFakeUI, WithDocTests): """ Test the terrain client side stuff """ if noOgre: skip = noOgre else: checkItems = (TerrainClient,) def setUp(self): """ Create a brush image """ WithFakeUI.setUp(self) self.tempDir = self.mktemp() os.makedirs(self.tempDir) image = Image.new("RGBA", (100, 100)) image.save(os.path.join(self.tempDir, "brush.png"), "png") TerrainClient.brushImageFile = os.path.join(self.tempDir, "brush.png") self.ui.items[1] = FakeTerrain() self.ui.items[1].vobs = [self.ui.items[1]] * 2 def test_construct(self): """ Test constructing the ui """ TerrainClient(self.ui, None) self.assertLog([('loadImageSet', 'brushes.imageset'), ('create', 'WindowsLook/FrameWindow', 'Root/TerrainEdit'), ('create', 'WindowsLook/Combobox', 'TerrainEdit/editType'), ('create', 'WindowsLook/Combobox', 'TerrainEdit/modeSelect'), ('create', 'WindowsLook/SystemButton', 'TerrainEdit/circleBrush'), ('create', 'WindowsLook/SystemButton', 'TerrainEdit/squareBrush'), ('create', 'WindowsLook/SystemButton', 'TerrainEdit/vertBrush'), ('create', 'WindowsLook/SystemButton', 'TerrainEdit/horizBrush'), ('create', 'WindowsLook/SystemButton', 'TerrainEdit/plusBrush'), ('create', 'WindowsLook/SystemButton', 'TerrainEdit/sprayBrush'), ('create', 'WindowsLook/StaticText', 'TerrainEdit/sizeLabel'), ('create', 'WindowsLook/Slider', 'TerrainEdit/sizeSlider'), ('create', 'WindowsLook/Editbox', 'TerrainEdit/sizeText'), ('create', 'WindowsLook/StaticText', 'TerrainEdit/amountLabel'), ('create', 'WindowsLook/Slider', 'TerrainEdit/amountSlider'), ('create', 'WindowsLook/Editbox', 'TerrainEdit/amountText'), ('create', 'WindowsLook/Button', 'TerrainEdit/importButton'), ('create', 'WindowsLook/Button', 'TerrainEdit/resetButton'), ('create', 'WindowsLook/Button', 'TerrainEdit/undoButton'), ('create', 'WindowsLook/Button', 'TerrainEdit/exportButton'), ('create', 'WindowsLook/Button', 'TerrainEdit/generateButton'), ('create', 'WindowsLook/StaticText', 'TerrainEdit/neighborLabel'), ('create', 'WindowsLook/StaticText', 'TerrainEdit/northLabel'), ('create', 'WindowsLook/Editbox', 'TerrainEdit/northNeighborText'), ('create', 'WindowsLook/Button', 'TerrainEdit/northNeighborSelect'), ('create', 'WindowsLook/StaticText', 'TerrainEdit/southLabel'), ('create', 'WindowsLook/Editbox', 'TerrainEdit/southNeighborText'), ('create', 'WindowsLook/Button', 'TerrainEdit/southNeighborSelect'), ('create', 'WindowsLook/StaticText', 'TerrainEdit/eastLabel'), ('create', 'WindowsLook/Editbox', 'TerrainEdit/eastNeighborText'), ('create', 'WindowsLook/Button', 'TerrainEdit/eastNeighborSelect'), ('create', 'WindowsLook/StaticText', 'TerrainEdit/westLabel'), ('create', 'WindowsLook/Editbox', 'TerrainEdit/westNeighborText'), ('create', 'WindowsLook/Button', 'TerrainEdit/westNeighborSelect'), ('create', 'WindowsLook/FrameWindow', 'Root/LayerWindow'), ('create', 'WindowsLook/MultiColumnList', 'LayerWindow/layersList'), ('create', 'WindowsLook/Button', 'LayerWindow/addLayer'), ('create', 'WindowsLook/Button', 'LayerWindow/selectAsset'), ('create', 'WindowsLook/Button', 'LayerWindow/delLayer'), ('create', 'WindowsLook/StaticText', 'LayerWindow/layerLabel1'), ('create', 'WindowsLook/Slider', 'LayerWindow/layerSlider1'), ('create', 'WindowsLook/Editbox', 'LayerWindow/layerText1'), ('create', 'WindowsLook/StaticText', 'LayerWindow/layerLabel2'), ('create', 'WindowsLook/Slider', 'LayerWindow/layerSlider2'), ('create', 'WindowsLook/Editbox', 'LayerWindow/layerText2'), ('create', 'WindowsLook/StaticText', 'LayerWindow/layerLabel3'), ('create', 'WindowsLook/Slider', 'LayerWindow/layerSlider3'), ('create', 'WindowsLook/Editbox', 'LayerWindow/layerText3')]) def test_stop(self): """ Make sure that stopping the ui also stops the layer window """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.window.show() terrain.layerWindow.show() self.clearLog() terrain.stop() self.assertLog(['removeInputContext', ('hideWindow', 'Root/TerrainEdit'), ('hideWindow', 'Root/LayerWindow')]) def test_updateModeHeights(self): """ Test updating the mode """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.editType.widget.selectedItem = FakeText("Heights") terrain.updateMode() self.assertEqual(len(terrain.modeSelect.items), 6) def test_updateModeTextures(self): """ Test updating the mode """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.terrain.vobs = [terrain.terrain] terrain.editType.widget.selectedItem = FakeText("Textures") terrain.updateMode() self.assertEqual(len(terrain.modeSelect.items), 3) def test_updateModeVegetation(self): """ Test updating the mode """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.editType.widget.selectedItem = FakeText("Vegetation") terrain.terrain = FakeTerrain() terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.updateMode() self.assertEqual(len(terrain.modeSelect.items), 5) def test_updateVegetationTextsAddRemove(self): """ Update the vegetation tests in add/remove mode """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.modeSelect.widget.selectedItem = FakeText("Add") terrain.updateVegetationTexts() self.assertEqual(terrain.layerLabel1.getText(), "Density") def test_updateVegetationTextsAnimation(self): """ Update the vegetation tests in animation mode """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.modeSelect.widget.selectedItem = FakeText("Animation") terrain.updateVegetationTexts() self.assertEqual(terrain.layerLabel1.getText(), "Spd") def test_updateVegetationTextsColor(self): """ Update the vegetation tests in color mode """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.modeSelect.widget.selectedItem = FakeText("Color") terrain.updateVegetationTexts() self.assertEqual(terrain.layerLabel1.getText(), "R") def test_updateLayerSlidersTexture(self): """ Update the layer sliders in texture mode """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.terrain.vobs = [terrain.terrain] terrain.terrain.textureLayerSettings.append({}) terrain.editType.widget.selectedItem = FakeText("Textures") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.updateLayerSliders() self.assertLog([('setTextureLayerSettings', 0, {'scale': (0, 0)})], terrain.modifier) self.assertEqual(terrain.terrain.textureLayerSettings[0]["scale"], (0, 0)) def test_updateLayerSlidersVegetationAdd(self): """ Update the layer sliders in vegetation mode """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.editType.widget.selectedItem = FakeText("Vegetation") terrain.modeSelect.widget.selectedItem = FakeText("Add") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.updateLayerSliders() self.assertLog([('setGrassLayerMainSettings', 0, 0, (-500, -500))], terrain.modifier) def test_updateLayerSlidersVegetationAnimation(self): """ Update the layer sliders in anim mode """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.editType.widget.selectedItem = FakeText("Vegetation") terrain.modeSelect.widget.selectedItem = FakeText("Animation") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.updateLayerSliders() self.assertLog([('setGrassLayerAnimationSettings', 0, 0, 0, 0)], terrain.modifier) def test_updateLayerSlidersVegetationSize(self): """ Update the layer sliders in size mode """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.editType.widget.selectedItem = FakeText("Vegetation") terrain.modeSelect.widget.selectedItem = FakeText("Size") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.updateLayerSliders() self.assertLog([('setGrassLayerSizeSettings', 0, (0, 0), (0, 0))], terrain.modifier) def test_selectLayerTextures(self): """ Select a layer in textur emode """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.editType.widget.selectedItem = FakeText("Textures") terrain.modeSelect.widget.selectedItem = FakeText("Size") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.terrain.textureLayerSettings.append(dict(scale=(1, 1))) terrain.selectLayer() self.assertEqual(terrain.layerText1.text, "1.00") self.assertEqual(terrain.layerText2.text, "1.00") self.assertEqual(terrain.updating, False) def test_selectLayerVegetationAnimation(self): """ Select a layer in animation mode """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.editType.widget.selectedItem = FakeText("Vegetation") terrain.modeSelect.widget.selectedItem = FakeText("Animation") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.terrain.layers.append(dict(swayLength=1.0)) terrain.selectLayer() self.assertEqual(terrain.layerSlider1.position, 1.0) self.assertEqual(terrain.updating, False) def test_selectLayerVegetationSize(self): """ Select a layer in size mode """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.editType.widget.selectedItem = FakeText("Vegetation") terrain.modeSelect.widget.selectedItem = FakeText("Size") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.terrain.layers.append(dict(swayLength=1.0)) terrain.selectLayer() self.assertEqual(terrain.layerSlider1.position, 0.0) self.assertEqual(terrain.layerSlider2.position, 0.05) self.assertEqual(terrain.updating, False) def test_selectLayerVegetationColor(self): """ Select a layer in color mode """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.editType.widget.selectedItem = FakeText("Vegetation") terrain.modeSelect.widget.selectedItem = FakeText("Color") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.terrain.layers.append(dict(swayLength=1.0)) terrain.selectLayer() self.assertNotIdentical(terrain.alphas, None) self.assertEqual(terrain.alphas.image.size, (128, 128)) self.assertEqual(terrain.updating, False) def test_selectLayerVegetationAdd(self): """ Select a layer in add mode """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.editType.widget.selectedItem = FakeText("Vegetation") terrain.modeSelect.widget.selectedItem = FakeText("Color") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.terrain.layers.append(dict(swayLength=1.0)) terrain.selectLayerVegetationAdd(dict(density=1.0)) self.assertNotIdentical(terrain.alphas, None) self.assertEqual(terrain.alphas.image.size, (128, 128)) self.assertEqual(terrain.updating, False) def test_selectBrush(self): """ Select a brush """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.selectBrush("Square") self.assertEqual(terrain.squareBrush.widget.properties, { 'HoverImage': 'set: Brushes image: SquareH', 'NormalImage': 'set: Brushes image: SquareH', 'PushedImage': 'set: Brushes image: SquareA'}) self.assertEqual(terrain.brush, "Square") @inlineCallbacks def test_newLayerTextures(self): """ Add a new layer test in texture mode """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.editType.widget.selectedItem = FakeText("Textures") terrain.selectAssetDialog = lambda : defer.succeed(1) terrain.terrain = FakeTerrain() terrain.terrain.vobs = [terrain.terrain] * 2 yield terrain.newLayer() self.assertLog([('newTextureLayer', 1, {'scale': (0, 0)}, None)], terrain.modifier) @inlineCallbacks def test_updateLayerListTextures(self): """ Update the layer list in texture mode """ self.ui.client = FakeConductor() self.ui.client.uint = self.ui terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.terrain.textureLayerAssetIds = [1] terrain.editType.widget.selectedItem = FakeText("Textures") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.terrain.textureLayerSettings.append(dict(scale=(1, 1))) terrain.layersList.widget.log = [] yield terrain.updateLayerList() self.assertLog(['resetList', "Add row ['0: george']"], terrain.layersList.widget) @inlineCallbacks def test_updateLayerListVegetation(self): """ Update the layer list in vegetation mode """ self.ui.client = FakeConductor() self.ui.client.uint = self.ui terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.terrain.layers = [dict(aid=1)] terrain.editType.widget.selectedItem = FakeText("Vegetation") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.terrain.textureLayerSettings.append(dict(scale=(1, 1))) terrain.layersList.widget.log = [] yield terrain.updateLayerList() self.assertLog(['resetList', "Add row ['0: george']"], terrain.layersList.widget) def test_prepUndoHeights(self): """ Test prepUndo for heights """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.terrain.heights = array("f", [1, 2, 3, 4]) terrain.editType.widget.selectedItem = FakeText("Heights") terrain.prepUndo() self.assertEqual(terrain.terrain.heights.tostring(), terrain.undoStack[0]) def test_prepUndoVegetationAdd(self): """ Test prepUndo for vegetation add """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.alphas = newImage((10, 10), "PIL", "RGB") terrain.terrain = FakeTerrain() terrain.editType.widget.selectedItem = FakeText("Vegetation") terrain.modeSelect.widget.selectedItem = FakeText("Add") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.prepUndo() self.assertEqual(("alpha", 0), terrain.undoStack[0][:2]) self.assertEqual(terrain.alphas.image.tostring(), terrain.undoStack[0][2].image.tostring()) def test_prepUndoVegetationColor(self): """ Test prepUndo for vegetation color """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.alphas = newImage((10, 10), "PIL", "RGB") terrain.terrain = FakeTerrain() terrain.editType.widget.selectedItem = FakeText("Vegetation") terrain.modeSelect.widget.selectedItem = FakeText("Color") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.prepUndo() self.assertEqual(("color", 0), terrain.undoStack[0][:2]) self.assertEqual(terrain.alphas.image.tostring(), terrain.undoStack[0][2].image.tostring()) def test_prepUndoManyLevels(self): """ Test prepUndo for truncating the undo stack """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.terrain.heights = array("f", [1, 2, 3, 4]) terrain.editType.widget.selectedItem = FakeText("Heights") for _ in range(terrain.undoMax * 2): terrain.prepUndo() self.failUnless(len(terrain.undoStack) < terrain.undoMax) def test_undoNoUndos(self): """ Test that calling undo with no undos just does nothign """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) # make it cry if it doesn't return immediately del terrain.editType terrain.undo() def test_translateWorldToHeightField(self): """ Test translating world coords """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() result = terrain.translateWorldToHeightField((10, 10, 10)) self.assertEqual(tuple(result), (-2, -6)) def test_translateWorldToTexture(self): """ Test translating world coords to texture uv """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() result = terrain.translateWorldToTexture((10, 10, 10)) self.assertEqual(tuple(result), (-128, -256)) def test_updateHeightsRaise(self): """ Test updating the heights """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.modeSelect.widget.selectedItem = FakeText("Raise") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.brushLocation = (25, 10, 35) terrain.brushData = [255] * 100 terrain.terrain.heights = [0] * (terrain.terrain.resolution[0] * terrain.terrain.resolution[1]) terrain.sizeSlider.position = 1 terrain.amountSlider.position = 1 terrain.updateHeights(None) self.assertEqual(terrain.terrain.heights, [10.0, 10.0, 20.0, 20.0, 30.0, 30.0]) def test_updateHeightsLower(self): """ Test updating the heights """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.modeSelect.widget.selectedItem = FakeText("Lower") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.brushLocation = (25, 10, 35) terrain.brushData = [255] * 100 terrain.terrain.heights = [0] * (terrain.terrain.resolution[0] * terrain.terrain.resolution[1]) terrain.sizeSlider.position = 1 terrain.amountSlider.position = 1 terrain.updateHeights(None) self.assertEqual(terrain.terrain.heights, [ -10.0, -10.0, -20.0, -20.0, - 30.0, -30.0]) def test_updateHeightsFlatten(self): """ Test updating the heights """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.modeSelect.widget.selectedItem = FakeText("Flatten") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.brushLocation = (25, 10, 35) terrain.brushData = [255] * 100 terrain.terrain.heights = [0] * (terrain.terrain.resolution[0] * terrain.terrain.resolution[1]) terrain.sizeSlider.position = 1 terrain.amountSlider.position = 1 terrain.updateHeights(None) self.assertEqual(terrain.terrain.heights, [0, 0, 0, 0, 0, 0]) def test_updateHeightsSmooth(self): """ Test updating the heights """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.modeSelect.widget.selectedItem = FakeText("Smooth") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.brushLocation = (25, 10, 35) terrain.brushData = [255] * 100 terrain.terrain.heights = [0] * (terrain.terrain.resolution[0] * terrain.terrain.resolution[1]) terrain.sizeSlider.position = 1 terrain.amountSlider.position = 1 terrain.updateHeights(None) self.assertEqual(terrain.terrain.heights, [0, 0, 0, 0, 0, 0]) def test_updateHeightsRoughen(self): """ Test updating the heights """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.modeSelect.widget.selectedItem = FakeText("Roughen") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.brushLocation = (25, 10, 35) terrain.brushData = [255] * 100 terrain.terrain.heights = [0] * (terrain.terrain.resolution[0] * terrain.terrain.resolution[1]) terrain.sizeSlider.position = 1 terrain.amountSlider.position = 1 terrain.updateHeights(None) self.assertEqual(terrain.terrain.heights, [0, 0, 0, 0, 0, 0]) def test_updateHeightsDrag(self): """ Test updating the heights """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.modeSelect.widget.selectedItem = FakeText("Drag") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.brushLocation = (25, 10, 35) terrain.brushData = [255] * 100 terrain.terrain.heights = [0] * (terrain.terrain.resolution[0] * terrain.terrain.resolution[1]) terrain.sizeSlider.position = 1 terrain.amountSlider.position = 1 terrain.updateHeights((0, 1)) self.assertEqual(terrain.terrain.heights, [ -1.0, -1.0, -2.0, -2.0, - 3.0, -3.0]) def test_updateTextures(self): """ Test updating the textures """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.modeSelect.widget.selectedItem = FakeText("Paint") terrain.layersList.widget.selection = [FakeText("2:qwe")] terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.alphas = [array("B", [0] * (128 * 128))] * 2 terrain.brushLocation = (25, 10, 35) terrain.brushData = [255] * 100 terrain.terrain.textureLayerMaps = [0] * 3 terrain.sizeSlider.position = 1 terrain.amountSlider.position = 1 terrain.updateTextures() self.assertEqual(terrain.alphas[0][8772], 255) def test_updateVegetationGrow(self): """ Test updating the vegetation grow """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.modeSelect.widget.selectedItem = FakeText("Add") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.alphas = newImage((128, 128), "PIL", "L") terrain.brushLocation = (25, 10, 35) terrain.brushData = [255] * 100 terrain.terrain.layers = [{}] terrain.sizeSlider.position = 1 terrain.amountSlider.position = 1 terrain.updateVegetation() self.assertEqual(terrain.alphas.getPixel((64, 64)), 255) def test_updateVegetationColor(self): """ Test updating the vegetation color """ terrain = TerrainClient(self.ui, FakeTerrainModifier()) terrain.terrain = FakeTerrain() terrain.modeSelect.widget.selectedItem = FakeText("Color") terrain.layersList.widget.selection = [FakeText("0:qwe")] terrain.terrain.vobs = [terrain.terrain, terrain.terrain] terrain.alphas = newImage((128, 128), "PIL", "RGB") terrain.brushLocation = (25, 10, 35) terrain.brushData = [255] * 100 terrain.terrain.layers = [{}] terrain.sizeSlider.position = 1 terrain.amountSlider.position = 1 terrain.layerSlider1.position = 1 terrain.layerSlider2.position = 0.5 terrain.updateVegetation() self.assertEqual(terrain.alphas.getPixel((64, 64)), (255, 127, 0)) class TestGenerateWindow(WithFakeUI): """ Test the terrain heightfield generation window """ def test_buildUI(self): """ Create a GenerateWindow and make sure it sets up the ui properly and initializes values """ tcli = TerrainClient(self.ui, FakeTerrainModifier()) self.clearLog() genw = GenerateWindow(self.ui, FakeTerrainModifier(), FakeTerrain(), tcli) self.assertLog([('create', 'WindowsLook/FrameWindow', 'Root/GenerateTerrain'), ('create', 'WindowsLook/StaticText', 'GenerateTerrain/seedLabel'), ('create', 'WindowsLook/Editbox', 'GenerateTerrain/seedText'), ('create', 'WindowsLook/StaticText', 'GenerateTerrain/persistenceLabel'), ('create', 'WindowsLook/Editbox', 'GenerateTerrain/persistenceText'), ('create', 'WindowsLook/StaticText', 'GenerateTerrain/octavesLabel'), ('create', 'WindowsLook/Editbox', 'GenerateTerrain/octavesText'), ('create', 'WindowsLook/StaticText', 'GenerateTerrain/heightLabel'), ('create', 'WindowsLook/Editbox', 'GenerateTerrain/heightText'), ('create', 'WindowsLook/Button', 'GenerateTerrain/cancelButton'), ('create', 'WindowsLook/Button', 'GenerateTerrain/saveButton'), ('create', 'WindowsLook/Button', 'GenerateTerrain/generateButton')]) self.assertEqual(genw.originalSeed, 0) self.assertEqual(genw.originalOctaves, 0) self.assertEqual(genw.originalScale, (0, 0, 0)) self.assertEqual(genw.originalPersistence, 0) def test_start(self): """ Create a GenerateWindow and make sure that when started, it registers callbacks and returns a deferred. """ tcli = TerrainClient(self.ui, FakeTerrainModifier()) genw = GenerateWindow(self.ui, FakeTerrainModifier(), FakeTerrain(), tcli) self.clearLog() dfrd = genw.start() self.assertIsInstance(dfrd, Deferred) self.assertLog([('displayWindow', 'Root/GenerateTerrain'), ('requestUICallback', 'EventCloseClicked', 'cancel'), ('requestUICallback', 'EventClicked', 'cancel'), ('requestUICallback', 'EventClicked', 'generate'), ('requestUICallback', 'EventClicked', 'save')]) @inlineCallbacks def test_cancel(self): """ Test that cancelling the window returns the terrain to its original state. """ tcli = TerrainClient(self.ui, FakeTerrainModifier()) genw = GenerateWindow(self.ui, FakeTerrainModifier(), FakeTerrain(), tcli) dfrd = genw.start() def callback(result): self.fail("Expected RuntimeError, got %s" % result) def errback(error): error.trap(RuntimeError) dfrd.addCallbacks(callback, errback) self.clearLog() genw.originalOctaves = 23 genw.originalPersistence = 4 genw.originalScale = (10, 2, 3) genw.originalSeed = 3 genw.terrain.vobs = [genw.terrain] yield genw.cancel() self.failIf(dfrd.result) self.assertEqual(genw.terrain.seed, 3) self.assertEqual(genw.terrain.octaves, 23) self.assertEqual(genw.terrain.persistence, 4) self.assertEqual(genw.terrain.multiplier, (10, 2, 3)) self.assertLog([('hideWindow', 'Root/GenerateTerrain'), ('stopUICallback', 'call'), ('stopUICallback', 'call'), ('stopUICallback', 'call'), ('stopUICallback', 'call')]) @inlineCallbacks def test_generate(self): """ Test that generating the terrain builds a new terrain """ tcli = TerrainClient(self.ui, FakeTerrainModifier()) genw = GenerateWindow(self.ui, FakeTerrainModifier(), FakeTerrain(), tcli) dfrd = genw.start() def callback(result): self.fail("Deferred got called back with %s" % result) dfrd.addBoth(callback) self.clearLog() genw.seedText.setText(23) genw.persistenceText.setText(4) genw.heightText.setText(2) genw.octavesText.setText(3) genw.terrain.vobs = [genw.terrain] yield genw.generate() self.assertEqual(genw.terrain.seed, 23) self.assertEqual(genw.terrain.octaves, 3) self.assertEqual(genw.terrain.persistence, 4) self.assertEqual(genw.terrain.multiplier, (0, 2, 0)) self.assertLog([])