def test_run_command_once(self,po_mock):
     # expect return value from function of 0
     po_mock.return_value.close.return_value = 0
     model_fn = self.repo.get_models()['lifestage_test']
     model = DispersalModel(model_fn,setup=False)
     i = model.get_instances()[0]
     ac = AnalysisCommand("test")
     # test normal
     ac.times=[1990,1991,1992]
     t_strings = [str(x) for x in ac.times]
     maps = ['map1','map2','map3']
     maps = dict(zip(t_strings, maps))
     return_val = ac.run_command_once(1990,maps,"testcommand")
     self.assertEqual(return_val, 0)
     # test with map_name replacements, but too early
     self.assertRaises(IndexError,ac.run_command_once, 1991,maps,"testcommand %1 %2")
     # test with map_name replacements
     return_val = ac.run_command_once(1991,maps,"testcommand %1")
     self.assertEqual(po_mock.call_args[0][0], "testcommand map1")
     return_val = ac.run_command_once(1990,maps,"testcommand %0")
     self.assertEqual(po_mock.call_args[0][0], "testcommand map1")
     return_val = ac.run_command_once(1992,maps,"testcommand %0")
     self.assertEqual(po_mock.call_args[0][0], "testcommand map3")
     mdig_config = config.get_config()
     mdig_config.analysis_print_time = True
     self.__do_run_command_once(model,ac,maps)
Exemple #2
0
 def test_run_command_once(self, po_mock):
     # expect return value from function of 0
     po_mock.return_value.close.return_value = 0
     model_fn = self.repo.get_models()['lifestage_test']
     model = DispersalModel(model_fn, setup=False)
     i = model.get_instances()[0]
     ac = AnalysisCommand("test")
     # test normal
     ac.times = [1990, 1991, 1992]
     t_strings = [str(x) for x in ac.times]
     maps = ['map1', 'map2', 'map3']
     maps = dict(zip(t_strings, maps))
     return_val = ac.run_command_once(1990, maps, "testcommand")
     self.assertEqual(return_val, 0)
     # test with map_name replacements, but too early
     self.assertRaises(IndexError, ac.run_command_once, 1991, maps,
                       "testcommand %1 %2")
     # test with map_name replacements
     return_val = ac.run_command_once(1991, maps, "testcommand %1")
     self.assertEqual(po_mock.call_args[0][0], "testcommand map1")
     return_val = ac.run_command_once(1990, maps, "testcommand %0")
     self.assertEqual(po_mock.call_args[0][0], "testcommand map1")
     return_val = ac.run_command_once(1992, maps, "testcommand %0")
     self.assertEqual(po_mock.call_args[0][0], "testcommand map3")
     mdig_config = config.get_config()
     mdig_config.analysis_print_time = True
     self.__do_run_command_once(model, ac, maps)
Exemple #3
0
 def test_set_times(self):
     model_fn = self.repo.get_models()['lifestage_test']
     model = DispersalModel(model_fn, setup=False)
     i = model.get_instances()[0]
     ac = AnalysisCommand("test")
     o_times = range(1990, 2000)
     # Test running on all available times
     ac.set_times((1990, 1999), o_times)
     self.assertEquals(ac.times, o_times)
     # Test with a single time in range
     ac.set_times((1990, 1999), o_times, [1990])
     self.assertEquals(ac.times, [1990])
     # Test with a single time out of range
     self.assertRaises(ValueError, ac.set_times, (1990, 1999), o_times,
                       [11990])
     # Test with a single negative index
     ac.set_times((1990, 1999), o_times, [-1])
     self.assertEquals(ac.times, [1999])
     # Test with time not in original times
     del o_times[2]  # delete 1992
     self.assertRaises(ValueError, ac.set_times, (1990, 1999), o_times,
                       [1992])
     # Test earliest time and not enough past maps to fulfill command line
     ac = AnalysisCommand("test %19")
     self.assertRaises(NotEnoughHistoryException, ac.set_times,
                       (1990, 1999), o_times, [-1])
Exemple #4
0
def migrate_repository(grassdb_dir):
    mr = ModelRepository(grassdb_dir)
    model_fns = mr.get_models()
    for model in model_fns:
        model_fn = model_fns[model]
        # check for unseparated instances from main mapset
        dm = DispersalModel(model_fn)
        try:
            instances = dm.get_instances()
            for i in instances:
                mapset = i.get_mapset()
            if not check_instances_have_info_file(dm.get_instances()):
                print "Model %s ok" % model
        except DispersalInstanceException, e:
            if not "no longer supports instances sharing one mapset" in str(e):
                continue
            # if so, fix them
            print dm.get_mapset() + " not ok.. fixing"
            split_instances_into_own_mapsets(dm)
Exemple #5
0
def migrate_repository(grassdb_dir):
    mr = ModelRepository(grassdb_dir)
    model_fns = mr.get_models()
    for model in model_fns:
        model_fn = model_fns[model]
        # check for unseparated instances from main mapset
        dm = DispersalModel(model_fn)
        try:
            instances = dm.get_instances()
            for i in instances:
                mapset = i.get_mapset()
            if not check_instances_have_info_file(dm.get_instances()):
                print "Model %s ok" % model
        except DispersalInstanceException, e:
            if not "no longer supports instances sharing one mapset" in str(e):
                continue
            # if so, fix them
            print dm.get_mapset() + " not ok.. fixing"
            split_instances_into_own_mapsets(dm)
Exemple #6
0
 def test_get_instances(self):
     # this functionally generally well tested, but
     # test removing deprecated baseDir attrib...
     mdig.repository = ModelRepository()
     models = mdig.repository.get_models()
     fn = models['lifestage_test']
     m = DispersalModel(fn)
     completed_node = m.xml_model.xpath("/model/instances")
     self.assertTrue(len(completed_node) > 0)
     completed_node[0].attrib['baseDir'] = 'flibble'
     instances = m.get_instances()
 def test_get_instances(self):
     # this functionally generally well tested, but
     # test removing deprecated baseDir attrib...
     mdig.repository = ModelRepository()
     models = mdig.repository.get_models()
     fn = models['lifestage_test']
     m = DispersalModel(fn)
     completed_node = m.xml_model.xpath("/model/instances")
     self.assertTrue(len(completed_node) > 0)
     completed_node[0].attrib['baseDir'] = 'flibble'
     instances = m.get_instances()
 def test_hard_reset(self,m_rm):
     mdig.repository = ModelRepository()
     models = mdig.repository.get_models()
     fn = models['lifestage_test']
     m = DispersalModel(fn)
     # init the mapsets so we have something to remove
     for i in m.get_instances():
         i.init_mapset()
     m.hard_reset()
     self.assertEqual(m_rm.call_count,1)
     self.assertEqual(len(m.xml_model.xpath('/model/instances/completed')),0)
     m.remove_log_handler()
Exemple #9
0
 def test_null_bitmask(self):
     mdig.repository = ModelRepository()
     models = mdig.repository.get_models()
     fn = models['lifestage_test']
     m = DispersalModel(fn)
     for i in m.get_instances():
         i.null_bitmask = Mock()
     m.null_bitmask()
     for i in m.get_instances():
         self.assertEqual(i.null_bitmask.call_count, 1)
         self.assertEqual(i.null_bitmask.call_args[0][0], True)
     # check parameter is passed
     m.null_bitmask(generate=False)
     for i in m.get_instances():
         self.assertEqual(i.null_bitmask.call_count, 2)
         self.assertEqual(i.null_bitmask.call_args[0][0], False)
     # check disabled instances are not touched
     for i in m.get_instances():
         i.enabled = False
     m.null_bitmask()
     for i in m.get_instances():
         self.assertEqual(i.null_bitmask.call_count, 2)
Exemple #10
0
 def test_hard_reset(self, m_rm):
     mdig.repository = ModelRepository()
     models = mdig.repository.get_models()
     fn = models['lifestage_test']
     m = DispersalModel(fn)
     # init the mapsets so we have something to remove
     for i in m.get_instances():
         i.init_mapset()
     m.hard_reset()
     self.assertEqual(m_rm.call_count, 1)
     self.assertEqual(len(m.xml_model.xpath('/model/instances/completed')),
                      0)
     m.remove_log_handler()
 def test_null_bitmask(self):
     mdig.repository = ModelRepository()
     models = mdig.repository.get_models()
     fn = models['lifestage_test']
     m = DispersalModel(fn)
     for i in m.get_instances():
         i.null_bitmask = Mock()
     m.null_bitmask()
     for i in m.get_instances():
         self.assertEqual(i.null_bitmask.call_count,1)
         self.assertEqual(i.null_bitmask.call_args[0][0], True)
     # check parameter is passed
     m.null_bitmask(generate=False)
     for i in m.get_instances():
         self.assertEqual(i.null_bitmask.call_count,2)
         self.assertEqual(i.null_bitmask.call_args[0][0], False)
     # check disabled instances are not touched
     for i in m.get_instances():
         i.enabled=False
     m.null_bitmask()
     for i in m.get_instances():
         self.assertEqual(i.null_bitmask.call_count,2)
 def test_run_command(self, rc_mock):
     model_fn = self.repo.get_models()['lifestage_test']
     model = DispersalModel(model_fn,setup=False)
     i = model.get_instances()[0]
     ac = AnalysisCommand("test")
     # test when there are no times set for when to run command
     self.assertRaises(Exception, ac.run_command, maps=[])
     # test when the times are empty list
     ac.times=[]
     output_file = ac.init_output_file(i)
     ac.run_command([])
     self.assertEqual(rc_mock.called,False)
     # test when there are times
     ac.times=[1990]
     rc_mock.called = False
     ac.run_command([])
     self.assertEqual(rc_mock.called,True)
Exemple #13
0
 def test_run_command(self, rc_mock):
     model_fn = self.repo.get_models()['lifestage_test']
     model = DispersalModel(model_fn, setup=False)
     i = model.get_instances()[0]
     ac = AnalysisCommand("test")
     # test when there are no times set for when to run command
     self.assertRaises(Exception, ac.run_command, maps=[])
     # test when the times are empty list
     ac.times = []
     output_file = ac.init_output_file(i)
     ac.run_command([])
     self.assertEqual(rc_mock.called, False)
     # test when there are times
     ac.times = [1990]
     rc_mock.called = False
     ac.run_command([])
     self.assertEqual(rc_mock.called, True)
    def test_init_output_file(self,rm_mock,isfile_mock):
        isfile_mock.return_value = True
        mdig_config = config.get_config()
        mdig_config.overwrite_flag = False
        model_fn = self.repo.get_models()['lifestage_test']
        model = DispersalModel(model_fn,setup=False)
        i = model.get_instances()[0]
        ac = AnalysisCommand("test")
        self.assertRaises(mdig.OutputFileExistsException, ac.init_output_file, i)
        mdig_config.overwrite_flag = True
        output_file = ac.init_output_file(i)
        self.assertEqual(output_file.index("lifestage_test_region_a_i0"), 0)

        # test with rep
        isfile_mock.return_value = False
        output_file = ac.init_output_file(i, i.replicates[0])
        print output_file
        self.assertEqual(output_file.index("lifestage_test_region_a_i0_rep_0"), 0)
 def test_insert_output_into_cmd(self):
     model_fn = self.repo.get_models()['lifestage_test']
     model = DispersalModel(model_fn,setup=False)
     i = model.get_instances()[0]
     ac = AnalysisCommand("test")
     # test exception for when no output file initialised
     self.assertRaises(OutputFileNotSetException,ac.insert_output_into_cmd)
     # check normal function works
     output_file = ac.init_output_file(i)
     self.assertEqual(output_file.index("lifestage_test_region_a_"), 0)
     output_cmd = ac.insert_output_into_cmd()
     self.assertEqual(output_cmd, "test >> " + output_file)
     # check that file substitution works 
     ac.cmd_string = "test %f"
     output_cmd = ac.insert_output_into_cmd()
     self.assertEqual(output_cmd, "test " + output_file)
     # check that it doesn't replaced escaped %
     ac.cmd_string = "test %%f"
     output_cmd = ac.insert_output_into_cmd()
     self.assertEqual(output_cmd, "test %%f >> " + output_file)
Exemple #16
0
 def test_insert_output_into_cmd(self):
     model_fn = self.repo.get_models()['lifestage_test']
     model = DispersalModel(model_fn, setup=False)
     i = model.get_instances()[0]
     ac = AnalysisCommand("test")
     # test exception for when no output file initialised
     self.assertRaises(OutputFileNotSetException, ac.insert_output_into_cmd)
     # check normal function works
     output_file = ac.init_output_file(i)
     self.assertEqual(output_file.index("lifestage_test_region_a_"), 0)
     output_cmd = ac.insert_output_into_cmd()
     self.assertEqual(output_cmd, "test >> " + output_file)
     # check that file substitution works
     ac.cmd_string = "test %f"
     output_cmd = ac.insert_output_into_cmd()
     self.assertEqual(output_cmd, "test " + output_file)
     # check that it doesn't replaced escaped %
     ac.cmd_string = "test %%f"
     output_cmd = ac.insert_output_into_cmd()
     self.assertEqual(output_cmd, "test %%f >> " + output_file)
Exemple #17
0
    def test_init_output_file(self, rm_mock, isfile_mock):
        isfile_mock.return_value = True
        mdig_config = config.get_config()
        mdig_config.overwrite_flag = False
        model_fn = self.repo.get_models()['lifestage_test']
        model = DispersalModel(model_fn, setup=False)
        i = model.get_instances()[0]
        ac = AnalysisCommand("test")
        self.assertRaises(mdig.OutputFileExistsException, ac.init_output_file,
                          i)
        mdig_config.overwrite_flag = True
        output_file = ac.init_output_file(i)
        self.assertEqual(output_file.index("lifestage_test_region_a_i0"), 0)

        # test with rep
        isfile_mock.return_value = False
        output_file = ac.init_output_file(i, i.replicates[0])
        print output_file
        self.assertEqual(output_file.index("lifestage_test_region_a_i0_rep_0"),
                         0)
 def test_set_times(self):
     model_fn = self.repo.get_models()['lifestage_test']
     model = DispersalModel(model_fn,setup=False)
     i = model.get_instances()[0]
     ac = AnalysisCommand("test")
     o_times=range(1990,2000)
     # Test running on all available times
     ac.set_times((1990,1999),o_times)
     self.assertEquals(ac.times,o_times)
     # Test with a single time in range
     ac.set_times((1990,1999),o_times,[1990])
     self.assertEquals(ac.times,[1990])
     # Test with a single time out of range
     self.assertRaises(ValueError,ac.set_times,(1990,1999),o_times,[11990])
     # Test with a single negative index
     ac.set_times((1990,1999),o_times,[-1])
     self.assertEquals(ac.times,[1999])
     # Test with time not in original times
     del o_times[2] # delete 1992
     self.assertRaises(ValueError,ac.set_times,(1990,1999),o_times,[1992])
     # Test earliest time and not enough past maps to fulfill command line
     ac = AnalysisCommand("test %19")
     self.assertRaises(NotEnoughHistoryException,ac.set_times,(1990,1999),o_times,[-1])
Exemple #19
0
class ReplicateTest(unittest.TestCase):
    def setUp(self):
        mdig.repository = self.repo = ModelRepository()
        #logging.getLogger('mdig').setLevel(logging.CRITICAL)
        models = mdig.repository.get_models()
        fn = models['lifestage_test']
        self.m_lifestage = DispersalModel(fn)

        # Model initialise with variables
        fn = models['variables']
        self.m_variables = DispersalModel(fn)
        fn = models['variables_complete']
        self.m_variables_complete = DispersalModel(fn)

        # management
        fn = models['management_alter_variable']
        self.m_management = DispersalModel(fn)

        #analysis
        fn = models['analysis_example']
        self.m_analysis = DispersalModel(fn)

    def tearDown(self):
        self.m_variables.remove_log_handler()
        self.m_variables_complete.remove_log_handler()
        self.m_lifestage.remove_log_handler()

    def test_create_w_no_node(self):
        i = self.m_lifestage.get_instances()[0]
        r = Replicate(node=None, instance=i)
        # TODO check effects

    def test_create_w_no_instance(self):
        i = self.m_lifestage.get_instances()[0]
        self.assertRaises(ValueError, Replicate, node=None, instance=None)

    def test_check_complete_on_creation(self):
        config.get_config()['replicate']['check_complete'] = 'true'
        i = self.m_variables.get_instances()[0]
        r = Replicate(node=None, instance=i)
        config.get_config()['replicate']['check_complete'] = 'false'

    def test_check_complete(self):
        i = self.m_variables.get_instances()[0]
        r = Replicate(node=None, instance=i)
        self.assertFalse(r.check_complete())
        i = self.m_variables_complete.get_instances()[0]
        self.assertTrue(i.replicates[0].check_complete())

        r = i.replicates[0]
        r.get_saved_maps = mock_get_saved_maps
        self.assertFalse(i.replicates[0].check_complete())
        global get_save_count
        get_save_count = 0

    @patch('mdig.grass.get_g')
    def test_delete_maps(self, get_g):
        i = self.m_variables_complete.get_instances()[0]
        i.replicates[0].delete_maps()
        self.assertEqual(get_g.return_value.remove_map.call_count, 6)

        get_g.return_value.remove_map.call_count = 0
        i = self.m_lifestage.get_instances()[0]
        r = Replicate(node=None, instance=i)
        r.delete_maps()
        self.assertEqual(get_g.return_value.remove_map.call_count, 0)

        r.get_saved_maps = mock_get_saved_maps
        r.delete_maps()
        self.assertEqual(get_g.return_value.remove_map.call_count, 0)
        global get_save_count
        get_save_count = 0

    @patch('mdig.grass.get_g')
    def test_null_bitmask(self, get_g):
        i = self.m_variables_complete.get_instances()[0]
        r = i.replicates[0]
        r.null_bitmask()
        self.assertEqual(get_g.return_value.null_bitmask.call_count, 6)

    def test_map_name_base(self):
        i = self.m_variables_complete.get_instances()[0]
        name = i.replicates[0].get_map_name_base()
        self.assertEqual('variables_complete_region_a_i0_rep_0', name)
        name = i.replicates[1].get_map_name_base()
        self.assertEqual('variables_complete_region_a_i0_rep_1', name)
        i = self.m_variables_complete.get_instances()[1]
        name = i.replicates[0].get_map_name_base()
        self.assertEqual('variables_complete_region_a_i1_rep_0', name)

    def test_get_base_filenames(self):
        i = self.m_variables_complete.get_instances()[0]
        # return a dictionary of time:names
        img_fns = i.replicates[0].get_base_filenames()
        self.assertEqual(len(img_fns), 6)
        # return a single filename
        img_fn = i.replicates[0].get_base_filenames(single_file=True)
        self.assertTrue(
            'variables_complete_region_a_i0_rep_0_ls_all' in img_fn)

    def test_get_initial_maps(self):
        i = self.m_variables_complete.get_instances()[0]
        r = i.replicates[0]
        self.assertEqual(r.get_initial_map('all'), None)
        r.initial_maps = self.m_variables.get_initial_maps(i.r_id)
        self.assertNotEqual(r.get_initial_map('all'), None)

    def test_reset(self):
        i = self.m_variables_complete.get_instances()[0]
        r = i.replicates[0]
        old_xml_node = r.node
        r.reset()
        self.assertNotEqual(old_xml_node, r.node)

    def test_record_maps(self):
        i = self.m_variables_complete.get_instances()[0]
        r = i.replicates[0]
        r.grass_i = Mock()
        r.record_maps()
        r.active = True
        r.temp_map_names['all'] = ['tmap1', 'tmap2']
        r.record_maps()
        self.assertEqual(r.grass_i.copy_map.call_count, 1)
        r.record_maps(remove_null=True)
        self.assertEqual(r.grass_i.copy_map.call_count, 2)
        self.assertEqual(r.grass_i.null_bitmask.call_count, 1)
        self.assertTrue('all' in r.get_previous_map('all'))

    def test_previous_maps(self):
        i = self.m_variables_complete.get_instances()[0]
        r = i.replicates[0]
        maps = r.get_previous_maps('all')
        self.assertEqual(maps, [])
        maps.append('test1')
        maps.append('test2')
        maps = r.get_previous_maps('all')
        self.assertEqual(len(maps), 2)
        a_map = r.get_previous_map('all')
        self.assertEqual(a_map, 'test2')
        a_map = r.get_previous_map('all', 2)
        self.assertEqual(a_map, 'test1')
        a_map = r.get_previous_map('all', 3)
        self.assertEqual(a_map, None)
        r.push_previous_map('all', 'freaky')
        a_map = r.get_previous_map('all')
        self.assertEqual(a_map, 'freaky')

    def init_mock_grass(self, g):
        g.return_value.init_map.return_value = ('mockstring', Mock())
        g.return_value.get_mapset.return_value = 'mock_mapset'
        g.return_value.generate_map_name.return_value = 'tempmapname'
        g.return_value.get_range.return_value = ['thisr=10'] * 10
        g.return_value.raster_value_freq.return_value = [(1, 1), (2, 1),
                                                         (3, 1)]
        g.return_value.raster_to_ascii.return_value = ('file1', 'file2')

    @patch('mdig.lifestage.Lifestage')
    @patch('mdig.grass.get_g')
    def test_run(self, m_g, m_ls):
        self.init_mock_grass(m_g)
        i = self.m_variables_complete.get_instances()[0]
        r = i.replicates[0]
        r.grass_i = Mock()
        r.instance.experiment.save_model = Mock()
        r.run()

    @patch('mdig.lifestage.Lifestage')
    @patch('mdig.grass.get_g')
    def test_run_w_lifestage(self, m_g, m_ls):
        self.init_mock_grass(m_g)
        i = self.m_lifestage.get_instances()[0]
        r = i.replicates[0]
        r.grass_i = Mock()
        r.instance.experiment.save_model = Mock()
        r.instance.experiment.get_lifestage_transitions = Mock()
        r.instance.experiment.get_lifestage_transitions.return_value = [Mock()]
        r.run()

    @patch('mdig.lifestage.Lifestage')
    @patch('mdig.grass.get_g')
    def test_run_w_management(self, m_g, m_ls):
        self.init_mock_grass(m_g)
        i = self.m_management.get_instances()[1]
        r = Replicate(None, i)
        r.grass_i = Mock()
        r.instance.experiment.save_model = Mock()
        r.run()

    @patch('mdig.lifestage.Lifestage')
    @patch('mdig.grass.get_g')
    def test_run_w_analysis(self, m_g, m_ls):
        self.init_mock_grass(m_g)
        m = self.m_analysis
        i = m.get_instances()[0]
        r = Replicate(None, i)
        r.grass_i = Mock()
        r.instance.experiment.save_model = Mock()
        r.run()

        # Run again to ensure
        self.assertRaises(mdig.analysis.AnalysisOutputFileExists, r.run)

    def test_get_time_stamp(self):
        i = self.m_variables_complete.get_instances()[0]
        r = i.replicates[0]
        import time
        import datetime
        self.assertTrue(r.get_time_stamp() < datetime.datetime.now())
        t = time.time()
        r.node.attrib['ts'] = str(t)
        self.assertEqual(r.get_time_stamp(),
                         datetime.datetime.fromtimestamp(float(str(t))))
class DispersalInstanceTest(unittest.TestCase):
    def setUp(self):
        mdig.repository = self.repo = ModelRepository()
        #logging.getLogger('mdig').setLevel(logging.CRITICAL)
        models = mdig.repository.get_models()
        fn = models['lifestage_test']
        self.m_lifestage = DispersalModel(fn)

        # Model initialise with management strategy
        fn = models['management_area_combine']
        self.m_strategy = DispersalModel(fn)

        # Model initialise with variables
        fn = models['variables']
        self.m_variables = DispersalModel(fn)
        #logging.getLogger('mdig').setLevel(logging.WARNING)

        fn = models['variables_complete']
        self.m_variables_complete = DispersalModel(fn)

        c = config.get_config()
        self.gisdb = c['GRASS']['GISDBASE']

    def tearDown(self):
        self.m_variables.remove_log_handler()
        self.m_variables_complete.remove_log_handler()
        self.m_lifestage.remove_log_handler()
        self.m_strategy.remove_log_handler()

    @patch('mdig.grass.get_g')
    def test_load_replicates(self, m_g):
        m_g.return_value.grass_vars = {'GISDBASE': self.gisdb}
        # replicates loaded on init
        self.m_lifestage.get_instances()
        self.m_strategy.get_instances()
        self.m_variables.get_instances()

    @patch('mdig.grass.get_g')
    def test_get_mapset(self, m_g):
        m_g.return_value.grass_vars = {'GISDBASE': self.gisdb}
        i = self.m_lifestage.get_instances()[0]
        self.assertEqual(i.get_mapset().find('lifestage_test_i'), 0)
        mapset = i.node.attrib['mapset']
        del i.node.attrib['mapset']
        self.assertRaises(mdig.instance.DispersalInstanceException,
                          i.get_mapset)
        i.node.attrib['mapset'] = mapset

    @patch('mdig.grass.get_g')
    def test_set_mapset(self, m_g):
        m_g.return_value.grass_vars = {'GISDBASE': self.gisdb}
        i = self.m_lifestage.get_instances()[0]
        i.set_mapset('blah')
        self.assertEqual(i.node.attrib['mapset'], 'blah')

    @patch('mdig.grass.get_g')
    def test_add_envelope(self, m_g):
        m_g.return_value.grass_vars = {'GISDBASE': self.gisdb}
        i = self.m_variables.get_instances()[0]
        i._add_envelope('test_envelope', 'all', 1)
        e = i.node.find('envelopes')
        self.assertEqual(len(e), 1)
        # second add doesn't have to init xml structure
        i._add_envelope('test_envelope', 'all', 1)
        self.assertEqual(len(e), 1)

    @patch('mdig.grass.get_g')
    def test_update_xml(self, m_g):
        m_g.return_value.grass_vars = {'GISDBASE': self.gisdb}
        i = self.m_variables.get_instances()[0]
        i.enabled = False
        i.update_xml()
        self.assertEqual(i.node.attrib['enabled'], 'false')
        i.enabled = True
        i.update_xml()
        self.assertEqual(i.node.attrib['enabled'], 'true')

    @patch('mdig.grass.get_g')
    def test_update_occupancy_envelope(self, m_get_g):
        m_get_g.return_value.occupancy_envelope.return_value = "test_env"
        m_get_g.return_value.grass_vars = {'GISDBASE': self.gisdb}
        i = self.m_variables.get_instances()[0]
        self.assertRaises(InstanceIncompleteException,
                          i.update_occupancy_envelope)

        i = self.m_variables_complete.get_instances()[0]
        i.update_occupancy_envelope()
        call_args = m_get_g.return_value.occupancy_envelope.call_args
        self.assertEqual(len(call_args[0][0]), 2)
        self.assertEqual(call_args[0][1],
                         'variables_complete_region_a_i0_ls_all_t_5_prob')

        #check existing aborts
        m_get_g.return_value.occupancy_envelope.call_args = []
        i.update_occupancy_envelope()
        call_args = m_get_g.return_value.occupancy_envelope.call_args
        self.assertEqual(len(call_args), 0)

        #check overwrite maps works
        m_get_g.return_value.occupancy_envelope.call_args = []
        i.update_occupancy_envelope(force=True)
        call_args = m_get_g.return_value.occupancy_envelope.call_args
        self.assertEqual(len(call_args[0][0]), 2)
        self.assertEqual(call_args[0][1],
                         'variables_complete_region_a_i0_ls_all_t_5_prob')

    @patch('mdig.grass.get_g')
    def test_listeners(self, m_get_g):
        m_get_g.return_value.occupancy_envelope.return_value = "test_env"
        m_get_g.return_value.grass_vars = {'GISDBASE': self.gisdb}
        i = self.m_variables_complete.get_instances()[0]

        class l:
            count = 0

            def occupancy_envelope_complete(self, i, l, t):
                self.count += 1

        i.listeners = [l()]
        i.update_occupancy_envelope()
        self.assertEqual(i.listeners[0].count, 6)
        call_args = m_get_g.return_value.occupancy_envelope.call_args
        self.assertEqual(len(call_args[0][0]), 2)
        self.assertEqual(call_args[0][1],
                         'variables_complete_region_a_i0_ls_all_t_5_prob')

    @patch('mdig.grass.get_g')
    def test_update_occupancy_env_strategy(self, m_get_g):
        # test with strategy
        m_get_g.return_value.occupancy_envelope.return_value = "test_env"
        m_get_g.return_value.grass_vars = {'GISDBASE': self.gisdb}
        m_get_g.return_value.occupancy_envelope.call_args = []
        # check with strategy
        i = self.m_strategy.get_instances()[1]
        self.assertTrue(i.strategy is not None)
        i.update_occupancy_envelope(force=True)
        call_args = m_get_g.return_value.occupancy_envelope.call_args
        self.assertEqual(len(call_args[0][0]), 2)
        self.assertEqual(
            call_args[0][1],
            'management_area_combine_region_a_i1_ls_all_t_5_prob')

    @patch('mdig.grass.get_g')
    @patch('mdig.replicate.Replicate.get_saved_maps')
    def test_update_occupancy_env_missing_maps(self, m_get_maps, m_get_g):
        # test without rep maps
        m_get_g.return_value.occupancy_envelope.return_value = "test_env"
        m_get_g.return_value.grass_vars = {'GISDBASE': self.gisdb}
        m_get_g.return_value.occupancy_envelope.call_args = []
        m_get_maps.return_value = {}

        i = self.m_variables_complete.get_instances()[0]
        self.assertRaises(mdig.instance.DispersalInstanceException,
                          i.update_occupancy_envelope,
                          force=True)
        call_args = m_get_g.return_value.occupancy_envelope.call_args
        self.assertEqual(len(call_args), 0)

        #import pdb;pdb.set_trace()
        m_get_maps.return_value = {1: 'test1', 222: 'test2'}
        self.assertRaises(mdig.instance.DispersalInstanceException,
                          i.update_occupancy_envelope,
                          force=True)

    @patch('mdig.grass.get_g')
    def test_str(self, m_get_g):
        # test with strategy
        m_get_g.return_value.grass_vars = {'GISDBASE': self.gisdb}
        # check with no strategy
        i = self.m_strategy.get_instances()[0]
        self.assertTrue(len(str(i)) > 0)
        self.assertTrue(len(i.long_str()) > 0)
        i.enabled = False
        self.assertTrue(len(str(i)) > 0)
        self.assertTrue(len(i.long_str()) > 0)
        i.enabled = True
        i.activeReps = [1]
        self.assertTrue(len(str(i)) > 0)
        self.assertTrue(len(i.long_str()) > 0)
        i.activeReps = []
        # check with strategy
        i = self.m_strategy.get_instances()[1]
        self.assertTrue(len(str(i)) > 0)
        self.assertTrue(len(i.long_str()) > 0)

    @patch('mdig.grass.get_g')
    @patch('os.path')
    @patch('os.remove')
    @patch('shutil.move')
    def test_add_analysis_result(self, m_shutil, m_remove, m_path, m_get_g):
        m_path.basename.return_value = 'test'
        m_get_g.return_value.grass_vars = {'GISDBASE': self.gisdb}
        # check with no strategy
        i = self.m_strategy.get_instances()[0]
        analysis_cmd = Mock()
        analysis_cmd.cmd_string = 'wibble'
        analysis_cmd.output_fn = 'wibble'
        # Test with file existing
        i.add_analysis_result('all', analysis_cmd)
        # Test with overwrite
        config.get_config().overwrite_flag = True
        i.add_analysis_result('all', analysis_cmd)
        # run again to check parsing existing lifestage analysis results
        i.add_analysis_result('all', analysis_cmd)
        config.get_config().overwrite_flag = False
Exemple #21
0
 def test_check_info(self):  #, m_remove_map, m_copy_map):
     m_fn = self.models['variables']
     dm = DispersalModel(m_fn)
     g = grass.get_g()
     check_instances_have_info_file(dm.get_instances())
class DispersalInstanceTest(unittest.TestCase):

    def setUp(self):
        mdig.repository = self.repo = ModelRepository()
        #logging.getLogger('mdig').setLevel(logging.CRITICAL)
        models = mdig.repository.get_models()
        fn = models['lifestage_test']
        self.m_lifestage = DispersalModel(fn)

        # Model initialise with management strategy
        fn = models['management_area_combine']
        self.m_strategy = DispersalModel(fn)
        
        # Model initialise with variables
        fn = models['variables']
        self.m_variables = DispersalModel(fn)
        #logging.getLogger('mdig').setLevel(logging.WARNING)

        fn = models['variables_complete']
        self.m_variables_complete = DispersalModel(fn)

        c = config.get_config()
        self.gisdb = c['GRASS']['GISDBASE']

    def tearDown(self):
        self.m_variables.remove_log_handler()
        self.m_variables_complete.remove_log_handler()
        self.m_lifestage.remove_log_handler()
        self.m_strategy.remove_log_handler()

    @patch('mdig.grass.get_g')
    def test_load_replicates(self,m_g):
        m_g.return_value.grass_vars = {'GISDBASE':self.gisdb}
        # replicates loaded on init
        self.m_lifestage.get_instances()
        self.m_strategy.get_instances()
        self.m_variables.get_instances()

    @patch('mdig.grass.get_g')
    def test_get_mapset(self,m_g):
        m_g.return_value.grass_vars = {'GISDBASE':self.gisdb}
        i = self.m_lifestage.get_instances()[0]
        self.assertEqual(i.get_mapset().find('lifestage_test_i'), 0)
        mapset = i.node.attrib['mapset']
        del i.node.attrib['mapset']
        self.assertRaises(mdig.instance.DispersalInstanceException,i.get_mapset)
        i.node.attrib['mapset'] = mapset

    @patch('mdig.grass.get_g')
    def test_set_mapset(self,m_g):
        m_g.return_value.grass_vars = {'GISDBASE':self.gisdb}
        i = self.m_lifestage.get_instances()[0]
        i.set_mapset('blah')
        self.assertEqual(i.node.attrib['mapset'], 'blah')

    @patch('mdig.grass.get_g')
    def test_add_envelope(self,m_g):
        m_g.return_value.grass_vars = {'GISDBASE':self.gisdb}
        i = self.m_variables.get_instances()[0]
        i._add_envelope('test_envelope','all',1)
        e = i.node.find('envelopes')
        self.assertEqual(len(e),1)
        # second add doesn't have to init xml structure
        i._add_envelope('test_envelope','all',1)
        self.assertEqual(len(e),1)

    @patch('mdig.grass.get_g')
    def test_update_xml(self,m_g):
        m_g.return_value.grass_vars = {'GISDBASE':self.gisdb}
        i = self.m_variables.get_instances()[0]
        i.enabled = False
        i.update_xml()
        self.assertEqual(i.node.attrib['enabled'],'false')
        i.enabled = True
        i.update_xml()
        self.assertEqual(i.node.attrib['enabled'],'true')

    @patch('mdig.grass.get_g')
    def test_update_occupancy_envelope(self,m_get_g):
        m_get_g.return_value.occupancy_envelope.return_value = "test_env"
        m_get_g.return_value.grass_vars = {'GISDBASE':self.gisdb}
        i = self.m_variables.get_instances()[0]
        self.assertRaises(InstanceIncompleteException,i.update_occupancy_envelope)

        i = self.m_variables_complete.get_instances()[0]
        i.update_occupancy_envelope()
        call_args = m_get_g.return_value.occupancy_envelope.call_args
        self.assertEqual(len(call_args[0][0]), 2)
        self.assertEqual(call_args[0][1], 'variables_complete_region_a_i0_ls_all_t_5_prob')

        #check existing aborts
        m_get_g.return_value.occupancy_envelope.call_args = []
        i.update_occupancy_envelope()
        call_args = m_get_g.return_value.occupancy_envelope.call_args
        self.assertEqual(len(call_args), 0)

        #check overwrite maps works
        m_get_g.return_value.occupancy_envelope.call_args = []
        i.update_occupancy_envelope(force=True)
        call_args = m_get_g.return_value.occupancy_envelope.call_args
        self.assertEqual(len(call_args[0][0]), 2)
        self.assertEqual(call_args[0][1], 'variables_complete_region_a_i0_ls_all_t_5_prob')

    @patch('mdig.grass.get_g')
    def test_listeners(self,m_get_g):
        m_get_g.return_value.occupancy_envelope.return_value = "test_env"
        m_get_g.return_value.grass_vars = {'GISDBASE':self.gisdb}
        i = self.m_variables_complete.get_instances()[0]
        class l:
            count = 0
            def occupancy_envelope_complete(self,i,l,t): self.count+=1
        i.listeners = [ l() ]
        i.update_occupancy_envelope()
        self.assertEqual(i.listeners[0].count, 6)
        call_args = m_get_g.return_value.occupancy_envelope.call_args
        self.assertEqual(len(call_args[0][0]), 2)
        self.assertEqual(call_args[0][1], 'variables_complete_region_a_i0_ls_all_t_5_prob')

    @patch('mdig.grass.get_g')
    def test_update_occupancy_env_strategy(self,m_get_g):
        # test with strategy
        m_get_g.return_value.occupancy_envelope.return_value = "test_env"
        m_get_g.return_value.grass_vars = {'GISDBASE':self.gisdb}
        m_get_g.return_value.occupancy_envelope.call_args = []
        # check with strategy
        i = self.m_strategy.get_instances()[1]
        self.assertTrue(i.strategy is not None)
        i.update_occupancy_envelope(force=True)
        call_args = m_get_g.return_value.occupancy_envelope.call_args
        self.assertEqual(len(call_args[0][0]), 2)
        self.assertEqual(call_args[0][1], 'management_area_combine_region_a_i1_ls_all_t_5_prob')

    @patch('mdig.grass.get_g')
    @patch('mdig.replicate.Replicate.get_saved_maps')
    def test_update_occupancy_env_missing_maps(self,m_get_maps,m_get_g):
        # test without rep maps
        m_get_g.return_value.occupancy_envelope.return_value = "test_env"
        m_get_g.return_value.grass_vars = {'GISDBASE':self.gisdb}
        m_get_g.return_value.occupancy_envelope.call_args = []
        m_get_maps.return_value = {}

        i = self.m_variables_complete.get_instances()[0]
        self.assertRaises(mdig.instance.DispersalInstanceException,
                i.update_occupancy_envelope,force=True)
        call_args = m_get_g.return_value.occupancy_envelope.call_args
        self.assertEqual(len(call_args), 0)

        #import pdb;pdb.set_trace()
        m_get_maps.return_value = {1:'test1',222:'test2'}
        self.assertRaises(mdig.instance.DispersalInstanceException,
                i.update_occupancy_envelope,force=True)

    @patch('mdig.grass.get_g')
    def test_str(self,m_get_g):
        # test with strategy
        m_get_g.return_value.grass_vars = {'GISDBASE':self.gisdb}
        # check with no strategy
        i = self.m_strategy.get_instances()[0]
        self.assertTrue(len(str(i)) > 0)
        self.assertTrue(len(i.long_str()) > 0)
        i.enabled = False
        self.assertTrue(len(str(i)) > 0)
        self.assertTrue(len(i.long_str()) > 0)
        i.enabled = True
        i.activeReps = [1]
        self.assertTrue(len(str(i)) > 0)
        self.assertTrue(len(i.long_str()) > 0)
        i.activeReps = []
        # check with strategy
        i = self.m_strategy.get_instances()[1]
        self.assertTrue(len(str(i)) > 0)
        self.assertTrue(len(i.long_str()) > 0)

    @patch('mdig.grass.get_g')
    @patch('os.path')
    @patch('os.remove')
    @patch('shutil.move')
    def test_add_analysis_result(self,m_shutil,m_remove,m_path,m_get_g):
        m_path.basename.return_value = 'test'
        m_get_g.return_value.grass_vars = {'GISDBASE':self.gisdb}
        # check with no strategy
        i = self.m_strategy.get_instances()[0]
        analysis_cmd = Mock()
        analysis_cmd.cmd_string = 'wibble'
        analysis_cmd.output_fn = 'wibble'
        # Test with file existing
        i.add_analysis_result('all',analysis_cmd)
        # Test with overwrite
        config.get_config().overwrite_flag = True
        i.add_analysis_result('all',analysis_cmd)
        # run again to check parsing existing lifestage analysis results
        i.add_analysis_result('all',analysis_cmd)
        config.get_config().overwrite_flag = False
Exemple #23
0
class ReplicateTest(unittest.TestCase):

    def setUp(self):
        mdig.repository = self.repo = ModelRepository()
        #logging.getLogger('mdig').setLevel(logging.CRITICAL)
        models = mdig.repository.get_models()
        fn = models['lifestage_test']
        self.m_lifestage = DispersalModel(fn)

        # Model initialise with variables
        fn = models['variables']
        self.m_variables = DispersalModel(fn)
        fn = models['variables_complete']
        self.m_variables_complete = DispersalModel(fn)

        # management
        fn = models['management_alter_variable']
        self.m_management = DispersalModel(fn)

        #analysis
        fn = models['analysis_example']
        self.m_analysis = DispersalModel(fn)

    def tearDown(self):
        self.m_variables.remove_log_handler()
        self.m_variables_complete.remove_log_handler()
        self.m_lifestage.remove_log_handler()
        
    def test_create_w_no_node(self):
        i = self.m_lifestage.get_instances()[0]
        r = Replicate(node=None,instance=i)
        # TODO check effects

    def test_create_w_no_instance(self):
        i = self.m_lifestage.get_instances()[0]
        self.assertRaises(ValueError,Replicate,node=None,instance=None)

    def test_check_complete_on_creation(self):
        config.get_config()['replicate']['check_complete']='true'
        i = self.m_variables.get_instances()[0]
        r = Replicate(node=None,instance=i)
        config.get_config()['replicate']['check_complete']='false'

    def test_check_complete(self):
        i = self.m_variables.get_instances()[0]
        r = Replicate(node=None,instance=i)
        self.assertFalse(r.check_complete())
        i = self.m_variables_complete.get_instances()[0]
        self.assertTrue(i.replicates[0].check_complete())

        r = i.replicates[0]
        r.get_saved_maps = mock_get_saved_maps
        self.assertFalse(i.replicates[0].check_complete())
        global get_save_count
        get_save_count = 0

    @patch('mdig.grass.get_g')
    def test_delete_maps(self,get_g):
        i = self.m_variables_complete.get_instances()[0]
        i.replicates[0].delete_maps()
        self.assertEqual(get_g.return_value.remove_map.call_count, 6)

        get_g.return_value.remove_map.call_count = 0
        i = self.m_lifestage.get_instances()[0]
        r = Replicate(node=None,instance=i)
        r.delete_maps()
        self.assertEqual(get_g.return_value.remove_map.call_count, 0)

        r.get_saved_maps = mock_get_saved_maps
        r.delete_maps()
        self.assertEqual(get_g.return_value.remove_map.call_count, 0)
        global get_save_count
        get_save_count = 0

    @patch('mdig.grass.get_g')
    def test_null_bitmask(self,get_g):
        i = self.m_variables_complete.get_instances()[0]
        r = i.replicates[0]
        r.null_bitmask()
        self.assertEqual(get_g.return_value.null_bitmask.call_count, 6)

    def test_map_name_base(self):
        i = self.m_variables_complete.get_instances()[0]
        name = i.replicates[0].get_map_name_base()
        self.assertEqual('variables_complete_region_a_i0_rep_0', name)
        name = i.replicates[1].get_map_name_base()
        self.assertEqual('variables_complete_region_a_i0_rep_1', name)
        i = self.m_variables_complete.get_instances()[1]
        name = i.replicates[0].get_map_name_base()
        self.assertEqual('variables_complete_region_a_i1_rep_0', name)

    def test_get_base_filenames(self):
        i = self.m_variables_complete.get_instances()[0]
        # return a dictionary of time:names
        img_fns = i.replicates[0].get_base_filenames()
        self.assertEqual(len(img_fns),6)
        # return a single filename
        img_fn = i.replicates[0].get_base_filenames(single_file=True)
        self.assertTrue('variables_complete_region_a_i0_rep_0_ls_all' in img_fn)

    def test_get_initial_maps(self):
        i = self.m_variables_complete.get_instances()[0]
        r = i.replicates[0]
        self.assertEqual(r.get_initial_map('all'),None)
        r.initial_maps = self.m_variables.get_initial_maps(i.r_id)
        self.assertNotEqual(r.get_initial_map('all'),None)

    def test_reset(self):
        i = self.m_variables_complete.get_instances()[0]
        r = i.replicates[0]
        old_xml_node = r.node
        r.reset()
        self.assertNotEqual(old_xml_node, r.node)

    def test_record_maps(self):
        i = self.m_variables_complete.get_instances()[0]
        r = i.replicates[0]
        r.grass_i = Mock()
        r.record_maps()
        r.active = True
        r.temp_map_names['all'] = [ 'tmap1', 'tmap2' ]
        r.record_maps()
        self.assertEqual(r.grass_i.copy_map.call_count, 1)
        r.record_maps(remove_null=True)
        self.assertEqual(r.grass_i.copy_map.call_count, 2)
        self.assertEqual(r.grass_i.null_bitmask.call_count, 1)
        self.assertTrue('all' in r.get_previous_map('all'))
        
    def test_previous_maps(self):
        i = self.m_variables_complete.get_instances()[0]
        r = i.replicates[0]
        maps = r.get_previous_maps('all')
        self.assertEqual(maps, [])
        maps.append('test1')
        maps.append('test2')
        maps = r.get_previous_maps('all')
        self.assertEqual(len(maps), 2)
        a_map = r.get_previous_map('all')
        self.assertEqual(a_map, 'test2')
        a_map = r.get_previous_map('all',2)
        self.assertEqual(a_map, 'test1')
        a_map = r.get_previous_map('all',3)
        self.assertEqual(a_map, None)
        r.push_previous_map('all','freaky')
        a_map = r.get_previous_map('all')
        self.assertEqual(a_map, 'freaky')

    def init_mock_grass(self,g):
        g.return_value.init_map.return_value = ('mockstring',Mock())
        g.return_value.get_mapset.return_value = 'mock_mapset'
        g.return_value.generate_map_name.return_value = 'tempmapname'
        g.return_value.get_range.return_value = ['thisr=10']*10
        g.return_value.raster_value_freq.return_value = [(1,1), (2,1), (3,1)]
        g.return_value.raster_to_ascii.return_value = ('file1','file2')

    @patch('mdig.lifestage.Lifestage')
    @patch('mdig.grass.get_g')
    def test_run(self,m_g,m_ls):
        self.init_mock_grass(m_g)
        i = self.m_variables_complete.get_instances()[0]
        r = i.replicates[0]
        r.grass_i = Mock()
        r.instance.experiment.save_model = Mock()
        r.run()

    @patch('mdig.lifestage.Lifestage')
    @patch('mdig.grass.get_g')
    def test_run_w_lifestage(self,m_g,m_ls):
        self.init_mock_grass(m_g)
        i = self.m_lifestage.get_instances()[0]
        r = i.replicates[0]
        r.grass_i = Mock()
        r.instance.experiment.save_model = Mock()
        r.instance.experiment.get_lifestage_transitions = Mock()
        r.instance.experiment.get_lifestage_transitions.return_value = [Mock()]
        r.run()

    @patch('mdig.lifestage.Lifestage')
    @patch('mdig.grass.get_g')
    def test_run_w_management(self,m_g,m_ls):
        self.init_mock_grass(m_g)
        i = self.m_management.get_instances()[1]
        r = Replicate(None,i)
        r.grass_i = Mock()
        r.instance.experiment.save_model = Mock()
        r.run()
        
    @patch('mdig.lifestage.Lifestage')
    @patch('mdig.grass.get_g')
    def test_run_w_analysis(self,m_g,m_ls):
        self.init_mock_grass(m_g)
        m = self.m_analysis
        i = m.get_instances()[0]
        r = Replicate(None,i)
        r.grass_i = Mock()
        r.instance.experiment.save_model = Mock()
        r.run()

        # Run again to ensure 
        self.assertRaises(mdig.analysis.AnalysisOutputFileExists,r.run)

    def test_get_time_stamp(self):
        i = self.m_variables_complete.get_instances()[0]
        r = i.replicates[0]
        import time
        import datetime
        self.assertTrue(r.get_time_stamp() < datetime.datetime.now())
        t = time.time()
        r.node.attrib['ts'] = str(t)
        self.assertEqual(r.get_time_stamp(),
                datetime.datetime.fromtimestamp(float(str(t))))
Exemple #24
0
 def test_check_info(self):  # , m_remove_map, m_copy_map):
     m_fn = self.models["variables"]
     dm = DispersalModel(m_fn)
     g = grass.get_g()
     check_instances_have_info_file(dm.get_instances())