Skip to content

Commit 89857c3

Browse files
authored
Remove expected failures on grdview tests (#589)
Removes the expected failures (xfail) pytest marks used as a workaround in #503 to deal with grdview failures. * Refactor test to use new check_figures_equal syntax from #590 * Refactor grdview test to use grdcut instead of load_earth_relief The xarray based slicing isn't as precise as grdcut, so some images were a few pixels off when plotted in 3D. * Rename grid explicitly to xrgrid, and use kwargs to reduce code length * Set a Transverse Mercator projection for zaxis_frame test Otherwise GMT (fig_ref) might plot double-lined x and y axis frame, while PyGMT (fig_test) plots a single-lined frame.
1 parent f59fd80 commit 89857c3

File tree

1 file changed

+136
-140
lines changed

1 file changed

+136
-140
lines changed

pygmt/tests/test_grdview.py

+136-140
Original file line numberDiff line numberDiff line change
@@ -3,262 +3,258 @@
33
"""
44
import pytest
55

6-
from .. import Figure, which
7-
from ..datasets import load_earth_relief
6+
from .. import Figure, grdcut, which
87
from ..exceptions import GMTInvalidInput
9-
from ..helpers import data_kind
8+
from ..helpers import GMTTempFile, data_kind
9+
from ..helpers.testing import check_figures_equal
1010

1111

12-
@pytest.fixture(scope="module", name="grid")
13-
def fixture_grid():
14-
"Load the grid data from the sample earth_relief file"
15-
return load_earth_relief(registration="gridline").sel(
16-
lat=slice(-49, -42), lon=slice(-118, -107)
17-
)
12+
@pytest.fixture(scope="module", name="region")
13+
def fixture_region():
14+
"Test region as lonmin, lonmax, latmin, latmax"
15+
return (-116, -109, -47, -44)
1816

1917

20-
@pytest.mark.xfail(
21-
reason="Baseline image generated using Cartesian instead of Geographic coordinates"
22-
)
23-
@pytest.mark.mpl_image_compare
24-
def test_grdview_grid_dataarray(grid):
18+
@pytest.fixture(scope="module", name="gridfile")
19+
def fixture_gridfile(region):
20+
"""
21+
Load the NetCDF grid file from the sample earth_relief file
22+
"""
23+
with GMTTempFile(suffix=".nc") as tmpfile:
24+
grdcut(grid="@earth_relief_01d_g", region=region, outgrid=tmpfile.name)
25+
yield tmpfile.name
26+
27+
28+
@pytest.fixture(scope="module", name="xrgrid")
29+
def fixture_xrgrid(region):
30+
"""
31+
Load the xarray.DataArray grid from the sample earth_relief file
32+
"""
33+
return grdcut(grid="@earth_relief_01d_g", region=region)
34+
35+
36+
@check_figures_equal()
37+
def test_grdview_grid_dataarray(gridfile, xrgrid):
2538
"""
2639
Run grdview by passing in a grid as an xarray.DataArray.
2740
"""
28-
fig = Figure()
29-
fig.grdview(grid=grid)
30-
return fig
41+
fig_ref, fig_test = Figure(), Figure()
42+
fig_ref.grdview(grid=gridfile)
43+
fig_test.grdview(grid=xrgrid)
44+
return fig_ref, fig_test
3145

3246

33-
@pytest.mark.xfail(
34-
reason="Baseline image not updated to use earth relief grid in GMT 6.1.0",
35-
)
3647
@pytest.mark.mpl_image_compare
37-
def test_grdview_grid_file_with_region_subset():
48+
def test_grdview_grid_file_with_region_subset(region):
3849
"""
3950
Run grdview by passing in a grid filename, and cropping it to a region.
4051
"""
4152
gridfile = which("@earth_relief_01d_g", download="a")
4253

4354
fig = Figure()
44-
fig.grdview(grid=gridfile, region=[-116, -109, -47, -44])
55+
fig.grdview(grid=gridfile, region=region)
4556
return fig
4657

4758

48-
def test_grdview_wrong_kind_of_grid(grid):
59+
def test_grdview_wrong_kind_of_grid(xrgrid):
4960
"""
5061
Run grdview using grid input that is not an xarray.DataArray or file.
5162
"""
52-
dataset = grid.to_dataset() # convert xarray.DataArray to xarray.Dataset
63+
dataset = xrgrid.to_dataset() # convert xarray.DataArray to xarray.Dataset
5364
assert data_kind(dataset) == "matrix"
5465

5566
fig = Figure()
5667
with pytest.raises(GMTInvalidInput):
5768
fig.grdview(grid=dataset)
5869

5970

60-
@pytest.mark.xfail(
61-
reason="Baseline image generated using Cartesian instead of Geographic coordinates"
62-
)
63-
@pytest.mark.mpl_image_compare
64-
def test_grdview_with_perspective(grid):
71+
@check_figures_equal()
72+
def test_grdview_with_perspective(gridfile, xrgrid):
6573
"""
6674
Run grdview by passing in a grid and setting a perspective viewpoint with
6775
an azimuth from the SouthEast and an elevation angle 15 degrees from the
6876
z-plane.
6977
"""
70-
fig = Figure()
71-
fig.grdview(grid=grid, perspective=[135, 15])
72-
return fig
78+
fig_ref, fig_test = Figure(), Figure()
79+
fig_ref.grdview(grid=gridfile, perspective=[135, 15])
80+
fig_test.grdview(grid=xrgrid, perspective=[135, 15])
81+
return fig_ref, fig_test
7382

7483

75-
@pytest.mark.xfail(
76-
reason="Baseline image not updated to use earth relief grid in GMT 6.1.0",
77-
)
78-
@pytest.mark.mpl_image_compare
79-
def test_grdview_with_perspective_and_zscale(grid):
84+
@check_figures_equal()
85+
def test_grdview_with_perspective_and_zscale(gridfile, xrgrid):
8086
"""
8187
Run grdview by passing in a grid and setting a perspective viewpoint with
8288
an azimuth from the SouthWest and an elevation angle 30 degrees from the
8389
z-plane, plus a z-axis scaling factor of 0.005.
8490
"""
85-
fig = Figure()
86-
fig.grdview(grid=grid, perspective=[225, 30], zscale=0.005)
87-
return fig
91+
fig_ref, fig_test = Figure(), Figure()
92+
kwargs = dict(perspective=[225, 30], zscale=0.005)
93+
fig_ref.grdview(grid=gridfile, **kwargs)
94+
fig_test.grdview(grid=xrgrid, **kwargs)
95+
return fig_ref, fig_test
8896

8997

90-
@pytest.mark.xfail(
91-
reason="Baseline image not updated to use earth relief grid in GMT 6.1.0",
92-
)
93-
@pytest.mark.mpl_image_compare
94-
def test_grdview_with_perspective_and_zsize(grid):
98+
@check_figures_equal()
99+
def test_grdview_with_perspective_and_zsize(gridfile, xrgrid):
95100
"""
96101
Run grdview by passing in a grid and setting a perspective viewpoint with
97102
an azimuth from the SouthWest and an elevation angle 30 degrees from the
98103
z-plane, plus a z-axis size of 10cm.
99104
"""
100-
fig = Figure()
101-
fig.grdview(grid=grid, perspective=[225, 30], zsize="10c")
102-
return fig
105+
fig_ref, fig_test = Figure(), Figure()
106+
kwargs = dict(perspective=[225, 30], zsize="10c")
107+
fig_ref.grdview(grid=gridfile, **kwargs)
108+
fig_test.grdview(grid=xrgrid, **kwargs)
109+
return fig_ref, fig_test
103110

104111

105-
@pytest.mark.xfail(
106-
reason="Baseline image not updated to use earth relief grid in GMT 6.1.0",
107-
)
108-
@pytest.mark.mpl_image_compare
109-
def test_grdview_with_cmap_for_image_plot(grid):
112+
@check_figures_equal()
113+
def test_grdview_with_cmap_for_image_plot(gridfile, xrgrid):
110114
"""
111115
Run grdview by passing in a grid and setting a colormap for producing an
112116
image plot.
113117
"""
114-
fig = Figure()
115-
fig.grdview(grid=grid, cmap="oleron", surftype="i")
116-
return fig
118+
fig_ref, fig_test = Figure(), Figure()
119+
kwargs = dict(cmap="oleron", surftype="i")
120+
fig_ref.grdview(grid=gridfile, **kwargs)
121+
fig_test.grdview(grid=xrgrid, **kwargs)
122+
return fig_ref, fig_test
117123

118124

119-
@pytest.mark.xfail(
120-
reason="Baseline image not updated to use earth relief grid in GMT 6.1.0",
121-
)
122-
@pytest.mark.mpl_image_compare
123-
def test_grdview_with_cmap_for_surface_monochrome_plot(grid):
125+
@check_figures_equal()
126+
def test_grdview_with_cmap_for_surface_monochrome_plot(gridfile, xrgrid):
124127
"""
125128
Run grdview by passing in a grid and setting a colormap for producing a
126129
surface monochrome plot.
127130
"""
128-
fig = Figure()
129-
fig.grdview(grid=grid, cmap="oleron", surftype="s+m")
130-
return fig
131+
fig_ref, fig_test = Figure(), Figure()
132+
kwargs = dict(cmap="oleron", surftype="s+m")
133+
fig_ref.grdview(grid=gridfile, **kwargs)
134+
fig_test.grdview(grid=xrgrid, **kwargs)
135+
return fig_ref, fig_test
131136

132137

133-
@pytest.mark.xfail(
134-
reason="Baseline image not updated to use earth relief grid in GMT 6.1.0",
135-
)
136-
@pytest.mark.mpl_image_compare
137-
def test_grdview_with_cmap_for_perspective_surface_plot(grid):
138+
@check_figures_equal()
139+
def test_grdview_with_cmap_for_perspective_surface_plot(gridfile, xrgrid):
138140
"""
139141
Run grdview by passing in a grid and setting a colormap for producing a
140142
surface plot with a 3D perspective viewpoint.
141143
"""
142-
fig = Figure()
143-
fig.grdview(
144-
grid=grid, cmap="oleron", surftype="s", perspective=[225, 30], zscale=0.005
145-
)
146-
return fig
144+
fig_ref, fig_test = Figure(), Figure()
145+
kwargs = dict(cmap="oleron", surftype="s", perspective=[225, 30], zscale=0.005)
146+
fig_ref.grdview(grid=gridfile, **kwargs)
147+
fig_test.grdview(grid=xrgrid, **kwargs)
148+
return fig_ref, fig_test
147149

148150

149-
@pytest.mark.xfail(
150-
reason="Baseline image not updated to use earth relief grid in GMT 6.1.0",
151-
)
152-
@pytest.mark.mpl_image_compare
153-
def test_grdview_on_a_plane(grid):
151+
@check_figures_equal()
152+
def test_grdview_on_a_plane(gridfile, xrgrid):
154153
"""
155154
Run grdview by passing in a grid and plotting it on a z-plane, while
156155
setting a 3D perspective viewpoint.
157156
"""
158-
fig = Figure()
159-
fig.grdview(grid=grid, plane=-4000, perspective=[225, 30], zscale=0.005)
160-
return fig
157+
fig_ref, fig_test = Figure(), Figure()
158+
kwargs = dict(plane=-4000, perspective=[225, 30], zscale=0.005)
159+
fig_ref.grdview(grid=gridfile, **kwargs)
160+
fig_test.grdview(grid=xrgrid, **kwargs)
161+
return fig_ref, fig_test
161162

162163

163-
@pytest.mark.xfail(
164-
reason="Baseline image not updated to use earth relief grid in GMT 6.1.0",
165-
)
166-
@pytest.mark.mpl_image_compare
167-
def test_grdview_on_a_plane_with_colored_frontal_facade(grid):
164+
@check_figures_equal()
165+
def test_grdview_on_a_plane_with_colored_frontal_facade(gridfile, xrgrid):
168166
"""
169167
Run grdview by passing in a grid and plotting it on a z-plane whose frontal
170168
facade is colored gray, while setting a 3D perspective viewpoint.
171169
"""
172-
fig = Figure()
173-
fig.grdview(grid=grid, plane="-4000+ggray", perspective=[225, 30], zscale=0.005)
174-
return fig
170+
fig_ref, fig_test = Figure(), Figure()
171+
kwargs = dict(plane="-4000+ggray", perspective=[225, 30], zscale=0.005)
172+
fig_ref.grdview(grid=gridfile, **kwargs)
173+
fig_test.grdview(grid=xrgrid, **kwargs)
174+
return fig_ref, fig_test
175175

176176

177-
@pytest.mark.xfail(
178-
reason="Baseline image not updated to use earth relief grid in GMT 6.1.0",
179-
)
180-
@pytest.mark.mpl_image_compare
181-
def test_grdview_with_perspective_and_zaxis_frame(grid):
177+
@check_figures_equal()
178+
def test_grdview_with_perspective_and_zaxis_frame(gridfile, xrgrid, region):
182179
"""
183180
Run grdview by passing in a grid and plotting an annotated vertical
184-
z-axis frame.
181+
z-axis frame on a Transverse Mercator (T) projection.
185182
"""
186-
fig = Figure()
187-
fig.grdview(grid=grid, perspective=[225, 30], zscale=0.005, frame="zaf")
188-
return fig
183+
fig_ref, fig_test = Figure(), Figure()
184+
projection = f"T{(region[0]+region[1])/2}/{abs((region[2]+region[3])/2)}"
185+
kwargs = dict(
186+
projection=projection,
187+
perspective=[225, 30],
188+
zscale=0.005,
189+
frame=["xaf", "yaf", "zaf"],
190+
)
191+
fig_ref.grdview(grid=gridfile, **kwargs)
192+
fig_test.grdview(grid=xrgrid, **kwargs)
193+
return fig_ref, fig_test
189194

190195

191-
@pytest.mark.xfail(
192-
reason="Baseline image not updated to use earth relief grid in GMT 6.1.0",
193-
)
194-
@pytest.mark.mpl_image_compare
195-
def test_grdview_surface_plot_styled_with_contourpen(grid):
196+
@check_figures_equal()
197+
def test_grdview_surface_plot_styled_with_contourpen(gridfile, xrgrid):
196198
"""
197199
Run grdview by passing in a grid with styled contour lines plotted on top
198200
of a surface plot.
199201
"""
200-
fig = Figure()
201-
fig.grdview(grid=grid, cmap="relief", surftype="s", contourpen="0.5p,black,dash")
202-
return fig
202+
fig_ref, fig_test = Figure(), Figure()
203+
kwargs = dict(cmap="relief", surftype="s", contourpen="0.5p,black,dash")
204+
fig_ref.grdview(grid=gridfile, **kwargs)
205+
fig_test.grdview(grid=xrgrid, **kwargs)
206+
return fig_ref, fig_test
203207

204208

205-
@pytest.mark.xfail(
206-
reason="Baseline image not updated to use earth relief grid in GMT 6.1.0",
207-
)
208-
@pytest.mark.mpl_image_compare
209-
def test_grdview_surface_mesh_plot_styled_with_meshpen(grid):
209+
@check_figures_equal()
210+
def test_grdview_surface_mesh_plot_styled_with_meshpen(gridfile, xrgrid):
210211
"""
211212
Run grdview by passing in a grid with styled mesh lines plotted on top of a
212213
surface mesh plot.
213214
"""
214-
fig = Figure()
215-
fig.grdview(grid=grid, cmap="relief", surftype="sm", meshpen="0.5p,black,dash")
216-
return fig
215+
fig_ref, fig_test = Figure(), Figure()
216+
kwargs = dict(cmap="relief", surftype="sm", meshpen="0.5p,black,dash")
217+
fig_ref.grdview(grid=gridfile, **kwargs)
218+
fig_test.grdview(grid=xrgrid, **kwargs)
219+
return fig_ref, fig_test
217220

218221

219-
@pytest.mark.xfail(
220-
reason="Baseline image not updated to use earth relief grid in GMT 6.1.0",
221-
)
222-
@pytest.mark.mpl_image_compare
223-
def test_grdview_on_a_plane_styled_with_facadepen(grid):
222+
@check_figures_equal()
223+
def test_grdview_on_a_plane_styled_with_facadepen(gridfile, xrgrid):
224224
"""
225225
Run grdview by passing in a grid and plotting it on a z-plane with styled
226226
lines for the frontal facade.
227227
"""
228-
fig = Figure()
229-
fig.grdview(
230-
grid=grid,
231-
plane=-4000,
232-
perspective=[225, 30],
233-
zscale=0.005,
234-
facadepen="0.5p,blue,dash",
228+
fig_ref, fig_test = Figure(), Figure()
229+
kwargs = dict(
230+
plane=-4000, perspective=[225, 30], zscale=0.005, facadepen="0.5p,blue,dash"
235231
)
236-
return fig
232+
fig_ref.grdview(grid=gridfile, **kwargs)
233+
fig_test.grdview(grid=xrgrid, **kwargs)
234+
return fig_ref, fig_test
237235

238236

239-
@pytest.mark.xfail(
240-
reason="Baseline image not updated to use earth relief grid in GMT 6.1.0",
241-
)
242-
@pytest.mark.mpl_image_compare
243-
def test_grdview_drapegrid_dataarray(grid):
237+
@check_figures_equal()
238+
def test_grdview_drapegrid_dataarray(gridfile, xrgrid):
244239
"""
245240
Run grdview by passing in both a grid and drapegrid as an xarray.DataArray,
246241
setting a colormap for producing an image plot.
247242
"""
248-
drapegrid = 1.1 * grid
243+
drapegrid = 1.1 * xrgrid
249244

250-
fig = Figure()
251-
fig.grdview(grid=grid, drapegrid=drapegrid, cmap="oleron", surftype="c")
252-
return fig
245+
fig_ref, fig_test = Figure(), Figure()
246+
fig_ref.grdview(grid=gridfile, drapegrid=drapegrid, cmap="oleron", surftype="c")
247+
fig_test.grdview(grid=xrgrid, drapegrid=drapegrid, cmap="oleron", surftype="c")
248+
return fig_ref, fig_test
253249

254250

255-
def test_grdview_wrong_kind_of_drapegrid(grid):
251+
def test_grdview_wrong_kind_of_drapegrid(xrgrid):
256252
"""
257253
Run grdview using drapegrid input that is not an xarray.DataArray or file.
258254
"""
259-
dataset = grid.to_dataset() # convert xarray.DataArray to xarray.Dataset
255+
dataset = xrgrid.to_dataset() # convert xarray.DataArray to xarray.Dataset
260256
assert data_kind(dataset) == "matrix"
261257

262258
fig = Figure()
263259
with pytest.raises(GMTInvalidInput):
264-
fig.grdview(grid=grid, drapegrid=dataset)
260+
fig.grdview(grid=xrgrid, drapegrid=dataset)

0 commit comments

Comments
 (0)