1+ import unittest
2+
13from s2sphere import LatLng
24
35from monitoring .monitorlib .geo import (
6+ Altitude ,
7+ AltitudeDatum ,
8+ Circle ,
9+ DistanceUnits ,
10+ LatLngPoint ,
11+ Polygon ,
12+ Radius ,
13+ Volume3D ,
414 generate_area_in_vicinity ,
515 generate_slight_overlap_area ,
616)
@@ -12,6 +22,196 @@ def _points(in_points: list[tuple[float, float]]) -> list[LatLng]:
1222 return [LatLng .from_degrees (* p ) for p in in_points ]
1323
1424
25+ class AltitudeIsEquivalentTest (unittest .TestCase ):
26+ def setUp (self ):
27+ self .alt1 = Altitude (
28+ value = 100 , reference = AltitudeDatum .W84 , units = DistanceUnits .M
29+ )
30+
31+ def test_equivalent_altitudes (self ):
32+ alt2 = Altitude (value = 100 , reference = AltitudeDatum .W84 , units = DistanceUnits .M )
33+ self .assertTrue (self .alt1 .is_equivalent (alt2 ))
34+
35+ def test_equivalent_altitudes_within_tolerance (self ):
36+ alt2 = Altitude (
37+ value = 100.000001 , reference = AltitudeDatum .W84 , units = DistanceUnits .M
38+ )
39+ self .assertTrue (self .alt1 .is_equivalent (alt2 ))
40+
41+ def test_equivalent_altitudes_different_units (self ):
42+ alt2 = Altitude (
43+ value = 328.084 , reference = AltitudeDatum .W84 , units = DistanceUnits .FT
44+ )
45+ self .assertTrue (self .alt1 .is_equivalent (alt2 ))
46+
47+ def test_nonequivalent_altitudes_different_value (self ):
48+ alt2 = Altitude (value = 101 , reference = AltitudeDatum .W84 , units = DistanceUnits .M )
49+ self .assertFalse (self .alt1 .is_equivalent (alt2 ))
50+
51+ def test_nonequivalent_altitudes_different_reference (self ):
52+ alt2 = Altitude (value = 100 , reference = AltitudeDatum .SFC , units = DistanceUnits .M )
53+ self .assertFalse (self .alt1 .is_equivalent (alt2 ))
54+
55+
56+ class PolygonIsEquivalentTest (unittest .TestCase ):
57+ def setUp (self ):
58+ self .poly1 = Polygon (
59+ vertices = [
60+ LatLngPoint (lat = 10 , lng = 10 ),
61+ LatLngPoint (lat = 11 , lng = 10 ),
62+ LatLngPoint (lat = 11 , lng = 11 ),
63+ LatLngPoint (lat = 10 , lng = 11 ),
64+ ]
65+ )
66+
67+ def test_equivalent_polygons (self ):
68+ poly2 = Polygon (
69+ vertices = [
70+ LatLngPoint (lat = 10 , lng = 10 ),
71+ LatLngPoint (lat = 11 , lng = 10 ),
72+ LatLngPoint (lat = 11 , lng = 11 ),
73+ LatLngPoint (lat = 10 , lng = 11 ),
74+ ]
75+ )
76+ self .assertTrue (self .poly1 .is_equivalent (poly2 ))
77+
78+ def test_equivalent_polygons_within_tolerance (self ):
79+ poly2 = Polygon (
80+ vertices = [
81+ LatLngPoint (lat = 10.00000001 , lng = 10.00000001 ),
82+ LatLngPoint (lat = 11.00000001 , lng = 10.00000001 ),
83+ LatLngPoint (lat = 11.00000001 , lng = 11.00000001 ),
84+ LatLngPoint (lat = 10.00000001 , lng = 11.00000001 ),
85+ ]
86+ )
87+ self .assertTrue (self .poly1 .is_equivalent (poly2 ))
88+
89+ def test_nonequivalent_polygons (self ):
90+ poly2 = Polygon (
91+ vertices = [
92+ LatLngPoint (lat = 10 , lng = 10 ),
93+ LatLngPoint (lat = 12 , lng = 10 ),
94+ LatLngPoint (lat = 12 , lng = 11 ),
95+ LatLngPoint (lat = 10 , lng = 11 ),
96+ ]
97+ )
98+ self .assertFalse (self .poly1 .is_equivalent (poly2 ))
99+
100+ def test_equivalent_polygons_none (self ):
101+ poly1 = Polygon (vertices = None )
102+ poly2 = Polygon (vertices = None )
103+ self .assertTrue (poly1 .is_equivalent (poly2 ))
104+
105+ def test_nonequivalent_polygons_one_none (self ):
106+ poly1 = Polygon (vertices = [])
107+ poly2 = Polygon (vertices = None )
108+ self .assertFalse (poly1 .is_equivalent (poly2 ))
109+
110+
111+ class Volume3DIsEquivalentTest (unittest .TestCase ):
112+ def setUp (self ):
113+ self .vol_poly = Volume3D (
114+ outline_polygon = Polygon (
115+ vertices = [
116+ LatLngPoint (lat = 10 , lng = 10 ),
117+ LatLngPoint (lat = 11 , lng = 10 ),
118+ LatLngPoint (lat = 11 , lng = 11 ),
119+ LatLngPoint (lat = 10 , lng = 11 ),
120+ ]
121+ ),
122+ altitude_lower = Altitude (
123+ value = 100 , reference = AltitudeDatum .W84 , units = DistanceUnits .M
124+ ),
125+ altitude_upper = Altitude (
126+ value = 200 , reference = AltitudeDatum .W84 , units = DistanceUnits .M
127+ ),
128+ )
129+ self .vol_circle = Volume3D (
130+ outline_circle = Circle (
131+ center = LatLngPoint (lat = 10 , lng = 10 ),
132+ radius = Radius (value = 100 , units = DistanceUnits .M ),
133+ ),
134+ altitude_lower = Altitude (
135+ value = 100 , reference = AltitudeDatum .W84 , units = DistanceUnits .M
136+ ),
137+ altitude_upper = Altitude (
138+ value = 200 , reference = AltitudeDatum .W84 , units = DistanceUnits .M
139+ ),
140+ )
141+
142+ def test_equivalent_volumes_polygon (self ):
143+ vol2 = Volume3D (
144+ outline_polygon = Polygon (
145+ vertices = [
146+ LatLngPoint (lat = 10 , lng = 10 ),
147+ LatLngPoint (lat = 11 , lng = 10 ),
148+ LatLngPoint (lat = 11 , lng = 11 ),
149+ LatLngPoint (lat = 10 , lng = 11 ),
150+ ]
151+ ),
152+ altitude_lower = Altitude (
153+ value = 100 , reference = AltitudeDatum .W84 , units = DistanceUnits .M
154+ ),
155+ altitude_upper = Altitude (
156+ value = 200 , reference = AltitudeDatum .W84 , units = DistanceUnits .M
157+ ),
158+ )
159+ self .assertTrue (self .vol_poly .is_equivalent (vol2 ))
160+
161+ def test_equivalent_volumes_circle (self ):
162+ vol2 = Volume3D (
163+ outline_circle = Circle (
164+ center = LatLngPoint (lat = 10 , lng = 10 ),
165+ radius = Radius (value = 100 , units = DistanceUnits .M ),
166+ ),
167+ altitude_lower = Altitude (
168+ value = 100 , reference = AltitudeDatum .W84 , units = DistanceUnits .M
169+ ),
170+ altitude_upper = Altitude (
171+ value = 200 , reference = AltitudeDatum .W84 , units = DistanceUnits .M
172+ ),
173+ )
174+ self .assertTrue (self .vol_circle .is_equivalent (vol2 ))
175+
176+ def test_nonequivalent_volumes_circle (self ):
177+ vol2 = Volume3D (
178+ outline_circle = Circle (
179+ center = LatLngPoint (lat = 10 , lng = 10 ),
180+ radius = Radius (value = 200 , units = DistanceUnits .M ),
181+ ),
182+ altitude_lower = Altitude (
183+ value = 100 , reference = AltitudeDatum .W84 , units = DistanceUnits .M
184+ ),
185+ altitude_upper = Altitude (
186+ value = 200 , reference = AltitudeDatum .W84 , units = DistanceUnits .M
187+ ),
188+ )
189+ self .assertFalse (self .vol_circle .is_equivalent (vol2 ))
190+
191+ def test_nonequivalent_volumes_different_shape (self ):
192+ vol2 = Volume3D (
193+ outline_circle = Circle (
194+ center = LatLngPoint (lat = 10.5 , lng = 10.5 ),
195+ radius = Radius (value = 50000 , units = DistanceUnits .M ),
196+ )
197+ )
198+ self .assertFalse (self .vol_poly .is_equivalent (vol2 ))
199+
200+ def test_equivalent_volumes_none_fields (self ):
201+ vol1 = Volume3D ()
202+ vol2 = Volume3D ()
203+ self .assertTrue (vol1 .is_equivalent (vol2 ))
204+
205+ def test_nonequivalent_volumes_one_none_field (self ):
206+ vol1 = Volume3D (
207+ altitude_lower = Altitude (
208+ value = 100 , reference = AltitudeDatum .W84 , units = DistanceUnits .M
209+ )
210+ )
211+ vol2 = Volume3D ()
212+ self .assertFalse (vol1 .is_equivalent (vol2 ))
213+
214+
15215def test_generate_slight_overlap_area ():
16216 # Square around 0,0 of edge length 2 -> first corner at 1,1 -> expect a square with overlapping corner at 1,1
17217 assert generate_slight_overlap_area (
0 commit comments