def test_fullRunResults(self): """Aggregation results are correct.""" myExpectedResult = open( TEST_FILES_DIR + '/test-full-run-results.txt', 'r').read() myResult, myMessage = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='People', function='Need evacuation', function_id='Flood Evacuation Function', aggregation_layer='kabupaten jakarta singlepart', aggregation_enabled_flag=True) assert myResult, myMessage # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # Press RUN # noinspection PyCallByClass,PyTypeChecker DOCK.accept() DOCK.runtimeKeywordsDialog.accept() myResult = DOCK.wvResults.page_to_text() myMessage = ('The aggregation report should be:\n%s\n\nFound:\n\n%s' % (myExpectedResult, myResult)) self.assertEqual(myResult, myExpectedResult, myMessage)
def test_runCategorisedHazardPopulationImpactFunction(self): """Flood function runs in GUI with Flood in Jakarta hazard data Uses Penduduk Jakarta as exposure data.""" myResult, myMessage = setup_scenario( DOCK, hazard='Flood in Jakarta', exposure='Penduduk Jakarta', function='Be impacted', function_id='Categorised Hazard Population Impact Function') assert myResult, myMessage # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # Press RUN DOCK.accept() myResult = DOCK.wvResults.page_to_text() myMessage = 'Result not as expected: %s' % myResult # This is the expected number of population might be affected assert format_int(30938000) in myResult, myMessage assert format_int(68280000) in myResult, myMessage assert format_int(157551000) in myResult, myMessage
def Xtest_printMap(self): """Test print map, especially on Windows.""" myResult, myMessage = setup_scenario( DOCK, hazard='Flood in Jakarta', exposure='Essential buildings', function='Be affected', function_id='Categorised Hazard Building Impact Function') assert myResult, myMessage # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # Press RUN myButton = DOCK.pbnRunStop # noinspection PyCallByClass,PyTypeChecker QTest.mouseClick(myButton, QtCore.Qt.LeftButton) printButton = DOCK.pbnPrint try: # noinspection PyCallByClass,PyTypeChecker QTest.mouseClick(printButton, QtCore.Qt.LeftButton) except OSError: LOGGER.debug('OSError') # pass except Exception, e: raise Exception('Exception is not expected, %s' % e)
def test_post_processor_output(self): """Check that the post processor does not add spurious report rows.""" # with KAB_NAME aggregation attribute defined in .keyword using # kabupaten_jakarta_singlepart.shp result, message = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='People', function='Need evacuation', function_id='Flood Evacuation Function') # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() assert result, message # Press RUN DOCK.accept() message = 'Spurious 0 filled rows added to post processing report.' result = DOCK.wvResults.page().currentFrame().toPlainText() for line in result.split('\n'): if 'Entire area' in line: tokens = str(line).split('\t') tokens = tokens[1:] total = 0 for token in tokens: total += float(token.replace(',', '.')) assert total != 0, message
def Xtest_runnerIsNone(self): """Test for none runner exceptions""" myResult, myMessage = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='People', function='None returner', function_id='None Returning Impact Function', aggregation_enabled_flag=True) assert myResult, myMessage # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # Press RUN # noinspection PyCallByClass,PyTypeChecker DOCK.accept() # DOCK.runtimeKeywordsDialog.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_to_text() myMessage = ('The result message should be:\n%s\nFound:\n%s' % (myExpectedResult, myResult)) self.assertEqual(myExpectedResult, myResult, myMessage)
def test_runFloodPopulationImpactFunction_scaling(self): """Flood function runs in GUI with 5x5km population data Raster on raster based function runs as expected with scaling.""" result, message = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='People', function='Need evacuation', function_id='Flood Evacuation Function') self.assertTrue(result, message) # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # Press RUN button = DOCK.pbnRunStop button.click() result = DOCK.wvResults.page_to_text() message = 'Result not as expected: %s' % result # Check numbers are OK (within expected errors from resampling) # These are expected impact number self.assertTrue(format_int(10473000) in result, message) self.assertTrue(format_int(978000) in result, message)
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 = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='Penduduk Jakarta', function='HKVtest', function_id='HKVtest') assert myResult, myMessage # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # Press RUN DOCK.accept() myResult = DOCK.wvResults.page_to_text() # 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 format_int(2480) in myResult, myMessage
def test_check_aggregation_single_attribute(self): """Aggregation attribute is chosen correctly when there is only one attr available.""" file_list = ['kabupaten_jakarta_singlepart_1_good_attr.shp'] # add additional layers load_layers(file_list, clear_flag=False) attribute_key = get_defaults('AGGR_ATTR_KEY') # with 1 good aggregation attribute using # kabupaten_jakarta_singlepart_1_good_attr.shp result, message = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='People', function_id='Flood Evacuation Function', aggregation_layer='kabupaten jakarta singlepart 1 good attr') set_jakarta_extent(dock=DOCK) assert result, message # Press RUN # noinspection PyCallByClass,PyTypeChecker DOCK.accept() DOCK.runtime_keywords_dialog.accept() print attribute_key print DOCK.aggregator.attributes attribute = DOCK.aggregator.attributes[attribute_key] message = ('The aggregation should be KAB_NAME. Found: %s' % attribute) self.assertEqual(attribute, 'KAB_NAME', message)
def test_fullRunResults(self): """Aggregation results are correct.""" myExpectedResult = open(TEST_FILES_DIR + '/test-full-run-results.txt', 'r').read() myResult, myMessage = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='People', function='Need evacuation', function_id='Flood Evacuation Function', aggregation_layer='kabupaten jakarta singlepart', aggregation_enabled_flag=True) assert myResult, myMessage # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # Press RUN # noinspection PyCallByClass,PyTypeChecker DOCK.accept() DOCK.runtimeKeywordsDialog.accept() myResult = DOCK.wvResults.page_to_text() myMessage = ('The aggregation report should be:\n%s\n\nFound:\n\n%s' % (myExpectedResult, myResult)) self.assertEqual(myResult, myExpectedResult, myMessage)
def test_runCategorizedHazardBuildingImpact(self): """Flood function runs in GUI with Flood in Jakarta hazard data Uses DKI buildings exposure data.""" myResult, myMessage = setup_scenario( DOCK, hazard='Flood in Jakarta', exposure='Essential buildings', function='Be affected', function_id='Categorised Hazard Building Impact Function') assert myResult, myMessage # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # Press RUN DOCK.accept() myResult = DOCK.wvResults.page_to_text() myMessage = 'Result not as expected: %s' % myResult # This is the expected number of building might be affected assert format_int(535) in myResult, myMessage assert format_int(453) in myResult, myMessage assert format_int(436) in myResult, myMessage
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 = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='People', function='Need evacuation', function_id='Flood Evacuation Function') assert myResult, myMessage # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # Press RUN myButton = DOCK.pbnRunStop # noinspection PyCallByClass,PyTypeChecker QTest.mouseClick(myButton, QtCore.Qt.LeftButton) myResult = DOCK.wvResults.page_to_text() myMessage = 'Result not as expected: %s' % myResult # Check numbers are OK (within expected errors from resampling) # These are expected impact number assert format_int(10484) in myResult, myMessage assert format_int(977) in myResult, myMessage
def Xtest_runnerExceptions(self): """Test runner exceptions""" result, message = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='People', function='Exception riser', function_id='Exception Raising Impact Function', aggregation_enabled_flag=True) self.assertTrue(result, message) # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # Press RUN # noinspection PyCallByClass,PyTypeChecker DOCK.accept() # DOCK.runtime_keywords_dialog.accept() expected_result = """Error: An exception occurred when calculating the results Problem: Exception : AHAHAH I got you Click for Diagnostic Information: """ result = DOCK.wvResults.page_to_text() message = ( 'The result message should be:\n%s\nFound:\n%s' % (expected_result, result)) self.assertEqual(expected_result, result, message)
def setUp(self): """Fixture run before all tests""" self.maxDiff = None # show full diff for assert errors os.environ['LANG'] = 'en' DOCK.show_only_visible_layers_flag = True load_standard_layers() DOCK.cboHazard.setCurrentIndex(0) DOCK.cboExposure.setCurrentIndex(0) DOCK.cboFunction.setCurrentIndex(0) DOCK.run_in_thread_flag = False DOCK.show_only_visible_layers_flag = False DOCK.set_layer_from_title_flag = False DOCK.zoom_to_impact_flag = False DOCK.hide_exposure_flag = False DOCK.show_intermediate_layers = False set_jakarta_extent() self._keywordIO = KeywordIO() self._defaults = breakdown_defaults() # Set extent as Jakarta extent geo_crs = QgsCoordinateReferenceSystem() geo_crs.createFromSrid(4326) self.extent = extent_to_geo_array(CANVAS.extent(), geo_crs)
def test_full_run_pyzstats(self): """Aggregation results correct using our own python zonal stats code. """ file_list = ['kabupaten_jakarta.shp'] load_layers(file_list, clear_flag=False, data_directory=BOUNDDATA) result, message = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='People', function='Need evacuation', function_id='Flood Evacuation Function', aggregation_layer='kabupaten jakarta', aggregation_enabled_flag=True) self.assertTrue(result, message) # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # Press RUN # noinspection PyCallByClass,PyTypeChecker DOCK.accept() result = DOCK.wvResults.page_to_text() expected_result = open( TEST_FILES_DIR + '/test-full-run-results.txt', 'r').readlines() result = result.replace( '</td> <td>', ' ').replace('</td><td>', ' ') for line in expected_result: line = line.replace('\n', '') self.assertIn(line, result)
def test_check_aggregation_single_attribute(self): """Aggregation attribute is chosen correctly when there is only one attr available.""" file_list = ['kabupaten_jakarta_singlepart_1_good_attr.shp'] # add additional layers load_layers(file_list, clear_flag=False) attribute_key = get_defaults('AGGR_ATTR_KEY') # with 1 good aggregation attribute using # kabupaten_jakarta_singlepart_1_good_attr.shp result, message = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='People', function_id='Flood Evacuation Function', aggregation_layer='kabupaten jakarta singlepart 1 good attr') set_jakarta_extent(dock=DOCK) assert result, message # Press RUN # noinspection PyCallByClass,PyTypeChecker DOCK.accept() DOCK.runtime_keywords_dialog.accept() print attribute_key print DOCK.aggregator.attributes attribute = DOCK.aggregator.attributes[attribute_key] message = ( 'The aggregation should be KAB_NAME. Found: %s' % attribute) self.assertEqual(attribute, 'KAB_NAME', message)
def test_postProcessorOutput(self): """Check that the post processor does not add spurious report rows.""" myRunButton = DOCK.pbnRunStop # with KAB_NAME aggregation attribute defined in .keyword using # kabupaten_jakarta_singlepart.shp myResult, myMessage = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='People', function='Need evacuation', function_id='Flood Evacuation Function') # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() assert myResult, myMessage # Press RUN # noinspection PyCallByClass,PyTypeChecker QTest.mouseClick(myRunButton, QtCore.Qt.LeftButton) myMessage = 'Spurious 0 filled rows added to post processing report.' myResult = DOCK.wvResults.page().currentFrame().toPlainText() for line in myResult.split('\n'): if 'Entire area' in line: myTokens = str(line).split('\t') myTokens = myTokens[1:] mySum = 0 for myToken in myTokens: mySum += float(myToken.replace(',', '.')) assert mySum != 0, myMessage
def test_post_processor_output(self): """Check that the post processor does not add spurious report rows.""" # with KAB_NAME aggregation attribute defined in .keyword using # kabupaten_jakarta_singlepart.shp result, message = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='People', function_id='Flood Evacuation Function') # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() assert result, message # Press RUN DOCK.accept() message = 'Spurious 0 filled rows added to post processing report.' result = DOCK.wvResults.page().currentFrame().toPlainText() for line in result.split('\n'): if 'Entire area' in line: tokens = str(line).split('\t') tokens = tokens[1:] total = 0 for token in tokens: total += float(token.replace(',', '.')) assert total != 0, message
def test_runCategorisedHazardPopulationImpactFunction(self): """Flood function runs in GUI with Flood in Jakarta hazard data Uses Penduduk Jakarta as exposure data.""" result, message = setup_scenario( DOCK, hazard='Flood in Jakarta', exposure='Penduduk Jakarta', function='Be impacted', function_id='Categorised Hazard Population Impact Function') self.assertTrue(result, message) # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # Press RUN DOCK.accept() result = DOCK.wvResults.page_to_text() message = ('Result not as expected: %s' % result) # This is the expected number of population might be affected self.assertTrue(format_int(30938000) in result, message) # high #self.assertTrue(format_int(68280000) in result, message) #self.assertTrue(format_int(157551000) in result, message) # The 2 asserts above are not valid anymore after the fix we made to # CategorisedHazardPopulationImpactFunction # Look at the fix here: # (https://github.com/AIFDR/inasafe/commit/aa5b3d72145c031c91f4d101b830 # 8228915c248d#diff-378093670f4ebd60b4487af9b7c2e164) # New Asserts self.assertTrue(format_int(0) in result, message) # medium self.assertTrue(format_int(256769000) in result, message) # low
def test_save_scenario(self): """Test saving Current scenario.""" result, message = setup_scenario( DOCK, hazard='Flood in Jakarta', exposure='Penduduk Jakarta', function='Be impacted', function_id='Categorised Hazard Population Impact Function') self.assertTrue(result, message) # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # create unique file scenario_file = unique_filename( prefix='scenarioTest', suffix='.txt', dir=temp_dir('test')) self.save_scenario_dialog.save_scenario( scenario_file_path=scenario_file) with open(scenario_file) as f: data = f.readlines() title = data[0][:-1] exposure = data[1][:-1] hazard = data[2][:-1] function = data[3][:-1] extent = data[4][:-1] self.assertTrue( os.path.exists(scenario_file), 'File %s does not exist' % scenario_file) self.assertTrue(title == '[Flood in Jakarta]', 'Title is not the same') self.assertTrue( exposure.startswith('exposure =') and exposure.endswith( 'Population_Jakarta_geographic.asc'), 'Exposure is not the same') self.assertTrue( hazard.startswith('hazard =') and hazard.endswith( 'jakarta_flood_category_123.asc'), 'Hazard is not the same') self.assertTrue( function == ( 'function = Categorised Hazard Population Impact Function'), 'Impact function is not same') # TODO: figure out why this changed between releases if qgis_version() < 20400: # For QGIS 2.0 expected_extent = ( 'extent = 106.313333, -6.380000, 107.346667, -6.070000') self.assertEqual(expected_extent, extent) else: # for QGIS 2.4 expected_extent = ( 'extent = 106.287500, -6.380000, 107.372500, -6.070000') self.assertEqual(expected_extent, expected_extent)
def test_save_scenario(self): """Test saving Current scenario.""" result, message = setup_scenario( DOCK, hazard='Flood in Jakarta', exposure='Penduduk Jakarta', function='Be impacted', function_id='Categorised Hazard Population Impact Function') self.assertTrue(result, message) # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent(dock=DOCK) # create unique file scenario_file = unique_filename( prefix='scenarioTest', suffix='.txt', dir=temp_dir('test')) self.save_scenario_dialog.save_scenario( scenario_file_path=scenario_file) with open(scenario_file) as f: data = f.readlines() title = data[0][:-1] exposure = data[1][:-1] hazard = data[2][:-1] function = data[3][:-1] extent = data[4][:-1] self.assertTrue( os.path.exists(scenario_file), 'File %s does not exist' % scenario_file) self.assertTrue(title == '[Flood in Jakarta]', 'Title is not the same') self.assertTrue( exposure.startswith('exposure =') and exposure.endswith( 'Population_Jakarta_geographic.asc'), 'Exposure is not the same') self.assertTrue( hazard.startswith('hazard =') and hazard.endswith( 'jakarta_flood_category_123.asc'), 'Hazard is not the same') self.assertTrue( function == ( 'function = Categorised Hazard Population Impact Function'), 'Impact function is not same') # TODO: figure out why this changed between releases if qgis_version() < 20400: # For QGIS 2.0 expected_extent = ( 'extent = 106.313333, -6.380000, 107.346667, -6.070000') self.assertEqual(expected_extent, extent) else: # for QGIS 2.4 expected_extent = ( 'extent = 106.287500, -6.380000, 107.372500, -6.070000') self.assertEqual(expected_extent, expected_extent)
def test_issue317(self): """Points near the edge of a raster hazard layer are interpolated OK""" set_canvas_crs(GEOCRS, True) set_jakarta_extent() myResult, myMessage = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='OSM Building Polygons', function='Be flooded', function_id='Flood Building Impact Function') DOCK.get_functions() assert myResult, myMessage
def test_hasParametersButtonEnabled(self): """Function configuration button is enabled when layers are compatible. """ set_canvas_crs(GEOCRS, True) set_jakarta_extent() setup_scenario(DOCK, hazard='A flood in Jakarta like in 2007', exposure='Penduduk Jakarta', function='Need evacuation', function_id='Flood Evacuation Function') myToolButton = DOCK.toolFunctionOptions myFlag = myToolButton.isEnabled() assert myFlag, 'Expected configuration options button to be enabled'
def test_hasParametersButtonEnabled(self): """Function configuration button is enabled when layers are compatible. """ set_canvas_crs(GEOCRS, True) set_jakarta_extent() setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='Penduduk Jakarta', function='Need evacuation', function_id='Flood Evacuation Function') myToolButton = DOCK.toolFunctionOptions myFlag = myToolButton.isEnabled() assert myFlag, 'Expected configuration options button to be enabled'
def Xtest_extentsChanged(self): """Memory requirements are calculated correctly when extents change. """ set_canvas_crs(GEOCRS, True) set_jakarta_extent() setup_scenario(DOCK, hazard='A flood in Jakarta like in 2007', exposure='Penduduk Jakarta', function='Need evacuation', function_id='Flood Evacuation Function') myResult = DOCK.checkMemoryUsage() myMessage = 'Expected "3mb" to apear in : %s' % myResult assert myResult is not None, 'Check memory reported None' assert '3mb' in myResult, myMessage
def Xtest_renderTemplate(self): """Test that load template works""" # Use the template from our resources bundle myInPath = ":/plugins/inasafe/basic.qpt" myLayer, _ = load_layer("test_shakeimpact.shp") myCanvasLayer = QgsMapCanvasLayer(myLayer) CANVAS.setLayerSet([myCanvasLayer]) myMap = Map(IFACE) set_jakarta_extent() myMap.set_impact_layer(myLayer) myPath = unique_filename(prefix="outTemplate", suffix=".pdf", dir=temp_dir("test")) LOGGER.debug(myPath) myMap.render_template(myInPath, myPath) assert os.path.exists(myPath)
def setUp(self): """Fixture run before all tests""" os.environ['LANG'] = 'en' DOCK.showOnlyVisibleLayersFlag = True load_standard_layers() 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.showIntermediateLayers = False set_jakarta_extent()
def Xtest_extentsChanged(self): """Memory requirements are calculated correctly when extents change. """ set_canvas_crs(GEOCRS, True) set_jakarta_extent() setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='Penduduk Jakarta', function='Need evacuation', function_id='Flood Evacuation Function') myResult = DOCK.checkMemoryUsage() myMessage = 'Expected "3mb" to apear in : %s' % myResult assert myResult is not None, 'Check memory reported None' assert '3mb' in myResult, myMessage
def setUp(self): """Fixture run before all tests""" os.environ['LANG'] = 'en' DOCK.show_only_visible_layers_flag = True load_standard_layers() DOCK.cboHazard.setCurrentIndex(0) DOCK.cboExposure.setCurrentIndex(0) DOCK.cboFunction.setCurrentIndex(0) DOCK.run_in_thread_flag = False DOCK.show_only_visible_layers_flag = False DOCK.set_layer_from_title_flag = False DOCK.zoom_to_impact_flag = False DOCK.hide_exposure_flag = False DOCK.show_intermediate_layers = False set_jakarta_extent()
def setUp(self): """Fixture run before all tests""" os.environ['LANG'] = 'en' DOCK.show_only_visible_layers_flag = True load_standard_layers(DOCK) DOCK.cboHazard.setCurrentIndex(0) DOCK.cboExposure.setCurrentIndex(0) DOCK.cboFunction.setCurrentIndex(0) DOCK.run_in_thread_flag = False DOCK.show_only_visible_layers_flag = False DOCK.set_layer_from_title_flag = False DOCK.zoom_to_impact_flag = False DOCK.hide_exposure_flag = False DOCK.show_intermediate_layers = False set_jakarta_extent()
def test_full_run_qgszstats(self): """Aggregation results are correct using native QGIS zonal stats. .. note:: We know this is going to fail (hence the decorator) as QGIS1.8 zonal stats are broken. We expect this to pass when we have ported to the QGIS 2.0 api at which time we can remove the decorator. TS July 2013 """ # TODO check that the values are similar enough to the python stats file_list = ['kabupaten_jakarta.shp'] load_layers(file_list, clear_flag=False, data_directory=BOUNDDATA) result, message = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='People', function='Need evacuation', function_id='Flood Evacuation Function', aggregation_layer='kabupaten jakarta', aggregation_enabled_flag=True) self.assertTrue(result, message) # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # Press RUN # noinspection PyCallByClass,PyTypeChecker # use QGIS zonal stats only in the test qgis_zonal_flag = bool(QtCore.QSettings().value( 'inasafe/use_native_zonal_stats', False, type=bool)) QtCore.QSettings().setValue('inasafe/use_native_zonal_stats', True) DOCK.accept() QtCore.QSettings().setValue('inasafe/use_native_zonal_stats', qgis_zonal_flag) result = DOCK.wvResults.page_to_text() expected_result = open( TEST_FILES_DIR + '/test-full-run-results-qgis.txt', 'rb').readlines() result = result.replace( '</td> <td>', ' ').replace('</td><td>', ' ') for line in expected_result: line = line.replace('\n', '') self.assertIn(line, result)
def test_vectorProjections(self): """Test that vector input data is reprojected properly during clip""" # Input data is OSM in GOOGLE CRS # We are reprojecting to GEO and expecting the output shp to be in GEO # see https://github.com/AIFDR/inasafe/issues/119 # and https://github.com/AIFDR/inasafe/issues/95 myVectorLayer = QgsVectorLayer(VECTOR_PATH2, 'OSM Buildings', 'ogr') message = 'Failed to load osm buildings' assert myVectorLayer is not None, message assert myVectorLayer.isValid() set_canvas_crs(GEOCRS, True) set_jakarta_extent() myClipRect = [106.52, -6.38, 107.14, -6.07] # Clip the vector to the bbox myResult = clip_layer(myVectorLayer, myClipRect) assert (os.path.exists(myResult.source()))
def test_check_postprocessing_layers_visibility(self): """Generated layers are not added to the map registry.""" # Explicitly disable showing intermediate layers DOCK.show_intermediate_layers = False # with KAB_NAME aggregation attribute defined in .keyword using # kabupaten_jakarta_singlepart.shp result, message = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='People', function_id='Flood Evacuation Function', aggregation_layer='kabupaten jakarta singlepart') set_jakarta_extent(dock=DOCK) assert result, message # LOGGER.info("Registry list before:\n%s" % # QgsMapLayerRegistry.instance().mapLayers()) # one layer (the impact) should have been added expected_count = len(CANVAS.layers()) + 1 # # Press RUN DOCK.accept() # no KW dialog will popuo due to complete keywords after_count = len(CANVAS.layers()) # LOGGER.info("Registry list after:\n%s" % # QgsMapLayerRegistry.instance().mapLayers()) message = ( 'Expected %s items in canvas, got %s' % (expected_count, after_count)) assert expected_count == after_count, message # Now run again showing intermediate layers DOCK.show_intermediate_layers = True # Press RUN DOCK.accept() # no KW dialog will popup due to complete keywords # one layer (the impact) should have been added expected_count += 2 after_count = len(CANVAS.layers()) LOGGER.info("Canvas list after:\n %s" % canvas_list()) message = ( 'Expected %s items in canvas, got %s' % (expected_count, after_count)) # We expect two more since we enabled showing intermediate layers assert expected_count == after_count, message
def Xtest_renderTemplate(self): """Test that load template works""" #Use the template from our resources bundle myInPath = ':/plugins/inasafe/basic.qpt' myLayer, _ = load_layer('test_shakeimpact.shp') myCanvasLayer = QgsMapCanvasLayer(myLayer) CANVAS.setLayerSet([myCanvasLayer]) myMap = Map(IFACE) set_jakarta_extent() myMap.set_impact_layer(myLayer) myPath = unique_filename(prefix='outTemplate', suffix='.pdf', dir=temp_dir('test')) LOGGER.debug(myPath) myMap.render_template(myInPath, myPath) assert os.path.exists(myPath)
def test_vector_projections(self): """Test that vector input data is reprojected properly during clip.""" # Input data is OSM in GOOGLE CRS # We are reprojecting to GEO and expecting the output shp to be in GEO # see https://github.com/AIFDR/inasafe/issues/119 # and https://github.com/AIFDR/inasafe/issues/95 vector_layer = QgsVectorLayer( VECTOR_PATH2, 'OSM Buildings', 'ogr') message = 'Failed to load osm buildings' assert vector_layer is not None, message assert vector_layer.isValid() set_canvas_crs(GEOCRS, True) set_jakarta_extent() clip_rectangle = [106.52, -6.38, 107.14, -6.07] # Clip the vector to the bbox result = clip_layer(vector_layer, clip_rectangle) assert(os.path.exists(result.source()))
def test_check_postprocessing_layers_visibility(self): """Generated layers are not added to the map registry.""" # Explicitly disable showing intermediate layers DOCK.show_intermediate_layers = False # with KAB_NAME aggregation attribute defined in .keyword using # kabupaten_jakarta_singlepart.shp result, message = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='People', function_id='Flood Evacuation Function', aggregation_layer='kabupaten jakarta singlepart') set_jakarta_extent(dock=DOCK) assert result, message # LOGGER.info("Registry list before:\n%s" % # QgsMapLayerRegistry.instance().mapLayers()) # one layer (the impact) should have been added expected_count = len(CANVAS.layers()) + 1 # # Press RUN DOCK.accept() # no KW dialog will popuo due to complete keywords after_count = len(CANVAS.layers()) # LOGGER.info("Registry list after:\n%s" % # QgsMapLayerRegistry.instance().mapLayers()) message = ('Expected %s items in canvas, got %s' % (expected_count, after_count)) assert expected_count == after_count, message # Now run again showing intermediate layers DOCK.show_intermediate_layers = True # Press RUN DOCK.accept() # no KW dialog will popup due to complete keywords # one layer (the impact) should have been added expected_count += 2 after_count = len(CANVAS.layers()) LOGGER.info("Canvas list after:\n %s" % canvas_list()) message = ('Expected %s items in canvas, got %s' % (expected_count, after_count)) # We expect two more since we enabled showing intermediate layers assert expected_count == after_count, message
def test_clipVectorHard(self): """Vector layers can be hard clipped. Hard clipping will remove any dangling, non intersecting elements. """ myVectorLayer = QgsVectorLayer(VECTOR_PATH3, 'OSM Buildings', 'ogr') message = 'Failed to load osm buildings' assert myVectorLayer is not None, message assert myVectorLayer.isValid() set_canvas_crs(GEOCRS, True) set_jakarta_extent() myClipRect = [106.8218, -6.1842, 106.8232, -6.1830] # Clip the vector to the bbox myResult = clip_layer(myVectorLayer, myClipRect, hard_clip_flag=True) # Check the output is valid assert (os.path.exists(myResult.source()))
def test_clip_vector_hard(self): """Vector layers can be hard clipped. Hard clipping will remove any dangling, non intersecting elements. """ vector_layer = QgsVectorLayer( VECTOR_PATH3, 'OSM Buildings', 'ogr') message = 'Failed to load osm buildings' assert vector_layer is not None, message assert vector_layer.isValid() set_canvas_crs(GEOCRS, True) set_jakarta_extent() clip_rectangle = [106.8218, -6.1842, 106.8232, -6.1830] # Clip the vector to the bbox result = clip_layer(vector_layer, clip_rectangle, hard_clip_flag=True) # Check the output is valid assert(os.path.exists(result.source()))
def test_preprocessing(self): """Preprocessing results are correct. TODO - this needs to be fixed post dock refactor. """ # See qgis project in test data: vector_preprocessing_test.qgs #add additional layers file_list = ['jakarta_crosskabupaten_polygons.shp'] load_layers(file_list, clear_flag=False) file_list = ['kabupaten_jakarta.shp'] load_layers(file_list, clear_flag=False, data_directory=BOUNDDATA) result, message = setup_scenario( DOCK, hazard='jakarta_crosskabupaten_polygons', exposure='People', function='Need evacuation', function_id='Flood Evacuation Function Vector Hazard', aggregation_layer='kabupaten jakarta', aggregation_enabled_flag=True) assert result, message # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # Press RUN DOCK.accept() DOCK.runtime_keywords_dialog.accept() expected_feature_count = 20 message = ( 'The preprocessing should have generated %s features, ' 'found %s' % ( expected_feature_count, DOCK.aggregator.preprocessed_feature_count)) self.assertEqual( expected_feature_count, DOCK.aggregator.preprocessed_feature_count, message)
def test_preprocessing(self): """Preprocessing results are correct. TODO - this needs to be fixed post dock refactor. """ # See qgis project in test data: vector_preprocessing_test.qgs #add additional layers myFileList = ['jakarta_crosskabupaten_polygons.shp'] load_layers(myFileList, clear_flag=False, data_directory=TESTDATA) myFileList = ['kabupaten_jakarta.shp'] load_layers(myFileList, clear_flag=False, data_directory=BOUNDDATA) myRunButton = DOCK.pbnRunStop myResult, myMessage = setup_scenario( DOCK, hazard='jakarta_crosskabupaten_polygons', exposure='People', function='Need evacuation', function_id='Flood Evacuation Function Vector Hazard', aggregation_layer='kabupaten jakarta', aggregation_enabled_flag=True) assert myResult, myMessage # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # Press RUN # noinspection PyTypeChecker,PyCallByClass QTest.mouseClick(myRunButton, QtCore.Qt.LeftButton) DOCK.runtimeKeywordsDialog.accept() myExpectedFeatureCount = 20 myMessage = ('The preprocessing should have generated %s features, ' 'found %s' % (myExpectedFeatureCount, DOCK.aggregator.preprocessedFeatureCount)) self.assertEqual(myExpectedFeatureCount, DOCK.aggregator.preprocessedFeatureCount, myMessage)
def setUp(self): """Fixture run before all tests""" self.maxDiff = None # show full diff for assert errors os.environ['LANG'] = 'en' DOCK.show_only_visible_layers_flag = True load_standard_layers() DOCK.cboHazard.setCurrentIndex(0) DOCK.cboExposure.setCurrentIndex(0) DOCK.cboFunction.setCurrentIndex(0) DOCK.run_in_thread_flag = False DOCK.show_only_visible_layers_flag = False DOCK.set_layer_from_title_flag = False DOCK.zoom_to_impact_flag = False DOCK.hide_exposure_flag = False DOCK.show_intermediate_layers = False set_jakarta_extent() self.keywordIO = KeywordIO() self.defaults = breakdown_defaults()
def setUp(self): """Fixture run before all tests""" self.maxDiff = None # show full diff for assert errors os.environ['LANG'] = 'en' DOCK.show_only_visible_layers_flag = True load_standard_layers() DOCK.cboHazard.setCurrentIndex(0) DOCK.cboExposure.setCurrentIndex(0) DOCK.cboFunction.setCurrentIndex(0) DOCK.run_in_thread_flag = False DOCK.show_only_visible_layers_flag = False DOCK.set_layer_from_title_flag = False DOCK.zoom_to_impact_flag = False DOCK.hide_exposure_flag = False DOCK.show_intermediate_layers = False set_jakarta_extent() self._keywordIO = KeywordIO() self._defaults = breakdown_defaults()
def setUp(self): """Fixture run before all tests""" self.maxDiff = None # show full diff for assert errors os.environ['LANG'] = 'en' DOCK.showOnlyVisibleLayersFlag = True load_standard_layers() 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.showIntermediateLayers = False set_jakarta_extent() self.keywordIO = KeywordIO() self.defaults = defaults()
def setUp(self): """Fixture run before all tests""" self.maxDiff = None # show full diff for assert errors os.environ['LANG'] = 'en' DOCK.showOnlyVisibleLayersFlag = True load_standard_layers() 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.showIntermediateLayers = False set_jakarta_extent() self.keywordIO = KeywordIO() self.defaults = breakdown_defaults()
def test_aggregation_attribute_in_keywords(self): """Aggregation attribute is chosen correctly when present in keywords. """ attribute_key = get_defaults('AGGR_ATTR_KEY') # with KAB_NAME aggregation attribute defined in .keyword using # kabupaten_jakarta_singlepart.shp result, message = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='People', function_id='Flood Evacuation Function', aggregation_layer='kabupaten jakarta singlepart', aggregation_enabled_flag=True) set_jakarta_extent(dock=DOCK) assert result, message # Press RUN DOCK.accept() DOCK.runtime_keywords_dialog.accept() attribute = DOCK.aggregator.attributes[attribute_key] message = ('The aggregation should be KAB_NAME. Found: %s' % attribute) self.assertEqual(attribute, 'KAB_NAME', message)
def test_saveCurrentScenario(self): """Test saving Current scenario """ myResult, myMessage = setup_scenario( DOCK, hazard='Flood in Jakarta', exposure='Penduduk Jakarta', function='Be impacted', function_id='Categorised Hazard Population Impact Function') assert myResult, myMessage # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # create unique file myScenarioFile = unique_filename(prefix='scenarioTest', suffix='.txt', dir=temp_dir('test')) DOCK.save_current_scenario(theScenarioFilePath=myScenarioFile) with open(myScenarioFile, 'rt') as f: data = f.readlines() myTitle = data[0][:-1] myExposure = data[1][:-1] myHazard = data[2][:-1] myFunction = data[3][:-1] myExtent = data[4][:-1] assert os.path.exists(myScenarioFile), \ 'File %s does not exist' % myScenarioFile assert myTitle == '[Flood in Jakarta]', 'Title is not the same' assert myExposure.startswith('exposure =') and myExposure.endswith( 'Population_Jakarta_geographic.asc'), 'Exposure is not the same' assert myHazard.startswith('hazard =') and myHazard.endswith( 'jakarta_flood_category_123.asc'), 'Hazard is not the same' assert myFunction == 'function = Categorised Hazard Population ' \ 'Impact Function', 'Impact function is not same' assert myExtent == 'extent = 106.3133333333333326, ' \ '-6.3799999999999999, 107.3466666666666640, ' \ '-6.0700000000000003', 'Extent is not same'
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 combos_to_string(DOCK) myResult, myMessage = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='People', function='Need evacuation', function_id='Flood Evacuation Function') assert myResult, myMessage # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # Run manually so we can get the output layer DOCK.prepare_aggregator() DOCK.aggregator.validate_keywords() DOCK.setup_calculator() myRunner = DOCK.calculator.get_runner() myRunner.run() # Run in same thread myEngineImpactLayer = myRunner.impact_layer() myQgisImpactLayer = read_impact_layer(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
def test_check_aggregation_none_in_keywords(self): """Aggregation attribute is chosen correctly when None in keywords.""" file_list = ['kabupaten_jakarta_singlepart_with_None_keyword.shp'] # add additional layers load_layers(file_list, clear_flag=False) attribute_key = get_defaults('AGGR_ATTR_KEY') # with None aggregation attribute defined in .keyword using # kabupaten_jakarta_singlepart_with_None_keyword.shp result, message = setup_scenario( DOCK, hazard='A flood in Jakarta like in 2007', exposure='People', function_id='Flood Evacuation Function', aggregation_layer='kabupaten jakarta singlepart with None keyword') set_jakarta_extent(dock=DOCK) assert result, message # Press RUN DOCK.accept() DOCK.runtime_keywords_dialog.accept() attribute = DOCK.aggregator.attributes[attribute_key] message = ('The aggregation should be None. Found: %s' % attribute) assert attribute is None, message
def test_runFloodPopulationPolygonHazardImpactFunction(self): """Flood function runs in GUI with Jakarta polygon flood hazard data. Uses population raster exposure layer""" myResult, myMessage = setup_scenario( DOCK, hazard='A flood in Jakarta', exposure='Penduduk Jakarta', function='Need evacuation', function_id='Flood Evacuation Function Vector Hazard') assert myResult, myMessage # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # Press RUN DOCK.accept() myResult = DOCK.wvResults.page_to_text() myMessage = 'Result not as expected: %s' % myResult # This is the expected number of people needing evacuation assert format_int(1349000) in myResult, myMessage
def test_preprocessing(self): """Preprocessing results are correct. TODO - this needs to be fixed post dock refactor. """ # See qgis project in test data: vector_preprocessing_test.qgs #add additional layers file_list = ['jakarta_crosskabupaten_polygons.shp'] load_layers(file_list, clear_flag=False) file_list = ['kabupaten_jakarta.shp'] load_layers(file_list, clear_flag=False, data_directory=BOUNDDATA) result, message = setup_scenario( DOCK, hazard='jakarta_crosskabupaten_polygons', exposure='People', function='Need evacuation', function_id='Flood Evacuation Function Vector Hazard', aggregation_layer='kabupaten jakarta', aggregation_enabled_flag=True) assert result, message # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) set_jakarta_extent() # Press RUN DOCK.accept() DOCK.runtime_keywords_dialog.accept() expected_feature_count = 20 message = ('The preprocessing should have generated %s features, ' 'found %s' % (expected_feature_count, DOCK.aggregator.preprocessed_feature_count)) self.assertEqual(expected_feature_count, DOCK.aggregator.preprocessed_feature_count, message)