def test_load_already_open_netcdf_error(self, patched, tmp_path): """ Test that a checkpoint can be loaded when the load expects there to be a netcdf file. This will create a new netcdf file and raise a warning. """ # define a yaml with an output, and checkpoint p = utilities.yaml_from_dict(tmp_path, 'input.yaml', { 'save_checkpoint': True, 'save_eta_grids': True }) _delta = DeltaModel(input_file=p) # make mocks _delta.log_info = mock.MagicMock() _delta.logger = mock.MagicMock() _delta.init_output_file = mock.MagicMock() # close the file so can be safely opened in load _delta.output_netcdf.close() # check that files exist, and then open the nc back up assert os.path.isfile( os.path.join(_delta.prefix, 'pyDeltaRCM_output.nc')) assert os.path.isfile(os.path.join(_delta.prefix, 'checkpoint.npz')) _ = Dataset(os.path.join(_delta.prefix, 'pyDeltaRCM_output.nc')) # now try to resume a model and should throw error with pytest.raises(RuntimeError): _delta.load_checkpoint()
def test_run_one_timestep_deprecated(self, tmp_path): # create a delta with default settings p = utilities.yaml_from_dict(tmp_path, 'input.yaml') _delta = DeltaModel(input_file=p) # mock top-level methods _delta.logger = mock.MagicMock() _delta.solve_water_and_sediment_timestep = mock.MagicMock() # check warning raised with pytest.warns(UserWarning): _delta.run_one_timestep() # and logged assert (_delta.logger.warning.called is True)
def test_load_wo_netcdf_expected(self, patched, tmp_path): """ Test that a checkpoint can be loaded when the load expects there to be a netcdf file. This will create a new netcdf file and raise a warning. """ # define a yaml with NO outputs, but checkpoint p = utilities.yaml_from_dict(tmp_path, 'input.yaml', { 'save_checkpoint': True, 'save_eta_grids': True }) _delta = DeltaModel(input_file=p) # make mocks _delta.log_info = mock.MagicMock() _delta.logger = mock.MagicMock() _delta.init_output_file = mock.MagicMock() # close the file so can be safely opened in load _delta.output_netcdf.close() # check that files exist, and then delete nc assert os.path.isfile( os.path.join(_delta.prefix, 'pyDeltaRCM_output.nc')) assert os.path.isfile(os.path.join(_delta.prefix, 'checkpoint.npz')) os.remove(os.path.join(_delta.prefix, 'pyDeltaRCM_output.nc')) # now mess up a field _eta0 = np.copy(_delta.eta) _rand_field = np.random.uniform(0, 1, size=_delta.eta.shape) _delta.eta = _rand_field assert np.all(_delta.eta == _rand_field) # now resume from the checkpoint to restore the field with pytest.warns(UserWarning, match=r'NetCDF4 output *.'): _delta.load_checkpoint() # check that fields match assert np.all(_delta.eta == _eta0) assert _delta._save_iter == 0 # assertions on function calls _delta.log_info.assert_called() _delta.logger.warning.assert_called() _delta.init_output_file.assert_called() patched.assert_called()
def test_load_standard_grid(self, patched, tmp_path): """Test that a run can be resumed when there are outputs. """ # create one delta, just to have a checkpoint file p = utilities.yaml_from_dict(tmp_path, 'input.yaml', { 'save_checkpoint': True, 'save_eta_grids': True }) _delta = DeltaModel(input_file=p) # make mocks _delta.log_info = mock.MagicMock() _delta.logger = mock.MagicMock() _delta.init_output_file = mock.MagicMock() # close the file so can be safely opened in load _delta.output_netcdf.close() # check checkpoint exists assert os.path.isfile(os.path.join(_delta.prefix, 'checkpoint.npz')) assert os.path.isfile( os.path.join(_delta.prefix, 'pyDeltaRCM_output.nc')) # now mess up a field _eta0 = np.copy(_delta.eta) _rand_field = np.random.uniform(0, 1, size=_delta.eta.shape) _delta.eta = _rand_field assert np.all(_delta.eta == _rand_field) # now resume from the checkpoint to restore the field _delta.load_checkpoint() # check that fields match assert np.all(_delta.eta == _eta0) # assertions on function calls _call = [mock.call('Renaming old NetCDF4 output file', verbosity=2)] _delta.log_info.assert_has_calls(_call, any_order=True) _delta.logger.assert_not_called() _delta.init_output_file.assert_not_called() patched.assert_called()
def test_records_arbitrary_time_values(self, tmp_path, capsys): """ This test should create the log, and then print nothing at all. """ file_name = 'user_parameters.yaml' p, f = utilities.create_temporary_file(tmp_path, file_name) utilities.write_parameter_to_file(f, 'out_dir', tmp_path / 'out_dir') f.close() _delta = DeltaModel(input_file=p) _delta.logger = mock.MagicMock() # change values _delta._time = 3.14159 _delta._time_iter = 42 _delta.log_model_time() # will record whatever value is in _delta _calls = [mock.call('Time: 3.1; timestep: 42')] _delta.logger.info.assert_has_calls(_calls)
def test_verbose_printing_2(self, tmp_path, capsys): """ This test should create the log, and then print nothing at all. """ file_name = 'user_parameters.yaml' p, f = utilities.create_temporary_file(tmp_path, file_name) utilities.write_parameter_to_file(f, 'out_dir', tmp_path / 'out_dir') utilities.write_parameter_to_file(f, 'verbose', 2) f.close() _delta = DeltaModel(input_file=p) _delta.logger = mock.MagicMock() _delta.log_model_time() # time is logged regardless of verbosity _calls = [mock.call('Time: 0.0; timestep: 0')] _delta.logger.info.assert_has_calls(_calls) # stdout is empty because verbose 2 captd = capsys.readouterr() assert 'Time: 0.0' in captd.out # if verbose >= 1
def test_save_a_checkpoint_checkpoint_true_timewarning(self, tmp_path): # create a delta with subsidence parameters p = utilities.yaml_from_dict(tmp_path, 'input.yaml', { 'save_checkpoint': True, 'checkpoint_dt': 864000000 }) _delta = DeltaModel(input_file=p) # force the time to be greater than the checkpoint interval _delta._save_time_since_checkpoint = 2 * _delta._checkpoint_dt # mock the actual save checkpoint function to see if it was called _delta.save_the_checkpoint = mock.MagicMock() # this warning is only written to log, so mock the logger _delta.logger = mock.MagicMock() # run the output checkpoint func _delta.output_checkpoint() # assertions assert (_delta.save_the_checkpoint.call_count == 1) assert (_delta.logger.warning.call_count == 1)
def test_load_wo_netcdf_not_expected(self, patched, tmp_path): """ Test that a checkpoint can be loaded when the load does not expect there to be any netcdf file. """ # create one delta, just to have a checkpoint file p = utilities.yaml_from_dict(tmp_path, 'input.yaml', {'save_checkpoint': True}) _delta = DeltaModel(input_file=p) # make mocks _delta.log_info = mock.MagicMock() _delta.logger = mock.MagicMock() _delta.init_output_file = mock.MagicMock() assert os.path.isfile(os.path.join(_delta.prefix, 'checkpoint.npz')) assert not os.path.isfile( os.path.join(_delta.prefix, 'pyDeltaRCM_output.nc')) # now mess up a field _eta0 = np.copy(_delta.eta) _rand_field = np.random.uniform(0, 1, size=_delta.eta.shape) _delta.eta = _rand_field assert np.all(_delta.eta == _rand_field) # now resume from the checkpoint to restore the field _delta.load_checkpoint() # check that fields match assert np.all(_delta.eta == _eta0) # assertions on function calls _delta.log_info.assert_called() _delta.logger.assert_not_called() _delta.init_output_file.assert_not_called() patched.assert_called()