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)
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']))
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)
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))
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)