test_config.py 4.19 KB
Newer Older
# 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))