Example #1
0
    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)
Example #2
0
    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)
Example #3
0
    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)
Example #4
0
    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)
Example #5
0
    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())
Example #6
0
    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_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)
Example #10
0
    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)
Example #11
0
    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)
Example #12
0
    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)
Example #13
0
    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
Example #14
0
    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')
Example #15
0
    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')
Example #16
0
    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
Example #17
0
    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
Example #18
0
 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)
Example #21
0
    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()
Example #28
0
    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()
Example #30
0
    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'))
Example #31
0
    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)
Example #32
0
    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)
Example #33
0
    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()