def test_is_polygonal_layer(self): """Test we can get the correct attributes back""" # Polygon layer layer = clone_shp_layer( name='district_osm_jakarta', include_keywords=True, source_directory=test_data_path('boundaries')) message = 'isPolygonLayer, %s layer should be polygonal' % layer self.assertTrue(is_polygon_layer(layer), message) # Point layer layer = clone_shp_layer( name='volcano_point', include_keywords=True, source_directory=test_data_path('hazard')) message = '%s layer should be polygonal' % layer self.assertFalse(is_polygon_layer(layer), message) layer = clone_raster_layer( name='padang_tsunami_mw8', extension='.tif', include_keywords=True, source_directory=test_data_path('hazard') ) message = ('%s raster layer should not be polygonal' % layer) self.assertFalse(is_polygon_layer(layer), message)
def test_write_read_iso_19115_metadata(self): """Test for write_read_iso_19115_metadata.""" keywords = { # 'date': '26-03-2015 14:03', 'exposure': 'structure', 'keyword_version': inasafe_keyword_version, 'layer_geometry': 'polygon', 'layer_mode': 'classified', 'layer_purpose': 'exposure', 'license': 'Open Data Commons Open Database License (ODbL)', 'source': 'OpenStreetMap - www.openstreetmap.org', 'title': 'Buildings', 'inasafe_fields': { 'youth_count_field': [ 'POP_F_0-4', 'POP_F_5-6', 'POP_F_7-12', ] } } layer = clone_shp_layer( name='buildings', include_keywords=False, source_directory=standard_data_path('exposure')) write_iso19115_metadata(layer.source(), keywords) read_metadata = read_iso19115_metadata(layer.source()) self.assertDictEqual(keywords, read_metadata) # Version 3.5 keywords = { # 'date': '26-03-2015 14:03', 'exposure': 'structure', 'keyword_version': '3.2', 'layer_geometry': 'polygon', 'layer_mode': 'classified', 'layer_purpose': 'exposure', 'license': 'Open Data Commons Open Database License (ODbL)', 'source': 'OpenStreetMap - www.openstreetmap.org', 'structure_class_field': 'TYPE', 'title': 'Buildings' } layer = clone_shp_layer( name='buildings', include_keywords=False, source_directory=standard_data_path('exposure')) write_iso19115_metadata(layer.source(), keywords, version_35=True) read_metadata = read_iso19115_metadata(layer.source(), version_35=True) self.assertDictEqual(keywords, read_metadata)
def test_write_read_iso_19115_metadata(self): """Test for write_read_iso_19115_metadata.""" keywords = { # 'date': '26-03-2015 14:03', 'exposure': 'structure', 'keyword_version': inasafe_keyword_version, 'layer_geometry': 'polygon', 'layer_mode': 'classified', 'layer_purpose': 'exposure', 'license': 'Open Data Commons Open Database License (ODbL)', 'source': 'OpenStreetMap - www.openstreetmap.org', 'title': 'Buildings', 'inasafe_fields': { 'youth_count_field': [ 'POP_F_0-4', 'POP_F_5-6', 'POP_F_7-12', ] } } layer = clone_shp_layer( name='buildings', include_keywords=False, source_directory=standard_data_path('exposure')) write_iso19115_metadata(layer.source(), keywords) read_metadata = read_iso19115_metadata(layer.source()) self.assertDictEqual(keywords, read_metadata)
def test_translation(self): """Test for metadata translation.""" from safe.gui.tools.wizard_dialog import WizardDialog from safe.test.utilities import ( clone_shp_layer, remove_vector_temp_file) from safe.test.utilities import BOUNDDATA from safe.test.utilities import get_qgis_app # Get QGis app handle # noinspection PyPep8Naming _, _, IFACE, PARENT = get_qgis_app() layer = clone_shp_layer( name='kabupaten_jakarta', include_keywords=True, source_directory=BOUNDDATA) # noinspection PyTypeChecker dialog = WizardDialog(PARENT, IFACE) dialog.set_keywords_creation_mode(layer) expected_categories = ['keterpaparan', 'ancaman', 'agregasi'] # noinspection PyTypeChecker self.check_list(expected_categories, dialog.lstCategories) self.check_current_text('agregasi', dialog.lstCategories) dialog.pbnNext.click() remove_vector_temp_file(layer.source())
def test_run(self): function = FloodPolygonBuildingFunction.instance() hazard_path = test_data_path('hazard', 'flood_multipart_polygons.shp') # exposure_path = test_data_path('exposure', 'buildings.shp') # noinspection PyCallingNonCallable hazard_layer = QgsVectorLayer(hazard_path, 'Flood', 'ogr') # noinspection PyCallingNonCallable # exposure_layer = QgsVectorLayer(exposure_path, 'Buildings', 'ogr') exposure_layer = clone_shp_layer( name='buildings', include_keywords=True, source_directory=test_data_path('exposure')) # Let's set the extent to the hazard extent extent = hazard_layer.extent() rect_extent = [ extent.xMinimum(), extent.yMaximum(), extent.xMaximum(), extent.yMinimum() ] function.hazard = SafeLayer(hazard_layer) function.exposure = SafeLayer(exposure_layer) function.requested_extent = rect_extent function.run() impact = function.impact # Count of flooded objects is calculated "by the hands" # total flooded = 27, total buildings = 129 count = sum(impact.get_data(attribute=function.target_field)) self.assertEquals(count, 33) count = len(impact.get_data()) self.assertEquals(count, 176)
def test_on_rad_postprocessing_toggled(self): """Test postprocessing radio button toggle behaviour works""" layer = clone_shp_layer(name='district_osm_jakarta', include_keywords=True, source_directory=test_data_path('boundaries')) defaults = get_defaults() dialog = KeywordsDialog(PARENT, IFACE, layer=layer) # Click hazard/exposure button first so that it won't take default # from keywords file dialog.radExposure.click() # Now click the postprocessing button button = dialog.radPostprocessing button.click() message = ('Toggling the postprocessing radio did not add a ' 'category to the keywords list.') self.assertEqual(dialog.get_value_for_key('category'), 'postprocessing', message) message = ('Toggling the postprocessing radio did not add an ' 'aggregation attribute to the keywords list.') self.assertEqual(dialog.get_value_for_key(defaults['AGGR_ATTR_KEY']), 'KAB_NAME', message) message = ('Toggling the postprocessing radio did not add a ' 'female ratio attribute to the keywords list.') self.assertEqual( dialog.get_value_for_key(defaults['FEMALE_RATIO_ATTR_KEY']), dialog.global_default_string, message) message = ('Toggling the postprocessing radio did not add a ' 'female ratio default value to the keywords list.') self.assertEqual( float(dialog.get_value_for_key(defaults['FEMALE_RATIO_KEY'])), defaults['FEMALE_RATIO'], message)
def test_run(self): function = FloodPolygonBuildingFunction.instance() hazard_path = test_data_path('hazard', 'flood_multipart_polygons.shp') # exposure_path = test_data_path('exposure', 'buildings.shp') # noinspection PyCallingNonCallable hazard_layer = QgsVectorLayer(hazard_path, 'Flood', 'ogr') # noinspection PyCallingNonCallable # exposure_layer = QgsVectorLayer(exposure_path, 'Buildings', 'ogr') exposure_layer = clone_shp_layer( name='buildings', include_keywords=True, source_directory=test_data_path('exposure')) # Let's set the extent to the hazard extent extent = hazard_layer.extent() rect_extent = [ extent.xMinimum(), extent.yMaximum(), extent.xMaximum(), extent.yMinimum()] function.hazard = SafeLayer(hazard_layer) function.exposure = SafeLayer(exposure_layer) function.requested_extent = rect_extent function.run() impact = function.impact # Count of flooded objects is calculated "by the hands" # total flooded = 27, total buildings = 129 count = sum(impact.get_data(attribute=function.target_field)) self.assertEquals(count, 33) count = len(impact.get_data()) self.assertEquals(count, 176)
def test_read_iso19115_metadata(self): """Test for read_iso19115_metadata method.""" exposure_layer = clone_shp_layer( name='buildings', include_keywords=False, source_directory=standard_data_path('exposure')) keywords = { # 'date': '26-03-2015 14:03', 'exposure': 'structure', 'keyword_version': inasafe_keyword_version, 'layer_geometry': 'polygon', 'layer_mode': 'classified', 'layer_purpose': 'exposure', 'license': 'Open Data Commons Open Database License (ODbL)', 'source': 'OpenStreetMap - www.openstreetmap.org', 'title': 'Buildings' } write_iso19115_metadata(exposure_layer.source(), keywords) read_metadata = read_iso19115_metadata(exposure_layer.source()) for key in set(keywords.keys()) & set(read_metadata.keys()): self.assertEqual(read_metadata[key], keywords[key]) for key in set(keywords.keys()) - set(read_metadata.keys()): message = 'key %s is not found in ISO metadata' % key self.assertEqual(read_metadata[key], keywords[key], message) for key in set(read_metadata.keys()) - set(keywords.keys()): message = 'key %s is not found in old keywords' % key self.assertEqual(read_metadata[key], keywords[key], message)
def test_on_dsb_female_ratio_default_value_changed(self): """Test hazard radio button toggle behaviour works""" layer = clone_shp_layer(name='district_osm_jakarta', include_keywords=True, source_directory=test_data_path('boundaries')) defaults = get_defaults() dialog = KeywordsDialog(PARENT, IFACE, layer=layer) button = dialog.radPostprocessing button.setChecked(False) button.click() female_ratio_box = dialog.cboFemaleRatioAttribute # set to Don't use index = female_ratio_box.findText(dialog.do_not_use_string) message = (dialog.do_not_use_string + ' not found') self.assertNotEqual(index, -1, message) female_ratio_box.setCurrentIndex(index) message = ('Toggling the female ratio attribute combo to' ' "Don\'t use" did not add it to the keywords list.') self.assertEqual( dialog.get_value_for_key(defaults['FEMALE_RATIO_ATTR_KEY']), dialog.do_not_use_string, message) message = ('Toggling the female ratio attribute combo to' ' "Don\'t use" did not disable dsbFemaleRatioDefault.') is_enabled = dialog.dsbFemaleRatioDefault.isEnabled() assert not is_enabled, message message = ('Toggling the female ratio attribute combo to' ' "Don\'t use" did not remove the keyword.') assert (dialog.get_value_for_key(defaults['FEMALE_RATIO']) is None), \ message # set to PEREMPUAN attribute attribute = 'PEREMPUAN' index = female_ratio_box.findText(attribute) message = 'The attribute %s is not found in the layer' % attribute self.assertNotEqual(index, -1, message) female_ratio_box.setCurrentIndex(index) message = ('Toggling the female ratio attribute combo to %s' ' did not add it to the keywords list.') % attribute self.assertEqual( dialog.get_value_for_key(defaults['FEMALE_RATIO_ATTR_KEY']), attribute, message) message = ('Toggling the female ratio attribute combo to %s' ' did not disable dsbFemaleRatioDefault.') % attribute is_enabled = dialog.dsbFemaleRatioDefault.isEnabled() self.assertFalse(is_enabled, message) message = ('Toggling the female ratio attribute combo to %s' ' did not remove the keyword.') % attribute self.assertIsNone(dialog.get_value_for_key(defaults['FEMALE_RATIO']), message)
def test_issue_121(self): """Test that point symbol size can be set from style (issue 121). .. seealso:: https://github.com/AIFDR/inasafe/issues/121 """ layer = clone_shp_layer(name='volcano_point', include_keywords=True, source_directory=test_data_path('hazard')) # Note the float quantity values below style_info = { 'target_field': 'KEPADATAN', 'style_classes': [{ 'opacity': 1, 'max': 200, 'colour': '#fecc5c', 'min': 45, 'label': 'Low', 'size': 1 }, { 'opacity': 1, 'max': 350, 'colour': '#fd8d3c', 'min': 201, 'label': 'Medium', 'size': 2 }, { 'opacity': 1, 'max': 539, 'colour': '#f31a1c', 'min': 351, 'label': 'High', 'size': 3 }] } print 'Setting style with point sizes should work.' set_vector_graduated_style(layer, style_info) # Now validate the size values were set as expected # new symbology - subclass of QgsFeatureRendererV2 class renderer = layer.rendererV2() layer_type = renderer.type() assert layer_type == 'graduatedSymbol' size = 1 for renderer_range in renderer.ranges(): symbol = renderer_range.symbol() symbol_layer = symbol.symbolLayer(0) actual_size = symbol_layer.size() message = (('Expected symbol layer 0 for range %s to have' ' a size of %s, got %s') % (size, size, actual_size)) assert size == actual_size, message size += 1
def test_write_iso19115_metadata(self): """Test for write_iso19115_metadata.""" exposure_layer = clone_shp_layer( name='buildings', include_keywords=False, source_directory=standard_data_path('exposure')) keywords = { 'date': '26-03-2015 14:03', 'exposure': 'structure', 'keyword_version': inasafe_keyword_version, 'layer_geometry': 'polygon', 'layer_mode': 'classified', 'layer_purpose': 'exposure', 'license': 'Open Data Commons Open Database License (ODbL)', 'source': 'OpenStreetMap - www.openstreetmap.org', 'title': 'Buildings' } metadata = write_iso19115_metadata(exposure_layer.source(), keywords) self.assertEqual(metadata.exposure, 'structure') # Version 3.5 exposure_layer = clone_shp_layer( name='buildings', include_keywords=False, source_directory=standard_data_path('exposure')) keywords = { 'date': '26-03-2015 14:03', 'exposure': 'structure', 'keyword_version': '3.2', 'layer_geometry': 'polygon', 'layer_mode': 'classified', 'layer_purpose': 'exposure', 'license': 'Open Data Commons Open Database License (ODbL)', 'source': 'OpenStreetMap - www.openstreetmap.org', 'structure_class_field': 'TYPE', 'title': 'Buildings' } metadata = write_iso19115_metadata(exposure_layer.source(), keywords, version_35=True) self.assertEqual(metadata.exposure, 'structure')
def test_write_iso19115_metadata(self): """Test for write_iso19115_metadata.""" exposure_layer = clone_shp_layer( name='buildings', include_keywords=False, source_directory=standard_data_path('exposure')) keywords = { 'date': '26-03-2015 14:03', 'exposure': 'structure', 'keyword_version': inasafe_keyword_version, 'layer_geometry': 'polygon', 'layer_mode': 'classified', 'layer_purpose': 'exposure', 'license': 'Open Data Commons Open Database License (ODbL)', 'source': 'OpenStreetMap - www.openstreetmap.org', 'title': 'Buildings' } metadata = write_iso19115_metadata(exposure_layer.source(), keywords) self.assertEqual(metadata.exposure, 'structure') # Version 3.5 exposure_layer = clone_shp_layer( name='buildings', include_keywords=False, source_directory=standard_data_path('exposure')) keywords = { 'date': '26-03-2015 14:03', 'exposure': 'structure', 'keyword_version': '3.2', 'layer_geometry': 'polygon', 'layer_mode': 'classified', 'layer_purpose': 'exposure', 'license': 'Open Data Commons Open Database License (ODbL)', 'source': 'OpenStreetMap - www.openstreetmap.org', 'structure_class_field': 'TYPE', 'title': 'Buildings' } metadata = write_iso19115_metadata( exposure_layer.source(), keywords, version_35=True) self.assertEqual(metadata.exposure, 'structure')
def test_get_layer_attribute_names(self): """Test we can get the correct attributes back""" layer = clone_shp_layer( name='district_osm_jakarta', include_keywords=True, source_directory=test_data_path('boundaries')) # with good attribute name attributes, position = layer_attribute_names( layer, [QVariant.Int, QVariant.String], 'TEST_STR') expected_attributes = ['KAB_NAME', 'TEST_STR', 'TEST_INT'] expected_position = 1 message = 'expected_attributes, got %s, expected %s' % ( attributes, expected_attributes) self.assertEqual(attributes, expected_attributes, message) message = 'expected_position, got %s, expected %s' % ( position, expected_position) self.assertEqual(position, expected_position, message) # with non existing attribute name attributes, position = layer_attribute_names( layer, [QVariant.Int, QVariant.String], 'MISSING_ATTR') expected_attributes = ['KAB_NAME', 'TEST_STR', 'TEST_INT'] expected_position = None message = 'expected_attributes, got %s, expected %s' % ( attributes, expected_attributes) self.assertEqual(attributes, expected_attributes, message) message = 'expected_position, got %s, expected %s' % ( position, expected_position) self.assertEqual(position, expected_position, message) # with raster layer layer = clone_raster_layer( name='padang_tsunami_mw8', extension='.tif', include_keywords=True, source_directory=test_data_path('hazard') ) attributes, position = layer_attribute_names(layer, [], '') message = 'Should return None, None for raster layer, got %s, %s' % ( attributes, position) assert (attributes is None and position is None), message
def test_write_read_iso_19115_metadata(self): """Test for write_read_iso_19115_metadata.""" keywords = { # 'date': '26-03-2015 14:03', 'exposure': 'structure', 'keyword_version': '3.2', 'layer_geometry': 'polygon', 'layer_mode': 'classified', 'layer_purpose': 'exposure', 'license': 'Open Data Commons Open Database License (ODbL)', 'source': 'OpenStreetMap - www.openstreetmap.org', 'structure_class_field': 'TYPE', 'title': 'Buildings' } layer = clone_shp_layer(name='buildings', include_keywords=False, source_directory=test_data_path('exposure')) write_iso19115_metadata(layer.source(), keywords)
def test_on_rad_postprocessing_toggled(self): """Test postprocessing radio button toggle behaviour works""" layer = clone_shp_layer( name='district_osm_jakarta', include_keywords=True, source_directory=test_data_path('boundaries')) defaults = get_defaults() dialog = KeywordsDialog(PARENT, IFACE, layer=layer) # Click hazard/exposure button first so that it won't take default # from keywords file dialog.radExposure.click() # Now click the postprocessing button button = dialog.radPostprocessing button.click() message = ( 'Toggling the postprocessing radio did not add a ' 'category to the keywords list.') self.assertEqual( dialog.get_value_for_key('category'), 'postprocessing', message) message = ( 'Toggling the postprocessing radio did not add an ' 'aggregation attribute to the keywords list.') self.assertEqual( dialog.get_value_for_key(defaults['AGGR_ATTR_KEY']), 'KAB_NAME', message) message = ( 'Toggling the postprocessing radio did not add a ' 'female ratio attribute to the keywords list.') self.assertEqual( dialog.get_value_for_key(defaults['FEMALE_RATIO_ATTR_KEY']), dialog.global_default_string, message) message = ( 'Toggling the postprocessing radio did not add a ' 'female ratio default value to the keywords list.') self.assertEqual( float(dialog.get_value_for_key(defaults['FEMALE_RATIO_KEY'])), defaults['FEMALE_RATIO'], message)
def test_write_read_iso_19115_metadata(self): """Test for write_read_iso_19115_metadata.""" keywords = { # 'date': '26-03-2015 14:03', 'exposure': 'structure', 'keyword_version': '3.2', 'layer_geometry': 'polygon', 'layer_mode': 'classified', 'layer_purpose': 'exposure', 'license': 'Open Data Commons Open Database License (ODbL)', 'source': 'OpenStreetMap - www.openstreetmap.org', 'structure_class_field': 'TYPE', 'title': 'Buildings' } layer = clone_shp_layer( name='buildings', include_keywords=False, source_directory=test_data_path('exposure')) write_iso19115_metadata(layer.source(), keywords)
def test_issue_121(self): """Test that point symbol size can be set from style (issue 121). .. seealso:: https://github.com/AIFDR/inasafe/issues/121 """ layer = clone_shp_layer( name='volcano_point', include_keywords=True, source_directory=test_data_path('hazard')) # Note the float quantity values below style_info = { 'target_field': 'KEPADATAN', 'style_classes': [ {'opacity': 1, 'max': 200, 'colour': '#fecc5c', 'min': 45, 'label': 'Low', 'size': 1}, {'opacity': 1, 'max': 350, 'colour': '#fd8d3c', 'min': 201, 'label': 'Medium', 'size': 2}, {'opacity': 1, 'max': 539, 'colour': '#f31a1c', 'min': 351, 'label': 'High', 'size': 3}]} print 'Setting style with point sizes should work.' set_vector_graduated_style(layer, style_info) # Now validate the size values were set as expected # new symbology - subclass of QgsFeatureRendererV2 class renderer = layer.rendererV2() layer_type = renderer.type() assert layer_type == 'graduatedSymbol' size = 1 for renderer_range in renderer.ranges(): symbol = renderer_range.symbol() symbol_layer = symbol.symbolLayer(0) actual_size = symbol_layer.size() message = (( 'Expected symbol layer 0 for range %s to have' ' a size of %s, got %s') % (size, size, actual_size)) assert size == actual_size, message size += 1
def test_check_aggregation(self): """Test for keywords dialog's behavior for aggregation layer.""" layer = clone_shp_layer( name='district_osm_jakarta', include_keywords=True, source_directory=test_data_path('boundaries')) dialog = KeywordsDialog(PARENT, IFACE, layer=layer) # Load existing keywords keywords = dialog.get_keywords() expected_keywords = { u'category': u'postprocessing', u'aggregation attribute': u'KAB_NAME', u'title': u'D\xedstr\xedct\'s of Jakarta', u'elderly ratio attribute': u'Global default', u'youth ratio default': u'0.26', u'elderly ratio default': u'0.08', u'adult ratio attribute': u'Global default', u'female ratio attribute': u'PEREMPUAN', u'youth ratio attribute': u'Global default', u'adult ratio default': u'0.66'} message = 'Expected %s but I got %s' % (expected_keywords, keywords) self.assertDictEqual(expected_keywords, keywords, message) # Check age ratios are valid good_sum_ratio, _ = dialog.age_ratios_are_valid(keywords) message = 'Expected %s but I got %s' % (True, good_sum_ratio) self.assertEqual(True, good_sum_ratio, message) # Change youth ratio attribute to Don't Use dialog.cboYouthRatioAttribute.setCurrentIndex(1) keywords = dialog.get_keywords() expected_keywords = { u'category': u'postprocessing', u'aggregation attribute': u'KAB_NAME', u'title': u'D\xedstr\xedct\'s of Jakarta', u'elderly ratio attribute': u'Global default', u'elderly ratio default': u'0.08', u'adult ratio attribute': u'Global default', u'female ratio attribute': u'PEREMPUAN', u'youth ratio attribute': u'Don\'t use', u'adult ratio default': u'0.66'} message = 'Expected %s but I got %s' % (expected_keywords, keywords) self.assertDictEqual(expected_keywords, keywords, message) good_sum_ratio, _ = dialog.age_ratios_are_valid(keywords) message = 'Expected %s but I got %s' % (True, good_sum_ratio) self.assertEqual(True, good_sum_ratio, message) # Change youth ratio attribute to Global Default # Change youth ratio default to 0.99 dialog.cboYouthRatioAttribute.setCurrentIndex(0) dialog.dsbYouthRatioDefault.setValue(0.99) keywords = dialog.get_keywords() expected_keywords = { u'category': u'postprocessing', u'aggregation attribute': u'KAB_NAME', u'title': u'D\xedstr\xedct\'s of Jakarta', u'elderly ratio attribute': u'Global default', u'elderly ratio default': u'0.08', u'adult ratio attribute': u'Global default', u'female ratio attribute': u'PEREMPUAN', u'youth ratio attribute': u'Global default', u'youth ratio default': u'0.99', u'adult ratio default': u'0.66'} message = 'Expected %s but I got %s' % (expected_keywords, keywords) self.assertDictEqual(expected_keywords, keywords, message) good_sum_ratio, _ = dialog.age_ratios_are_valid(keywords) message = 'Expected %s but I got %s' % (False, good_sum_ratio) self.assertEqual(False, good_sum_ratio, message) # We need to delete reference to layer on Windows before removing # the files del layer del dialog.layer # Using clone_shp_layer the files are saved in testing dir under # InaSAFE temp dir shutil.rmtree(temp_dir(sub_dir='testing'))
def test_on_dsb_female_ratio_default_value_changed(self): """Test hazard radio button toggle behaviour works""" layer = clone_shp_layer( name='district_osm_jakarta', include_keywords=True, source_directory=test_data_path('boundaries')) defaults = get_defaults() dialog = KeywordsDialog(PARENT, IFACE, layer=layer) button = dialog.radPostprocessing button.setChecked(False) button.click() female_ratio_box = dialog.cboFemaleRatioAttribute # set to Don't use index = female_ratio_box.findText(dialog.do_not_use_string) message = (dialog.do_not_use_string + ' not found') self.assertNotEqual(index, -1, message) female_ratio_box.setCurrentIndex(index) message = ( 'Toggling the female ratio attribute combo to' ' "Don\'t use" did not add it to the keywords list.') self.assertEqual( dialog.get_value_for_key(defaults['FEMALE_RATIO_ATTR_KEY']), dialog.do_not_use_string, message) message = ( 'Toggling the female ratio attribute combo to' ' "Don\'t use" did not disable dsbFemaleRatioDefault.') is_enabled = dialog.dsbFemaleRatioDefault.isEnabled() assert not is_enabled, message message = ( 'Toggling the female ratio attribute combo to' ' "Don\'t use" did not remove the keyword.') assert (dialog.get_value_for_key(defaults['FEMALE_RATIO']) is None), \ message # set to PEREMPUAN attribute attribute = 'PEREMPUAN' index = female_ratio_box.findText(attribute) message = 'The attribute %s is not found in the layer' % attribute self.assertNotEqual(index, -1, message) female_ratio_box.setCurrentIndex(index) message = ( 'Toggling the female ratio attribute combo to %s' ' did not add it to the keywords list.') % attribute self.assertEqual( dialog.get_value_for_key(defaults['FEMALE_RATIO_ATTR_KEY']), attribute, message) message = ( 'Toggling the female ratio attribute combo to %s' ' did not disable dsbFemaleRatioDefault.') % attribute is_enabled = dialog.dsbFemaleRatioDefault.isEnabled() self.assertFalse(is_enabled, message) message = ( 'Toggling the female ratio attribute combo to %s' ' did not remove the keyword.') % attribute self.assertIsNone( dialog.get_value_for_key(defaults['FEMALE_RATIO']), message)
def test_existing_complex_keywords(self): """Test for existing complex keywords in wizard in locale mode.""" from safe.gui.tools.wizard_dialog import WizardDialog from safe.test.utilities import ( clone_shp_layer, remove_vector_temp_file) layer = clone_shp_layer( name='tsunami_polygon', include_keywords=True, source_directory='') from safe.test.utilities import get_qgis_app # Get QGis app handle # noinspection PyPep8Naming _, _, IFACE, PARENT = get_qgis_app() # noinspection PyTypeChecker dialog = WizardDialog(PARENT, IFACE) dialog.set_keywords_creation_mode(layer) # select hazard self.select_from_list_widget('ancaman', dialog.lstCategories) dialog.pbnNext.click() # select volcano self.select_from_list_widget('gunung berapi', dialog.lstSubcategories) dialog.pbnNext.click() # select volcano categorical unit self.select_from_list_widget('Kategori gunung berapi', dialog.lstUnits) dialog.pbnNext.click() # select GRIDCODE self.select_from_list_widget('GRIDCODE', dialog.lstFields) dialog.pbnNext.click() unit = dialog.selected_unit() default_classes = unit['classes'] unassigned_values = [] # no need to check actually, not save in file assigned_values = { 'low': ['5.0'], 'medium': ['3.0', '4.0'], 'high': ['2.0'] } dialog.populate_classified_values( unassigned_values, assigned_values, default_classes) dialog.pbnNext.click() source = 'Source' source_scale = 'Source Scale' source_url = 'Source Url' source_date = 'Source Date' dialog.leSource.setText(source) dialog.leSource_scale.setText(source_scale) dialog.leSource_url.setText(source_url) dialog.leSource_date.setText(source_date) dialog.pbnNext.click() # next dialog.pbnNext.click() # finish # noinspection PyTypeChecker dialog = WizardDialog(PARENT, IFACE) dialog.set_keywords_creation_mode(layer) # step 1 of 7 - select category self.check_current_text('ancaman', dialog.lstCategories) # Click Next dialog.pbnNext.click() # step 2 of 7 - select subcategory # noinspection PyTypeChecker self.check_current_text('gunung berapi', dialog.lstSubcategories) # Click Next dialog.pbnNext.click() # step 3 of 7 - select volcano units self.check_current_text('Kategori gunung berapi', dialog.lstUnits) # Click Next dialog.pbnNext.click() # step 4 of 7 - select field self.check_current_text('GRIDCODE', dialog.lstFields) # Click Next dialog.pbnNext.click() for index in range(dialog.lstUniqueValues.count()): message = ('%s Should be in unassigned values' % dialog.lstUniqueValues.item(index).text()) self.assertIn( dialog.lstUniqueValues.item(index).text(), unassigned_values, message) real_assigned_values = dialog.selected_mapping() self.assertDictEqual(real_assigned_values, assigned_values) # Click Next dialog.pbnNext.click() # step 6 of 7 - enter source message = ('Invalid Next button state in step 6! Disabled while ' 'source is optional') self.assertTrue(dialog.pbnNext.isEnabled(), message) message = 'Source should be %s' % source self.assertEqual(dialog.leSource.text(), source, message) message = 'Source Url should be %s' % source_url self.assertEqual(dialog.leSource_url.text(), source_url, message) message = 'Source Date should be %s' % source_date self.assertEqual(dialog.leSource_date.text(), source_date, message) message = 'Source Scale should be %s' % source_scale self.assertEqual(dialog.leSource_scale.text(), source_scale, message) dialog.pbnNext.click() dialog.pbnCancel.click() remove_vector_temp_file(layer.source())
def test_existing_complex_keywords(self): """Test for existing complex keywords in wizard in locale mode.""" from safe.gui.tools.wizard_dialog import WizardDialog from safe.test.utilities import clone_shp_layer, remove_vector_temp_file layer = clone_shp_layer(name="tsunami_polygon", include_keywords=True, source_directory="") from safe.test.utilities import get_qgis_app # Get QGis app handle # noinspection PyPep8Naming _, _, IFACE, PARENT = get_qgis_app() # noinspection PyTypeChecker dialog = WizardDialog(PARENT, IFACE) dialog.set_keywords_creation_mode(layer) # select hazard self.select_from_list_widget("ancaman", dialog.lstCategories) dialog.pbnNext.click() # select volcano self.select_from_list_widget("gunung berapi", dialog.lstSubcategories) dialog.pbnNext.click() # select volcano categorical unit self.select_from_list_widget("Kategori gunung berapi", dialog.lstUnits) dialog.pbnNext.click() # select GRIDCODE self.select_from_list_widget("GRIDCODE", dialog.lstFields) dialog.pbnNext.click() unit = dialog.selected_unit() default_classes = unit["classes"] unassigned_values = [] # no need to check actually, not save in file assigned_values = {"low": ["5.0"], "medium": ["3.0", "4.0"], "high": ["2.0"]} dialog.populate_classified_values(unassigned_values, assigned_values, default_classes) dialog.pbnNext.click() source = "Source" source_scale = "Source Scale" source_url = "Source Url" source_date = QDateTime.fromString("06-12-2015 12:30", "dd-MM-yyyy HH:mm") dialog.leSource.setText(source) dialog.leSource_scale.setText(source_scale) dialog.leSource_url.setText(source_url) dialog.leSource_date.seDateTime(source_date) dialog.pbnNext.click() # next dialog.pbnNext.click() # finish # noinspection PyTypeChecker dialog = WizardDialog(PARENT, IFACE) dialog.set_keywords_creation_mode(layer) # step 1 of 7 - select category self.check_current_text("ancaman", dialog.lstCategories) # Click Next dialog.pbnNext.click() # step 2 of 7 - select subcategory # noinspection PyTypeChecker self.check_current_text("gunung berapi", dialog.lstSubcategories) # Click Next dialog.pbnNext.click() # step 3 of 7 - select volcano units self.check_current_text("Kategori gunung berapi", dialog.lstUnits) # Click Next dialog.pbnNext.click() # step 4 of 7 - select field self.check_current_text("GRIDCODE", dialog.lstFields) # Click Next dialog.pbnNext.click() for index in range(dialog.lstUniqueValues.count()): message = "%s Should be in unassigned values" % dialog.lstUniqueValues.item(index).text() self.assertIn(dialog.lstUniqueValues.item(index).text(), unassigned_values, message) real_assigned_values = dialog.selected_mapping() self.assertDictEqual(real_assigned_values, assigned_values) # Click Next dialog.pbnNext.click() # step 6 of 7 - enter source message = "Invalid Next button state in step 6! Disabled while " "source is optional" self.assertTrue(dialog.pbnNext.isEnabled(), message) message = "Source should be %s" % source self.assertEqual(dialog.leSource.text(), source, message) message = "Source Url should be %s" % source_url self.assertEqual(dialog.leSource_url.text(), source_url, message) message = "Source Date should be %s" % source_date.toString("dd-MM-yyyy HH:mm") self.assertEqual(dialog.leSource_date.dateTime(), source_date, message) message = "Source Scale should be %s" % source_scale self.assertEqual(dialog.leSource_scale.text(), source_scale, message) dialog.pbnNext.click() dialog.pbnCancel.click() remove_vector_temp_file(layer.source())
def test_input_function_centric_wizard_test_3(self): """Test various usecases of the wizard: keywordless layers, disjoint layers, browsers, stepping back and forth .""" chosen_if1 = 'FloodRasterBuildingFunction' chosen_if2 = 'ClassifiedRasterHazardBuildingFunction' expected_hazard_layers_count = 2 expected_exposure_layers_count = 2 expected_aggregation_layers_count = 2 # Initialize dialog # noinspection PyTypeChecker dialog = WizardDialog(iface=IFACE) dialog.dock = self.dock dialog.set_function_centric_mode() QgsMapLayerRegistry.instance().removeAllMapLayers() # Load test layers # Hazard layer without keywords layer = clone_raster_layer( name='keywordless_layer', extension='.tif', include_keywords=False, source_directory=test_data_path('hazard')) # noinspection PyArgumentList QgsMapLayerRegistry.instance().addMapLayers([layer]) # Hazard layer - disjoint layer = clone_raster_layer( name='continuous_flood_unaligned_big_size', extension='.tif', include_keywords=True, source_directory=test_data_path('hazard')) # noinspection PyArgumentList QgsMapLayerRegistry.instance().addMapLayers([layer]) # Hazard layer layer = clone_raster_layer( name='classified_flood_20_20', extension='.asc', include_keywords=True, source_directory=test_data_path('hazard')) # noinspection PyArgumentList QgsMapLayerRegistry.instance().addMapLayers([layer]) # Exposure layer layer = clone_shp_layer( name='building-points', include_keywords=True, source_directory=test_data_path('exposure')) # noinspection PyArgumentList QgsMapLayerRegistry.instance().addMapLayers([layer]) # Exposure layer without keywords layer = clone_shp_layer( name='building-points', include_keywords=False, source_directory=test_data_path('exposure')) # noinspection PyArgumentList QgsMapLayerRegistry.instance().addMapLayers([layer]) # Aggregation layer layer = clone_shp_layer( name='district_osm_jakarta', include_keywords=True, source_directory=test_data_path('boundaries')) # noinspection PyArgumentList QgsMapLayerRegistry.instance().addMapLayers([layer]) # Aggregation layer without keywords layer = clone_shp_layer( name='grid_jakarta', include_keywords=False, source_directory=test_data_path('boundaries')) # noinspection PyArgumentList QgsMapLayerRegistry.instance().addMapLayers([layer]) # step_fc_functions1: select functions for flood x structure self.check_current_step(dialog.step_fc_functions1) dialog.step_fc_functions1.tblFunctions1.setCurrentCell(3, 1) dialog.pbnNext.click() # step_fc_functions2: select functions for raster x point self.check_current_step(dialog.step_fc_functions2) dialog.step_fc_functions2.tblFunctions2.setCurrentCell(1, 0) dialog.pbnNext.click() # step_fc_function: test if FloodRasterBuildingFunction is on the list role = QtCore.Qt.UserRole flood_ifs = [ dialog.step_fc_function.lstFunctions.item(row).data(role)['id'] for row in range(dialog.step_fc_function.lstFunctions.count())] self.assertTrue(chosen_if1 in flood_ifs) # step_fc_function: select FloodRasterBuildingFunction and # press ok self.check_current_step(dialog.step_fc_function) chosen_if_row = flood_ifs.index(chosen_if1) dialog.step_fc_function.lstFunctions.setCurrentRow(chosen_if_row) dialog.pbnNext.click() # step_fc_hazlayer_origin: self.check_current_step(dialog.step_fc_hazlayer_origin) # step_fc_hazlayer_from_canvas: test the lstCanvasHazLayers state # Note this step is tested prior to step_fc_hazlayer_origin # as the list is prepared prior to autoselecting the radiobuttons count = dialog.step_fc_hazlayer_from_canvas.lstCanvasHazLayers.count() self.assertEqual(count, expected_hazard_layers_count) # test if hazard browser works dialog.step_fc_hazlayer_origin.rbHazLayerFromBrowser.click() dialog.pbnNext.click() self.check_current_step(dialog.step_fc_hazlayer_from_browser) # step back and continue with hazard from canvas dialog.pbnBack.click() dialog.step_fc_hazlayer_origin.rbHazLayerFromCanvas.click() dialog.pbnNext.click() # step_fc_hazlayer_from_canvas self.check_current_step(dialog.step_fc_hazlayer_from_canvas) # Select the second (keywordless) layer in order to trigger preparing # the 'missing keywords' description. dialog.step_fc_hazlayer_from_canvas.lstCanvasHazLayers.setCurrentRow(1) dialog.pbnNext.click() self.check_current_step(dialog.step_kw_purpose) dialog.pbnBack.click() # Now select the first (proper) layer and press ok dialog.step_fc_hazlayer_from_canvas.lstCanvasHazLayers.setCurrentRow(0) dialog.pbnNext.click() # step_fc_explayer_origin self.check_current_step(dialog.step_fc_explayer_origin) count = dialog.step_fc_explayer_from_canvas.lstCanvasExpLayers.count() self.assertEqual(count, expected_exposure_layers_count) # test if exposure browser works dialog.step_fc_explayer_origin.rbExpLayerFromBrowser.click() dialog.pbnNext.click() self.check_current_step(dialog.step_fc_explayer_from_browser) # step back and continue with exposure from canvas dialog.pbnBack.click() dialog.step_fc_explayer_origin.rbExpLayerFromCanvas.click() dialog.pbnNext.click() self.check_current_step(dialog.step_fc_explayer_from_canvas) # Select the second (keywordless) layer in order to trigger preparing # the 'missing keywords' description. dialog.step_fc_explayer_from_canvas.lstCanvasExpLayers.setCurrentRow(1) dialog.pbnNext.click() self.check_current_step(dialog.step_kw_purpose) dialog.pbnBack.click() # Now select the first (proper) layer and press ok dialog.step_fc_explayer_from_canvas.lstCanvasExpLayers.setCurrentRow(0) dialog.pbnNext.click() # step_fc_disjoint_layers self.check_current_step(dialog.step_fc_disjoint_layers) dialog.pbnBack.click() self.check_current_step(dialog.step_fc_explayer_from_canvas) dialog.pbnBack.click() self.check_current_step(dialog.step_fc_explayer_origin) dialog.pbnBack.click() self.check_current_step(dialog.step_fc_hazlayer_from_canvas) dialog.pbnBack.click() self.check_current_step(dialog.step_fc_hazlayer_origin) dialog.pbnBack.click() self.check_current_step(dialog.step_fc_function) # Select ClassifiedRasterHazardBuildingFunction chosen_if_row = flood_ifs.index(chosen_if2) dialog.step_fc_function.lstFunctions.setCurrentRow(chosen_if_row) dialog.pbnNext.click() self.check_current_step(dialog.step_fc_hazlayer_origin) dialog.pbnNext.click() self.check_current_step(dialog.step_fc_hazlayer_from_canvas) # Select the first (proper) layer and press ok dialog.step_fc_hazlayer_from_canvas.lstCanvasHazLayers.setCurrentRow(0) dialog.pbnNext.click() self.check_current_step(dialog.step_fc_explayer_origin) dialog.pbnNext.click() self.check_current_step(dialog.step_fc_explayer_from_canvas) dialog.step_fc_explayer_from_canvas.lstCanvasExpLayers.setCurrentRow(0) dialog.pbnNext.click() self.check_current_step(dialog.step_fc_agglayer_origin) # test if no aggregation works dialog.step_fc_agglayer_origin.rbAggLayerNoAggregation.click() dialog.pbnNext.click() self.check_current_step(dialog.step_fc_extent) # step back and test if aggregation browser works dialog.pbnBack.click() dialog.step_fc_agglayer_origin.rbAggLayerFromBrowser.click() dialog.pbnNext.click() self.check_current_step(dialog.step_fc_agglayer_from_browser) # step back and continue with aggregation from canvas dialog.pbnBack.click() dialog.step_fc_agglayer_origin.rbAggLayerFromCanvas.click() dialog.pbnNext.click() self.check_current_step(dialog.step_fc_agglayer_from_canvas) count = dialog.step_fc_agglayer_from_canvas.lstCanvasAggLayers.count() self.assertEqual(count, expected_aggregation_layers_count) # Select the second (keywordless) layer in order to trigger preparing # the 'missing keywords' description. dialog.step_fc_agglayer_from_canvas.lstCanvasAggLayers.setCurrentRow(1) dialog.pbnNext.click() self.check_current_step(dialog.step_kw_purpose) dialog.pbnBack.click() # Now select the first (proper) layer and press ok dialog.step_fc_agglayer_from_canvas.lstCanvasAggLayers.setCurrentRow(0) dialog.pbnNext.click() self.check_current_step(dialog.step_fc_extent) dialog.pbnNext.click() self.check_current_step(dialog.step_fc_params) # Step back and enter the params step again dialog.pbnBack.click() self.check_current_step(dialog.step_fc_extent) dialog.pbnNext.click() self.check_current_step(dialog.step_fc_params) dialog.pbnNext.click() self.check_current_step(dialog.step_fc_summary) dialog.pbnBack.click() self.check_current_step(dialog.step_fc_params) dialog.pbnBack.click() self.check_current_step(dialog.step_fc_extent) dialog.pbnBack.click() self.check_current_step(dialog.step_fc_agglayer_from_canvas) dialog.pbnBack.click() self.check_current_step(dialog.step_fc_agglayer_origin) # No need to test more backward steps (already tested in other test) dialog.pbnCancel.click()
def test_input_function_centric_wizard(self): """Test the IFCW mode: FloodRasterBuildingFunction""" expected_test_layer_count = 2 expected_hazards_count = 5 # expected_exposures_count = 3 expected_exposures_count = 4 expected_flood_structure_functions_count = 4 expected_raster_polygon_functions_count = 2 expected_functions_count = 2 chosen_if = 'FloodRasterBuildingFunction' expected_hazard_layers_count = 1 expected_exposure_layers_count = 1 expected_aggregation_layers_count = 0 # expected_summary_key = 'minimum needs' # expected_summary_value_fragment = 'rice' # expected_report_size = 4055 # as saved on Ubuntu # TS : changed tolerance from 120 to 160 because above change # causes fail on fedora # AG: updated the tolerance from 160 to 190 # MD: more tolerance please! 190 -> 200 # tolerance = 200 # windows EOL etc # Initialize dialog # noinspection PyTypeChecker dialog = WizardDialog(iface=IFACE) dialog.dock = self.dock dialog.set_function_centric_mode() QgsMapLayerRegistry.instance().removeAllMapLayers() # Load test layers layer = clone_raster_layer( name='continuous_flood_20_20', extension='.asc', include_keywords=True, source_directory=standard_data_path('hazard')) # noinspection PyArgumentList QgsMapLayerRegistry.instance().addMapLayers([layer]) layer = clone_shp_layer( name='buildings', include_keywords=True, source_directory=standard_data_path('exposure')) # noinspection PyArgumentList QgsMapLayerRegistry.instance().addMapLayers([layer]) # Check the environment first self.assertIsNotNone(layer.dataProvider()) count = len(dialog.iface.mapCanvas().layers()) self.assertEqual(count, expected_test_layer_count) # step_fc_functions1: test function matrix dimensions col_count = dialog.step_fc_functions1.tblFunctions1.columnCount() self.assertEqual(col_count, expected_hazards_count) row_count = dialog.step_fc_functions1.tblFunctions1.rowCount() self.assertEqual(row_count, expected_exposures_count) # step_fc_functions1: test number of functions for flood x structure dialog.step_fc_functions1.tblFunctions1.setCurrentCell(3, 1) count = len(dialog.step_fc_functions1.selected_functions_1()) self.assertEqual(count, expected_flood_structure_functions_count) # step_fc_functions1: press ok dialog.pbnNext.click() # step_fc_functions2: test number of functions for raster flood # and polygon structure self.check_current_step(dialog.step_fc_functions2) dialog.step_fc_functions2.tblFunctions2.setCurrentCell(3, 0) count = len(dialog.step_fc_functions2.selected_functions_2()) self.assertEqual(count, expected_raster_polygon_functions_count) # step_fc_functions2: press ok dialog.pbnNext.click() # step_fc_function: test number of available functions self.check_current_step(dialog.step_fc_function) count = dialog.step_fc_function.lstFunctions.count() self.assertEqual(count, expected_functions_count) # step_fc_function: test if chosen_if is on the list role = QtCore.Qt.UserRole flood_ifs = [ dialog.step_fc_function.lstFunctions.item(row).data(role)['id'] for row in range(count)] self.assertTrue(chosen_if in flood_ifs) # step_fc_function: select FloodRasterBuildingImpactFunction and # press ok chosen_if_row = flood_ifs.index(chosen_if) dialog.step_fc_function.lstFunctions.setCurrentRow(chosen_if_row) dialog.pbnNext.click() # step_fc_hazlayer_from_canvas: test the lstCanvasHazLayers state # Note this step is tested prior to step_fc_hazlayer_origin # as the list is prepared prior to autoselecting the radiobuttons count = dialog.step_fc_hazlayer_from_canvas.lstCanvasHazLayers.count() self.assertEqual(count, expected_hazard_layers_count) # step_fc_hazlayer_origin: test if the radiobuttons are autmatically # enabled and selected self.assertTrue( dialog.step_fc_hazlayer_origin.rbHazLayerFromCanvas.isEnabled()) self.assertTrue( dialog.step_fc_hazlayer_origin.rbHazLayerFromCanvas.isChecked()) # step_fc_hazlayer_origin: press ok self.check_current_step(dialog.step_fc_hazlayer_origin) dialog.pbnNext.click() # step_fc_hazlayer_from_canvas: press ok self.check_current_step(dialog.step_fc_hazlayer_from_canvas) dialog.pbnNext.click() # step_fc_explayer_from_canvas: test the lstCanvasExpLayers state # Note this step is tested prior to step_fc_explayer_origin # as the list is prepared prior to autoselecting the radiobuttons count = dialog.step_fc_explayer_from_canvas.lstCanvasExpLayers.count() self.assertEqual(count, expected_exposure_layers_count) # step_fc_explayer_origin: test if the radiobuttons are automatically # enabled and selected self.assertTrue( dialog.step_fc_explayer_origin.rbExpLayerFromCanvas.isEnabled()) self.assertTrue( dialog.step_fc_explayer_origin.rbExpLayerFromCanvas.isChecked()) # step_fc_explayer_origin: press ok self.check_current_step(dialog.step_fc_explayer_origin) dialog.pbnNext.click() # step_fc_explayer_from_canvas: press ok self.check_current_step(dialog.step_fc_explayer_from_canvas) dialog.pbnNext.click() # step_fc_explayer_from_canvas: test the lstCanvasAggLayers state # Note this step is tested prior to step_fc_agglayer_origin # as the list is prepared prior to auto selecting the radio buttons count = dialog.step_fc_agglayer_from_canvas.lstCanvasAggLayers.count() self.assertEqual(count, expected_aggregation_layers_count) # step_fc_agglayer_origin: test if the radio buttons are automatically # enabled and selected self.assertFalse( dialog.step_fc_agglayer_origin.rbAggLayerFromCanvas.isEnabled()) self.assertTrue( dialog.step_fc_agglayer_origin.rbAggLayerFromBrowser.isChecked()) # step_fc_agglayer_origin: switch to no aggregation and press ok self.check_current_step(dialog.step_fc_agglayer_origin) dialog.step_fc_agglayer_origin.rbAggLayerNoAggregation.click() dialog.pbnNext.click() # step_fc_extent: switch to layer's extent and press ok self.check_current_step(dialog.step_fc_extent) dialog.step_fc_extent.extent_dialog.hazard_exposure_only.click() dialog.pbnNext.click() # step_fc_params: press ok (already covered by the relevant test) self.check_current_step(dialog.step_fc_params) dialog.pbnNext.click() # step_fc_summary: test minimum needs text # summaries = dialog.lblSummary.text().split('<br/>') # #TODO: temporarily disable minimum needs test as they seem # #te be removed from params # minneeds = [s for s in summaries # if expected_summary_key.upper() in s.upper()] # self.assertTrue(minneeds) # self.assertTrue(expected_summary_value_fragment.upper() # in minneeds[0].upper()) # step_fc_summary: run analysis dialog.pbnNext.click() # No longer valid for impact data. # step_fc_analysis: test the html output # report_path = dialog.wvResults.report_path # size = os.stat(report_path).st_size # self.assertTrue( # (expected_report_size - tolerance < size < expected_report_size + # tolerance)) # close the wizard dialog.pbnNext.click()
def test_issue160(self): """Test that multipart features can be used in a scenario - issue #160 """ exposure_layer = clone_shp_layer( name='buildings', include_keywords=True, source_directory=test_data_path('exposure')) hazard_layer = clone_shp_layer( name='flood_multipart_polygons', include_keywords=True, source_directory=test_data_path('hazard')) exposure_path = exposure_layer.source() hazard_path = hazard_layer.source() # See https://github.com/AIFDR/inasafe/issues/71 # Push OK with the left mouse button # print 'Using QGIS: %s' % qgis_version() self.tearDown() button = self.dock.pbnRunStop # First part of scenario should have enabled run file_list = [hazard_path, exposure_path] hazard_layer_count, exposure_layer_count = load_layers(file_list) message = ( 'Incorrect number of Hazard layers: expected 1 got %s' % hazard_layer_count) self.assertTrue(hazard_layer_count == 1, message) message = ( 'Incorrect number of Exposure layers: expected 1 got %s' % exposure_layer_count) self.assertTrue(exposure_layer_count == 1, message) message = 'Run button was not enabled' self.assertTrue(button.isEnabled(), message) # Second part of scenario - run disabled when adding invalid layer # and select it - run should be disabled path = os.path.join(TESTDATA, 'issue71.tif') file_list = [path] # This layer has incorrect keywords clear_flag = False _, _ = load_layers(file_list, clear_flag) result, message = setup_scenario( self.dock, hazard='Flood Polygon', exposure='Buildings', function='Be flooded', function_id='FloodPolygonBuildingFunction') self.assertTrue(result, message) # Enable on-the-fly reprojection set_canvas_crs(GEOCRS, True) expected_extent = QgsRectangle( 106.80801, -6.19531, 106.83456946836641, -6.167526) CANVAS.setExtent(expected_extent) crs = QgsCoordinateReferenceSystem('EPSG:4326') self.dock.define_user_analysis_extent(expected_extent, crs) # Press RUN # noinspection PyCallByClass,PyCallByClass,PyTypeChecker self.dock.accept() result = self.dock.wvResults.page_to_text() message = 'Result not as expected: %s' % result self.assertTrue(format_int(33) in result, message)
def test_input_function_centric_wizard(self): """Test the IFCW mode: FloodRasterBuildingFunction""" expected_test_layer_count = 2 expected_hazards_count = 5 # expected_exposures_count = 3 expected_exposures_count = 4 expected_flood_structure_functions_count = 4 expected_raster_polygon_functions_count = 2 expected_functions_count = 2 chosen_if = 'FloodRasterBuildingFunction' expected_hazard_layers_count = 1 expected_exposure_layers_count = 1 expected_aggregation_layers_count = 0 # expected_summary_key = 'minimum needs' # expected_summary_value_fragment = 'rice' # expected_report_size = 4055 # as saved on Ubuntu # TS : changed tolerance from 120 to 160 because above change # causes fail on fedora # AG: updated the tolerance from 160 to 190 # MD: more tolerance please! 190 -> 200 # tolerance = 200 # windows EOL etc # Initialize dialog # noinspection PyTypeChecker dialog = WizardDialog(iface=IFACE) dialog.dock = self.dock dialog.set_function_centric_mode() QgsMapLayerRegistry.instance().removeAllMapLayers() # Load test layers layer = clone_raster_layer( name='continuous_flood_20_20', extension='.asc', include_keywords=True, source_directory=test_data_path('hazard')) # noinspection PyArgumentList QgsMapLayerRegistry.instance().addMapLayers([layer]) layer = clone_shp_layer( name='buildings', include_keywords=True, source_directory=test_data_path('exposure')) # noinspection PyArgumentList QgsMapLayerRegistry.instance().addMapLayers([layer]) # Check the environment first self.assertIsNotNone(layer.dataProvider()) count = len(dialog.iface.mapCanvas().layers()) self.assertEqual(count, expected_test_layer_count) # step_fc_functions1: test function matrix dimensions col_count = dialog.step_fc_functions1.tblFunctions1.columnCount() self.assertEqual(col_count, expected_hazards_count) row_count = dialog.step_fc_functions1.tblFunctions1.rowCount() self.assertEqual(row_count, expected_exposures_count) # step_fc_functions1: test number of functions for flood x structure dialog.step_fc_functions1.tblFunctions1.setCurrentCell(3, 1) count = len(dialog.step_fc_functions1.selected_functions_1()) self.assertEqual(count, expected_flood_structure_functions_count) # step_fc_functions1: press ok dialog.pbnNext.click() # step_fc_functions2: test number of functions for raster flood # and polygon structure self.check_current_step(dialog.step_fc_functions2) dialog.step_fc_functions2.tblFunctions2.setCurrentCell(3, 0) count = len(dialog.step_fc_functions2.selected_functions_2()) self.assertEqual(count, expected_raster_polygon_functions_count) # step_fc_functions2: press ok dialog.pbnNext.click() # step_fc_function: test number of available functions self.check_current_step(dialog.step_fc_function) count = dialog.step_fc_function.lstFunctions.count() self.assertEqual(count, expected_functions_count) # step_fc_function: test if chosen_if is on the list role = QtCore.Qt.UserRole flood_ifs = [ dialog.step_fc_function.lstFunctions.item(row).data(role)['id'] for row in range(count)] self.assertTrue(chosen_if in flood_ifs) # step_fc_function: select FloodRasterBuildingImpactFunction and # press ok chosen_if_row = flood_ifs.index(chosen_if) dialog.step_fc_function.lstFunctions.setCurrentRow(chosen_if_row) dialog.pbnNext.click() # step_fc_hazlayer_from_canvas: test the lstCanvasHazLayers state # Note this step is tested prior to step_fc_hazlayer_origin # as the list is prepared prior to autoselecting the radiobuttons count = dialog.step_fc_hazlayer_from_canvas.lstCanvasHazLayers.count() self.assertEqual(count, expected_hazard_layers_count) # step_fc_hazlayer_origin: test if the radiobuttons are autmatically # enabled and selected self.assertTrue( dialog.step_fc_hazlayer_origin.rbHazLayerFromCanvas.isEnabled()) self.assertTrue( dialog.step_fc_hazlayer_origin.rbHazLayerFromCanvas.isChecked()) # step_fc_hazlayer_origin: press ok self.check_current_step(dialog.step_fc_hazlayer_origin) dialog.pbnNext.click() # step_fc_hazlayer_from_canvas: press ok self.check_current_step(dialog.step_fc_hazlayer_from_canvas) dialog.pbnNext.click() # step_fc_explayer_from_canvas: test the lstCanvasExpLayers state # Note this step is tested prior to step_fc_explayer_origin # as the list is prepared prior to autoselecting the radiobuttons count = dialog.step_fc_explayer_from_canvas.lstCanvasExpLayers.count() self.assertEqual(count, expected_exposure_layers_count) # step_fc_explayer_origin: test if the radiobuttons are automatically # enabled and selected self.assertTrue( dialog.step_fc_explayer_origin.rbExpLayerFromCanvas.isEnabled()) self.assertTrue( dialog.step_fc_explayer_origin.rbExpLayerFromCanvas.isChecked()) # step_fc_explayer_origin: press ok self.check_current_step(dialog.step_fc_explayer_origin) dialog.pbnNext.click() # step_fc_explayer_from_canvas: press ok self.check_current_step(dialog.step_fc_explayer_from_canvas) dialog.pbnNext.click() # step_fc_explayer_from_canvas: test the lstCanvasAggLayers state # Note this step is tested prior to step_fc_agglayer_origin # as the list is prepared prior to auto selecting the radio buttons count = dialog.step_fc_agglayer_from_canvas.lstCanvasAggLayers.count() self.assertEqual(count, expected_aggregation_layers_count) # step_fc_agglayer_origin: test if the radio buttons are automatically # enabled and selected self.assertFalse( dialog.step_fc_agglayer_origin.rbAggLayerFromCanvas.isEnabled()) self.assertTrue( dialog.step_fc_agglayer_origin.rbAggLayerFromBrowser.isChecked()) # step_fc_agglayer_origin: switch to no aggregation and press ok self.check_current_step(dialog.step_fc_agglayer_origin) dialog.step_fc_agglayer_origin.rbAggLayerNoAggregation.click() dialog.pbnNext.click() # step_fc_extent: switch to layer's extent and press ok self.check_current_step(dialog.step_fc_extent) dialog.step_fc_extent.extent_dialog.hazard_exposure_only.click() dialog.pbnNext.click() # step_fc_params: press ok (already covered by the relevant test) self.check_current_step(dialog.step_fc_params) dialog.pbnNext.click() # step_fc_summary: test minimum needs text # summaries = dialog.lblSummary.text().split('<br/>') # #TODO: temporarily disable minimum needs test as they seem # #te be removed from params # minneeds = [s for s in summaries # if expected_summary_key.upper() in s.upper()] # self.assertTrue(minneeds) # self.assertTrue(expected_summary_value_fragment.upper() # in minneeds[0].upper()) # step_fc_summary: run analysis dialog.pbnNext.click() # No longer valid for impact data. # step_fc_analysis: test the html output # report_path = dialog.wvResults.report_path # size = os.stat(report_path).st_size # self.assertTrue( # (expected_report_size - tolerance < size < expected_report_size + # tolerance)) # close the wizard dialog.pbnNext.click()
def test_check_aggregation(self): """Test for keywords dialog's behavior for aggregation layer.""" layer = clone_shp_layer(name='district_osm_jakarta', include_keywords=True, source_directory=test_data_path('boundaries')) dialog = KeywordsDialog(PARENT, IFACE, layer=layer) # Load existing keywords keywords = dialog.get_keywords() expected_keywords = { u'category': u'postprocessing', u'aggregation attribute': u'KAB_NAME', u'title': u'D\xedstr\xedct\'s of Jakarta', u'elderly ratio attribute': u'Global default', u'youth ratio default': u'0.26', u'elderly ratio default': u'0.08', u'adult ratio attribute': u'Global default', u'female ratio attribute': u'PEREMPUAN', u'youth ratio attribute': u'Global default', u'adult ratio default': u'0.66' } message = 'Expected %s but I got %s' % (expected_keywords, keywords) self.assertDictEqual(expected_keywords, keywords, message) # Check age ratios are valid good_sum_ratio, _ = dialog.age_ratios_are_valid(keywords) message = 'Expected %s but I got %s' % (True, good_sum_ratio) self.assertEqual(True, good_sum_ratio, message) # Change youth ratio attribute to Don't Use dialog.cboYouthRatioAttribute.setCurrentIndex(1) keywords = dialog.get_keywords() expected_keywords = { u'category': u'postprocessing', u'aggregation attribute': u'KAB_NAME', u'title': u'D\xedstr\xedct\'s of Jakarta', u'elderly ratio attribute': u'Global default', u'elderly ratio default': u'0.08', u'adult ratio attribute': u'Global default', u'female ratio attribute': u'PEREMPUAN', u'youth ratio attribute': u'Don\'t use', u'adult ratio default': u'0.66' } message = 'Expected %s but I got %s' % (expected_keywords, keywords) self.assertDictEqual(expected_keywords, keywords, message) good_sum_ratio, _ = dialog.age_ratios_are_valid(keywords) message = 'Expected %s but I got %s' % (True, good_sum_ratio) self.assertEqual(True, good_sum_ratio, message) # Change youth ratio attribute to Global Default # Change youth ratio default to 0.99 dialog.cboYouthRatioAttribute.setCurrentIndex(0) dialog.dsbYouthRatioDefault.setValue(0.99) keywords = dialog.get_keywords() expected_keywords = { u'category': u'postprocessing', u'aggregation attribute': u'KAB_NAME', u'title': u'D\xedstr\xedct\'s of Jakarta', u'elderly ratio attribute': u'Global default', u'elderly ratio default': u'0.08', u'adult ratio attribute': u'Global default', u'female ratio attribute': u'PEREMPUAN', u'youth ratio attribute': u'Global default', u'youth ratio default': u'0.99', u'adult ratio default': u'0.66' } message = 'Expected %s but I got %s' % (expected_keywords, keywords) self.assertDictEqual(expected_keywords, keywords, message) good_sum_ratio, _ = dialog.age_ratios_are_valid(keywords) message = 'Expected %s but I got %s' % (False, good_sum_ratio) self.assertEqual(False, good_sum_ratio, message) # We need to delete reference to layer on Windows before removing # the files del layer del dialog.layer # Using clone_shp_layer the files are saved in testing dir under # InaSAFE temp dir shutil.rmtree(temp_dir(sub_dir='testing'))
def test_issue230(self): """Verify that we give informative errors when style is not correct .. seealso:: https://github.com/AIFDR/inasafe/issues/230 """ vector_layer = clone_shp_layer( name='polygons_for_styling', include_keywords=True, source_directory=test_data_path('impact')) style = { 'legend_title': u'Population Count', 'target_field': 'population', 'style_classes': [ { 'transparency': 0, 'min': [0], # <--intentionally broken list not number! 'max': 139904.08186340332, 'colour': '#FFFFFF', 'size': 1, 'label': u'Nil' }, { 'transparency': 0, 'min': 139904.08186340332, 'max': 279808.16372680664, 'colour': '#38A800', 'size': 1, 'label': u'Low' }, { 'transparency': 0, 'min': 279808.16372680664, 'max': 419712.24559020996, 'colour': '#79C900', 'size': 1, 'label': u'Low' }, { 'transparency': 0, 'min': 419712.24559020996, 'max': 559616.32745361328, 'colour': '#CEED00', 'size': 1, 'label': u'Low' }, { 'transparency': 0, 'min': 559616.32745361328, 'max': 699520.4093170166, 'colour': '#FFCC00', 'size': 1, 'label': u'Medium' }, { 'transparency': 0, 'min': 699520.4093170166, 'max': 839424.49118041992, 'colour': '#FF6600', 'size': 1, 'label': u'Medium' }, { 'transparency': 0, 'min': 839424.49118041992, 'max': 979328.57304382324, 'colour': '#FF0000', 'size': 1, 'label': u'Medium' }, { 'transparency': 0, 'min': 979328.57304382324, 'max': 1119232.6549072266, 'colour': '#7A0000', 'size': 1, 'label': u'High' } ] } try: set_vector_graduated_style(vector_layer, style) except StyleError: # Exactly what should have happened return except Exception, e: # pylint: disable=broad-except print str(e)
def test_issue230(self): """Verify that we give informative errors when style is not correct .. seealso:: https://github.com/AIFDR/inasafe/issues/230 """ vector_layer = clone_shp_layer( name='polygons_for_styling', include_keywords=True, source_directory=test_data_path('impact')) style = { 'legend_title': u'Population Count', 'target_field': 'population', 'style_classes': [ { 'transparency': 0, 'min': [0], # <--intentionally broken list not number! 'max': 139904.08186340332, 'colour': '#FFFFFF', 'size': 1, 'label': u'Nil'}, { 'transparency': 0, 'min': 139904.08186340332, 'max': 279808.16372680664, 'colour': '#38A800', 'size': 1, 'label': u'Low'}, { 'transparency': 0, 'min': 279808.16372680664, 'max': 419712.24559020996, 'colour': '#79C900', 'size': 1, 'label': u'Low'}, { 'transparency': 0, 'min': 419712.24559020996, 'max': 559616.32745361328, 'colour': '#CEED00', 'size': 1, 'label': u'Low'}, { 'transparency': 0, 'min': 559616.32745361328, 'max': 699520.4093170166, 'colour': '#FFCC00', 'size': 1, 'label': u'Medium'}, { 'transparency': 0, 'min': 699520.4093170166, 'max': 839424.49118041992, 'colour': '#FF6600', 'size': 1, 'label': u'Medium'}, { 'transparency': 0, 'min': 839424.49118041992, 'max': 979328.57304382324, 'colour': '#FF0000', 'size': 1, 'label': u'Medium'}, { 'transparency': 0, 'min': 979328.57304382324, 'max': 1119232.6549072266, 'colour': '#7A0000', 'size': 1, 'label': u'High'}]} try: set_vector_graduated_style(vector_layer, style) except StyleError: # Exactly what should have happened return except Exception, e: # pylint: disable=broad-except print str(e)
def test_existing_complex_keywords(self): """Test for existing complex keywords in wizard in locale mode.""" from safe.gui.tools.wizard_dialog import WizardDialog from safe.test.utilities import ( clone_shp_layer, remove_vector_temp_file) layer = clone_shp_layer( name='tsunami_polygon', include_keywords=True, source_directory='') from safe.test.utilities import get_qgis_app # Get QGis app handle # noinspection PyPep8Naming _, _, IFACE, PARENT = get_qgis_app() # noinspection PyTypeChecker dialog = WizardDialog(PARENT, IFACE) dialog.set_keywords_creation_mode(layer) # select hazard self.select_from_list_widget('ancaman', dialog.lstCategories) dialog.pbnNext.click() # select volcano self.select_from_list_widget('gunung berapi', dialog.lstSubcategories) dialog.pbnNext.click() # select volcano categorical unit self.select_from_list_widget('Kategori gunung berapi', dialog.lstUnits) dialog.pbnNext.click() # select GRIDCODE self.select_from_list_widget('GRIDCODE', dialog.lstFields) dialog.pbnNext.click() unit = dialog.selected_unit() default_classes = unit['classes'] unassigned_values = [] # no need to check actually, not save in file assigned_values = { 'low': ['5.0'], 'medium': ['3.0', '4.0'], 'high': ['2.0'] } dialog.populate_classified_values( unassigned_values, assigned_values, default_classes) dialog.pbnNext.click() source = 'Source' source_scale = 'Source Scale' source_url = 'Source Url' source_date = QDateTime.fromString( '06-12-2015 12:30', 'dd-MM-yyyy HH:mm') dialog.leSource.setText(source) dialog.leSource_scale.setText(source_scale) dialog.leSource_url.setText(source_url) dialog.leSource_date.seDateTime(source_date) dialog.pbnNext.click() # next dialog.pbnNext.click() # finish # noinspection PyTypeChecker dialog = WizardDialog(PARENT, IFACE) dialog.set_keywords_creation_mode(layer) # step 1 of 7 - select category self.check_current_text('ancaman', dialog.lstCategories) # Click Next dialog.pbnNext.click() # step 2 of 7 - select subcategory # noinspection PyTypeChecker self.check_current_text('gunung berapi', dialog.lstSubcategories) # Click Next dialog.pbnNext.click() # step 3 of 7 - select volcano units self.check_current_text('Kategori gunung berapi', dialog.lstUnits) # Click Next dialog.pbnNext.click() # step 4 of 7 - select field self.check_current_text('GRIDCODE', dialog.lstFields) # Click Next dialog.pbnNext.click() for index in range(dialog.lstUniqueValues.count()): message = ('%s Should be in unassigned values' % dialog.lstUniqueValues.item(index).text()) self.assertIn( dialog.lstUniqueValues.item(index).text(), unassigned_values, message) real_assigned_values = dialog.selected_mapping() self.assertDictEqual(real_assigned_values, assigned_values) # Click Next dialog.pbnNext.click() # step 6 of 7 - enter source message = ('Invalid Next button state in step 6! Disabled while ' 'source is optional') self.assertTrue(dialog.pbnNext.isEnabled(), message) message = 'Source should be %s' % source self.assertEqual(dialog.leSource.text(), source, message) message = 'Source Url should be %s' % source_url self.assertEqual(dialog.leSource_url.text(), source_url, message) message = 'Source Date should be %s' % source_date.toString( 'dd-MM-yyyy HH:mm') self.assertEqual(dialog.leSource_date.dateTime(), source_date, message) message = 'Source Scale should be %s' % source_scale self.assertEqual(dialog.leSource_scale.text(), source_scale, message) dialog.pbnNext.click() dialog.pbnCancel.click() remove_vector_temp_file(layer.source())
def test_input_function_centric_wizard_test_3(self): """Test various usecases of the wizard: keywordless layers, disjoint layers, browsers, stepping back and forth .""" chosen_if1 = 'FloodRasterBuildingFunction' chosen_if2 = 'ClassifiedRasterHazardBuildingFunction' expected_hazard_layers_count = 2 expected_exposure_layers_count = 2 expected_aggregation_layers_count = 2 # Initialize dialog # noinspection PyTypeChecker dialog = WizardDialog(iface=IFACE) dialog.dock = self.dock dialog.set_function_centric_mode() QgsMapLayerRegistry.instance().removeAllMapLayers() # Load test layers # Hazard layer without keywords layer = clone_raster_layer( name='keywordless_layer', extension='.tif', include_keywords=False, source_directory=standard_data_path('hazard')) # noinspection PyArgumentList QgsMapLayerRegistry.instance().addMapLayers([layer]) # Hazard layer - disjoint layer = clone_raster_layer( name='continuous_flood_unaligned_big_size', extension='.tif', include_keywords=True, source_directory=standard_data_path('hazard')) # noinspection PyArgumentList QgsMapLayerRegistry.instance().addMapLayers([layer]) # Hazard layer layer = clone_raster_layer( name='classified_flood_20_20', extension='.asc', include_keywords=True, source_directory=standard_data_path('hazard')) # noinspection PyArgumentList QgsMapLayerRegistry.instance().addMapLayers([layer]) # Exposure layer layer = clone_shp_layer( name='building-points', include_keywords=True, source_directory=standard_data_path('exposure')) # noinspection PyArgumentList QgsMapLayerRegistry.instance().addMapLayers([layer]) # Exposure layer without keywords layer = clone_shp_layer( name='building-points', include_keywords=False, source_directory=standard_data_path('exposure')) # noinspection PyArgumentList QgsMapLayerRegistry.instance().addMapLayers([layer]) # Aggregation layer layer = clone_shp_layer( name='district_osm_jakarta', include_keywords=True, source_directory=standard_data_path('boundaries')) # noinspection PyArgumentList QgsMapLayerRegistry.instance().addMapLayers([layer]) # Aggregation layer without keywords layer = clone_shp_layer( name='grid_jakarta', include_keywords=False, source_directory=standard_data_path('boundaries')) # noinspection PyArgumentList QgsMapLayerRegistry.instance().addMapLayers([layer]) # step_fc_functions1: select functions for flood x structure self.check_current_step(dialog.step_fc_functions1) dialog.step_fc_functions1.tblFunctions1.setCurrentCell(3, 1) dialog.pbnNext.click() # step_fc_functions2: select functions for raster x point self.check_current_step(dialog.step_fc_functions2) dialog.step_fc_functions2.tblFunctions2.setCurrentCell(1, 0) dialog.pbnNext.click() # step_fc_function: test if FloodRasterBuildingFunction is on the list role = QtCore.Qt.UserRole flood_ifs = [ dialog.step_fc_function.lstFunctions.item(row).data(role)['id'] for row in range(dialog.step_fc_function.lstFunctions.count())] self.assertTrue(chosen_if1 in flood_ifs) # step_fc_function: select FloodRasterBuildingFunction and # press ok self.check_current_step(dialog.step_fc_function) chosen_if_row = flood_ifs.index(chosen_if1) dialog.step_fc_function.lstFunctions.setCurrentRow(chosen_if_row) dialog.pbnNext.click() # step_fc_hazlayer_origin: self.check_current_step(dialog.step_fc_hazlayer_origin) # step_fc_hazlayer_from_canvas: test the lstCanvasHazLayers state # Note this step is tested prior to step_fc_hazlayer_origin # as the list is prepared prior to autoselecting the radiobuttons count = dialog.step_fc_hazlayer_from_canvas.lstCanvasHazLayers.count() self.assertEqual(count, expected_hazard_layers_count) # test if hazard browser works dialog.step_fc_hazlayer_origin.rbHazLayerFromBrowser.click() dialog.pbnNext.click() self.check_current_step(dialog.step_fc_hazlayer_from_browser) # step back and continue with hazard from canvas dialog.pbnBack.click() dialog.step_fc_hazlayer_origin.rbHazLayerFromCanvas.click() dialog.pbnNext.click() # step_fc_hazlayer_from_canvas self.check_current_step(dialog.step_fc_hazlayer_from_canvas) # Select the second (keywordless) layer in order to trigger preparing # the 'missing keywords' description. dialog.step_fc_hazlayer_from_canvas.lstCanvasHazLayers.setCurrentRow(1) dialog.pbnNext.click() self.check_current_step(dialog.step_kw_purpose) dialog.pbnBack.click() # Now select the first (proper) layer and press ok dialog.step_fc_hazlayer_from_canvas.lstCanvasHazLayers.setCurrentRow(0) dialog.pbnNext.click() # step_fc_explayer_origin self.check_current_step(dialog.step_fc_explayer_origin) count = dialog.step_fc_explayer_from_canvas.lstCanvasExpLayers.count() self.assertEqual(count, expected_exposure_layers_count) # test if exposure browser works dialog.step_fc_explayer_origin.rbExpLayerFromBrowser.click() dialog.pbnNext.click() self.check_current_step(dialog.step_fc_explayer_from_browser) # step back and continue with exposure from canvas dialog.pbnBack.click() dialog.step_fc_explayer_origin.rbExpLayerFromCanvas.click() dialog.pbnNext.click() self.check_current_step(dialog.step_fc_explayer_from_canvas) # Select the second (keywordless) layer in order to trigger preparing # the 'missing keywords' description. dialog.step_fc_explayer_from_canvas.lstCanvasExpLayers.setCurrentRow(1) dialog.pbnNext.click() self.check_current_step(dialog.step_kw_purpose) dialog.pbnBack.click() # Now select the first (proper) layer and press ok dialog.step_fc_explayer_from_canvas.lstCanvasExpLayers.setCurrentRow(0) dialog.pbnNext.click() # step_fc_disjoint_layers self.check_current_step(dialog.step_fc_disjoint_layers) dialog.pbnBack.click() self.check_current_step(dialog.step_fc_explayer_from_canvas) dialog.pbnBack.click() self.check_current_step(dialog.step_fc_explayer_origin) dialog.pbnBack.click() self.check_current_step(dialog.step_fc_hazlayer_from_canvas) dialog.pbnBack.click() self.check_current_step(dialog.step_fc_hazlayer_origin) dialog.pbnBack.click() self.check_current_step(dialog.step_fc_function) # Select ClassifiedRasterHazardBuildingFunction chosen_if_row = flood_ifs.index(chosen_if2) dialog.step_fc_function.lstFunctions.setCurrentRow(chosen_if_row) dialog.pbnNext.click() self.check_current_step(dialog.step_fc_hazlayer_origin) dialog.pbnNext.click() self.check_current_step(dialog.step_fc_hazlayer_from_canvas) # Select the first (proper) layer and press ok dialog.step_fc_hazlayer_from_canvas.lstCanvasHazLayers.setCurrentRow(0) dialog.pbnNext.click() self.check_current_step(dialog.step_fc_explayer_origin) dialog.pbnNext.click() self.check_current_step(dialog.step_fc_explayer_from_canvas) dialog.step_fc_explayer_from_canvas.lstCanvasExpLayers.setCurrentRow(0) dialog.pbnNext.click() self.check_current_step(dialog.step_fc_agglayer_origin) # test if no aggregation works dialog.step_fc_agglayer_origin.rbAggLayerNoAggregation.click() dialog.pbnNext.click() self.check_current_step(dialog.step_fc_extent) # step back and test if aggregation browser works dialog.pbnBack.click() dialog.step_fc_agglayer_origin.rbAggLayerFromBrowser.click() dialog.pbnNext.click() self.check_current_step(dialog.step_fc_agglayer_from_browser) # step back and continue with aggregation from canvas dialog.pbnBack.click() dialog.step_fc_agglayer_origin.rbAggLayerFromCanvas.click() dialog.pbnNext.click() self.check_current_step(dialog.step_fc_agglayer_from_canvas) count = dialog.step_fc_agglayer_from_canvas.lstCanvasAggLayers.count() self.assertEqual(count, expected_aggregation_layers_count) # Select the second (keywordless) layer in order to trigger preparing # the 'missing keywords' description. dialog.step_fc_agglayer_from_canvas.lstCanvasAggLayers.setCurrentRow(1) dialog.pbnNext.click() self.check_current_step(dialog.step_kw_purpose) dialog.pbnBack.click() # Now select the first (proper) layer and press ok dialog.step_fc_agglayer_from_canvas.lstCanvasAggLayers.setCurrentRow(0) dialog.pbnNext.click() self.check_current_step(dialog.step_fc_extent) dialog.pbnNext.click() self.check_current_step(dialog.step_fc_params) # Step back and enter the params step again dialog.pbnBack.click() self.check_current_step(dialog.step_fc_extent) dialog.pbnNext.click() self.check_current_step(dialog.step_fc_params) dialog.pbnNext.click() self.check_current_step(dialog.step_fc_summary) dialog.pbnBack.click() self.check_current_step(dialog.step_fc_params) dialog.pbnBack.click() self.check_current_step(dialog.step_fc_extent) dialog.pbnBack.click() self.check_current_step(dialog.step_fc_agglayer_from_canvas) dialog.pbnBack.click() self.check_current_step(dialog.step_fc_agglayer_origin) # No need to test more backward steps (already tested in other test) dialog.pbnCancel.click()