Skip to content

Commit 151885c

Browse files
committed
#174 Update test for v2 specs module
1 parent 771384c commit 151885c

File tree

2 files changed

+229
-0
lines changed

2 files changed

+229
-0
lines changed

tests/test_data.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# standard library
2+
from dataclasses import dataclass
3+
from typing import Collection, Tuple, Union
4+
5+
6+
# dependencies
7+
import numpy as np
8+
from typing_extensions import Annotated as Ann, Literal as L
9+
from xarray_dataclasses.v2.typing import Attr, Coord, Coordof, Data
10+
11+
12+
# type hints
13+
X = L["x"]
14+
Y = L["y"]
15+
T = L["time"]
16+
_ = Tuple[()]
17+
18+
19+
# test data
20+
@dataclass
21+
class Longitude:
22+
"""Specification of longitude."""
23+
24+
data: Data[Tuple[X, Y], float]
25+
units: Attr[str] = "deg"
26+
27+
28+
@dataclass
29+
class Latitude:
30+
"""Specification of latitude."""
31+
32+
data: Data[Tuple[X, Y], float]
33+
units: Attr[str] = "deg"
34+
35+
36+
@dataclass
37+
class Weather:
38+
"""Weather information."""
39+
40+
temp: Ann[Data[Tuple[X, Y, T], float], "Temperature ({.temp_unit})"]
41+
"""Measured temperature."""
42+
43+
prec: Ann[Data[Tuple[X, Y, T], float], "Precipitation ({.prec_unit})"]
44+
"""Measured precipitation."""
45+
46+
lon: Union[Ann[Coordof[Longitude], "Longitude"], Collection[float]]
47+
"""Longitude of the measured location."""
48+
49+
lat: Union[Ann[Coordof[Latitude], "Latitude"], Collection[float]]
50+
"""Latitude of the measured location."""
51+
52+
time: Coord[T, L["M8[ns]"]]
53+
"""Measured time."""
54+
55+
reference_time: Union[Coord[_, L["M8[ns]"]], np.datetime64]
56+
"""Reference time."""
57+
58+
temp_unit: str = "deg C"
59+
"""Unit of the temperature."""
60+
61+
prec_unit: str = "mm"
62+
"""Unit of the precipitation."""
63+
64+
65+
weather = Weather(
66+
15 + 8 * np.random.randn(2, 2, 3),
67+
10 * np.random.rand(2, 2, 3),
68+
np.array([[-99.83, -99.32], [-99.79, -99.23]]),
69+
np.array([[42.25, 42.21], [42.63, 42.59]]),
70+
np.array(["2014-09-06", "2014-09-07", "2014-09-08"], "M8[ns]"),
71+
np.datetime64("2014-09-05"),
72+
)

tests/test_v2_specs.py

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
# standard library
2+
from dataclasses import MISSING
3+
4+
5+
# dependencies
6+
from test_data import Latitude, Longitude, Weather, weather
7+
from xarray_dataclasses.v2.specs import Spec
8+
9+
10+
# test data
11+
spec = Spec.from_dataclass(Weather)
12+
spec_updated = spec @ weather
13+
14+
15+
# test functions
16+
def test_temp() -> None:
17+
field = spec.fields.of_data[0]
18+
19+
assert field.id == "temp"
20+
assert field.name == "Temperature ({.temp_unit})"
21+
assert field.role == "data"
22+
assert field.default is MISSING
23+
assert field.type is None
24+
assert field.dims == ("x", "y", "time")
25+
assert field.dtype == "float64"
26+
27+
28+
def test_temp_updated() -> None:
29+
field = spec_updated.fields.of_data[0]
30+
31+
assert field.id == "temp"
32+
assert field.name == "Temperature (deg C)"
33+
assert field.role == "data"
34+
assert (field.default == weather.temp).all()
35+
assert field.type is None
36+
assert field.dims == ("x", "y", "time")
37+
assert field.dtype == "float64"
38+
39+
40+
def test_prec() -> None:
41+
field = spec.fields.of_data[1]
42+
43+
assert field.id == "prec"
44+
assert field.name == "Precipitation ({.prec_unit})"
45+
assert field.role == "data"
46+
assert field.default is MISSING
47+
assert field.type is None
48+
assert field.dims == ("x", "y", "time")
49+
assert field.dtype == "float64"
50+
51+
52+
def test_prec_updated() -> None:
53+
field = spec_updated.fields.of_data[1]
54+
55+
assert field.id == "prec"
56+
assert field.name == "Precipitation (mm)"
57+
assert field.role == "data"
58+
assert (field.default == weather.prec).all()
59+
assert field.type is None
60+
assert field.dims == ("x", "y", "time")
61+
assert field.dtype == "float64"
62+
63+
64+
def test_lon() -> None:
65+
field = spec.fields.of_coord[0]
66+
67+
assert field.id == "lon"
68+
assert field.name == "Longitude"
69+
assert field.role == "coord"
70+
assert field.default is MISSING
71+
assert field.type is Longitude
72+
assert field.dims == ("x", "y")
73+
assert field.dtype == "float64"
74+
75+
76+
def test_lon_updated() -> None:
77+
field = spec_updated.fields.of_coord[0]
78+
79+
assert field.id == "lon"
80+
assert field.name == "Longitude"
81+
assert field.role == "coord"
82+
assert (field.default == weather.lon).all()
83+
assert field.type is Longitude
84+
assert field.dims == ("x", "y")
85+
assert field.dtype == "float64"
86+
87+
88+
def test_lat() -> None:
89+
field = spec.fields.of_coord[1]
90+
91+
assert field.id == "lat"
92+
assert field.name == "Latitude"
93+
assert field.role == "coord"
94+
assert field.default is MISSING
95+
assert field.type is Latitude
96+
assert field.dims == ("x", "y")
97+
assert field.dtype == "float64"
98+
99+
100+
def test_lat_updated() -> None:
101+
field = spec_updated.fields.of_coord[1]
102+
103+
assert field.id == "lat"
104+
assert field.name == "Latitude"
105+
assert field.role == "coord"
106+
assert (field.default == weather.lat).all()
107+
assert field.type is Latitude
108+
assert field.dims == ("x", "y")
109+
assert field.dtype == "float64"
110+
111+
112+
def test_time() -> None:
113+
field = spec.fields.of_coord[2]
114+
115+
assert field.id == "time"
116+
assert field.name == "time"
117+
assert field.role == "coord"
118+
assert field.default is MISSING
119+
assert field.type is None
120+
assert field.dims == ("time",)
121+
assert field.dtype == "datetime64[ns]"
122+
123+
124+
def test_time_updated() -> None:
125+
field = spec_updated.fields.of_coord[2]
126+
127+
assert field.id == "time"
128+
assert field.name == "time"
129+
assert field.role == "coord"
130+
assert (field.default == weather.time).all()
131+
assert field.type is None
132+
assert field.dims == ("time",)
133+
assert field.dtype == "datetime64[ns]"
134+
135+
136+
def test_reference_time() -> None:
137+
field = spec.fields.of_coord[3]
138+
139+
assert field.id == "reference_time"
140+
assert field.name == "reference_time"
141+
assert field.role == "coord"
142+
assert field.default is MISSING
143+
assert field.type is None
144+
assert field.dims == ()
145+
assert field.dtype == "datetime64[ns]"
146+
147+
148+
def test_reference_time_updated() -> None:
149+
field = spec_updated.fields.of_coord[3]
150+
151+
assert field.id == "reference_time"
152+
assert field.name == "reference_time"
153+
assert field.role == "coord"
154+
assert field.default == weather.reference_time
155+
assert field.type is None
156+
assert field.dims == ()
157+
assert field.dtype == "datetime64[ns]"

0 commit comments

Comments
 (0)