diff --git a/e3sm_diags/run.py b/e3sm_diags/run.py index aeb2b0ee0..b5d32aaac 100644 --- a/e3sm_diags/run.py +++ b/e3sm_diags/run.py @@ -25,6 +25,10 @@ def __init__(self): # The list of sets to run using parameter objects. self.sets_to_run = [] + # The path to the user-specified `.cfg` file using `-d/--diags` or + # the default diagnostics `.cfg` file. + self.cfg_path = None + @property def is_cfg_file_arg_set(self): """A property to check if `-d/--diags` was set to a `.cfg` filepath. @@ -35,8 +39,11 @@ def is_cfg_file_arg_set(self): True if list contains more than one path, else False. """ args = self.parser.view_args() + self.cfg_path = args.other_parameters + + is_set = len(self.cfg_path) > 0 - return len(args.other_parameters) > 0 + return is_set def run_diags( self, parameters: List[CoreParameter], use_cfg: bool = True @@ -233,6 +240,8 @@ def _get_default_params_from_cfg_file(self, run_type: str) -> List[CoreParameter path = get_default_diags_path(set_name, run_type, False) paths.append(path) + self.cfg_path = paths + # Convert the .cfg file(s) to parameter objects. params = self.parser.get_cfg_parameters( files_to_open=paths, argparse_vals_only=False diff --git a/pyproject.toml b/pyproject.toml index 41a9a2930..09d466ab5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,6 +38,7 @@ junit_family = "xunit2" addopts = "--cov=e3sm_diags --cov-report term --cov-report html:tests_coverage_reports/htmlcov --cov-report xml:tests_coverage_reports/coverage.xml -s" python_files = ["tests.py", "test_*.py"] # Only run the unit tests because integration tests take a long time. +# Integration tests can be executed manually with `test.sh` or `pytest tests/integration`. testpaths = "tests/e3sm_diags" [tool.mypy] diff --git a/tests/integration/test_run.py b/tests/e3sm_diags/test_run.py similarity index 94% rename from tests/integration/test_run.py rename to tests/e3sm_diags/test_run.py index 96a08e06f..3421b0aaf 100644 --- a/tests/integration/test_run.py +++ b/tests/e3sm_diags/test_run.py @@ -65,7 +65,7 @@ def test_all_sets_and_all_seasons(self): ] parameters = self.runner.get_run_parameters( - [self.core_param, ts_param, enso_param, streamflow_param] + [self.core_param, ts_param, enso_param, streamflow_param], use_cfg=True ) # Counts the number of each set and each seasons to run the diags on. set_counter, season_counter = ( @@ -88,12 +88,14 @@ def test_all_sets_and_all_seasons(self): # So, reduce the ANN count by the number of times these appear season_counter["ANN"] -= set_counter["enso_diags"] season_counter["ANN"] -= set_counter["streamflow"] - if not all(season_counter["ANN"] == count for count in season_counter.values()): - self.fail( - "In .cfg files, at least one season does not match the count for ANN: {}".format( - season_counter + + for season, count in season_counter.items(): + if count != season_counter["ANN"]: + self.fail( + "In .cfg files, at least one season does not match the count for ANN: {}".format( + season_counter + ) ) - ) def test_zonal_mean_2d(self): # Running zonal_mean_2d with the core param only. diff --git a/tests/integration/all_sets.cfg b/tests/integration/all_sets.cfg index 059155714..06277d1e0 100644 --- a/tests/integration/all_sets.cfg +++ b/tests/integration/all_sets.cfg @@ -17,7 +17,6 @@ test_file = "T_20161118.beta0.FC5COSP.ne30_ne30.edison_ANN_climo.nc" results_dir = "tests/integration/all_sets_results_test" debug = True - [zonal_mean_2d] sets = ["zonal_mean_2d"] case_id = "ERA-Interim" @@ -38,7 +37,6 @@ test_file = "T_20161118.beta0.FC5COSP.ne30_ne30.edison_ANN_climo.nc" results_dir = "tests/integration/all_sets_results_test" debug = True - [meridional_mean_2d] sets = ["meridional_mean_2d"] case_id = "ERA-Interim" @@ -59,7 +57,6 @@ test_file = "T_20161118.beta0.FC5COSP.ne30_ne30.edison_ANN_climo.nc" results_dir = "tests/integration/all_sets_results_test" debug = True - [lat_lon] sets = ["lat_lon"] case_id = "ERA-Interim" @@ -82,8 +79,6 @@ results_dir = "tests/integration/all_sets_results_test" debug = True regions=["CONUS_RRM","global"] - - [polar] sets = ["polar"] case_id = "ERA-Interim" @@ -106,7 +101,6 @@ test_file = "T_20161118.beta0.FC5COSP.ne30_ne30.edison_ANN_climo.nc" results_dir = "tests/integration/all_sets_results_test" debug = True - [cosp_histogram] sets = ["cosp_histogram"] case_id = "MISR-COSP" @@ -127,7 +121,6 @@ test_file = "CLD_MISR_20161118.beta0.FC5COSP.ne30_ne30.edison_ANN_climo.nc" results_dir = "tests/integration/all_sets_results_test" debug = True - [area_mean_time_series] sets = ["area_mean_time_series"] variables = ["TREFHT"] @@ -158,7 +151,6 @@ reference_data_path = 'tests/integration/integration_test_data' ref_file = 'TREFHT_201201_201312.nc' test_name = "system tests" variables = ["TREFHT"] -print_statements = True [#] sets = ["enso_diags"] @@ -177,7 +169,6 @@ reference_data_path = 'tests/integration/integration_test_data' ref_file = 'TREFHT_201201_201312.nc' test_name = "system tests" variables = ["TREFHT"] -print_statements = True [#] sets = ["enso_diags"] @@ -197,7 +188,6 @@ reference_data_path = 'tests/integration/integration_test_data' ref_file = 'TREFHT_201201_201312.nc' test_name = "system tests" variables = ["TREFHT"] -print_statements = True [#] sets = ["enso_diags"] @@ -214,7 +204,6 @@ reference_data_path = 'tests/integration/integration_test_data' ref_file = 'TREFHT_201201_201312.nc' test_name = "system tests" variables = ["TREFHT"] -print_statements = True [#] sets = ["enso_diags"] @@ -232,7 +221,6 @@ reference_data_path = 'tests/integration/integration_test_data' ref_file = 'TREFHT_201201_201312.nc' test_name = "system tests" variables = ["TREFHT"] -print_statements = True [#] sets = ["enso_diags"] @@ -251,7 +239,6 @@ reference_data_path = 'tests/integration/integration_test_data' ref_file = 'TREFHT_201201_201312.nc' test_name = "system tests" variables = ["TREFHT"] -print_statements = True [qbo] sets = ["qbo"] @@ -283,7 +270,6 @@ test_start_yr = '1959' test_end_yr = '1961' results_dir = "tests/integration/all_sets_results_test" test_name = "system tests" -print_statements = True [diurnal_cycle] sets = ["diurnal_cycle"] @@ -304,7 +290,6 @@ test_file = "20180215.DECKv1b_H1.ne30_oEC.edison.cam.h4_JJA_200006_200908_climo. results_dir = "tests/integration/all_sets_results_test" debug = True - [arm_diags1] sets = ["arm_diags"] diags_set = "annual_cycle" diff --git a/tests/integration/test_dataset.py b/tests/integration/test_dataset.py deleted file mode 100644 index 312d8778c..000000000 --- a/tests/integration/test_dataset.py +++ /dev/null @@ -1,198 +0,0 @@ -import unittest - -import cdms2 - -from e3sm_diags.derivations import acme as acme_derivations -from e3sm_diags.driver.utils.dataset import Dataset -from e3sm_diags.parameter.core_parameter import CoreParameter -from tests.integration.config import TEST_DATA_PATH - - -class TestDataset(unittest.TestCase): - def setUp(self): - self.parameter = CoreParameter() - - def test_convert_units(self): - with cdms2.open(f"{TEST_DATA_PATH}/precc.nc") as precc_file: - var = precc_file("PRECC") - - new_var = acme_derivations.convert_units(var, "mm/day") - self.assertEqual(new_var.units, "mm/day") - - def test_add_user_derived_vars(self): - my_vars = { - "A_NEW_VAR": { - ("v1", "v2"): lambda v1, v2: v1 + v2, - ("v3", "v4"): lambda v3, v4: v3 - v4, - }, - "PRECT": {("MY_PRECT",): lambda my_prect: my_prect}, - } - self.parameter.derived_variables = my_vars - data = Dataset(self.parameter, test=True) - self.assertTrue("A_NEW_VAR" in data.derived_vars) - - # In the default my_vars, each entry - # ('PRECT', 'A_NEW_VAR', etc) is an OrderedDict. - # We must check that what the user inserted is - # first, so it's used first. - self.assertTrue(list(data.derived_vars["PRECT"].keys())[0] == ("MY_PRECT",)) - - def test_is_timeseries(self): - self.parameter.ref_timeseries_input = True - data = Dataset(self.parameter, ref=True) - self.assertTrue(data.is_timeseries()) - - self.parameter.test_timeseries_input = True - data = Dataset(self.parameter, test=True) - self.assertTrue(data.is_timeseries()) - - self.parameter.ref_timeseries_input = False - data = Dataset(self.parameter, ref=True) - self.assertFalse(data.is_timeseries()) - - self.parameter.test_timeseries_input = False - data = Dataset(self.parameter, test=True) - self.assertFalse(data.is_timeseries()) - - def test_is_climo(self): - self.parameter.ref_timeseries_input = True - data = Dataset(self.parameter, ref=True) - self.assertFalse(data.is_climo()) - - self.parameter.test_timeseries_input = True - data = Dataset(self.parameter, test=True) - self.assertFalse(data.is_climo()) - - self.parameter.ref_timeseries_input = False - data = Dataset(self.parameter, ref=True) - self.assertTrue(data.is_climo()) - - self.parameter.test_timeseries_input = False - data = Dataset(self.parameter, test=True) - self.assertTrue(data.is_climo()) - - def test_get_attr_from_climo(self): - # We pass in the path to a file, so the input directory - # to the tests doesn't need to be like how it is for when e3sm_diags - # is ran wit a bunch of diags. - self.parameter.reference_data_path = TEST_DATA_PATH - self.parameter.ref_file = "ta_ERA-Interim_ANN_198001_201401_climo.nc" - data = Dataset(self.parameter, ref=True) - self.assertEqual(data.get_attr_from_climo("Conventions", "ANN"), "CF-1.0") - - """ - def test_process_derived_var_passes(self): - derived_var = { - 'PRECT': { - ('pr'): lambda x: x, - ('PRECC'): lambda x: 'this is some function' - } - } - - precc_file = cdms2.open(get_abs_file_path('integration_test_data/precc.nc')) - acme_derivations.process_derived_var('PRECT', derived_var, - precc_file, self.parameter) - precc_file.close() - - def test_process_derived_var_with_wrong_dict(self): - # pr, nothing, and nothing2 are not variables in the file we open - wrong_derived_var = { - 'PRECT': { - ('pr'): lambda x: x, - ('nothing1', 'nothing2'): lambda x, y: 'this is some function' - } - } - - precc_file = cdms2.open(get_abs_file_path('integration_test_data/precc.nc')) - with self.assertRaises(RuntimeError): - acme_derivations.process_derived_var( - 'PRECT', wrong_derived_var, precc_file, self.parameter) - precc_file.close() - - def test_process_derived_var_adds_to_dict(self): - # the one that's usually in the parameters file - derived_var_dict = { - 'PRECT': {('test'): lambda x: x} - } - # use this instead of the acme.derived_variables one - default_derived_vars = { - 'PRECT': { - ('pr'): lambda x: x, - ('PRECC'): lambda x: 'this is some function' - } - } - - # add derived_var_dict to default_derived_vars - precc_file = cdms2.open(get_abs_file_path('integration_test_data/precc.nc')) - self.parameter.derived_variables = derived_var_dict - acme_derivations.process_derived_var( - 'PRECT', default_derived_vars, precc_file, self.parameter) - precc_file.close() - - if 'test' not in default_derived_vars['PRECT']: - self.fail("Failed to insert test derived variable") - - # make sure that test is the first one - if 'test' != default_derived_vars['PRECT'].keys()[0]: - self.fail( - "Failed to insert test derived variable before default derived vars") - - def test_process_derived_var_adds_duplicate_to_dict(self): - # the one that's usually in the parameters file - # the function for PRECC below is different than the one in - # default_derived_vars - derived_var_dict = { - 'PRECT': {('PRECC'): lambda x: 'PRECC'} - } - # use this instead of the acme_derivations.derived_variables one - default_derived_vars = { - 'PRECT': { - ('pr'): lambda x: x, - ('PRECC'): lambda x: 'this is some function' - } - } - - # add derived_var_dict to default_derived_vars - precc_file = cdms2.open(get_abs_file_path('integration_test_data/precc.nc')) - self.parameter.derived_variables = derived_var_dict - msg = acme_derivations.process_derived_var( - 'PRECT', default_derived_vars, precc_file, self.parameter) - precc_file.close() - if msg != 'PRECC': - self.fail("Failed to insert a duplicate test derived variable") - - def test_process_derived_var_works_with_ordereddict(self): - derived_var_dict = { - 'PRECT': OrderedDict([ - (('something'), lambda x: 'something') - ]) - } - - default_derived_vars = { - 'PRECT': OrderedDict([ - (('pr'), lambda x: x), - (('PRECC'), lambda x: 'this is some function') - ]) - } - - precc_file = cdms2.open(get_abs_file_path('integration_test_data/precc.nc')) - self.parameter.derived_variables = derived_var_dict - acme_derivations.process_derived_var( - 'PRECT', default_derived_vars, precc_file, self.parameter) - precc_file.close() - # Check that 'something' was inserted first - self.assertEqual(['something', 'pr', 'PRECC'], - default_derived_vars['PRECT'].keys()) - - def test_mask_by(self): - with cdms2.open(get_abs_file_path('integration_test_data/precc.nc')) as precc_file: - prcc = precc_file('PRECC') - with cdms2.open(get_abs_file_path('integration_test_data/precl.nc')) as precl_file: - prcl = precl_file('PRECL') - - acme_derivations.mask_by(prcc, prcl, low_limit=2.0) - """ - - -if __name__ == "__main__": - unittest.main()