def test_criteria_excel_file(self): """HRA: test excel files read correctly by _get_criteria_dataframe.""" from natcap.invest.hra import _get_criteria_dataframe # Make an info CSV file and read it as a dataframe criteria_csv_path = os.path.join(self.workspace_dir, 'criteria.csv') _make_criteria_csv(criteria_csv_path, self.workspace_dir, rel_path=True) expected_df = _get_criteria_dataframe(criteria_csv_path).astype(str) # Since we don't have openpyxl library, use the existing excel file # from TEST_DATA folder, and copy it to self.workspace_dir so # the function won't raise exceptions about vector or raster files # in the table not existing criteria_excel_path = os.path.join(TEST_DATA, 'criteria_excel.xlsx') copied_criteria_excel_path = os.path.join(self.workspace_dir, 'criteria_excel.xlsx') shutil.copyfile(criteria_excel_path, copied_criteria_excel_path) out_df = _get_criteria_dataframe(copied_criteria_excel_path).astype( str) self.assertTrue( out_df.equals(expected_df), 'The dataframes from criteria CSV and excel files are different.')
def test_missing_criteria_header_from_criteria_csv(self): """HRA: correct error message when missing indexes from criteria CSV.""" from natcap.invest.hra import _get_criteria_dataframe # Use a criteria CSV that misses two indexes bad_criteria_table_path = os.path.join(self.workspace_dir, 'bad_criteria.csv') _make_criteria_csv(bad_criteria_table_path, self.workspace_dir, missing_criteria_header=True) with self.assertRaises(ValueError) as cm: _get_criteria_dataframe(bad_criteria_table_path) expected_message = 'missing the column header "CRITERIA TYPE"' actual_message = str(cm.exception) self.assertTrue(expected_message in actual_message, actual_message)
def test_missing_index_from_criteria_csv(self): """HRA: correct error message when missing indexes from criteria CSV.""" from natcap.invest.hra import _get_criteria_dataframe # Use a criteria CSV that misses two indexes bad_criteria_table_path = os.path.join(self.workspace_dir, 'bad_criteria.csv') _make_criteria_csv(bad_criteria_table_path, self.workspace_dir, missing_index=True) with self.assertRaises(ValueError) as cm: _get_criteria_dataframe(bad_criteria_table_path) expected_message = ( "'HABITAT NAME', 'HABITAT STRESSOR OVERLAP PROPERTIES'") actual_message = str(cm.exception) self.assertTrue(expected_message in actual_message, actual_message)
def test_missing_index_from_criteria_csv(self): """HRA: correct error message when missing indexes from criteria CSV.""" from natcap.invest.hra import _get_criteria_dataframe # Use a criteria CSV that misses two indexes bad_criteria_table_path = os.path.join(self.workspace_dir, 'bad_criteria.csv') _make_criteria_csv(bad_criteria_table_path, self.workspace_dir, missing_index=True) with self.assertRaises(ValueError) as cm: _get_criteria_dataframe(bad_criteria_table_path) expected_message = ('The Criteria table is missing the following ' 'value(s) in the first column:') actual_message = str(cm.exception) self.assertTrue(expected_message in actual_message, actual_message)
def test_unknown_criteria_from_criteria_csv(self): """HRA: exception raised with unknown criteria from criteria CSV.""" from natcap.invest.hra import _get_criteria_dataframe, _get_attributes_from_df # Create a criteria CSV that has a criteria row that shows up before # any stressors bad_criteria_table_path = os.path.join( self.workspace_dir, 'bad_criteria.csv') _make_criteria_csv( bad_criteria_table_path, self.workspace_dir, unknown_criteria=True) with self.assertRaises(ValueError) as cm: criteria_df = _get_criteria_dataframe(bad_criteria_table_path) _get_attributes_from_df(criteria_df, ['habitat_0', 'habitat_1'], ['stressor_0', 'stressor_1']) expected_message = 'The "extra criteria" criteria does not belong to ' actual_message = str(cm.exception) self.assertTrue(expected_message in actual_message, actual_message)
def test_large_rating_from_criteria_csv(self): """HRA: exception raised when rating is larger than maximum rating.""" from natcap.invest.hra import _get_criteria_dataframe, _get_overlap_dataframe # Use a criteria CSV that's missing a criteria type bad_criteria_table_path = os.path.join( self.workspace_dir, 'bad_criteria.csv') _make_criteria_csv( bad_criteria_table_path, self.workspace_dir, large_rating=True) with self.assertRaises(ValueError) as cm: criteria_df = _get_criteria_dataframe(bad_criteria_table_path) _get_overlap_dataframe( criteria_df, ['habitat_0', 'habitat_1'], {'stressor_0': ['criteria 3', 'criteria 4'], 'stressor_1': ['criteria 5', 'criteria 6']}, 3, self.workspace_dir, self.workspace_dir, '') expected_message = 'rating 99999.0 larger than the maximum rating 3' actual_message = str(cm.exception) self.assertTrue(expected_message in actual_message, actual_message)
def test_missing_criteria_header(self): """HRA: exception raised when missing criteria from criteria CSV.""" from natcap.invest.hra import _get_criteria_dataframe, _get_overlap_dataframe # Create a criteria CSV that misses a criteria type bad_criteria_table_path = os.path.join( self.workspace_dir, 'bad_criteria.csv') _make_criteria_csv( bad_criteria_table_path, self.workspace_dir, missing_criteria=True) with self.assertRaises(ValueError) as cm: criteria_df = _get_criteria_dataframe(bad_criteria_table_path) _get_overlap_dataframe( criteria_df, ['habitat_0', 'habitat_1'], {'stressor_0': ['criteria 3', 'criteria 4'], 'stressor_1': ['criteria 5', 'criteria 6']}, 3, self.workspace_dir, self.workspace_dir, '') expected_message = 'The following stressor-habitat pair(s)' actual_message = str(cm.exception) self.assertTrue(expected_message in actual_message, actual_message)
def test_wrong_criteria_type_type(self): """HRA: exception raised when type is not C or E from criteria CSV.""" from natcap.invest.hra import _get_criteria_dataframe, _get_overlap_dataframe # Use a criteria CSV that's missing a criteria type bad_criteria_table_path = os.path.join(self.workspace_dir, 'bad_criteria.csv') _make_criteria_csv(bad_criteria_table_path, self.workspace_dir, wrong_criteria_type=True) with self.assertRaises(ValueError) as cm: criteria_df = _get_criteria_dataframe(bad_criteria_table_path) _get_overlap_dataframe( criteria_df, ['habitat_0', 'habitat_1'], { 'stressor_0': ['criteria 3', 'criteria 4'], 'stressor_1': ['criteria 5', 'criteria 6'] }, 3, self.workspace_dir, self.workspace_dir, '') expected_message = 'Criteria Type in the criteria scores table' actual_message = str(cm.exception) self.assertTrue(expected_message in actual_message, actual_message)
def test_wrong_weight_from_criteria_csv(self): """HRA: exception raised when weight is not a number from CSV.""" from natcap.invest.hra import _get_criteria_dataframe, _get_overlap_dataframe # Use a criteria CSV that's missing a criteria type bad_criteria_table_path = os.path.join( self.workspace_dir, 'bad_criteria.csv') _make_criteria_csv( bad_criteria_table_path, self.workspace_dir, wrong_weight=True) with self.assertRaises(ValueError) as cm: criteria_df = _get_criteria_dataframe(bad_criteria_table_path) _get_overlap_dataframe( criteria_df, ['habitat_0', 'habitat_1'], {'stressor_0': ['criteria 3', 'criteria 4'], 'stressor_1': ['criteria 5', 'criteria 6']}, 3, self.workspace_dir, self.workspace_dir, '') expected_message = ( 'Weight column for habitat "habitat_0" and stressor "stressor_1"') actual_message = str(cm.exception) self.assertTrue(expected_message in actual_message, actual_message)