# coding=utf-8 from unittest import TestCase from earthdiagnostics.config import CMORConfig from earthdiagnostics.modelingrealm import ModelingRealms class VariableMock(object): def __init__(self): self.domain = ModelingRealms.ocean self.short_name = 'tos' def __eq__(self, other): return self.domain == other.domain and self.short_name == other.short_name class VariableManagerMock(object): def get_variable(self, alias, silent=False): if alias == 'bad': return None var = VariableMock() var.short_name = alias return var class ParserMock(object): def __init__(self): self._values = {} def add_value(self, section, var, value): self._values[self.get_var_string(section, var)] = value def get_var_string(self, section, var): return '{0}:{1}'.format(section, var) def get_value(self, section, var, default): try: return self._values[self.get_var_string(section, var)] except KeyError: return default def get_bool_option(self, section, var, default): return self.get_value(section, var, default) def get_int_option(self, section, var, default): return self.get_value(section, var, default) def get_int_list_option(self, section, var, default=list(), separator=' '): try: return [int(val) for val in self._values[self.get_var_string(section, var)].split(separator)] except KeyError: return default def get_option(self, section, var, default): return self.get_value(section, var, default) class TestCMORConfig(TestCase): def setUp(self): self.mock_parser = ParserMock() self.var_manager = VariableManagerMock() def test_basic_config(self): config = CMORConfig(self.mock_parser, self.var_manager) self.assertEquals(config.ocean, True) self.assertEquals(config.atmosphere, True) self.assertEquals(config.force, False) self.assertEquals(config.force_untar, False) self.assertEquals(config.use_grib, True) self.assertEquals(config.activity, 'CMIP') self.assertEquals(config.associated_experiment, 'to be filled') self.assertEquals(config.associated_model, 'to be filled') self.assertEquals(config.initialization_description, 'to be filled') self.assertEquals(config.initialization_method, '1') self.assertEquals(config.initialization_number, 1) self.assertEquals(config.source, 'to be filled') self.assertEquals(config.version, '') self.assertEquals(config.physics_version, '1') self.assertEquals(config.physics_description, 'to be filled') self.assertEquals(config.filter_files, '') self.assertEquals(config.default_atmos_grid, 'gr') self.assertEquals(config.default_ocean_grid, 'gn') def test_cmorize(self): config = CMORConfig(self.mock_parser, self.var_manager) self.assertTrue(config.cmorize(VariableMock)) def test_not_cmorize(self): self.mock_parser.add_value('CMOR', 'VARIABLE_LIST', 'ocean:tos') config = CMORConfig(self.mock_parser, self.var_manager) self.assertTrue(config.cmorize(VariableMock())) tas_mock = VariableMock() tas_mock.domain = ModelingRealms.atmos tas_mock.short_name = 'tas' self.assertFalse(config.cmorize(tas_mock)) thetao_mock = VariableMock() thetao_mock.domain = ModelingRealms.ocean thetao_mock.short_name = 'thetao' self.assertFalse(config.cmorize(thetao_mock)) def test_cmorization_chunk(self): config = CMORConfig(self.mock_parser, self.var_manager) self.assertTrue(config.chunk_cmorization_requested(1)) def test_cmorize_only_some_chunks(self): self.mock_parser.add_value('CMOR', 'CHUNKS', '3 5') config = CMORConfig(self.mock_parser, self.var_manager) self.assertTrue(config.chunk_cmorization_requested(3)) self.assertTrue(config.chunk_cmorization_requested(5)) self.assertFalse(config.chunk_cmorization_requested(1)) self.assertFalse(config.chunk_cmorization_requested(4)) self.assertFalse(config.chunk_cmorization_requested(6))