"""
InaSAFE Disaster risk assessment tool developed by AusAid and World Bank
- **GUI Test Cases.**
Contact : ole.moller.nielsen@gmail.com
.. note:: This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
"""
__author__ = 'tim@linfiniti.com'
__date__ = '10/01/2011'
__copyright__ = ('Copyright 2012, Australia Indonesia Facility for '
'Disaster Reduction')
import unittest
import sys
import os
import logging
from unittest import expectedFailure
from os.path import join
# Add PARENT directory to path to make test aware of other modules
pardir = os.path.abspath(join(os.path.dirname(__file__), '..'))
sys.path.append(pardir)
from PyQt4 import QtCore
from PyQt4.QtTest import QTest
from qgis.core import (QgsRasterLayer,
QgsVectorLayer,
QgsMapLayerRegistry,
QgsRectangle)
from safe.common.testing import HAZDATA, EXPDATA, TESTDATA, UNITDATA
from safe_qgis.utilities_test import (getQgisTestApp,
setCanvasCrs,
setPadangGeoExtent,
setBatemansBayGeoExtent,
setJakartaGeoExtent,
setYogyaGeoExtent,
setJakartaGoogleExtent,
setGeoExtent,
GEOCRS,
GOOGLECRS,
loadLayer)
from safe_qgis.dock import Dock
from safe_qgis.utilities import (setRasterStyle,
qgisVersion,
getDefaults)
# Retired impact function for characterisation (Ole)
# So ignore unused import errors for these? (Tim)
# pylint: disable=W0611
from safe.engine.impact_functions_for_testing import allen_fatality_model
from safe.engine.impact_functions_for_testing import HKV_flood_study
from safe.engine.impact_functions_for_testing import BNPB_earthquake_guidelines
#from safe.engine.impact_functions_for_testing import error_raising_functions
# pylint: enable=W0611
LOGGER = logging.getLogger('InaSAFE')
QGISAPP, CANVAS, IFACE, PARENT = getQgisTestApp()
DOCK = Dock(IFACE)
YOGYA2006_title = 'An earthquake in Yogyakarta like in 2006'
PADANG2009_title = 'An earthquake in Padang like in 2009'
TEST_FILES_DIR = os.path.join(os.path.dirname(__file__),
'test_data/test_files')
[docs]def getUiState(ui):
"""Get state of the 3 combos on the DOCK ui. This method is purely for
testing and not to be confused with the saveState and restoreState methods
of inasafedock.
"""
myHazard = str(ui.cboHazard.currentText())
myExposure = str(ui.cboExposure.currentText())
myImpactFunctionTitle = str(ui.cboFunction.currentText())
myImpactFunctionId = DOCK.getFunctionID()
myRunButton = ui.pbnRunStop.isEnabled()
return {'Hazard': myHazard,
'Exposure': myExposure,
'Impact Function Title': myImpactFunctionTitle,
'Impact Function Id': myImpactFunctionId,
'Run Button Enabled': myRunButton}
[docs]def canvasList():
"""Return a string representing the list of canvas layers (in correct
order) but formatted with line breaks between each entry."""
myListString = ''
for myLayer in CANVAS.layers():
myListString += str(myLayer.name()) + '\n'
return myListString
[docs]def combosToString(theUi):
"""Helper to return a string showing the state of all combos (all their
entries"""
myString = 'Hazard Layers\n'
myString += '-------------------------\n'
myCurrentId = theUi.cboHazard.currentIndex()
for myCount in range(0, theUi.cboHazard.count()):
myItemText = theUi.cboHazard.itemText(myCount)
if myCount == myCurrentId:
myString += '>> '
else:
myString += ' '
myString += str(myItemText) + '\n'
myString += '\n'
myString += 'Exposure Layers\n'
myString += '-------------------------\n'
myCurrentId = theUi.cboExposure.currentIndex()
for myCount in range(0, theUi.cboExposure.count()):
myItemText = theUi.cboExposure.itemText(myCount)
if myCount == myCurrentId:
myString += '>> '
else:
myString += ' '
myString += str(myItemText) + '\n'
myString += '\n'
myString += 'Functions\n'
myString += '-------------------------\n'
myCurrentId = theUi.cboFunction.currentIndex()
for myCount in range(0, theUi.cboFunction.count()):
myItemText = theUi.cboFunction.itemText(myCount)
if myCount == myCurrentId:
myString += '>> '
else:
myString += ' '
myString += '%s (Function ID: %s)\n' % (
str(myItemText), DOCK.getFunctionID(myCurrentId))
myString += '\n'
myString += 'Aggregation Layers\n'
myString += '-------------------------\n'
myCurrentId = theUi.cboAggregation.currentIndex()
for myCount in range(0, theUi.cboAggregation.count()):
myItemText = theUi.cboAggregation.itemText(myCount)
if myCount == myCurrentId:
myString += '>> '
else:
myString += ' '
myString += str(myItemText) + '\n'
myString += '\n\n >> means combo item is selected'
return myString
[docs]def setupScenario(theHazard, theExposure, theFunction, theFunctionId,
theOkButtonFlag=True, theAggregation=None,
theAggregationEnabledFlag=None):
"""Helper function to set the gui state to a given scenario.
Args:
theHazard str - (Required) name of the hazard combo entry to set.
theExposure str - (Required) name of exposure combo entry to set.
theFunction - (Required) name of the function combo entry to set.
theFunctionId - (Required) the impact function id that should be used.
theOkButtonFlag - (Optional) Whether the ok button should be enabled
after this scenario is set up.
theAggregationLayer - (Optional) which layer should be used for
aggregation
We require both theFunction and theFunctionId because safe allows for
multiple functions with the same name but different id's so we need to be
sure we have the right one.
Returns: bool - Indicating if the setup was successful
str - A message indicating why it may have failed.
Raises: None
"""
if theHazard is not None:
myIndex = DOCK.cboHazard.findText(theHazard)
myMessage = ('\nHazard Layer Not Found: %s\n Combo State:\n%s' %
(theHazard, combosToString(DOCK)))
if myIndex == -1:
return False, myMessage
DOCK.cboHazard.setCurrentIndex(myIndex)
if theExposure is not None:
myIndex = DOCK.cboExposure.findText(theExposure)
myMessage = ('\nExposure Layer Not Found: %s\n Combo State:\n%s' %
(theExposure, combosToString(DOCK)))
if myIndex == -1:
return False, myMessage
DOCK.cboExposure.setCurrentIndex(myIndex)
if theFunction is not None:
myIndex = DOCK.cboFunction.findText(theFunction)
myMessage = ('\nImpact Function Not Found: %s\n Combo State:\n%s' %
(theFunction, combosToString(DOCK)))
if myIndex == -1:
return False, myMessage
DOCK.cboFunction.setCurrentIndex(myIndex)
if theAggregation is not None:
myIndex = DOCK.cboAggregation.findText(theAggregation)
myMessage = ('Aggregation layer Not Found: %s\n Combo State:\n%s' %
(theAggregation, combosToString(DOCK)))
if myIndex == -1:
return False, myMessage
DOCK.cboAggregation.setCurrentIndex(myIndex)
if theAggregationEnabledFlag is not None:
if DOCK.cboAggregation.isEnabled() != theAggregationEnabledFlag:
myMessage = ('The aggregation combobox should be %s' %
('enabled' if theAggregationEnabledFlag else 'disabled'))
return False, myMessage
# Check that layers and impact function are correct
myDict = getUiState(DOCK)
myExpectedDict = {'Run Button Enabled': theOkButtonFlag,
'Impact Function Title': theFunction,
'Impact Function Id': theFunctionId,
'Hazard': theHazard,
'Exposure': theExposure}
myMessage = 'Expected versus Actual State\n'
myMessage += '--------------------------------------------------------\n'
for myKey in myExpectedDict.keys():
myMessage += 'Expected %s: %s\n' % (myKey, myExpectedDict[myKey])
myMessage += 'Actual %s: %s\n' % (myKey, myDict[myKey])
myMessage += '----\n'
myMessage += '--------------------------------------------------------\n'
myMessage += combosToString(DOCK)
if myDict != myExpectedDict:
return False, myMessage
return True, 'Matched ok.'
[docs]def populatemyDock():
"""A helper function to populate the DOCK and set it to a valid state.
"""
loadStandardLayers()
DOCK.cboHazard.setCurrentIndex(0)
DOCK.cboExposure.setCurrentIndex(0)
#QTest.mouseClick(myHazardItem, Qt.LeftButton)
#QTest.mouseClick(myExposureItem, Qt.LeftButton)
[docs]def loadStandardLayers():
"""Helper function to load standard layers into the dialog."""
# NOTE: Adding new layers here may break existing tests since
# combos are populated alphabetically. Each test will
# provide a detailed diagnostic if you break it so make sure
# to consult that and clean up accordingly.
#
# Update on above. We are refactoring tests so they use find on combos
# to set them appropriately, instead of relative in combo position
# so you should be able to put datasets in any order below.
# If chancing the order does cause tests to fail, please update the tests
# to also use find instead of relative position. (Tim)
myFileList = [join(TESTDATA, 'Padang_WGS84.shp'),
join(EXPDATA, 'glp10ag.asc'),
join(HAZDATA, 'Shakemap_Padang_2009.asc'),
join(TESTDATA, 'tsunami_max_inundation_depth_utm56s.tif'),
join(TESTDATA, 'tsunami_building_exposure.shp'),
join(HAZDATA, 'Flood_Current_Depth_Jakarta_geographic.asc'),
join(TESTDATA, 'Population_Jakarta_geographic.asc'),
join(HAZDATA, 'eq_yogya_2006.asc'),
join(HAZDATA, 'Jakarta_RW_2007flood.shp'),
join(TESTDATA, 'OSM_building_polygons_20110905.shp'),
join(EXPDATA, 'DKI_buildings.shp'),
join(HAZDATA, 'jakarta_flood_category_123.asc'),
join(TESTDATA, 'roads_Maumere.shp'),
join(TESTDATA, 'kabupaten_jakarta_singlepart.shp')]
myHazardLayerCount, myExposureLayerCount = loadLayers(myFileList,
theDataDirectory=None)
#FIXME (MB) -1 is untill we add the aggregation category because of
# kabupaten_jakarta_singlepart not being either hayard nor exposure layer
assert myHazardLayerCount + myExposureLayerCount == len(myFileList) - 1
return myHazardLayerCount, myExposureLayerCount
[docs]def loadLayers(theLayerList, theClearFlag=True, theDataDirectory=TESTDATA):
"""Helper function to load layers as defined in a python list."""
# First unload any layers that may already be loaded
if theClearFlag:
QgsMapLayerRegistry.instance().removeAllMapLayers()
# Now go ahead and load our layers
myExposureLayerCount = 0
myHazardLayerCount = 0
# Now create our new layers
for myFile in theLayerList:
myLayer, myType = loadLayer(myFile, theDataDirectory)
if myType == 'hazard':
myHazardLayerCount += 1
elif myType == 'exposure':
myExposureLayerCount += 1
# Add layer to the registry (that QGis knows about) a slot
# in qgis_interface will also ensure it gets added to the canvas
QgsMapLayerRegistry.instance().addMapLayer(myLayer)
DOCK.getLayers()
# Add MCL's to the CANVAS
return myHazardLayerCount, myExposureLayerCount
[docs]class DockTest(unittest.TestCase):
"""Test the InaSAFE GUI"""
[docs] def setUp(self):
"""Fixture run before all tests"""
os.environ['LANG'] = 'en'
DOCK.showOnlyVisibleLayersFlag = True
loadStandardLayers()
DOCK.cboHazard.setCurrentIndex(0)
DOCK.cboExposure.setCurrentIndex(0)
DOCK.cboFunction.setCurrentIndex(0)
DOCK.runInThreadFlag = False
DOCK.showOnlyVisibleLayersFlag = False
DOCK.setLayerNameFromTitleFlag = False
DOCK.zoomToImpactFlag = False
DOCK.hideExposureFlag = False
DOCK.showPostProcLayers = False
[docs] def tearDown(self):
"""Fixture run after each test"""
QgsMapLayerRegistry.instance().removeAllMapLayers()
DOCK.cboHazard.clear()
DOCK.cboExposure.clear()
#DOCK.cboAggregation.clear() #dont do this because the cboAggregation
# need to be able to react to the status changes of the other combos
[docs] def test_defaults(self):
"""Test the GUI in its default state"""
self.assertEqual(DOCK.cboHazard.currentIndex(), 0)
self.assertEqual(DOCK.cboExposure.currentIndex(), 0)
self.assertEqual(DOCK.cboFunction.currentIndex(), 0)
self.assertEqual(DOCK.cboAggregation.currentIndex(), 0)
[docs] def test_validate(self):
"""Validate function work as expected"""
self.tearDown()
# First check that we DONT validate a clear DOCK
myFlag, myMessage = DOCK.validate()
assert myMessage is not None, 'No reason for failure given'
myMessage = 'Validation expected to fail on a cleared DOCK.'
self.assertEquals(myFlag, False, myMessage)
# Now check we DO validate a populated DOCK
populatemyDock()
myFlag = DOCK.validate()
myMessage = ('Validation expected to pass on '
'a populated for with selections.')
assert myFlag, myMessage
[docs] def test_cboAggregationEmptyProject(self):
"""Aggregation combo changes properly according on no loaded layers"""
self.tearDown()
myMessage = ('The aggregation combobox should have only the "Entire '
'area" item when the project has no layer. Found:'
' %s' % (DOCK.cboAggregation.currentText()))
self.assertEqual(DOCK.cboAggregation.currentText(), DOCK.tr(
'Entire area'), myMessage)
assert not DOCK.cboAggregation.isEnabled(), 'The aggregation ' \
'combobox should be disabled when the project has no layer.'
[docs] def test_cboAggregationLoadedProject(self):
"""Aggregation combo changes properly according loaded layers"""
myLayerList = [DOCK.tr('Entire area'),
DOCK.tr('A flood in Jakarta'),
DOCK.tr('Essential buildings'),
DOCK.tr('kabupaten jakarta singlepart'),
DOCK.tr('OSM Building Polygons')]
currentLayers = [DOCK.cboAggregation.itemText(i) for i in range(DOCK
.cboAggregation.count())]
myMessage = ('The aggregation combobox should have:\n %s \nFound: %s'
% (myLayerList, currentLayers))
self.assertEquals(currentLayers, myLayerList, myMessage)
#FIXME (MB) this is actually wrong, when calling the test directly it works
# in nosetest it fails at the second assert
@expectedFailure
[docs] def test_cboAggregationToggle(self):
"""Aggregation Combobox toggles on and off as expected."""
#raster hazard
#raster exposure
myResult, myMessage = setupScenario(
theHazard='A flood in Jakarta like in 2007',
theExposure='People',
theFunction='Need evacuation',
theFunctionId='Flood Evacuation Function',
theAggregationEnabledFlag=True)
myMessage += ' when the when hazard and exposure layer are raster'
assert myResult, myMessage
#vector hazard
#raster exposure
myResult, myMessage = setupScenario(
theHazard=('A flood in Jakarta'),
theExposure='People',
theFunction='Need evacuation',
theFunctionId='Flood Evacuation Function Vector Hazard',
theAggregationEnabledFlag=False)
myMessage += ' when the when hazard is vector and exposure is raster'
assert myResult, myMessage
#raster hazard
#vector exposure
myResult, myMessage = setupScenario(
theHazard='Tsunami Max Inundation',
theExposure='Tsunami Building Exposure',
theFunction='Be flooded',
theFunctionId='Flood Building Impact Function',
theAggregationEnabledFlag=False)
myMessage += ' when the when hazard is raster and exposure is vector'
assert myResult, myMessage
#vector hazard
#vector exposure
myResult, myMessage = setupScenario(
theHazard='A flood in Jakarta',
theExposure='Essential buildings',
theFunction='Be flooded',
theFunctionId='Flood Building Impact Function',
theAggregationEnabledFlag=False)
myMessage += ' when the when hazard and exposure layer are vector'
assert myResult, myMessage
[docs] def test_checkAggregationAttributeInKW(self):
"""Aggregation attribute is chosen correctly when present
in kezwords."""
myRunButton = DOCK.pbnRunStop
myAttrKey = getDefaults('AGGR_ATTR_KEY')
# with KAB_NAME aggregation attribute defined in .keyword using
# kabupaten_jakarta_singlepart.shp
myResult, myMessage = setupScenario(
theHazard='A flood in Jakarta like in 2007',
theExposure='People',
theFunction='Need evacuation',
theFunctionId='Flood Evacuation Function',
theAggregation='kabupaten jakarta singlepart',
theAggregationEnabledFlag=True)
assert myResult, myMessage
# Press RUN
QTest.mouseClick(myRunButton, QtCore.Qt.LeftButton)
DOCK.runtimeKWDialog.accept()
myAttribute = DOCK.postprocAttributes[myAttrKey]
myMessage = ('The aggregation should be KAB_NAME. Found: %s' %
(myAttribute))
self.assertEqual(myAttribute, 'KAB_NAME', myMessage)
[docs] def test_checkAggregationAttribute1Attr(self):
"""Aggregation attribute is chosen correctly when there is only
one attr available."""
myRunButton = DOCK.pbnRunStop
myFileList = ['kabupaten_jakarta_singlepart_1_good_attr.shp']
#add additional layers
loadLayers(myFileList, theClearFlag=False, theDataDirectory=TESTDATA)
myAttrKey = getDefaults('AGGR_ATTR_KEY')
# with 1 good aggregation attribute using
# kabupaten_jakarta_singlepart_1_good_attr.shp
myResult, myMessage = setupScenario(
theHazard='A flood in Jakarta like in 2007',
theExposure='People',
theFunction='Need evacuation',
theFunctionId='Flood Evacuation Function',
theAggregation='kabupaten jakarta singlepart 1 good attr')
assert myResult, myMessage
# Press RUN
QTest.mouseClick(myRunButton, QtCore.Qt.LeftButton)
DOCK.runtimeKWDialog.accept()
myAttribute = DOCK.postprocAttributes[myAttrKey]
myMessage = ('The aggregation should be KAB_NAME. Found: %s' %
(myAttribute))
self.assertEqual(myAttribute, 'KAB_NAME', myMessage)
[docs] def test_checkAggregationAttributeNoAttr(self):
"""Aggregation attribute is chosen correctly when there is no
attr available."""
myRunButton = DOCK.pbnRunStop
myFileList = ['kabupaten_jakarta_singlepart_0_good_attr.shp']
#add additional layers
loadLayers(myFileList, theClearFlag=False, theDataDirectory=TESTDATA)
myAttrKey = getDefaults('AGGR_ATTR_KEY')
# with no good aggregation attribute using
# kabupaten_jakarta_singlepart_0_good_attr.shp
myResult, myMessage = setupScenario(
theHazard='A flood in Jakarta like in 2007',
theExposure='People',
theFunction='Need evacuation',
theFunctionId='Flood Evacuation Function',
theAggregation='kabupaten jakarta singlepart 0 good attr')
assert myResult, myMessage
# Press RUN
QTest.mouseClick(myRunButton, QtCore.Qt.LeftButton)
DOCK.runtimeKWDialog.accept()
myAttribute = DOCK.postprocAttributes[myAttrKey]
myMessage = ('The aggregation should be None. Found: %s' %
(myAttribute))
assert myAttribute is None, myMessage
[docs] def test_checkAggregationAttributeNoneAttr(self):
"""Aggregation attribute is chosen correctly when there None in the
kezwords"""
myRunButton = DOCK.pbnRunStop
myFileList = ['kabupaten_jakarta_singlepart_with_None_keyword.shp']
#add additional layers
loadLayers(myFileList, theClearFlag=False, theDataDirectory=TESTDATA)
myAttrKey = getDefaults('AGGR_ATTR_KEY')
# with None aggregation attribute defined in .keyword using
# kabupaten_jakarta_singlepart_with_None_keyword.shp
myResult, myMessage = setupScenario(
theHazard='A flood in Jakarta like in 2007',
theExposure='People',
theFunction='Need evacuation',
theFunctionId='Flood Evacuation Function',
theAggregation='kabupaten jakarta singlepart with None keyword')
assert myResult, myMessage
# Press RUN
QTest.mouseClick(myRunButton, QtCore.Qt.LeftButton)
DOCK.runtimeKWDialog.accept()
myAttribute = DOCK.postprocAttributes[myAttrKey]
myMessage = ('The aggregation should be None. Found: %s' %
(myAttribute))
assert myAttribute is None, myMessage
#the generated layers are not added to the map registry
def test_checkPostProcessingLayersVisibility(self):
myRunButton = DOCK.pbnRunStop
# with KAB_NAME aggregation attribute defined in .keyword using
# kabupaten_jakarta_singlepart.shp
myResult, myMessage = setupScenario(
theHazard='A flood in Jakarta like in 2007',
theExposure='People',
theFunction='Need evacuation',
theFunctionId='Flood Evacuation Function',
theAggregation='kabupaten jakarta singlepart',
theOkButtonFlag=True)
assert myResult, myMessage
myBeforeCount = len(CANVAS.layers())
#LOGGER.info("Canvas list before:\n%s" % canvasList())
print [str(l.name()) for l in
QgsMapLayerRegistry.instance().mapLayers().values()]
LOGGER.info("Registry list before:\n%s" %
len(QgsMapLayerRegistry.instance().mapLayers()))
# Press RUN
QTest.mouseClick(myRunButton, QtCore.Qt.LeftButton)
myAfterCount = len(CANVAS.layers())
LOGGER.info("Registry list after:\n%s" %
len(QgsMapLayerRegistry.instance().mapLayers()))
# print [str(l.name()) for l in QgsMapLayerRegistry.instance(
# ).mapLayers().values()]
#LOGGER.info("Canvas list after:\n%s" % canvasList())
myMessage = ('Expected %s items in canvas, got %s' %
(myBeforeCount + 1, myAfterCount))
assert myBeforeCount + 1 == myAfterCount, myMessage
# Now run again showing intermediate layers
DOCK.showPostProcLayers = True
myBeforeCount = len(CANVAS.layers())
# Press RUN
QTest.mouseClick(myRunButton, QtCore.Qt.LeftButton)
myAfterCount = len(CANVAS.layers())
LOGGER.info("Canvas list after:\n %s" % canvasList())
myMessage = ('Expected %s items in canvas, got %s' %
(myBeforeCount + 2, myAfterCount))
# We expect two more since we enabled showing intermedate layers
assert myBeforeCount + 2 == myAfterCount, myMessage
[docs] def test_runEarthQuakeGuidelinesFunction(self):
"""GUI runs with Shakemap 2009 and Padang Buildings"""
# Push OK with the left mouse button
myButton = DOCK.pbnRunStop
setCanvasCrs(GEOCRS, True)
setPadangGeoExtent()
myMessage = 'Run button was not enabled'
assert myButton.isEnabled(), myMessage
#QTest.keyClick(DOCK.cboHazard, QtCore.Qt.Key_Down)
#QTest.keyClick(DOCK.cboHazard, QtCore.Qt.Key_Enter)
#
#QTest.keyClick(DOCK.cboExposure, QtCore.Qt.Key_Down)
#QTest.keyClick(DOCK.cboExposure, QtCore.Qt.Key_Enter)
# Hazard layer
myIndex = DOCK.cboHazard.findText(PADANG2009_title)
assert myIndex != -1, 'Padang 2009 scenario hazard layer not found'
DOCK.cboHazard.setCurrentIndex(myIndex)
# Exposure layer
myIndex = DOCK.cboExposure.findText('Padang_WGS84')
myMessage = ('Could not find layer Padang_WGS84:\n'
'%s' % (combosToString(DOCK)))
assert myIndex != -1, myMessage
DOCK.cboExposure.setCurrentIndex(myIndex)
# Impact function
myIndex = DOCK.cboFunction.findText('Earthquake Guidelines Function')
myMessage = ('Earthquake Guidelines function not '
'found: ' + combosToString(DOCK))
assert myIndex != -1, myMessage
DOCK.cboFunction.setCurrentIndex(myIndex)
myDict = getUiState(DOCK)
myExpectedDict = {'Hazard': PADANG2009_title,
'Exposure': 'Padang_WGS84',
'Impact Function Id':
'Earthquake Guidelines Function',
'Impact Function Title':
'Earthquake Guidelines Function',
'Run Button Enabled': True}
myMessage = 'Got:\n %s\nExpected:\n%s\n%s' % (
myDict, myExpectedDict, combosToString(DOCK))
assert myDict == myExpectedDict, myMessage
QTest.mouseClick(myButton, QtCore.Qt.LeftButton)
myResult = DOCK.wvResults.page().currentFrame().toPlainText()
# Expected output:
#Buildings Total
#All: 3160
#Low damage (10-25%): 0
#Medium damage (25-50%): 0
#Pre merge of clip on steroids branch:
#High damage (50-100%): 3160
# Post merge of clip on steoids branch:
#High damage (50-100%): 2993
myMessage = ('Unexpected result returned for Earthquake guidelines'
'function. Expected:\n "All" count of 2993, '
'received: \n %s' % myResult)
assert '2993' in myResult, myMessage
[docs] def test_runEarthquakeFatalityFunction_small(self):
"""Padang 2009 fatalities estimated correctly (small extent)"""
# Push OK with the left mouse button
myButton = DOCK.pbnRunStop
setCanvasCrs(GEOCRS, True)
setPadangGeoExtent()
myMessage = 'Run button was not enabled'
assert myButton.isEnabled(), myMessage
# Simulate choosing another combo item and running
# the model again
myIndex = DOCK.cboHazard.findText(PADANG2009_title)
assert myIndex != -1, 'Padang 2009 scenario hazard layer not found'
DOCK.cboHazard.setCurrentIndex(myIndex)
# Exposure layers
myIndex = DOCK.cboExposure.findText('People')
assert myIndex != -1, 'People'
DOCK.cboExposure.setCurrentIndex(myIndex)
# Choose impact function
myIndex = DOCK.cboFunction.findText('Earthquake Fatality Function')
myMessage = ('Earthquake Fatality Function not '
'found: ' + combosToString(DOCK))
assert myIndex != -1, myMessage
DOCK.cboFunction.setCurrentIndex(myIndex)
myDict = getUiState(DOCK)
myExpectedDict = {'Hazard': PADANG2009_title,
'Exposure': 'People',
'Impact Function Id': 'Earthquake Fatality Function',
'Impact Function Title':
'Earthquake Fatality Function',
'Run Button Enabled': True}
myMessage = 'Got unexpected state: %s\nExpected: %s\n%s' % (
myDict, myExpectedDict, combosToString(DOCK))
assert myDict == myExpectedDict, myMessage
QTest.mouseClick(myButton, QtCore.Qt.LeftButton)
myResult = DOCK.wvResults.page().currentFrame().toPlainText()
# Check against expected output
myMessage = ('Unexpected result returned for Earthquake Fatality '
'Function Expected: fatality count of '
'116 , received: \n %s' % myResult)
assert '116' in myResult, myMessage
myMessage = ('Unexpected result returned for Earthquake Fatality '
'Function Expected: total population count of '
'847529 , received: \n %s' % myResult)
assert '847529' in myResult, myMessage
[docs] def test_runEarthquakeFatalityFunction_Padang_full(self):
"""Padang 2009 fatalities estimated correctly (large extent)"""
# Push OK with the left mouse button
myButton = DOCK.pbnRunStop
setCanvasCrs(GEOCRS, True)
setGeoExtent([96, -5, 105, 2]) # This covers all of the 2009 shaking
myMessage = 'Run button was not enabled'
assert myButton.isEnabled(), myMessage
# Hazard layers
myIndex = DOCK.cboHazard.findText(PADANG2009_title)
assert myIndex != -1, 'Padang 2009 scenario hazard layer not found'
DOCK.cboHazard.setCurrentIndex(myIndex)
# Exposure layers
myIndex = DOCK.cboExposure.findText('People')
assert myIndex != -1, 'People'
DOCK.cboExposure.setCurrentIndex(myIndex)
# Choose impact function
myIndex = DOCK.cboFunction.findText('Earthquake Fatality Function')
myMessage = ('Earthquake Fatality Function not '
'found: ' + combosToString(DOCK))
assert myIndex != -1, myMessage
DOCK.cboFunction.setCurrentIndex(myIndex)
myDict = getUiState(DOCK)
myExpectedDict = {'Hazard': PADANG2009_title,
'Exposure': 'People',
'Impact Function Id':
'Earthquake Fatality Function',
'Impact Function Title':
'Earthquake Fatality Function',
'Run Button Enabled': True}
myMessage = 'Got unexpected state: %s\nExpected: %s\n%s' % (
myDict, myExpectedDict, combosToString(DOCK))
assert myDict == myExpectedDict, myMessage
QTest.mouseClick(myButton, QtCore.Qt.LeftButton)
myResult = DOCK.wvResults.page().currentFrame().toPlainText()
# Check against expected output
myMessage = ('Unexpected result returned for Earthquake Fatality '
'Function Expected: fatality count of '
'500 , received: \n %s' % myResult)
assert '500' in myResult, myMessage
myMessage = ('Unexpected result returned for Earthquake Fatality '
'Function Expected: total population count of '
'31372262 , received: \n %s' % myResult)
assert '31372262' in myResult, myMessage
[docs] def test_runTsunamiBuildingImpactFunction(self):
"""Tsunami function runs in GUI as expected."""
# Push OK with the left mouse button
myButton = DOCK.pbnRunStop
myMessage = 'Run button was not enabled'
assert myButton.isEnabled(), myMessage
myResult, myMessage = setupScenario(
theHazard='Tsunami Max Inundation',
theExposure='Tsunami Building Exposure',
theFunction='Be flooded',
theFunctionId='Flood Building Impact Function')
assert myResult, myMessage
setCanvasCrs(GEOCRS, True)
setBatemansBayGeoExtent()
# Press RUN
QTest.mouseClick(myButton, QtCore.Qt.LeftButton)
myResult = DOCK.wvResults.page().currentFrame().toPlainText()
#print myResult
# Post clip on steroids refactor
# < 1 m: 1923
# 1 - 3 m: 89
# > 3 m: 0
# Post replacement of Batemans Bay dataset
#< 1 m: 10
#1 - 3 m: 7
#> 3 m: 0
# Post rewrite of impact function
#Building type closed Total
#All 7 17
myMessage = 'Result not as expected: %s' % myResult
assert '17' in myResult, myMessage
assert '7' in myResult, myMessage
[docs] def test_runFloodPopulationImpactFunction(self):
"""Flood function runs in GUI with Jakarta data
Raster on raster based function runs as expected."""
# Push OK with the left mouse button
myButton = DOCK.pbnRunStop
myMessage = 'Run button was not enabled'
assert myButton.isEnabled(), myMessage
myResult, myMessage = setupScenario(
theHazard='A flood in Jakarta like in 2007',
theExposure='Penduduk Jakarta',
theFunction='HKVtest',
theFunctionId='HKVtest')
assert myResult, myMessage
# Enable on-the-fly reprojection
setCanvasCrs(GEOCRS, True)
setJakartaGeoExtent()
# Press RUN
QTest.mouseClick(myButton, QtCore.Qt.LeftButton)
myResult = DOCK.wvResults.page().currentFrame().toPlainText()
# Check that the number is as what was calculated by
# Marco Hartman form HKV
myMessage = 'Result not as expected: %s' % myResult
# This is the expected impact number
assert '2480' in myResult, myMessage
[docs] def test_runFloodPopulationImpactFunction_scaling(self):
"""Flood function runs in GUI with 5x5km population data
Raster on raster based function runs as expected with scaling."""
myResult, myMessage = setupScenario(
theHazard='A flood in Jakarta like in 2007',
theExposure='People',
theFunction='Need evacuation',
theFunctionId='Flood Evacuation Function')
assert myResult, myMessage
# Enable on-the-fly reprojection
setCanvasCrs(GEOCRS, True)
setJakartaGeoExtent()
# Press RUN
myButton = DOCK.pbnRunStop
QTest.mouseClick(myButton, QtCore.Qt.LeftButton)
myResult = DOCK.wvResults.page().currentFrame().toPlainText()
myMessage = 'Result not as expected: %s' % myResult
# Check numbers are OK (within expected errors from resampling)
assert '10484' in myResult, myMessage
assert '977' in myResult, myMessage # These are expected impact number
[docs] def test_runFloodPopulationPolygonHazardImpactFunction(self):
"""Flood function runs in GUI with Jakarta polygon flood hazard data.
Uses population raster exposure layer"""
myResult, myMessage = setupScenario(
theHazard=('A flood in Jakarta'),
theExposure='Penduduk Jakarta',
theFunction='Need evacuation',
theFunctionId='Flood Evacuation Function Vector Hazard')
assert myResult, myMessage
# Enable on-the-fly reprojection
setCanvasCrs(GEOCRS, True)
setJakartaGeoExtent()
# Press RUN
myButton = DOCK.pbnRunStop
QTest.mouseClick(myButton, QtCore.Qt.LeftButton)
myResult = DOCK.wvResults.page().currentFrame().toPlainText()
myMessage = 'Result not as expected: %s' % myResult
# This is the expected number of people needing evacuation
assert '134953000' in myResult, myMessage
[docs] def test_runCategorizedHazardBuildingImpact(self):
"""Flood function runs in GUI with Flood in Jakarta hazard data
Uses DKI buildings exposure data."""
myResult, myMessage = setupScenario(
theHazard='Flood in Jakarta',
theExposure='Essential buildings',
theFunction='Be affected',
theFunctionId='Categorised Hazard Building Impact Function')
assert myResult, myMessage
# Enable on-the-fly reprojection
setCanvasCrs(GEOCRS, True)
setJakartaGeoExtent()
# Press RUN
myButton = DOCK.pbnRunStop
QTest.mouseClick(myButton, QtCore.Qt.LeftButton)
myResult = DOCK.wvResults.page().currentFrame().toPlainText()
myMessage = 'Result not as expected: %s' % myResult
# This is the expected number of building might be affected
assert '535' in myResult, myMessage
assert '453' in myResult, myMessage
assert '436' in myResult, myMessage
[docs] def test_ResultStyling(self):
"""Test that ouputs from a model are correctly styled (colours and
opacity. """
# Push OK with the left mouse button
print '--------------------'
print combosToString(DOCK)
myResult, myMessage = setupScenario(
theHazard=('A flood in Jakarta like in 2007'),
theExposure='People',
theFunction='Need evacuation',
theFunctionId='Flood Evacuation Function')
assert myResult, myMessage
# Enable on-the-fly reprojection
setCanvasCrs(GEOCRS, True)
setJakartaGeoExtent()
# Run manually so we can get the output layer
DOCK.setupCalculator()
myRunner = DOCK.calculator.getRunner()
myRunner.run() # Run in same thread
myEngineImpactLayer = myRunner.impactLayer()
myQgisImpactLayer = DOCK.readImpactLayer(myEngineImpactLayer)
myStyle = myEngineImpactLayer.get_style_info()
#print myStyle
setRasterStyle(myQgisImpactLayer, myStyle)
# simple test for now - we could test explicity for style state
# later if needed.
myMessage = ('Raster layer was not assigned a ColorRampShader'
' as expected.')
assert myQgisImpactLayer.colorShadingAlgorithm() == \
QgsRasterLayer.ColorRampShader, myMessage
# Commenting out because we changed impact function to use floating
# point quantities. Revisit in QGIS 2.0 where range based transparency
# will have been implemented
#myMessage = ('Raster layer was not assigned transparency'
# 'classes as expected.')
#myTransparencyList = (myQgisImpactLayer.rasterTransparency().
# transparentSingleValuePixelList())
#print "Transparency list:" + str(myTransparencyList)
#assert (len(myTransparencyList) > 0)
[docs] def test_Issue47(self):
"""Issue47: Problem when hazard & exposure data are in different
proj to viewport.
See https://github.com/AIFDR/inasafe/issues/47"""
myResult, myMessage = setupScenario(
theHazard='A flood in Jakarta like in 2007',
theExposure='Penduduk Jakarta',
theFunction='HKVtest',
theFunctionId='HKVtest')
assert myResult, myMessage
# Enable on-the-fly reprojection
setCanvasCrs(GOOGLECRS, True)
setJakartaGoogleExtent()
# Press RUN
myButton = DOCK.pbnRunStop
QTest.mouseClick(myButton, QtCore.Qt.LeftButton)
myResult = DOCK.wvResults.page().currentFrame().toPlainText()
myMessage = 'Result not as expected: %s' % myResult
assert '2366' in myResult, myMessage
[docs] def test_issue45(self):
"""Points near the edge of a raster hazard layer are interpolated OK"""
myButton = DOCK.pbnRunStop
setCanvasCrs(GEOCRS, True)
setYogyaGeoExtent()
myMessage = 'Run button was not enabled'
assert myButton.isEnabled(), myMessage
myResult, myMessage = setupScenario(
theHazard='An earthquake in Yogyakarta like in 2006',
theExposure='OSM Building Polygons',
theFunction='Earthquake Guidelines Function',
theFunctionId='Earthquake Guidelines Function')
assert myResult, myMessage
# This is the where nosetest sometims hangs when running the
# guitest suite (Issue #103)
# The QTest.mouseClick call some times never returns when run
# with nosetest, but OK when run normally.
QTest.mouseClick(myButton, QtCore.Qt.LeftButton)
myResult = DOCK.wvResults.page().currentFrame().toPlainText()
# Check that none of these get a NaN value:
assert 'Unknown' in myResult
myMessage = ('Some buildings returned by Earthquake guidelines '
'function '
'had NaN values. Result: \n %s' % myResult)
assert 'Unknown (NaN): 196' not in myResult, myMessage
# FIXME (Ole): A more robust test would be to load the
# result layer and check that all buildings
# have values.
# Tim, how do we get the output filename?
# ANSWER
#DOCK.calculator.impactLayer()
[docs] def test_loadLayers(self):
"""Layers can be loaded and list widget was updated appropriately
"""
myHazardLayerCount, myExposureLayerCount = loadStandardLayers()
myMessage = 'Expect %s layer(s) in hazard list widget but got %s' \
% (myHazardLayerCount, DOCK.cboHazard.count())
# pylint: disable=W0106
self.assertEqual(DOCK.cboHazard.count(),
myHazardLayerCount), myMessage
myMessage = 'Expect %s layer(s) in exposure list widget but got %s' \
% (myExposureLayerCount, DOCK.cboExposure.count())
self.assertEqual(DOCK.cboExposure.count(),
myExposureLayerCount), myMessage
# pylint: disable=W0106
[docs] def test_Issue71(self):
"""Test issue #71 in github - cbo changes should update ok button."""
# See https://github.com/AIFDR/inasafe/issues/71
# Push OK with the left mouse button
print 'Using QGIS: %s' % qgisVersion()
self.tearDown()
myButton = DOCK.pbnRunStop
# First part of scenario should have enabled run
myFileList = [join(HAZDATA,
'Flood_Current_Depth_Jakarta_geographic.asc'),
join(TESTDATA,
'Population_Jakarta_geographic.asc')]
myHazardLayerCount, myExposureLayerCount = loadLayers(myFileList,
theDataDirectory=None)
myMessage = ('Incorrect number of Hazard layers: expected 1 got %s'
% myHazardLayerCount)
assert myHazardLayerCount == 1, myMessage
myMessage = ('Incorrect number of Exposure layers: expected 1 got %s'
% myExposureLayerCount)
assert myExposureLayerCount == 1, myMessage
myMessage = 'Run button was not enabled'
assert myButton.isEnabled(), myMessage
# Second part of scenario - run disabled when adding invalid layer
# and select it - run should be disabled
myFileList = ['issue71.tif'] # This layer has incorrect keywords
myClearFlag = False
myHazardLayerCount, myExposureLayerCount = (
loadLayers(myFileList, myClearFlag))
# set exposure to : Population Density Estimate (5kmx5km)
QTest.keyClick(DOCK.cboExposure, QtCore.Qt.Key_Down)
QTest.keyClick(DOCK.cboExposure, QtCore.Qt.Key_Enter)
myDict = getUiState(DOCK)
myExpectedDict = {'Run Button Enabled': False,
'Impact Function Id': '',
'Impact Function Title': '',
'Hazard': 'A flood in Jakarta like in 2007',
'Exposure': 'Population density (5kmx5km)'}
myMessage = ('Run button was not disabled when exposure set to \n%s'
'\nUI State: \n%s\nExpected State:\n%s\n%s') % (
DOCK.cboExposure.currentText(),
myDict,
myExpectedDict,
combosToString(DOCK))
assert myExpectedDict == myDict, myMessage
# Now select again a valid layer and the run button
# should be enabled
QTest.keyClick(DOCK.cboExposure, QtCore.Qt.Key_Up)
QTest.keyClick(DOCK.cboExposure, QtCore.Qt.Key_Enter)
myMessage = ('Run button was not enabled when exposure set to \n%s' %
DOCK.cboExposure.currentText())
assert myButton.isEnabled(), myMessage
[docs] def test_Issue95(self):
"""Test issue #95 in github -check crs of impact layer."""
# See https://github.com/AIFDR/inasafe/issues/95
# Push OK with the left mouse button
self.tearDown()
myButton = DOCK.pbnRunStop
# First part of scenario should have enabled run
myFileList = [join(HAZDATA,
'Flood_Current_Depth_Jakarta_geographic.asc'),
join(TESTDATA,
'Population_Jakarta_geographic.asc')]
myHazardLayerCount, myExposureLayerCount = loadLayers(myFileList,
theDataDirectory=None)
myMessage = ('Incorrect number of Hazard layers: expected 1 got %s'
% myHazardLayerCount)
assert myHazardLayerCount == 1, myMessage
myMessage = ('Incorrect number of Exposure layers: expected 1 got %s'
% myExposureLayerCount)
assert myExposureLayerCount == 1, myMessage
myMessage = 'Run button was not enabled'
assert myButton.isEnabled(), myMessage
# Second part of scenario - run disables when adding invalid layer
# and select it - run should be disabled
myFileList = ['issue71.tif'] # This layer has incorrect keywords
myClearFlag = False
myHazardLayerCount, myExposureLayerCount = (
loadLayers(myFileList, myClearFlag))
# set exposure to : Population density (5kmx5km)
QTest.keyClick(DOCK.cboExposure, QtCore.Qt.Key_Down)
QTest.keyClick(DOCK.cboExposure, QtCore.Qt.Key_Enter)
myDict = getUiState(DOCK)
myExpectedDict = {'Run Button Enabled': False,
'Impact Function Id': '',
'Impact Function Title': '',
'Hazard': 'A flood in Jakarta like in 2007',
'Exposure': 'Population density (5kmx5km)'}
myMessage = ('Run button was not disabled when exposure set to \n%s'
'\nUI State: \n%s\nExpected State:\n%s\n%s') % (
DOCK.cboExposure.currentText(),
myDict,
myExpectedDict,
combosToString(DOCK))
assert myExpectedDict == myDict, myMessage
# Now select again a valid layer and the run button
# should be enabled
QTest.keyClick(DOCK.cboExposure, QtCore.Qt.Key_Up)
QTest.keyClick(DOCK.cboExposure, QtCore.Qt.Key_Enter)
myMessage = ('Run button was not enabled when exposure set to \n%s' %
DOCK.cboExposure.currentText())
assert myButton.isEnabled(), myMessage
[docs] def test_issue_160(self):
"""Test that multipart features can be used in a scenario - issue #160
"""
myExposure = os.path.join(UNITDATA, 'exposure',
'buildings_osm_4326.shp')
myHazard = os.path.join(UNITDATA, 'hazard',
'multipart_polygons_osm_4326.shp')
# See https://github.com/AIFDR/inasafe/issues/71
# Push OK with the left mouse button
print 'Using QGIS: %s' % qgisVersion()
self.tearDown()
myButton = DOCK.pbnRunStop
# First part of scenario should have enabled run
myFileList = [myHazard, myExposure]
myHazardLayerCount, myExposureLayerCount = loadLayers(myFileList,
theDataDirectory=TESTDATA)
myMessage = ('Incorrect number of Hazard layers: expected 1 got %s'
% myHazardLayerCount)
assert myHazardLayerCount == 1, myMessage
myMessage = ('Incorrect number of Exposure layers: expected 1 got %s'
% myExposureLayerCount)
assert myExposureLayerCount == 1, myMessage
myMessage = 'Run button was not enabled'
assert myButton.isEnabled(), myMessage
# Second part of scenario - run disabled when adding invalid layer
# and select it - run should be disabled
myFileList = ['issue71.tif'] # This layer has incorrect keywords
myClearFlag = False
myHazardLayerCount, myExposureLayerCount = (
loadLayers(myFileList, myClearFlag))
myResult, myMessage = setupScenario(
theHazard='multipart_polygons_osm_4326',
theExposure='buildings_osm_4326',
theFunction='Be flooded',
theFunctionId='Flood Building Impact Function')
assert myResult, myMessage
# Enable on-the-fly reprojection
setCanvasCrs(GEOCRS, True)
IFACE.mapCanvas().setExtent(
QgsRectangle(106.788, -6.193, 106.853, -6.167))
# Press RUN
QTest.mouseClick(myButton, QtCore.Qt.LeftButton)
myResult = DOCK.wvResults.page().currentFrame().toPlainText()
myMessage = 'Result not as expected: %s' % myResult
assert '68' in myResult, myMessage
[docs] def test_state(self):
"""Check if the save/restore state methods work. See also
https://github.com/AIFDR/inasafe/issues/58
"""
QTest.keyClick(DOCK.cboExposure, QtCore.Qt.Key_Up)
QTest.keyClick(DOCK.cboExposure, QtCore.Qt.Key_Enter)
DOCK.saveState()
myExpectedDict = getUiState(DOCK)
#myState = DOCK.state
# Now reset and restore and check that it gets the old state
# Html is not considered in restore test since the ready
# message overwrites it in dock implementation
QTest.keyClick(DOCK.cboExposure, QtCore.Qt.Key_Up)
QTest.keyClick(DOCK.cboExposure, QtCore.Qt.Key_Enter)
DOCK.restoreState()
myResultDict = getUiState(DOCK)
myMessage = 'Got unexpected state: %s\nExpected: %s\n%s' % (
myResultDict, myExpectedDict, combosToString(DOCK))
assert myExpectedDict == myResultDict, myMessage
# Corner case test when two layers can have the
# same functions - when switching layers the selected function should
# remain unchanged
self.tearDown()
myFileList = [join(HAZDATA,
'Flood_Design_Depth_Jakarta_geographic.asc'),
join(HAZDATA,
'Flood_Current_Depth_Jakarta_geographic.asc'),
join(TESTDATA,
'Population_Jakarta_geographic.asc')]
myHazardLayerCount, myExposureLayerCount = loadLayers(myFileList,
theDataDirectory=None)
assert myHazardLayerCount == 2
assert myExposureLayerCount == 1
DOCK.cboHazard.setCurrentIndex(0)
QTest.keyClick(DOCK.cboFunction, QtCore.Qt.Key_Down)
QTest.keyClick(DOCK.cboFunction, QtCore.Qt.Key_Enter)
myExpectedFunction = str(DOCK.cboFunction.currentText())
# Now move down one hazard in the combo then verify
# the function remains unchanged
QTest.keyClick(DOCK.cboHazard, QtCore.Qt.Key_Down)
QTest.keyClick(DOCK.cboHazard, QtCore.Qt.Key_Enter)
myCurrentFunction = str(DOCK.cboFunction.currentText())
myMessage = ('Expected selected impact function to remain unchanged '
'when choosing a different hazard of the same category:'
' %s\nExpected: %s\n%s' % (
myExpectedFunction,
myCurrentFunction,
combosToString(DOCK)))
assert myExpectedFunction == myCurrentFunction, myMessage
QTest.keyClick(DOCK.cboHazard, QtCore.Qt.Key_Down)
QTest.keyClick(DOCK.cboHazard, QtCore.Qt.Key_Enter)
# Selected function should remain the same
myExpectation = 'Need evacuation'
myFunction = DOCK.cboFunction.currentText()
myMessage = 'Expected: %s, Got: %s' % (myExpectation, myFunction)
assert myFunction == myExpectation, myMessage
#FIXME (MB) this is actually wrong, when calling the test directly it works
# in nosetest it fails at the first assert
@expectedFailure
[docs] def test_aggregationResults(self):
"""Aggregation results are correct."""
myRunButton = DOCK.pbnRunStop
myExpectedResult = open(TEST_FILES_DIR +
'/test-aggregation-results.txt',
'r').read()
myResult, myMessage = setupScenario(
theHazard='A flood in Jakarta like in 2007',
theExposure='People',
theFunction='Need evacuation',
theFunctionId='Flood Evacuation Function',
theAggregation='kabupaten jakarta singlepart',
theAggregationEnabledFlag=True)
assert myResult, myMessage
# Enable on-the-fly reprojection
setCanvasCrs(GEOCRS, True)
setJakartaGeoExtent()
# Press RUN
QTest.mouseClick(myRunButton, QtCore.Qt.LeftButton)
DOCK.runtimeKWDialog.accept()
myResult = DOCK.wvResults.page().currentFrame().toPlainText()
myMessage = ('The postprocessing report should be:\n%s\nFound:\n%s' %
(myExpectedResult, myResult))
self.assertEqual(myExpectedResult, myResult, myMessage)
[docs] def test_layerChanged(self):
"""Test the metadata is updated as the user highlights different
QGIS layers. For inasafe outputs, the table of results should be shown
See also
https://github.com/AIFDR/inasafe/issues/58
"""
myLayer, myType = loadLayer('issue58.tif')
myMessage = ('Unexpected category for issue58.tif.\nGot:'
' %s\nExpected: undefined' % myType)
assert myType == 'undefined', myMessage
DOCK.layerChanged(myLayer)
DOCK.saveState()
myHtml = DOCK.state['report']
myExpectedString = '4229'
myMessage = "%s\nDoes not contain:\n%s" % (
myHtml,
myExpectedString)
assert myExpectedString in myHtml, myMessage
[docs] def test_issue317(self):
"""Points near the edge of a raster hazard layer are interpolated OK"""
setCanvasCrs(GEOCRS, True)
setJakartaGeoExtent()
myResult, myMessage = setupScenario(
theHazard='A flood in Jakarta like in 2007',
theExposure='OSM Building Polygons',
theFunction='Be flooded',
theFunctionId='Flood Building Impact Function')
DOCK.getFunctions()
assert myResult, myMessage
[docs] def Xtest_runnerExceptions(self):
"""Test runner exceptions"""
myRunButton = DOCK.pbnRunStop
myResult, myMessage = setupScenario(
theHazard='A flood in Jakarta like in 2007',
theExposure='People',
theFunction='Exception riser',
theFunctionId='Exception Raising Impact Function',
theAggregationEnabledFlag=True)
assert myResult, myMessage
# Enable on-the-fly reprojection
setCanvasCrs(GEOCRS, True)
setJakartaGeoExtent()
# Press RUN
QTest.mouseClick(myRunButton, QtCore.Qt.LeftButton)
# DOCK.runtimeKWDialog.accept()
myExpectedResult = """Error:
An exception occurred when calculating the results
Problem:
Exception : AHAHAH I got you
Click for Diagnostic Information:
"""
myResult = DOCK.wvResults.page().currentFrame().toPlainText()
myMessage = ('The result message should be:\n%s\nFound:\n%s' %
(myExpectedResult, myResult))
self.assertEqual(myExpectedResult, myResult, myMessage)
[docs] def Xtest_runnerIsNone(self):
"""Test for none runner exceptions"""
myRunButton = DOCK.pbnRunStop
myResult, myMessage = setupScenario(
theHazard='A flood in Jakarta like in 2007',
theExposure='People',
theFunction='None returner',
theFunctionId='None Returning Impact Function',
theAggregationEnabledFlag=True)
assert myResult, myMessage
# Enable on-the-fly reprojection
setCanvasCrs(GEOCRS, True)
setJakartaGeoExtent()
# Press RUN
QTest.mouseClick(myRunButton, QtCore.Qt.LeftButton)
# DOCK.runtimeKWDialog.accept()
myExpectedResult = """Error:
An exception occurred when calculating the results
Problem:
AttributeError : 'NoneType' object has no attribute 'keywords'
Click for Diagnostic Information:
"""
myResult = DOCK.wvResults.page().currentFrame().toPlainText()
myMessage = ('The result message should be:\n%s\nFound:\n%s' %
(myExpectedResult, myResult))
self.assertEqual(myExpectedResult, myResult, myMessage)
if __name__ == '__main__':
suite = unittest.makeSuite(DockTest, 'test')
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)