Skip to content

Commit cb005b1

Browse files
committed
#156 Update test for specs module
1 parent 558bf54 commit cb005b1

File tree

1 file changed

+173
-0
lines changed

1 file changed

+173
-0
lines changed

tests/test_specs.py

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
# standard library
2+
from dataclasses import MISSING, dataclass
3+
from typing import Tuple
4+
5+
6+
# dependencies
7+
import numpy as np
8+
from typing_extensions import Annotated as Ann
9+
from typing_extensions import Literal as L
10+
from xarray_dataclasses.specs import DataSpec
11+
from xarray_dataclasses.typing import Attr, Coordof, Data, Name
12+
13+
14+
# type hints
15+
DataDims = Tuple[L["lon"], L["lat"], L["time"]]
16+
17+
18+
# test datasets
19+
@dataclass
20+
class Lon:
21+
"""Specification of relative longitude."""
22+
23+
data: Data[L["lon"], float]
24+
units: Attr[str] = "deg"
25+
name: Name[str] = "Relative longitude"
26+
27+
28+
@dataclass
29+
class Lat:
30+
"""Specification of relative latitude."""
31+
32+
data: Data[L["lat"], float]
33+
units: Attr[str] = "m"
34+
name: Name[str] = "Relative latitude"
35+
36+
37+
@dataclass
38+
class Time:
39+
"""Specification of time."""
40+
41+
data: Data[L["time"], L["datetime64[ns]"]]
42+
name: Name[str] = "Time in UTC"
43+
44+
45+
@dataclass
46+
class Weather:
47+
"""Time-series spatial weather information at a location."""
48+
49+
temperature: Ann[Data[DataDims, float], "Temperature"]
50+
humidity: Ann[Data[DataDims, float], "Humidity"]
51+
wind_speed: Ann[Data[DataDims, float], "Wind speed"]
52+
wind_direction: Ann[Data[DataDims, float], "Wind direction"]
53+
lon: Coordof[Lon]
54+
lat: Coordof[Lat]
55+
time: Coordof[Time]
56+
location: Attr[str] = "Tokyo"
57+
longitude: Attr[float] = 139.69167
58+
latitude: Attr[float] = 35.68944
59+
name: Name[str] = "weather"
60+
61+
62+
# test functions
63+
def test_temperature() -> None:
64+
spec = DataSpec.from_dataclass(Weather).specs.of_data["temperature"]
65+
66+
assert spec.name == "Temperature"
67+
assert spec.role == "data"
68+
assert spec.dims == ("lon", "lat", "time")
69+
assert spec.dtype == np.dtype("f8")
70+
assert spec.default is MISSING
71+
assert spec.origin is None
72+
73+
74+
def test_humidity() -> None:
75+
spec = DataSpec.from_dataclass(Weather).specs.of_data["humidity"]
76+
77+
assert spec.name == "Humidity"
78+
assert spec.role == "data"
79+
assert spec.dims == ("lon", "lat", "time")
80+
assert spec.dtype == np.dtype("f8")
81+
assert spec.default is MISSING
82+
assert spec.origin is None
83+
84+
85+
def test_wind_speed() -> None:
86+
spec = DataSpec.from_dataclass(Weather).specs.of_data["wind_speed"]
87+
88+
assert spec.name == "Wind speed"
89+
assert spec.role == "data"
90+
assert spec.dims == ("lon", "lat", "time")
91+
assert spec.dtype == np.dtype("f8")
92+
assert spec.default is MISSING
93+
assert spec.origin is None
94+
95+
96+
def test_wind_direction() -> None:
97+
spec = DataSpec.from_dataclass(Weather).specs.of_data["wind_direction"]
98+
99+
assert spec.name == "Wind direction"
100+
assert spec.role == "data"
101+
assert spec.dims == ("lon", "lat", "time")
102+
assert spec.dtype == np.dtype("f8")
103+
assert spec.default is MISSING
104+
assert spec.origin is None
105+
106+
107+
def test_lon() -> None:
108+
spec = DataSpec.from_dataclass(Weather).specs.of_coord["lon"]
109+
110+
assert spec.name == "Relative longitude"
111+
assert spec.role == "coord"
112+
assert spec.dims == ("lon",)
113+
assert spec.dtype == np.dtype("f8")
114+
assert spec.default is MISSING
115+
assert spec.origin is Lon
116+
117+
118+
def test_lat() -> None:
119+
spec = DataSpec.from_dataclass(Weather).specs.of_coord["lat"]
120+
121+
assert spec.name == "Relative latitude"
122+
assert spec.role == "coord"
123+
assert spec.dims == ("lat",)
124+
assert spec.dtype == np.dtype("f8")
125+
assert spec.default is MISSING
126+
assert spec.origin is Lat
127+
128+
129+
def test_time() -> None:
130+
spec = DataSpec.from_dataclass(Weather).specs.of_coord["time"]
131+
132+
assert spec.name == "Time in UTC"
133+
assert spec.role == "coord"
134+
assert spec.dims == ("time",)
135+
assert spec.dtype == np.dtype("M8[ns]")
136+
assert spec.default is MISSING
137+
assert spec.origin is Time
138+
139+
140+
def test_location() -> None:
141+
spec = DataSpec.from_dataclass(Weather).specs.of_attr["location"]
142+
143+
assert spec.name == "location"
144+
assert spec.role == "attr"
145+
assert spec.type is str
146+
assert spec.default == "Tokyo"
147+
148+
149+
def test_longitude() -> None:
150+
spec = DataSpec.from_dataclass(Weather).specs.of_attr["longitude"]
151+
152+
assert spec.name == "longitude"
153+
assert spec.role == "attr"
154+
assert spec.type is float
155+
assert spec.default == 139.69167
156+
157+
158+
def test_latitude() -> None:
159+
spec = DataSpec.from_dataclass(Weather).specs.of_attr["latitude"]
160+
161+
assert spec.name == "latitude"
162+
assert spec.role == "attr"
163+
assert spec.type is float
164+
assert spec.default == 35.68944
165+
166+
167+
def test_name() -> None:
168+
spec = DataSpec.from_dataclass(Weather).specs.of_name["name"]
169+
170+
assert spec.name == "name"
171+
assert spec.role == "name"
172+
assert spec.type is str
173+
assert spec.default == "weather"

0 commit comments

Comments
 (0)