@@ -6,106 +6,169 @@ import (
66
77 restapi "github.com/interuss/dss/pkg/api/scdv1"
88 "github.com/stretchr/testify/assert"
9+ "github.com/stretchr/testify/require"
910)
1011
11- func TestVolume4DFromSCDRest (t * testing.T ) {
12- start := time .Date (2024 , time .December , 15 , 15 , 0 , 0 , 0 , time .UTC )
13- end := start .Add (time .Hour )
12+ func newRestTime (t time.Time ) * restapi.Time {
13+ return & restapi.Time {Value : t .Format (time .RFC3339 ), Format : TimeFormatRFC3339 }
14+ }
15+
16+ func newRestAlt (a float32 ) * restapi.Altitude {
17+ return & restapi.Altitude {Value : float64 (a ), Reference : ReferenceW84 , Units : UnitsM }
18+ }
19+
20+ func TestUnionVolumes4DFromSCDRest (t * testing.T ) {
21+ timeStart := time .Date (2024 , time .December , 15 , 15 , 0 , 0 , 0 , time .UTC )
22+ timeMid := timeStart .Add (time .Minute )
23+ timeEnd := timeStart .Add (time .Hour )
1424
15- timeStart := restapi.Time {Value : start .Format (time .RFC3339 ), Format : TimeFormatRFC3339 }
16- timeEnd := restapi.Time {Value : end .Format (time .RFC3339 ), Format : TimeFormatRFC3339 }
17- timeInvalid := restapi.Time {Value : start .Format (time .ANSIC )}
18- altLower := restapi.Altitude {Value : 100.0 , Reference : ReferenceW84 , Units : UnitsM }
1925 altLo := float32 (100.0 )
20- altUpper := restapi. Altitude { Value : 200.0 , Reference : ReferenceW84 , Units : UnitsM }
26+ altMid := float32 ( 150.0 )
2127 altHi := float32 (200.0 )
28+
2229 testCases := []struct {
2330 name string
2431 validators []Volume4DValidator
25- rest * restapi.Volume4D
32+ rest [] restapi.Volume4D
2633 want * Volume4D
2734 wantErr bool
2835 }{
2936 {
30- name : "Empty" ,
31- rest : & restapi.Volume4D {},
32- want : & Volume4D {SpatialVolume : & Volume3D {}},
33- },
34- {
35- name : "Times" ,
36- validators : []Volume4DValidator {WithRequireTimeBounds ()},
37- rest : & restapi.Volume4D {TimeStart : & timeStart , TimeEnd : & timeEnd },
38- want : & Volume4D {
39- SpatialVolume : & Volume3D {},
40- StartTime : & start ,
41- EndTime : & end ,
37+ name : "Time" ,
38+ validators : []Volume4DValidator {
39+ WithRequireTimeBounds (),
40+ WithRequireEndTimeAfter (timeEnd .Add (- time .Minute )),
4241 },
42+ rest : []restapi.Volume4D {
43+ {TimeStart : newRestTime (timeStart ), TimeEnd : newRestTime (timeMid )},
44+ {TimeStart : newRestTime (timeStart ), TimeEnd : newRestTime (timeEnd )},
45+ },
46+ want : & Volume4D {SpatialVolume : & Volume3D {}, StartTime : & timeStart , EndTime : & timeEnd },
4347 },
4448 {
45- name : "InvalidTimeStart" ,
46- rest : & restapi.Volume4D {TimeStart : & timeInvalid },
47- wantErr : true ,
48- },
49- {
50- name : "InvalidTimeEnd" ,
51- rest : & restapi.Volume4D {TimeEnd : & timeInvalid },
52- wantErr : true ,
53- },
54- {
55- name : "TimeStartAfterTimeEnd" ,
56- rest : & restapi.Volume4D {TimeStart : & timeEnd , TimeEnd : & timeStart },
49+ name : "TimeEndExpired" ,
50+ validators : []Volume4DValidator {WithRequireEndTimeAfter (timeEnd .Add (time .Minute ))},
51+ rest : []restapi.Volume4D {
52+ {TimeEnd : newRestTime (timeMid )},
53+ {TimeEnd : newRestTime (timeEnd )},
54+ },
5755 wantErr : true ,
5856 },
5957 {
6058 name : "MissingTimeStart" ,
6159 validators : []Volume4DValidator {WithRequireTimeBounds ()},
62- rest : & restapi.Volume4D {TimeEnd : & timeEnd },
63- wantErr : true ,
60+ rest : []restapi.Volume4D {
61+ {TimeEnd : newRestTime (timeMid )},
62+ {TimeStart : newRestTime (timeStart ), TimeEnd : newRestTime (timeEnd )},
63+ },
64+ wantErr : true ,
6465 },
6566 {
6667 name : "MissingTimeEnd" ,
6768 validators : []Volume4DValidator {WithRequireTimeBounds ()},
68- rest : & restapi.Volume4D {TimeStart : & timeStart },
69- wantErr : true ,
69+ rest : []restapi.Volume4D {
70+ {TimeStart : newRestTime (timeStart ), TimeEnd : newRestTime (timeMid )},
71+ {TimeStart : newRestTime (timeStart )},
72+ },
73+ wantErr : true ,
7074 },
7175 {
7276 name : "Altitude" ,
7377 validators : []Volume4DValidator {WithRequireAltitudeBounds ()},
74- rest : & restapi.Volume4D {Volume : restapi.Volume3D {AltitudeLower : & altLower , AltitudeUpper : & altUpper }},
75- want : & Volume4D {SpatialVolume : & Volume3D {AltitudeLo : & altLo , AltitudeHi : & altHi }},
78+ rest : []restapi.Volume4D {
79+ {Volume : restapi.Volume3D {AltitudeLower : newRestAlt (altLo ), AltitudeUpper : newRestAlt (altMid )}},
80+ {Volume : restapi.Volume3D {AltitudeLower : newRestAlt (altMid ), AltitudeUpper : newRestAlt (altHi )}},
81+ },
82+ want : & Volume4D {SpatialVolume : & Volume3D {AltitudeLo : & altLo , AltitudeHi : & altHi }},
7683 },
7784 {
7885 name : "MissingLowerAltitude" ,
7986 validators : []Volume4DValidator {WithRequireAltitudeBounds ()},
80- rest : & restapi.Volume4D {Volume : restapi.Volume3D {AltitudeUpper : & altUpper }},
81- wantErr : true ,
87+ rest : []restapi.Volume4D {
88+ {Volume : restapi.Volume3D {AltitudeUpper : newRestAlt (altMid )}},
89+ {Volume : restapi.Volume3D {AltitudeLower : newRestAlt (altMid ), AltitudeUpper : newRestAlt (altHi )}},
90+ },
91+ wantErr : true ,
8292 },
8393 {
8494 name : "MissingUpperAltitude" ,
8595 validators : []Volume4DValidator {WithRequireAltitudeBounds ()},
86- rest : & restapi.Volume4D {Volume : restapi.Volume3D {AltitudeLower : & altLower }},
87- wantErr : true ,
96+ rest : []restapi.Volume4D {
97+ {Volume : restapi.Volume3D {AltitudeLower : newRestAlt (altLo ), AltitudeUpper : newRestAlt (altMid )}},
98+ {Volume : restapi.Volume3D {AltitudeLower : newRestAlt (altMid )}},
99+ },
100+ wantErr : true ,
101+ },
102+ }
103+
104+ for _ , testCase := range testCases {
105+ t .Run (testCase .name , func (t * testing.T ) {
106+ actual , err := UnionVolumes4DFromSCDRest (testCase .rest , testCase .validators ... )
107+ if testCase .wantErr {
108+ require .Error (t , err )
109+ } else {
110+ require .NoError (t , err )
111+ assert .Equal (t , testCase .want , actual )
112+ }
113+ })
114+ }
115+ }
116+
117+ func TestVolume4DFromSCDRest (t * testing.T ) {
118+ start := time .Date (2024 , time .December , 15 , 15 , 0 , 0 , 0 , time .UTC )
119+ end := start .Add (time .Hour )
120+ restInvalid := & restapi.Time {Value : start .Format (time .ANSIC )}
121+
122+ testCases := []struct {
123+ name string
124+ rest * restapi.Volume4D
125+ want * Volume4D
126+ wantErr bool
127+ }{
128+ {
129+ name : "Empty" ,
130+ rest : & restapi.Volume4D {},
131+ want : & Volume4D {SpatialVolume : & Volume3D {}},
132+ },
133+ {
134+ name : "Times" ,
135+ rest : & restapi.Volume4D {TimeStart : newRestTime (start ), TimeEnd : newRestTime (end )},
136+ want : & Volume4D {SpatialVolume : & Volume3D {}, StartTime : & start , EndTime : & end },
137+ },
138+ {
139+ name : "InvalidTimeStart" ,
140+ rest : & restapi.Volume4D {TimeStart : restInvalid },
141+ wantErr : true ,
142+ },
143+ {
144+ name : "InvalidTimeEnd" ,
145+ rest : & restapi.Volume4D {TimeEnd : restInvalid },
146+ wantErr : true ,
147+ },
148+ {
149+ name : "TimeStartAfterTimeEnd" ,
150+ rest : & restapi.Volume4D {TimeStart : newRestTime (end ), TimeEnd : newRestTime (start )},
151+ wantErr : true ,
88152 },
89153 }
90154
91155 for _ , testCase := range testCases {
92156 t .Run (testCase .name , func (t * testing.T ) {
93- actual , err := Volume4DFromSCDRest (testCase .rest , testCase . validators ... )
157+ actual , err := Volume4DFromSCDRest (testCase .rest )
94158 if testCase .wantErr {
95- assert .Error (t , err )
159+ require .Error (t , err )
96160 } else {
161+ require .NoError (t , err )
97162 assert .Equal (t , testCase .want , actual )
98163 }
99164 })
100165 }
101166}
102167
103168func TestVolume3DFromSCDRest (t * testing.T ) {
104- lower := restapi.Altitude {Value : 100.0 , Reference : ReferenceW84 , Units : UnitsM }
105169 lo := float32 (100.0 )
106- upper := restapi.Altitude {Value : 200.0 , Reference : ReferenceW84 , Units : UnitsM }
107170 hi := float32 (200.0 )
108- invalid := restapi.Altitude {Value : 0 }
171+ restInvalid := & restapi.Altitude {Value : 0 }
109172
110173 testCases := []struct {
111174 name string
@@ -141,22 +204,22 @@ func TestVolume3DFromSCDRest(t *testing.T) {
141204 },
142205 {
143206 name : "Altitudes" ,
144- rest : & restapi.Volume3D {AltitudeLower : & lower , AltitudeUpper : & upper },
207+ rest : & restapi.Volume3D {AltitudeLower : newRestAlt ( lo ) , AltitudeUpper : newRestAlt ( hi ) },
145208 want : & Volume3D {AltitudeLo : & lo , AltitudeHi : & hi },
146209 },
147210 {
148211 name : "InvalidLowerAltitude" ,
149- rest : & restapi.Volume3D {AltitudeLower : & invalid },
212+ rest : & restapi.Volume3D {AltitudeLower : restInvalid },
150213 wantErr : true ,
151214 },
152215 {
153216 name : "InvalidUpperAltitude" ,
154- rest : & restapi.Volume3D {AltitudeUpper : & invalid },
217+ rest : & restapi.Volume3D {AltitudeUpper : restInvalid },
155218 wantErr : true ,
156219 },
157220 {
158221 name : "LowerAltitudeGreaterThanUpperAltitude" ,
159- rest : & restapi.Volume3D {AltitudeLower : & upper , AltitudeUpper : & lower },
222+ rest : & restapi.Volume3D {AltitudeLower : newRestAlt ( hi ) , AltitudeUpper : newRestAlt ( lo ) },
160223 wantErr : true ,
161224 },
162225 {
@@ -170,8 +233,9 @@ func TestVolume3DFromSCDRest(t *testing.T) {
170233 t .Run (testCase .name , func (t * testing.T ) {
171234 actual , err := Volume3DFromSCDRest (testCase .rest )
172235 if testCase .wantErr {
173- assert .Error (t , err )
236+ require .Error (t , err )
174237 } else {
238+ require .NoError (t , err )
175239 assert .Equal (t , testCase .want , actual )
176240 }
177241 })
0 commit comments