You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@climate.apache.org by ja...@apache.org on 2016/06/14 06:43:29 UTC
[2/4] climate git commit: Add tests for Utils module
Add tests for Utils module
- Add multiple tests for utils module
- Add test data lat_lon_time_daily.nc file
Project: http://git-wip-us.apache.org/repos/asf/climate/repo
Commit: http://git-wip-us.apache.org/repos/asf/climate/commit/c9b7c4e6
Tree: http://git-wip-us.apache.org/repos/asf/climate/tree/c9b7c4e6
Diff: http://git-wip-us.apache.org/repos/asf/climate/diff/c9b7c4e6
Branch: refs/heads/master
Commit: c9b7c4e603e6575d999a28889231e182b1ed267a
Parents: aaa3bc5
Author: Ibrahim <ja...@gmail.com>
Authored: Sun Jun 12 22:10:52 2016 +0530
Committer: Ibrahim <ja...@gmail.com>
Committed: Tue Jun 14 01:18:41 2016 +0530
----------------------------------------------------------------------
ocw/tests/lat_lon_time_daily.nc | Bin 0 -> 6242 bytes
ocw/tests/test_utils.py | 141 ++++++++++++++++++++++++++++++++++-
2 files changed, 138 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/climate/blob/c9b7c4e6/ocw/tests/lat_lon_time_daily.nc
----------------------------------------------------------------------
diff --git a/ocw/tests/lat_lon_time_daily.nc b/ocw/tests/lat_lon_time_daily.nc
new file mode 100644
index 0000000..cf884da
Binary files /dev/null and b/ocw/tests/lat_lon_time_daily.nc differ
http://git-wip-us.apache.org/repos/asf/climate/blob/c9b7c4e6/ocw/tests/test_utils.py
----------------------------------------------------------------------
diff --git a/ocw/tests/test_utils.py b/ocw/tests/test_utils.py
index 1b6cfb7..1137bea 100644
--- a/ocw/tests/test_utils.py
+++ b/ocw/tests/test_utils.py
@@ -28,12 +28,17 @@ import ocw.utils as utils
class TestDecodeTimes(unittest.TestCase):
- test_model = os.getcwd() + '/ocw-ui/backend/tests/example_data/'\
- 'lat_lon_time.nc'
def setUp(self):
+ path = os.path.dirname(os.path.realpath(__file__))
+ self.test_model = path + \
+ '/../../ocw-ui/backend/tests/example_data/lat_lon_time.nc'
+ self.test_model_daily = path + '/lat_lon_time_daily.nc'
+
self.netcdf = netCDF4.Dataset(
os.path.abspath(self.test_model), mode='r')
+ self.netcdf_daily = netCDF4.Dataset(
+ os.path.abspath(self.test_model_daily), mode='r')
def test_proper_return_format(self):
times = utils.decode_time_values(self.netcdf, 'time')
@@ -46,10 +51,18 @@ class TestDecodeTimes(unittest.TestCase):
end_time = datetime.datetime.strptime(
'2008-12-01 00:00:00', '%Y-%m-%d %H:%M:%S')
times = utils.decode_time_values(self.netcdf, 'time')
-
self.assertEquals(times[0], start_time)
self.assertEquals(times[-1], end_time)
+ def test_days_time_processing(self):
+ start_time = datetime.datetime.strptime(
+ '1951-4-14 00:00:00', '%Y-%m-%d %H:%M:%S')
+ end_time = datetime.datetime.strptime(
+ '1951-12-9 00:00:00', '%Y-%m-%d %H:%M:%S')
+ new_times = utils.decode_time_values(self.netcdf_daily, 'time')
+ self.assertEqual(new_times[0], start_time)
+ self.assertEqual(new_times[-1], end_time)
+
class TestTimeUnitsParse(unittest.TestCase):
def test_valid_parse(self):
@@ -125,6 +138,23 @@ class TestNormalizeLatLonValues(unittest.TestCase):
np.testing.assert_array_equal(lats, self.lats)
np.testing.assert_array_equal(values, self.values)
+ def test_lons_reversed(self):
+ self.lats = np.arange(-10, 10)
+ self.lons = np.arange(40)
+ times = np.array([datetime.datetime(2000, x, 1) for x in range(1, 7)])
+ flat_array = np.arange(len(times) * len(self.lats) * len(self.lons))
+ self.variable = flat_array.reshape(len(times),
+ len(self.lats),
+ len(self.lons))
+ lats, lons, values = utils.normalize_lat_lon_values(self.lats,
+ self.lons[::-1],
+ self.values[:,
+ ::,
+ ::-1])
+ np.testing.assert_array_equal(lats, self.lats)
+ np.testing.assert_array_equal(values, self.values)
+ np.testing.assert_array_equal(lons, self.lons)
+
def test_lons_shift_values(self):
expected_vals = np.array([[2, 3, 0, 1],
[6, 7, 4, 5],
@@ -157,6 +187,49 @@ class TestNormalizeLatLonValues(unittest.TestCase):
self.lons_unsorted,
self.values2)
+ def test_lons_greater_than_180(self):
+ self.lons = np.array([190, 210, 230, 250])
+ self.lats = np.array([-30, 0, 30])
+ self.values = np.arange(12).reshape(3, 4)
+ expected_lons = np.array([-170, -150, -130, -110])
+ expected_values = np.array([[0, 1, 2, 3],
+ [4, 5, 6, 7],
+ [8, 9, 10, 11]])
+ lats, lons, values = utils.normalize_lat_lon_values(self.lats,
+ self.lons,
+ self.values)
+ np.testing.assert_array_equal(lons, expected_lons)
+ np.testing.assert_array_equal(expected_values, values)
+
+
+class TestGetTemporalOverlap(unittest.TestCase):
+ def setUp(self):
+ self.lat = np.array([10, 12, 14, 16, 18])
+ self.lon = np.array([100, 102, 104, 106, 108])
+ self.time = np.array(
+ [datetime.datetime(2000, x, 1) for x in range(1, 13)])
+ flat_array = np.array(range(300))
+ self.value = flat_array.reshape(12, 5, 5)
+ self.variable = 'prec'
+ self.test_dataset = Dataset(self.lat, self.lon, self.time,
+ self.value, self.variable)
+ self.dataset_array = [self.test_dataset, self.test_dataset]
+
+ def test_same_dataset_temporal_overlap(self):
+ maximum, minimum = utils.get_temporal_overlap(self.dataset_array)
+ self.assertEqual(maximum, datetime.datetime(2000, 1, 1))
+ self.assertEqual(minimum, datetime.datetime(2000, 12, 1))
+
+ def test_different_dataset_temporal_overlap(self):
+ new_times = np.array(
+ [datetime.datetime(2002, x, 1) for x in range(1, 13)])
+ another_dataset = Dataset(self.lat, self.lon, new_times,
+ self.value, self.variable)
+ self.dataset_array = [self.test_dataset, another_dataset]
+ maximum, minimum = utils.get_temporal_overlap(self.dataset_array)
+ self.assertEqual(maximum, datetime.datetime(2002, 1, 1))
+ self.assertEqual(minimum, datetime.datetime(2000, 12, 1))
+
class TestReshapeMonthlyToAnnually(unittest.TestCase):
''' Testing function 'reshape_monthly_to_annually' from ocw.utils.py '''
@@ -191,6 +264,56 @@ class TestReshapeMonthlyToAnnually(unittest.TestCase):
ValueError, utils.reshape_monthly_to_annually, bad_dataset)
+class TestCalcTemporalMean(unittest.TestCase):
+ def setUp(self):
+ self.lat = np.array([10, 12, 14])
+ self.lon = np.array([100, 102, 104])
+ self.time = np.array(
+ [datetime.datetime(2000, x, 1) for x in range(1, 7)])
+ flat_array = np.array(range(54))
+ self.value = flat_array.reshape(6, 3, 3)
+ self.variable = 'prec'
+ self.test_dataset = Dataset(self.lat, self.lon, self.time,
+ self.value, self.variable)
+
+ def test_returned_mean(self):
+ mean_values = np.array([[22.5, 23.5, 24.5],
+ [25.5, 26.5, 27.5],
+ [28.5, 29.5, 30.5]])
+
+ result = utils.calc_temporal_mean(self.test_dataset)
+ np.testing.assert_array_equal(result, mean_values)
+
+
+class TestCalcAreaWeightedSpatialAverage(unittest.TestCase):
+ def setUp(self):
+ self.lat = np.array([10, 12, 14])
+ self.lon = np.array([100, 102, 104])
+ self.time = np.array(
+ [datetime.datetime(2000, x, 1) for x in range(1, 7)])
+ flat_array = np.array(range(54))
+ self.value = flat_array.reshape(6, 3, 3)
+ self.variable = 'prec'
+ self.test_dataset = Dataset(self.lat, self.lon, self.time,
+ self.value, self.variable)
+
+ def test_spatial_average(self):
+ avg = np.ma.array([4., 13., 22., 31., 40., 49.])
+ result = utils.calc_area_weighted_spatial_average(self.test_dataset)
+ np.testing.assert_array_equal(avg, result)
+
+ def test_2_dim_lats_lons(self):
+ self.lat = np.array([10, 12, 14]).reshape(3, 1)
+ self.lon = np.array([100, 102, 104]).reshape(3, 1)
+ flat_array = np.array(range(18))
+ self.value = flat_array.reshape(6, 3, 1)
+ self.test_dataset = Dataset(self.lat, self.lon, self.time,
+ self.value, self.variable)
+ avg = np.ma.array([1., 4., 7., 10., 13., 16.])
+ result = utils.calc_area_weighted_spatial_average(self.test_dataset)
+ np.testing.assert_array_equal(avg, result)
+
+
class TestCalcClimatologyYear(unittest.TestCase):
''' Testing function 'calc_climatology_year' from ocw.utils.py '''
@@ -219,6 +342,12 @@ class TestCalcClimatologyYear(unittest.TestCase):
np.testing.assert_array_equal(
utils.calc_climatology_year(self.test_dataset)[1], total_mean)
+ def test_invalid_time_shape(self):
+ flat_array = np.array(range(350))
+ self.test_dataset.values = flat_array.reshape(14, 5, 5)
+ with self.assertRaises(ValueError):
+ utils.calc_climatology_year(self.test_dataset)
+
class TestCalcClimatologyMonthly(unittest.TestCase):
''' Tests the 'calc_climatology_monthly' method from ocw.utils.py '''
@@ -245,6 +374,12 @@ class TestCalcClimatologyMonthly(unittest.TestCase):
np.testing.assert_array_equal(actual_result, expected_result)
np.testing.assert_array_equal(actual_times, expected_times)
+ def test_invalid_time_shape(self):
+ flat_array = np.array(range(350))
+ self.dataset.values = flat_array.reshape(14, 5, 5)
+ with self.assertRaises(ValueError):
+ utils.calc_climatology_monthly(self.dataset)
+
class TestCalcTimeSeries(unittest.TestCase):
''' Tests the 'calc_time_series' method from ocw.utils.py '''