예제 #1
0
    def test_validation_required_args_threshold(self):
        """RouteDEM: test required args in validation (with threshold)."""
        from natcap.invest import routedem
        from natcap.invest import validation

        args = {'calculate_stream_threshold': True}
        required_keys = [
            'workspace_dir', 'dem_path', 'algorithm',

            # Required because calculate_stream_threshold
            'threshold_flow_accumulation']

        validation_warnings = routedem.validate(args)
        invalid_keys = validation.get_invalid_keys(validation_warnings)
        for key in required_keys:
            self.assertTrue(key in invalid_keys)
예제 #2
0
    def test_validation_band_index_value_too_large(self):
        """RouteDEM: test validation of a too-large band index."""
        from natcap.invest import routedem
        from natcap.invest import validation

        args = {
            'workspace_dir': self.workspace_dir,
            'dem_path': os.path.join(self.workspace_dir, 'raster.tif'),
            'dem_band_index': 5,
        }

        # Has two bands, so band index 5 is too large.
        RouteDEMTests._make_dem(args['dem_path'])

        validation_errors = routedem.validate(args)
        invalid_keys = validation.get_invalid_keys(validation_errors)

        self.assertEqual(invalid_keys, set(['algorithm', 'dem_band_index']))
예제 #3
0
    def test_missing_transitions_map_year_mismatch(self):
        """CBC Validate: assert transition maps and years are equal length."""
        from natcap.invest.coastal_blue_carbon import coastal_blue_carbon
        from natcap.invest import validation

        validation_warnings = coastal_blue_carbon.validate(
            {'lulc_transition_years_list': [1999],
             'lulc_transition_maps_list': ['foo.tif', 'bar.tif']})
        invalid_keys = validation.get_invalid_keys(validation_warnings)
        expected_missing_keys = set(
            self.base_required_keys +
            ['lulc_transition_maps_list',
             'lulc_transition_years_list'])
        self.assertEqual(invalid_keys, expected_missing_keys)
        expected_message = 'Must have the same number of elements.'
        actual_messages = set()
        for keys, error_strings in validation_warnings:
            actual_messages.add(error_strings)
        self.assertTrue(expected_message in actual_messages)
예제 #4
0
    def test_validation(self):
        """NDR test argument validation."""
        from natcap.invest.ndr import ndr
        from natcap.invest import validation

        # use predefined directory so test can clean up files during teardown
        args = NDRTests.generate_base_args(self.workspace_dir)
        # should not raise an exception
        ndr.validate(args)

        del args['workspace_dir']
        validation_errors = ndr.validate(args)
        self.assertEquals(len(validation_errors), 1)

        args = NDRTests.generate_base_args(self.workspace_dir)
        args['workspace_dir'] = ''
        validation_error_list = ndr.validate(args)
        # we should have one warning that is an empty value
        self.assertEqual(len(validation_error_list), 1)

        # here the wrong GDAL type happens (vector instead of raster)
        args = NDRTests.generate_base_args(self.workspace_dir)
        args['lulc_path'] = args['watersheds_path']
        validation_error_list = ndr.validate(args)
        # we should have one warning that is an empty value
        self.assertEqual(len(validation_error_list), 1)

        # here the wrong GDAL type happens (raster instead of vector)
        args = NDRTests.generate_base_args(self.workspace_dir)
        args['watersheds_path'] = args['lulc_path']
        validation_error_list = ndr.validate(args)
        # we should have one warning that is an empty value
        self.assertEqual(len(validation_error_list), 1)

        # cover that there's no p and n calculation
        args = NDRTests.generate_base_args(self.workspace_dir)
        args['calc_p'] = False
        args['calc_n'] = False
        validation_error_list = ndr.validate(args)
        # we should have one warning that is an empty value
        self.assertEqual(len(validation_error_list), 1)
        self.assertTrue('calc_n' in validation_error_list[0][0]
                        and 'calc_p' in validation_error_list[0][0])

        # cover that a file is missing
        args = NDRTests.generate_base_args(self.workspace_dir)
        args['lulc_path'] = 'this/path/does/not/exist.tif'
        validation_error_list = ndr.validate(args)
        # we should have one warning that is an empty value
        self.assertEqual(len(validation_error_list), 1)

        # cover that some args are conditionally required when
        # these args are present and true
        args = {'calc_p': True, 'calc_n': True}
        validation_error_list = ndr.validate(args)
        invalid_args = validation.get_invalid_keys(validation_error_list)
        expected_missing_args = [
            'biophysical_table_path',
            'threshold_flow_accumulation',
            'dem_path',
            'subsurface_critical_length_n',
            'subsurface_critical_length_p',
            'runoff_proxy_path',
            'lulc_path',
            'workspace_dir',
            'k_param',
            'watersheds_path',
            'subsurface_eff_p',
            'subsurface_eff_n',
        ]
        self.assertEqual(set(invalid_args), set(expected_missing_args))
예제 #5
0
    def test_missing_keys_with_valuation(self):
        """Wind Energy Validate: assert missing required for valuation."""
        from natcap.invest import wind_energy
        from natcap.invest import validation

        base_required_valuation = ['land_polygon_vector_path',
                                   'min_distance',
                                   'max_distance',
                                   'foundation_cost',
                                   'discount_rate']
        required_no_price_table = ['wind_price', 'rate_change']
        required_no_grid_points = ['avg_grid_distance']
        required_no_grid_distance = ['grid_points_path']

        # Test that many args become required for valuation.
        args = {'valuation_container': True}
        validation_errors = wind_energy.validate(args)
        invalid_keys = validation.get_invalid_keys(validation_errors)
        expected_missing_keys = set(
            self.base_required_keys +
            base_required_valuation +
            ['price_table'] +
            required_no_price_table +
            required_no_grid_distance +
            required_no_grid_points)
        self.assertEqual(invalid_keys, expected_missing_keys)

        # Test wind_price, rate_change are not required if price_table
        args = {
            'valuation_container': True,
            'price_table': True
        }
        validation_errors = wind_energy.validate(args)
        invalid_keys = validation.get_invalid_keys(validation_errors)
        expected_missing_keys = set(
            self.base_required_keys +
            base_required_valuation +
            ['wind_schedule'] +  # required when price_table
            required_no_grid_distance +
            required_no_grid_points)
        self.assertEqual(invalid_keys, expected_missing_keys)

        # Test grid_points_path is not required if avg_grid_distance:
        args = {
            'valuation_container': True,
            'avg_grid_distance': 9
        }
        validation_errors = wind_energy.validate(args)
        invalid_keys = validation.get_invalid_keys(validation_errors)
        expected_missing_keys = set(
            self.base_required_keys +
            base_required_valuation +
            ['price_table'] +
            required_no_price_table)
        self.assertEqual(invalid_keys, expected_missing_keys)

        # TestAOI becomes required when these two args present:
        args = {
            'valuation_container': True,
            'grid_points_path': 'foo.shp'
        }
        validation_errors = wind_energy.validate(args)
        invalid_keys = validation.get_invalid_keys(validation_errors)
        expected_missing_keys = set(
            self.base_required_keys +
            base_required_valuation +
            ['price_table'] +
            required_no_price_table +
            ['grid_points_path', 'aoi_vector_path'])
        self.assertEqual(invalid_keys, expected_missing_keys)