2020
2121
2222class GetVariablesConfigTest (unittest .TestCase ):
23- def test_it (self ):
23+ def test_no_variables_given (self ):
2424 dataset = make_test_dataset ()
2525 variables = get_variables_config (dataset , dict (x = 512 , y = 256 , time = 1 ))
2626 self .assertEqual (
@@ -34,13 +34,35 @@ def test_it(self):
3434 variables ,
3535 )
3636
37+ def test_variables_given (self ):
38+ dataset = make_test_dataset ()
39+ variables = get_variables_config (
40+ dataset ,
41+ dict (x = 512 , y = 256 , time = 1 ),
42+ variables = {
43+ "time" : {"encoding" : {"chunks" : [3 ]}},
44+ "chl" : {"encoding" : {"chunks" : [3 , 100 , 100 ]}},
45+ "tsm" : {"encoding" : {"dtype" : "uint16" }},
46+ },
47+ )
48+ self .assertEqual (
49+ {
50+ "x" : {"encoding" : {"chunks" : None }},
51+ "y" : {"encoding" : {"chunks" : None }},
52+ "time" : {"encoding" : {"chunks" : [3 ]}},
53+ "chl" : {"encoding" : {"chunks" : [3 , 100 , 100 ]}},
54+ "tsm" : {"encoding" : {"chunks" : [1 , 256 , 512 ], "dtype" : "uint16" }},
55+ },
56+ variables ,
57+ )
58+
3759
3860@unittest .skipIf (xcube is None , reason = "xcube is not installed" )
3961class WriteLevelsTest (unittest .TestCase ):
4062 def setUp (self ):
4163 clear_memory_fs ()
4264
43- def test_it (self ):
65+ def test_default_x_y_with_crs (self ):
4466 source_path = "memory://source.zarr"
4567 make_test_dataset (
4668 uri = source_path ,
@@ -70,14 +92,140 @@ def test_it(self):
7092 levels_info ,
7193 )
7294
73- ds0 = xr .open_zarr (target_dir .uri + f"/0.zarr" )
74- self .assertEqual ({"time" : 3 , "y" : 1024 , "x" : 2048 }, ds0 .sizes )
95+ self .assert_level (target_dir .uri + "/0.zarr" , 0 , has_crs = True )
96+ self .assert_level (target_dir .uri + "/1.zarr" , 1 , has_crs = True )
97+ self .assert_level (target_dir .uri + "/2.zarr" , 2 , has_crs = True )
98+ self .assert_level (target_dir .uri + "/3.zarr" , 3 , has_crs = True )
99+
100+ def test_default_lon_lat_no_crs (self ):
101+ source_path = "memory://source.zarr"
102+ make_test_dataset (
103+ uri = source_path ,
104+ dims = ("time" , "lat" , "lon" ),
105+ shape = (3 , 1024 , 2048 ),
106+ chunks = (1 , 128 , 256 ),
107+ )
108+
109+ target_dir = FileObj ("memory://target.levels" )
110+ self .assertFalse (target_dir .exists ())
111+
112+ write_levels (source_path = source_path , target_path = target_dir .uri )
113+
114+ self .assertTrue (target_dir .exists ())
75115
76- ds1 = xr .open_zarr (target_dir .uri + f"/1.zarr" )
77- self .assertEqual ({"time" : 3 , "y" : 512 , "x" : 1024 }, ds1 .sizes )
116+ levels_file = target_dir .for_path (".zlevels" )
117+ self .assertTrue (levels_file .exists ())
118+ levels_info = json .loads (levels_file .read ())
119+ self .assertEqual (
120+ {
121+ "version" : "1.0" ,
122+ "num_levels" : 4 ,
123+ "agg_methods" : {"chl" : "mean" , "tsm" : "mean" },
124+ "use_saved_levels" : False ,
125+ },
126+ levels_info ,
127+ )
78128
79- ds2 = xr .open_zarr (target_dir .uri + f"/2.zarr" )
80- self .assertEqual ({"time" : 3 , "y" : 256 , "x" : 512 }, ds2 .sizes )
129+ xy_dims = "lon" , "lat"
130+ self .assert_level (target_dir .uri + "/0.zarr" , 0 , xy_dims = xy_dims )
131+ self .assert_level (target_dir .uri + "/1.zarr" , 1 , xy_dims = xy_dims )
132+ self .assert_level (target_dir .uri + "/2.zarr" , 2 , xy_dims = xy_dims )
133+ self .assert_level (target_dir .uri + "/3.zarr" , 3 , xy_dims = xy_dims )
81134
82- ds3 = xr .open_zarr (target_dir .uri + f"/3.zarr" )
83- self .assertEqual ({"time" : 3 , "y" : 128 , "x" : 256 }, ds3 .sizes )
135+ def test_link_level_zero (self ):
136+ source_dir = FileObj ("memory://source.zarr" )
137+ make_test_dataset (
138+ uri = source_dir .uri ,
139+ dims = ("time" , "y" , "x" ),
140+ shape = (3 , 1024 , 2048 ),
141+ chunks = (1 , 128 , 256 ),
142+ crs = "EPSG:4326" ,
143+ )
144+
145+ target_dir = FileObj ("memory://target.levels" )
146+ self .assertFalse (target_dir .exists ())
147+
148+ write_levels (
149+ source_path = source_dir .uri ,
150+ target_path = target_dir .uri ,
151+ link_level_zero = True ,
152+ )
153+
154+ self .assertTrue (target_dir .exists ())
155+
156+ levels_file = target_dir .for_path (".zlevels" )
157+ self .assertTrue (levels_file .exists ())
158+ levels_info = json .loads (levels_file .read ())
159+ self .assertEqual (
160+ {
161+ "version" : "1.0" ,
162+ "num_levels" : 4 ,
163+ "agg_methods" : {"chl" : "mean" , "tsm" : "mean" },
164+ "use_saved_levels" : False ,
165+ },
166+ levels_info ,
167+ )
168+
169+ level_zero_file = target_dir .for_path ("0.link" )
170+ self .assertTrue (level_zero_file .exists ())
171+ self .assertEqual (b"../source.zarr" , level_zero_file .read ())
172+ self .assert_level (target_dir .uri + "/1.zarr" , 1 , has_crs = True )
173+ self .assert_level (target_dir .uri + "/2.zarr" , 2 , has_crs = True )
174+ self .assert_level (target_dir .uri + "/3.zarr" , 3 , has_crs = True )
175+
176+ def test_link_level_zero_use_saved_levels (self ):
177+ source_dir = FileObj ("memory://source.zarr" )
178+ make_test_dataset (
179+ uri = source_dir .uri ,
180+ dims = ("time" , "lat" , "lon" ),
181+ shape = (3 , 1024 , 2048 ),
182+ chunks = (1 , 128 , 256 ),
183+ )
184+
185+ target_dir = FileObj ("memory://target.levels" )
186+ self .assertFalse (target_dir .exists ())
187+
188+ write_levels (
189+ source_path = source_dir .uri ,
190+ target_path = target_dir .uri ,
191+ link_level_zero = True ,
192+ use_saved_levels = True ,
193+ )
194+
195+ self .assertTrue (target_dir .exists ())
196+
197+ levels_file = target_dir .for_path (".zlevels" )
198+ self .assertTrue (levels_file .exists ())
199+ levels_info = json .loads (levels_file .read ())
200+ self .assertEqual (
201+ {
202+ "version" : "1.0" ,
203+ "num_levels" : 4 ,
204+ "agg_methods" : {"chl" : "mean" , "tsm" : "mean" },
205+ "use_saved_levels" : True ,
206+ },
207+ levels_info ,
208+ )
209+
210+ xy_dims = "lon" , "lat"
211+ level_zero_file = target_dir .for_path ("0.link" )
212+ self .assertTrue (level_zero_file .exists ())
213+ self .assertEqual (b"../source.zarr" , level_zero_file .read ())
214+ self .assert_level (target_dir .uri + "/1.zarr" , 1 , xy_dims = xy_dims )
215+ self .assert_level (target_dir .uri + "/2.zarr" , 2 , xy_dims = xy_dims )
216+ self .assert_level (target_dir .uri + "/3.zarr" , 3 , xy_dims = xy_dims )
217+
218+ def assert_level (self , uri : str , level : int , xy_dims = ("x" , "y" ), has_crs = False ):
219+ x_dim , y_dim = xy_dims
220+ dataset = xr .open_zarr (uri )
221+ z = 2 ** level
222+ f = 2 ** (3 - level )
223+ self .assertEqual ({"time" : 3 , y_dim : 1024 // z , x_dim : 2048 // z }, dataset .sizes )
224+ self .assertEqual (
225+ {"time" : 3 * (1 ,), y_dim : f * (128 ,), x_dim : f * (256 ,)}, dataset .chunksizes
226+ )
227+ self .assertEqual ({x_dim , y_dim , "time" }, set (dataset .coords ))
228+ if has_crs :
229+ self .assertEqual ({"chl" , "tsm" , "crs" }, set (dataset .data_vars ))
230+ else :
231+ self .assertEqual ({"chl" , "tsm" }, set (dataset .data_vars ))
0 commit comments