def test_compare_data_floats_equal(dummy_nc): """Check comparison of floating point data considered exactly equal""" actual_nc, expected_nc = dummy_nc expected_ds = nc.Dataset(expected_nc, mode='a') actual_ds = nc.Dataset(actual_nc, mode='a') messages_reported = [] def message_collector(message): messages_reported.append(message) # Check that data originally matches exactly (zero tolerances) compare.compare_data(DEWPOINT, actual_ds[DEWPOINT], expected_ds[DEWPOINT], 0.0, 0.0, message_collector) assert len(messages_reported) == 0 # Check that NaNs in same position compare equal rather than the # floating point "NaNs are always unequal" usual convention expected_dp = expected_ds[DEWPOINT] expected_dp[0, :] = np.nan expected_ds.sync() actual_dp = actual_ds[DEWPOINT] actual_dp[0, :] = np.nan actual_ds.sync() compare.compare_data(DEWPOINT, actual_ds[DEWPOINT], expected_ds[DEWPOINT], 0.0, 0.0, message_collector) assert len(messages_reported) == 0
def test_compare_data_shape(dummy_nc): """Check differing data shapes are reported""" actual_nc, expected_nc = dummy_nc expected_ds = nc.Dataset(expected_nc, mode='r') actual_ds = nc.Dataset(actual_nc, mode='a') messages_reported = [] def message_collector(message): messages_reported.append(message) # super loose tolerance, but shapes don't match compare.compare_data("lonlat", actual_ds[LON], expected_ds[LAT], 100.0, 100.0, message_collector) assert len(messages_reported) == 1 assert "shape" in messages_reported[0]
def test_compare_data_integers(dummy_nc): """Check comparison of integers""" actual_nc, expected_nc = dummy_nc expected_ds = nc.Dataset(expected_nc, mode='r') actual_ds = nc.Dataset(actual_nc, mode='a') messages_reported = [] def message_collector(message): messages_reported.append(message) actual_dp = actual_ds[CAT] actual_dp[:] = np.array(actual_dp[:]) + 1 # 2 absolute tolerance -> no problem compare.compare_data(CAT, actual_ds[CAT], expected_ds[CAT], 0, 2, message_collector) assert len(messages_reported) == 0 # 1 absolute tolerance -> no problem compare.compare_data(CAT, actual_ds[CAT], expected_ds[CAT], 0, 1, message_collector) assert len(messages_reported) == 0 # 0 relative and absolute tolerance -> problem reported compare.compare_data(CAT, actual_ds[CAT], expected_ds[CAT], 0, 0, message_collector) assert len(messages_reported) == 1 assert "tolerance" in messages_reported[0] assert CAT in messages_reported[0]
def test_compare_data_floats_absolute(dummy_nc): """Check comparison of floating point data with absolute tolerances""" actual_nc, expected_nc = dummy_nc expected_ds = nc.Dataset(expected_nc, mode='r') actual_ds = nc.Dataset(actual_nc, mode='a') messages_reported = [] def message_collector(message): messages_reported.append(message) # Check that modifying the data is picked up by absolute tolerance actual_dp = actual_ds[DEWPOINT] # absolute change is a little smaller than 1e-2 actual_dp[1, :] = np.array(actual_dp[1, :]) + 8e-3 # 1e-2 absolute tolerance -> no problem compare.compare_data(DEWPOINT, actual_ds[DEWPOINT], expected_ds[DEWPOINT], 0.0, 1e-2, message_collector) assert len(messages_reported) == 0 # 5e-3 absolute tolerance -> problem reported compare.compare_data(DEWPOINT, actual_ds[DEWPOINT], expected_ds[DEWPOINT], 0.0, 5e-3, message_collector) assert len(messages_reported) == 1 assert DEWPOINT in messages_reported[0] assert 'tolerance' in messages_reported[0] # no relative tolerance -> problem reported compare.compare_data(DEWPOINT, actual_ds[DEWPOINT], expected_ds[DEWPOINT], 0.0, 0.0, message_collector) assert len(messages_reported) == 2
def test_compare_data_floats_relative(dummy_nc): """Check comparison of floating point data with relative tolerances""" actual_nc, expected_nc = dummy_nc expected_ds = nc.Dataset(expected_nc, mode="a") actual_ds = nc.Dataset(actual_nc, mode="a") messages_reported = [] def message_collector(message): messages_reported.append(message) # Check that modifying the data is picked up by relative tolerance actual_dp = actual_ds[DEWPOINT] # relative change is a little smaller than 1e-3 actual_dp[1, :] = np.array(actual_dp[1, :]) * (1.0 + 8e-4) # 1e-3 relative tolerance -> no problem compare.compare_data( DEWPOINT, actual_ds[DEWPOINT], expected_ds[DEWPOINT], 1e-3, 0.0, message_collector, ) assert len(messages_reported) == 0 # 5e-4 relative tolerance -> problem reported compare.compare_data( DEWPOINT, actual_ds[DEWPOINT], expected_ds[DEWPOINT], 5e-4, 0.0, message_collector, ) assert len(messages_reported) == 1 assert DEWPOINT in messages_reported[0] assert "tolerance" in messages_reported[0] # no relative tolerance -> problem reported compare.compare_data( DEWPOINT, actual_ds[DEWPOINT], expected_ds[DEWPOINT], 0.0, 0.0, message_collector, ) assert len(messages_reported) == 2