|
3 | 3 | """ |
4 | 4 |
|
5 | 5 | from contextlib import contextmanager |
6 | | -from pathlib import Path |
7 | 6 |
|
8 | | -import numpy as np |
9 | | -import numpy.testing as npt |
10 | 7 | import pytest |
11 | | -import xarray as xr |
12 | 8 | from packaging.version import Version |
13 | | -from pygmt import Figure, clib |
| 9 | +from pygmt import clib |
14 | 10 | from pygmt.clib import required_gmt_version |
15 | | -from pygmt.clib.conversion import dataarray_to_matrix |
16 | 11 | from pygmt.clib.session import FAMILIES, VIAS |
17 | 12 | from pygmt.exceptions import ( |
18 | 13 | GMTCLibError, |
19 | 14 | GMTCLibNoSessionError, |
20 | 15 | GMTInvalidInput, |
21 | 16 | GMTVersionError, |
22 | 17 | ) |
23 | | -from pygmt.helpers import GMTTempFile |
24 | | - |
25 | | -POINTS_DATA = Path(__file__).parent / "data" / "points.txt" |
26 | 18 |
|
27 | 19 |
|
28 | 20 | @contextmanager |
@@ -129,82 +121,6 @@ def test_destroy_session_fails(): |
129 | 121 | ses.destroy() |
130 | 122 |
|
131 | 123 |
|
132 | | -@pytest.mark.benchmark |
133 | | -def test_call_module(): |
134 | | - """ |
135 | | - Call a GMT module by passing a list of arguments. |
136 | | - """ |
137 | | - with clib.Session() as lib: |
138 | | - with GMTTempFile() as out_fname: |
139 | | - lib.call_module("info", [str(POINTS_DATA), "-C", f"->{out_fname.name}"]) |
140 | | - assert Path(out_fname.name).stat().st_size > 0 |
141 | | - output = out_fname.read().strip() |
142 | | - assert output == "11.5309 61.7074 -2.9289 7.8648 0.1412 0.9338" |
143 | | - |
144 | | - |
145 | | -def test_call_module_argument_string(): |
146 | | - """ |
147 | | - Call a GMT module by passing a single argument string. |
148 | | - """ |
149 | | - with clib.Session() as lib: |
150 | | - with GMTTempFile() as out_fname: |
151 | | - lib.call_module("info", f"{POINTS_DATA} -C ->{out_fname.name}") |
152 | | - assert Path(out_fname.name).stat().st_size > 0 |
153 | | - output = out_fname.read().strip() |
154 | | - assert output == "11.5309 61.7074 -2.9289 7.8648 0.1412 0.9338" |
155 | | - |
156 | | - |
157 | | -def test_call_module_empty_argument(): |
158 | | - """ |
159 | | - call_module should work if an empty string or an empty list is passed as argument. |
160 | | - """ |
161 | | - Figure() |
162 | | - with clib.Session() as lib: |
163 | | - lib.call_module("logo", "") |
164 | | - with clib.Session() as lib: |
165 | | - lib.call_module("logo", []) |
166 | | - |
167 | | - |
168 | | -def test_call_module_invalid_argument_type(): |
169 | | - """ |
170 | | - call_module only accepts a string or a list of strings as module arguments. |
171 | | - """ |
172 | | - with clib.Session() as lib: |
173 | | - with pytest.raises(GMTInvalidInput): |
174 | | - lib.call_module("get", ("FONT_TITLE", "FONT_TAG")) |
175 | | - |
176 | | - |
177 | | -def test_call_module_invalid_arguments(): |
178 | | - """ |
179 | | - call_module should fail for invalid module arguments. |
180 | | - """ |
181 | | - with clib.Session() as lib: |
182 | | - with pytest.raises(GMTCLibError): |
183 | | - lib.call_module("info", ["bogus-data.bla"]) |
184 | | - |
185 | | - |
186 | | -def test_call_module_invalid_name(): |
187 | | - """ |
188 | | - call_module should fail when an invalid module name is given. |
189 | | - """ |
190 | | - with clib.Session() as lib: |
191 | | - with pytest.raises(GMTCLibError): |
192 | | - lib.call_module("meh", []) |
193 | | - |
194 | | - |
195 | | -def test_call_module_error_message(): |
196 | | - """ |
197 | | - Check if the GMT error message was captured when calling a module. |
198 | | - """ |
199 | | - with clib.Session() as lib: |
200 | | - with pytest.raises(GMTCLibError) as exc_info: |
201 | | - lib.call_module("info", ["bogus-data.bla"]) |
202 | | - assert "Module 'info' failed with status code" in exc_info.value.args[0] |
203 | | - assert ( |
204 | | - "gmtinfo [ERROR]: Cannot find file bogus-data.bla" in exc_info.value.args[0] |
205 | | - ) |
206 | | - |
207 | | - |
208 | 124 | def test_method_no_session(): |
209 | 125 | """ |
210 | 126 | Fails when not in a session. |
@@ -268,263 +184,6 @@ def test_parse_constant_fails(): |
268 | 184 | ) |
269 | 185 |
|
270 | 186 |
|
271 | | -def test_create_data_dataset(): |
272 | | - """ |
273 | | - Run the function to make sure it doesn't fail badly. |
274 | | - """ |
275 | | - with clib.Session() as lib: |
276 | | - # Dataset from vectors |
277 | | - data_vector = lib.create_data( |
278 | | - family="GMT_IS_DATASET|GMT_VIA_VECTOR", |
279 | | - geometry="GMT_IS_POINT", |
280 | | - mode="GMT_CONTAINER_ONLY", |
281 | | - dim=[10, 20, 1, 0], # columns, rows, layers, dtype |
282 | | - ) |
283 | | - # Dataset from matrices |
284 | | - data_matrix = lib.create_data( |
285 | | - family="GMT_IS_DATASET|GMT_VIA_MATRIX", |
286 | | - geometry="GMT_IS_POINT", |
287 | | - mode="GMT_CONTAINER_ONLY", |
288 | | - dim=[10, 20, 1, 0], |
289 | | - ) |
290 | | - assert data_vector != data_matrix |
291 | | - |
292 | | - |
293 | | -def test_create_data_grid_dim(): |
294 | | - """ |
295 | | - Create a grid ignoring range and inc. |
296 | | - """ |
297 | | - with clib.Session() as lib: |
298 | | - # Grids from matrices using dim |
299 | | - lib.create_data( |
300 | | - family="GMT_IS_GRID|GMT_VIA_MATRIX", |
301 | | - geometry="GMT_IS_SURFACE", |
302 | | - mode="GMT_CONTAINER_ONLY", |
303 | | - dim=[10, 20, 1, 0], |
304 | | - ) |
305 | | - |
306 | | - |
307 | | -def test_create_data_grid_range(): |
308 | | - """ |
309 | | - Create a grid specifying range and inc instead of dim. |
310 | | - """ |
311 | | - with clib.Session() as lib: |
312 | | - # Grids from matrices using range and int |
313 | | - lib.create_data( |
314 | | - family="GMT_IS_GRID|GMT_VIA_MATRIX", |
315 | | - geometry="GMT_IS_SURFACE", |
316 | | - mode="GMT_CONTAINER_ONLY", |
317 | | - ranges=[150.0, 250.0, -20.0, 20.0], |
318 | | - inc=[0.1, 0.2], |
319 | | - ) |
320 | | - |
321 | | - |
322 | | -def test_create_data_fails(): |
323 | | - """ |
324 | | - Check that create_data raises exceptions for invalid input and output. |
325 | | - """ |
326 | | - # Passing in invalid mode |
327 | | - with pytest.raises(GMTInvalidInput): |
328 | | - with clib.Session() as lib: |
329 | | - lib.create_data( |
330 | | - family="GMT_IS_DATASET", |
331 | | - geometry="GMT_IS_SURFACE", |
332 | | - mode="Not_a_valid_mode", |
333 | | - dim=[0, 0, 1, 0], |
334 | | - ranges=[150.0, 250.0, -20.0, 20.0], |
335 | | - inc=[0.1, 0.2], |
336 | | - ) |
337 | | - # Passing in invalid geometry |
338 | | - with pytest.raises(GMTInvalidInput): |
339 | | - with clib.Session() as lib: |
340 | | - lib.create_data( |
341 | | - family="GMT_IS_GRID", |
342 | | - geometry="Not_a_valid_geometry", |
343 | | - mode="GMT_CONTAINER_ONLY", |
344 | | - dim=[0, 0, 1, 0], |
345 | | - ranges=[150.0, 250.0, -20.0, 20.0], |
346 | | - inc=[0.1, 0.2], |
347 | | - ) |
348 | | - |
349 | | - # If the data pointer returned is None (NULL pointer) |
350 | | - with clib.Session() as lib: |
351 | | - with mock(lib, "GMT_Create_Data", returns=None): |
352 | | - with pytest.raises(GMTCLibError): |
353 | | - lib.create_data( |
354 | | - family="GMT_IS_DATASET", |
355 | | - geometry="GMT_IS_SURFACE", |
356 | | - mode="GMT_CONTAINER_ONLY", |
357 | | - dim=[11, 10, 2, 0], |
358 | | - ) |
359 | | - |
360 | | - |
361 | | -def test_extract_region_fails(): |
362 | | - """ |
363 | | - Check that extract region fails if nothing has been plotted. |
364 | | - """ |
365 | | - Figure() |
366 | | - with pytest.raises(GMTCLibError): |
367 | | - with clib.Session() as lib: |
368 | | - lib.extract_region() |
369 | | - |
370 | | - |
371 | | -def test_extract_region_two_figures(): |
372 | | - """ |
373 | | - Extract region should handle multiple figures existing at the same time. |
374 | | - """ |
375 | | - # Make two figures before calling extract_region to make sure that it's |
376 | | - # getting from the current figure, not the last figure. |
377 | | - fig1 = Figure() |
378 | | - region1 = np.array([0, 10, -20, -10]) |
379 | | - fig1.coast(region=region1, projection="M6i", frame=True, land="black") |
380 | | - |
381 | | - fig2 = Figure() |
382 | | - fig2.basemap(region="US.HI+r5", projection="M6i", frame=True) |
383 | | - |
384 | | - # Activate the first figure and extract the region from it |
385 | | - # Use in a different session to avoid any memory problems. |
386 | | - with clib.Session() as lib: |
387 | | - lib.call_module("figure", [fig1._name, "-"]) |
388 | | - with clib.Session() as lib: |
389 | | - wesn1 = lib.extract_region() |
390 | | - npt.assert_allclose(wesn1, region1) |
391 | | - |
392 | | - # Now try it with the second one |
393 | | - with clib.Session() as lib: |
394 | | - lib.call_module("figure", [fig2._name, "-"]) |
395 | | - with clib.Session() as lib: |
396 | | - wesn2 = lib.extract_region() |
397 | | - npt.assert_allclose(wesn2, np.array([-165.0, -150.0, 15.0, 25.0])) |
398 | | - |
399 | | - |
400 | | -def test_write_data_fails(): |
401 | | - """ |
402 | | - Check that write data raises an exception for non-zero return codes. |
403 | | - """ |
404 | | - # It's hard to make the C API function fail without causing a Segmentation |
405 | | - # Fault. Can't test this if by giving a bad file name because if |
406 | | - # output=='', GMT will just write to stdout and spaces are valid file |
407 | | - # names. Use a mock instead just to exercise this part of the code. |
408 | | - with clib.Session() as lib: |
409 | | - with mock(lib, "GMT_Write_Data", returns=1): |
410 | | - with pytest.raises(GMTCLibError): |
411 | | - lib.write_data( |
412 | | - "GMT_IS_VECTOR", |
413 | | - "GMT_IS_POINT", |
414 | | - "GMT_WRITE_SET", |
415 | | - [1] * 6, |
416 | | - "some-file-name", |
417 | | - None, |
418 | | - ) |
419 | | - |
420 | | - |
421 | | -@pytest.mark.benchmark |
422 | | -def test_dataarray_to_matrix_works(): |
423 | | - """ |
424 | | - Check that dataarray_to_matrix returns correct output. |
425 | | - """ |
426 | | - data = np.diag(v=np.arange(3)) |
427 | | - x = np.linspace(start=0, stop=4, num=3) |
428 | | - y = np.linspace(start=5, stop=9, num=3) |
429 | | - grid = xr.DataArray(data, coords=[("y", y), ("x", x)]) |
430 | | - |
431 | | - matrix, region, inc = dataarray_to_matrix(grid) |
432 | | - npt.assert_allclose(actual=matrix, desired=np.flipud(data)) |
433 | | - npt.assert_allclose(actual=region, desired=[x.min(), x.max(), y.min(), y.max()]) |
434 | | - npt.assert_allclose(actual=inc, desired=[x[1] - x[0], y[1] - y[0]]) |
435 | | - |
436 | | - |
437 | | -def test_dataarray_to_matrix_negative_x_increment(): |
438 | | - """ |
439 | | - Check if dataarray_to_matrix returns correct output with flipped x. |
440 | | - """ |
441 | | - data = np.diag(v=np.arange(3)) |
442 | | - x = np.linspace(start=4, stop=0, num=3) |
443 | | - y = np.linspace(start=5, stop=9, num=3) |
444 | | - grid = xr.DataArray(data, coords=[("y", y), ("x", x)]) |
445 | | - |
446 | | - matrix, region, inc = dataarray_to_matrix(grid) |
447 | | - npt.assert_allclose(actual=matrix, desired=np.flip(data, axis=(0, 1))) |
448 | | - npt.assert_allclose(actual=region, desired=[x.min(), x.max(), y.min(), y.max()]) |
449 | | - npt.assert_allclose(actual=inc, desired=[abs(x[1] - x[0]), abs(y[1] - y[0])]) |
450 | | - |
451 | | - |
452 | | -def test_dataarray_to_matrix_negative_y_increment(): |
453 | | - """ |
454 | | - Check that dataarray_to_matrix returns correct output with flipped y. |
455 | | - """ |
456 | | - data = np.diag(v=np.arange(3)) |
457 | | - x = np.linspace(start=0, stop=4, num=3) |
458 | | - y = np.linspace(start=9, stop=5, num=3) |
459 | | - grid = xr.DataArray(data, coords=[("y", y), ("x", x)]) |
460 | | - |
461 | | - matrix, region, inc = dataarray_to_matrix(grid) |
462 | | - npt.assert_allclose(actual=matrix, desired=data) |
463 | | - npt.assert_allclose(actual=region, desired=[x.min(), x.max(), y.min(), y.max()]) |
464 | | - npt.assert_allclose(actual=inc, desired=[abs(x[1] - x[0]), abs(y[1] - y[0])]) |
465 | | - |
466 | | - |
467 | | -def test_dataarray_to_matrix_negative_x_and_y_increment(): |
468 | | - """ |
469 | | - Check that dataarray_to_matrix returns correct output with flipped x/y. |
470 | | - """ |
471 | | - data = np.diag(v=np.arange(3)) |
472 | | - x = np.linspace(start=4, stop=0, num=3) |
473 | | - y = np.linspace(start=9, stop=5, num=3) |
474 | | - grid = xr.DataArray(data, coords=[("y", y), ("x", x)]) |
475 | | - |
476 | | - matrix, region, inc = dataarray_to_matrix(grid) |
477 | | - npt.assert_allclose(actual=matrix, desired=np.fliplr(data)) |
478 | | - npt.assert_allclose(actual=region, desired=[x.min(), x.max(), y.min(), y.max()]) |
479 | | - npt.assert_allclose(actual=inc, desired=[abs(x[1] - x[0]), abs(y[1] - y[0])]) |
480 | | - |
481 | | - |
482 | | -def test_dataarray_to_matrix_dims_fails(): |
483 | | - """ |
484 | | - Check that it fails for > 2 dims. |
485 | | - """ |
486 | | - # Make a 3-D regular grid |
487 | | - data = np.ones((10, 12, 11), dtype="float32") |
488 | | - x = np.arange(11) |
489 | | - y = np.arange(12) |
490 | | - z = np.arange(10) |
491 | | - grid = xr.DataArray(data, coords=[("z", z), ("y", y), ("x", x)]) |
492 | | - with pytest.raises(GMTInvalidInput): |
493 | | - dataarray_to_matrix(grid) |
494 | | - |
495 | | - |
496 | | -def test_dataarray_to_matrix_irregular_inc_warning(): |
497 | | - """ |
498 | | - Check that it warns for variable increments, see also |
499 | | - https://github.com/GenericMappingTools/pygmt/issues/1468. |
500 | | - """ |
501 | | - data = np.ones((4, 5), dtype="float64") |
502 | | - x = np.linspace(0, 1, 5) |
503 | | - y = np.logspace(2, 3, 4) |
504 | | - grid = xr.DataArray(data, coords=[("y", y), ("x", x)]) |
505 | | - with pytest.warns(expected_warning=RuntimeWarning) as record: |
506 | | - dataarray_to_matrix(grid) |
507 | | - assert len(record) == 1 |
508 | | - |
509 | | - |
510 | | -def test_dataarray_to_matrix_zero_inc_fails(): |
511 | | - """ |
512 | | - Check that dataarray_to_matrix fails for zero increments grid. |
513 | | - """ |
514 | | - data = np.ones((5, 5), dtype="float32") |
515 | | - x = np.linspace(0, 1, 5) |
516 | | - y = np.zeros_like(x) |
517 | | - grid = xr.DataArray(data, coords=[("y", y), ("x", x)]) |
518 | | - with pytest.raises(GMTInvalidInput): |
519 | | - dataarray_to_matrix(grid) |
520 | | - |
521 | | - y = np.linspace(0, 1, 5) |
522 | | - x = np.zeros_like(x) |
523 | | - grid = xr.DataArray(data, coords=[("y", y), ("x", x)]) |
524 | | - with pytest.raises(GMTInvalidInput): |
525 | | - dataarray_to_matrix(grid) |
526 | | - |
527 | | - |
528 | 187 | def test_get_default(): |
529 | 188 | """ |
530 | 189 | Make sure get_default works without crashing and gives reasonable results. |
|
0 commit comments