obsarray 1.0.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,488 @@
1
+ """
2
+ Tests for DatasetUtil class
3
+ """
4
+
5
+ import unittest
6
+ import numpy as np
7
+ from xarray import DataArray, Variable
8
+ from obsarray.templater.dataset_util import DatasetUtil
9
+
10
+
11
+ __author__ = "Sam Hunt <sam.hunt@npl.co.uk>"
12
+
13
+
14
+ class TestDatasetUtil(unittest.TestCase):
15
+ def test_create_default_array_1D_int(self):
16
+
17
+ default_array = DatasetUtil.create_default_array([5], np.int8)
18
+
19
+ self.assertIsNotNone(default_array)
20
+ self.assertEqual(DataArray, type(default_array))
21
+ self.assertEqual((5,), default_array.shape)
22
+ self.assertEqual(np.int8, default_array.dtype)
23
+ self.assertEqual(-127, default_array[2])
24
+
25
+ def test_create_default_array_1D_int_dims(self):
26
+
27
+ default_array = DatasetUtil.create_default_array(
28
+ [5], np.int8, dim_names=["dim1"]
29
+ )
30
+
31
+ self.assertIsNotNone(default_array)
32
+ self.assertEqual(DataArray, type(default_array))
33
+ self.assertEqual((5,), default_array.shape)
34
+ self.assertEqual(np.int8, default_array.dtype)
35
+ self.assertEqual(-127, default_array[2])
36
+ self.assertEqual(("dim1",), default_array.dims)
37
+
38
+ def test_create_default_array_1D_int_fill_value(self):
39
+
40
+ default_array = DatasetUtil.create_default_array([5], np.int8, fill_value=1)
41
+
42
+ self.assertIsNotNone(default_array)
43
+ self.assertEqual(DataArray, type(default_array))
44
+ self.assertEqual((5,), default_array.shape)
45
+ self.assertEqual(np.int8, default_array.dtype)
46
+ self.assertEqual(1, default_array[2])
47
+
48
+ def test_create_default_array_3D_int(self):
49
+ default_array = DatasetUtil.create_default_array([7, 8, 3], np.int8)
50
+
51
+ self.assertIsNotNone(default_array)
52
+ self.assertEqual(DataArray, type(default_array))
53
+ self.assertEqual((7, 8, 3), default_array.shape)
54
+ self.assertEqual(np.int8, default_array.dtype)
55
+ self.assertEqual(-127, default_array[2, 4, 2])
56
+
57
+ def test_create_default_array_3D_int_dims(self):
58
+ default_array = DatasetUtil.create_default_array(
59
+ [7, 8, 3], np.int8, dim_names=["dim1", "dim2", "dim3"]
60
+ )
61
+
62
+ self.assertIsNotNone(default_array)
63
+ self.assertEqual(DataArray, type(default_array))
64
+ self.assertEqual((7, 8, 3), default_array.shape)
65
+ self.assertEqual(np.int8, default_array.dtype)
66
+ self.assertEqual(-127, default_array[2, 4, 2])
67
+ self.assertEqual(
68
+ (
69
+ "dim1",
70
+ "dim2",
71
+ "dim3",
72
+ ),
73
+ default_array.dims,
74
+ )
75
+
76
+ def test_create_default_array_3D_int_fill_value(self):
77
+ default_array = DatasetUtil.create_default_array(
78
+ [7, 8, 3], np.int8, fill_value=1
79
+ )
80
+
81
+ self.assertIsNotNone(default_array)
82
+ self.assertEqual(DataArray, type(default_array))
83
+ self.assertEqual((7, 8, 3), default_array.shape)
84
+ self.assertEqual(np.int8, default_array.dtype)
85
+ self.assertEqual(1, default_array[2, 4, 2])
86
+
87
+ def test_create_variable_1D_int(self):
88
+ vector_variable = DatasetUtil.create_variable([5], np.int8)
89
+
90
+ self.assertIsNotNone(vector_variable)
91
+ self.assertEqual(Variable, type(vector_variable))
92
+ self.assertEqual((5,), vector_variable.shape)
93
+ self.assertEqual(np.int8, vector_variable.dtype)
94
+ self.assertEqual(-127, vector_variable[2])
95
+
96
+ def test_create_variable_1D_int_dims(self):
97
+ vector_variable = DatasetUtil.create_variable([5], np.int8, dim_names=["dim1"])
98
+
99
+ self.assertIsNotNone(vector_variable)
100
+ self.assertEqual(Variable, type(vector_variable))
101
+ self.assertEqual((5,), vector_variable.shape)
102
+ self.assertEqual(np.int8, vector_variable.dtype)
103
+ self.assertEqual(-127, vector_variable[2])
104
+ self.assertEqual(("dim1",), vector_variable.dims)
105
+
106
+ def test_create_variable_1D_int_fill_value(self):
107
+ vector_variable = DatasetUtil.create_variable([5], np.int8, fill_value=1)
108
+
109
+ self.assertIsNotNone(vector_variable)
110
+ self.assertEqual(Variable, type(vector_variable))
111
+ self.assertEqual((5,), vector_variable.shape)
112
+ self.assertEqual(np.int8, vector_variable.dtype)
113
+ self.assertEqual(1, vector_variable[2])
114
+
115
+ def test_create_variable_1D_int_attributes(self):
116
+ vector_variable = DatasetUtil.create_variable(
117
+ [5], np.int8, attributes={"standard_name": "std"}
118
+ )
119
+
120
+ self.assertIsNotNone(vector_variable)
121
+ self.assertEqual(Variable, type(vector_variable))
122
+ self.assertEqual((5,), vector_variable.shape)
123
+ self.assertEqual(np.int8, vector_variable.dtype)
124
+ self.assertEqual(-127, vector_variable[2])
125
+ self.assertEqual("std", vector_variable.attrs["standard_name"])
126
+
127
+ def test_create_variable_3D_int(self):
128
+ array_variable = DatasetUtil.create_variable([7, 8, 3], np.int8)
129
+
130
+ self.assertIsNotNone(array_variable)
131
+ self.assertEqual(Variable, type(array_variable))
132
+ self.assertEqual((7, 8, 3), array_variable.shape)
133
+ self.assertEqual(np.int8, array_variable.dtype)
134
+ self.assertEqual(-127, array_variable[2, 4, 2])
135
+
136
+ def test_create_variable_3D_int_dims(self):
137
+ array_variable = DatasetUtil.create_variable(
138
+ [7, 8, 3], np.int8, dim_names=["dim1", "dim2", "dim3"]
139
+ )
140
+
141
+ self.assertIsNotNone(array_variable)
142
+ self.assertEqual(Variable, type(array_variable))
143
+ self.assertEqual((7, 8, 3), array_variable.shape)
144
+ self.assertEqual(np.int8, array_variable.dtype)
145
+ self.assertEqual(-127, array_variable[2, 4, 2])
146
+ self.assertEqual(
147
+ (
148
+ "dim1",
149
+ "dim2",
150
+ "dim3",
151
+ ),
152
+ array_variable.dims,
153
+ )
154
+
155
+ def test_create_variable_3D_int_fill_value(self):
156
+ array_variable = DatasetUtil.create_variable([7, 8, 3], np.int8, fill_value=1)
157
+
158
+ self.assertIsNotNone(array_variable)
159
+ self.assertEqual(Variable, type(array_variable))
160
+ self.assertEqual((7, 8, 3), array_variable.shape)
161
+ self.assertEqual(np.int8, array_variable.dtype)
162
+ self.assertEqual(1, array_variable[2, 4, 2])
163
+
164
+ def test_create_variable_3D_int_attributes(self):
165
+ array_variable = DatasetUtil.create_variable(
166
+ [7, 8, 3], np.int8, attributes={"standard_name": "std"}
167
+ )
168
+
169
+ self.assertIsNotNone(array_variable)
170
+ self.assertEqual(Variable, type(array_variable))
171
+ self.assertEqual((7, 8, 3), array_variable.shape)
172
+ self.assertEqual(np.int8, array_variable.dtype)
173
+ self.assertEqual(-127, array_variable[2, 4, 2])
174
+ self.assertEqual("std", array_variable.attrs["standard_name"])
175
+
176
+ def test_create_unc_variable_1dimundef(self):
177
+ err_corr = [
178
+ {
179
+ "dim": ["x"],
180
+ "form": "rectangle_absolute",
181
+ "params": [1, 2],
182
+ "units": ["m", "m"],
183
+ },
184
+ ]
185
+
186
+ unc_variable = DatasetUtil.create_unc_variable(
187
+ [7],
188
+ np.int8,
189
+ ["x"],
190
+ pdf_shape="gaussian",
191
+ err_corr=err_corr,
192
+ )
193
+
194
+ expected_attrs = {
195
+ "err_corr_1_dim": ["x"],
196
+ "err_corr_1_form": "rectangle_absolute",
197
+ "err_corr_1_units": ["m", "m"],
198
+ "err_corr_1_params": [1, 2],
199
+ }
200
+
201
+ actual_attrs = unc_variable.attrs
202
+
203
+ self.assertTrue(expected_attrs.items() <= actual_attrs.items())
204
+
205
+ def test_create_unc_variable_1undef(self):
206
+ err_corr = [
207
+ {
208
+ "dim": "x",
209
+ "form": "rectangle_absolute",
210
+ "params": [1, 2],
211
+ "units": ["m", "m"],
212
+ },
213
+ {"dim": ["y", "z"], "form": "systematic", "params": [], "units": []},
214
+ ]
215
+
216
+ unc_variable = DatasetUtil.create_unc_variable(
217
+ [7, 8, 3, 5],
218
+ np.int8,
219
+ ["x", "y", "z", "a"],
220
+ pdf_shape="gaussian",
221
+ err_corr=err_corr,
222
+ )
223
+
224
+ expected_attrs = {
225
+ "err_corr_1_dim": "x",
226
+ "err_corr_1_form": "rectangle_absolute",
227
+ "err_corr_1_units": ["m", "m"],
228
+ "err_corr_1_params": [1, 2],
229
+ "err_corr_2_dim": ["y", "z"],
230
+ "err_corr_2_form": "systematic",
231
+ "err_corr_2_units": [],
232
+ "err_corr_2_params": [],
233
+ "err_corr_3_dim": "a",
234
+ "err_corr_3_form": "random",
235
+ "err_corr_3_units": [],
236
+ "err_corr_3_params": [],
237
+ "pdf_shape": "gaussian",
238
+ }
239
+
240
+ self.assertTrue(expected_attrs.items() <= unc_variable.attrs.items())
241
+
242
+ def test_create_unc_variable_incorrect_n_fiduceo_params(self):
243
+ err_corr = [
244
+ {
245
+ "dim": "x",
246
+ "form": "rectangle_absolute",
247
+ "params": [1, 2, 3],
248
+ "units": ["m", "m", "m"],
249
+ }
250
+ ]
251
+
252
+ self.assertRaises(
253
+ ValueError,
254
+ DatasetUtil.create_unc_variable,
255
+ [7],
256
+ np.int8,
257
+ ["x"],
258
+ pdf_shape="gaussian",
259
+ err_corr=err_corr,
260
+ )
261
+
262
+ pass
263
+
264
+ def test_create_flags_variable_1D(self):
265
+
266
+ meanings = [
267
+ "flag1",
268
+ "flag2",
269
+ "flag3",
270
+ "flag4",
271
+ "flag5",
272
+ "flag6",
273
+ "flag7",
274
+ "flag8",
275
+ ]
276
+ meanings_txt = "flag1 flag2 flag3 flag4 flag5 flag6 flag7 flag8"
277
+ masks = "1, 2, 4, 8, 16, 32, 64, 128"
278
+ flags_vector_variable = DatasetUtil.create_flags_variable(
279
+ [5], meanings, dim_names=["dim1"], attributes={"standard_name": "std"}
280
+ )
281
+
282
+ self.assertIsNotNone(flags_vector_variable)
283
+ self.assertEqual(Variable, type(flags_vector_variable))
284
+ self.assertEqual((5,), flags_vector_variable.shape)
285
+ self.assertEqual(np.uint8, flags_vector_variable.dtype)
286
+ self.assertEqual(flags_vector_variable.attrs["flag_masks"], masks)
287
+ self.assertEqual(flags_vector_variable.attrs["flag_meanings"], meanings_txt)
288
+ self.assertEqual(0, flags_vector_variable[2])
289
+ self.assertEqual("std", flags_vector_variable.attrs["standard_name"])
290
+ self.assertEqual(("dim1",), flags_vector_variable.dims)
291
+
292
+ def test_create_flags_variable_3D(self):
293
+
294
+ meanings = [
295
+ "flag1",
296
+ "flag2",
297
+ "flag3",
298
+ "flag4",
299
+ "flag5",
300
+ "flag6",
301
+ "flag7",
302
+ "flag8",
303
+ ]
304
+ meanings_txt = "flag1 flag2 flag3 flag4 flag5 flag6 flag7 flag8"
305
+ masks = "1, 2, 4, 8, 16, 32, 64, 128"
306
+ flags_array_variable = DatasetUtil.create_flags_variable(
307
+ [7, 8, 3],
308
+ meanings,
309
+ dim_names=["dim1", "dim2", "dim3"],
310
+ attributes={"standard_name": "std"},
311
+ )
312
+
313
+ self.assertIsNotNone(flags_array_variable)
314
+ self.assertEqual(Variable, type(flags_array_variable))
315
+ self.assertEqual((7, 8, 3), flags_array_variable.shape)
316
+ self.assertEqual(np.uint8, flags_array_variable.dtype)
317
+ self.assertEqual(flags_array_variable.attrs["flag_masks"], masks)
318
+ self.assertEqual(flags_array_variable.attrs["flag_meanings"], meanings_txt)
319
+ self.assertEqual(0, flags_array_variable[2, 4, 2])
320
+ self.assertEqual("std", flags_array_variable.attrs["standard_name"])
321
+ self.assertEqual(("dim1", "dim2", "dim3"), flags_array_variable.dims)
322
+
323
+ def test_return_flags_dtype_5(self):
324
+ data_type = DatasetUtil.return_flags_dtype(5)
325
+ self.assertEqual(data_type, np.uint8)
326
+
327
+ def test_return_flags_dtype_8(self):
328
+ data_type = DatasetUtil.return_flags_dtype(8)
329
+ self.assertEqual(data_type, np.uint8)
330
+
331
+ def test_return_flags_dtype_15(self):
332
+ data_type = DatasetUtil.return_flags_dtype(15)
333
+ self.assertEqual(data_type, np.uint16)
334
+
335
+ def test_return_flags_dtype_16(self):
336
+ data_type = DatasetUtil.return_flags_dtype(16)
337
+ self.assertEqual(data_type, np.uint16)
338
+
339
+ def test_return_flags_dtype_17(self):
340
+ data_type = DatasetUtil.return_flags_dtype(17)
341
+ self.assertEqual(data_type, np.uint32)
342
+
343
+ def test_return_flags_dtype_32(self):
344
+ data_type = DatasetUtil.return_flags_dtype(32)
345
+ self.assertEqual(data_type, np.uint32)
346
+
347
+ def test_pack_flag_attrs(self):
348
+ test_flag_attrs = DatasetUtil.pack_flag_attrs(["f1", "f2", "f3", "f4"])
349
+ exp_flag_attrs = {"flag_meanings": "f1 f2 f3 f4", "flag_masks": "1, 2, 4, 8"}
350
+
351
+ self.assertDictEqual(test_flag_attrs, exp_flag_attrs)
352
+
353
+ def test_pack_flag_attrs_with_mask(self):
354
+ test_flag_attrs = DatasetUtil.pack_flag_attrs(
355
+ ["f1", "f2", "f3", "f4"], [1, 4, 8, 16]
356
+ )
357
+ exp_flag_attrs = {"flag_meanings": "f1 f2 f3 f4", "flag_masks": "1, 4, 8, 16"}
358
+
359
+ self.assertDictEqual(test_flag_attrs, exp_flag_attrs)
360
+
361
+ def test_unpack_flag_attrs(self):
362
+ flag_attrs = {"flag_meanings": "f1 f2 f3 f4", "flag_masks": "1, 2, 4, 8"}
363
+
364
+ exp_flag_meanings = ["f1", "f2", "f3", "f4"]
365
+ exp_flag_masks = [1, 2, 4, 8]
366
+
367
+ flag_meanings, flag_masks = DatasetUtil.unpack_flag_attrs(flag_attrs)
368
+
369
+ self.assertCountEqual(flag_meanings, exp_flag_meanings)
370
+ self.assertCountEqual(flag_masks, exp_flag_masks)
371
+
372
+ def test_unpack_flag_attrs_emptyflags(self):
373
+ flag_attrs = {"flag_meanings": "", "flag_masks": ""}
374
+
375
+ exp_flag_meanings = []
376
+ exp_flag_masks = []
377
+
378
+ flag_meanings, flag_masks = DatasetUtil.unpack_flag_attrs(flag_attrs)
379
+
380
+ self.assertCountEqual(flag_meanings, exp_flag_meanings)
381
+ self.assertCountEqual(flag_masks, exp_flag_masks)
382
+
383
+ def test_unpack_flag_attrs_noflagattrs(self):
384
+ flag_attrs = {}
385
+
386
+ exp_flag_meanings = []
387
+ exp_flag_masks = []
388
+
389
+ flag_meanings, flag_masks = DatasetUtil.unpack_flag_attrs(flag_attrs)
390
+
391
+ self.assertCountEqual(flag_meanings, exp_flag_meanings)
392
+ self.assertCountEqual(flag_masks, exp_flag_masks)
393
+
394
+ def test_add_flag_meaning_to_attrs(self):
395
+ flag_attrs = {"flag_meanings": "f1 f2 f3 f4", "flag_masks": "1, 2, 4, 8"}
396
+
397
+ exp_flag_attrs = {
398
+ "flag_meanings": "f1 f2 f3 f4 f5",
399
+ "flag_masks": "1, 2, 4, 8, 16",
400
+ }
401
+
402
+ new_attrs = DatasetUtil.add_flag_meaning_to_attrs(flag_attrs, "f5", np.int32)
403
+
404
+ self.assertDictEqual(exp_flag_attrs, new_attrs)
405
+
406
+ def test_add_flag_meaning_to_attrs_first(self):
407
+ flag_attrs = {}
408
+
409
+ exp_flag_attrs = {"flag_meanings": "f1", "flag_masks": "1"}
410
+
411
+ new_attrs = DatasetUtil.add_flag_meaning_to_attrs(flag_attrs, "f1", np.int32)
412
+
413
+ self.assertDictEqual(exp_flag_attrs, new_attrs)
414
+
415
+ def test_add_flag_meaning_to_attrs_full(self):
416
+ flag_attrs = {
417
+ "flag_meanings": "f1 f2 f3 f4 f5 f6 f7 f8",
418
+ "flag_masks": "1, 2, 4, 8, 16, 32, 64, 128",
419
+ }
420
+
421
+ self.assertRaises(
422
+ ValueError, DatasetUtil.add_flag_meaning_to_attrs, flag_attrs, "f9", np.int8
423
+ )
424
+
425
+ def test_rm_flag_meaning_from_attrs(self):
426
+ flag_attrs = {"flag_meanings": "f1 f2 f3 f4", "flag_masks": "1, 2, 4, 8"}
427
+
428
+ exp_flag_attrs = {
429
+ "flag_meanings": "f1 f2 f4",
430
+ "flag_masks": "1, 2, 8",
431
+ }
432
+
433
+ new_attrs = DatasetUtil.rm_flag_meaning_from_attrs(flag_attrs, "f3")
434
+
435
+ self.assertDictEqual(exp_flag_attrs, new_attrs)
436
+
437
+ def test_rm_flag_meaning_from_attrs_unknown_flag(self):
438
+ flag_attrs = {
439
+ "flag_meanings": "f1 f2 f3 f4 f5 f6 f7 f8",
440
+ "flag_masks": "1, 2, 4, 8, 16, 32, 64, 128",
441
+ }
442
+
443
+ self.assertRaises(
444
+ ValueError, DatasetUtil.rm_flag_meaning_from_attrs, flag_attrs, "f9"
445
+ )
446
+
447
+ def test_add_encoding(self):
448
+ vector_variable = DatasetUtil.create_variable([5], np.int8)
449
+ DatasetUtil.add_encoding(
450
+ vector_variable,
451
+ np.int32,
452
+ scale_factor=10,
453
+ offset=23,
454
+ fill_value=11,
455
+ chunksizes=12,
456
+ )
457
+
458
+ self.assertIsNotNone(vector_variable)
459
+ self.assertEqual(Variable, type(vector_variable))
460
+ self.assertEqual((5,), vector_variable.shape)
461
+ self.assertEqual(np.int8, vector_variable.dtype)
462
+ self.assertEqual(-127, vector_variable[2])
463
+
464
+ self.assertEqual(np.int32, vector_variable.encoding["dtype"])
465
+ self.assertEqual(10, vector_variable.encoding["scale_factor"])
466
+ self.assertEqual(23, vector_variable.encoding["add_offset"])
467
+ self.assertEqual(11, vector_variable.encoding["_FillValue"])
468
+ self.assertEqual(12, vector_variable.encoding["chunksizes"])
469
+
470
+ def test_get_default_fill_value(self):
471
+
472
+ self.assertEqual(-127, DatasetUtil.get_default_fill_value(np.int8))
473
+ self.assertEqual(-32767, DatasetUtil.get_default_fill_value(np.int16))
474
+ self.assertEqual(np.uint16(-1), DatasetUtil.get_default_fill_value(np.uint16))
475
+ self.assertEqual(-2147483647, DatasetUtil.get_default_fill_value(np.int32))
476
+ self.assertEqual(
477
+ -9223372036854775806, DatasetUtil.get_default_fill_value(np.int64)
478
+ )
479
+ self.assertEqual(
480
+ np.float32(9.96921e36), DatasetUtil.get_default_fill_value(np.float32)
481
+ )
482
+ self.assertEqual(
483
+ 9.969209968386869e36, DatasetUtil.get_default_fill_value(np.float64)
484
+ )
485
+
486
+
487
+ if __name__ == "__main__":
488
+ unittest.main()
@@ -0,0 +1,31 @@
1
+ """
2
+ Tests for DSWriter class
3
+ """
4
+
5
+ import unittest
6
+ from unittest.mock import MagicMock
7
+ from obsarray.templater.dswriter import DSWriter
8
+
9
+
10
+ __author__ = "Sam Hunt <sam.hunt@npl.co.uk>"
11
+
12
+
13
+ # todo - write test for csv writer
14
+ # todo - write test for end to end writer use
15
+
16
+
17
+ class TestDSWriter(unittest.TestCase):
18
+ def test__write_netcdf(self):
19
+
20
+ ds = MagicMock()
21
+ path = "test.nc"
22
+
23
+ DSWriter._write_netcdf(ds, path)
24
+
25
+ ds.to_netcdf.assert_called_once_with(
26
+ path, encoding={}, engine="netcdf4", format="netCDF4"
27
+ )
28
+
29
+
30
+ if __name__ == "__main__":
31
+ unittest.main()