@@ -3,6 +3,9 @@ package pkg
33import (
44 "encoding/json"
55 "testing"
6+ "time"
7+
8+ "github.com/stretchr/testify/assert"
69)
710
811func TestLightStateString (t * testing.T ) {
@@ -138,3 +141,117 @@ func TestLightStateMarshal(t *testing.T) {
138141 }
139142 })
140143}
144+
145+ func TestNextChange (t * testing.T ) {
146+ tests := []struct {
147+ name string
148+ ls LightSchedule
149+ currentTime time.Time
150+ expectedTime time.Time
151+ expectedState LightState
152+ }{
153+ {
154+ name : "OnInOneHour" ,
155+ ls : LightSchedule {
156+ StartTime : & StartTime {Time : time .Date (0 , 0 , 0 , 13 , 0 , 0 , 0 , time .UTC )},
157+ Duration : & Duration {Duration : 12 * time .Hour },
158+ },
159+ currentTime : time .Date (2025 , time .November , 8 , 12 , 0 , 0 , 0 , time .UTC ),
160+ expectedTime : time .Date (2025 , time .November , 8 , 13 , 0 , 0 , 0 , time .UTC ),
161+ expectedState : LightStateOn ,
162+ },
163+ {
164+ name : "OffInElevenHours" ,
165+ ls : LightSchedule {
166+ StartTime : & StartTime {Time : time .Date (0 , 0 , 0 , 13 , 0 , 0 , 0 , time .UTC )},
167+ Duration : & Duration {Duration : 12 * time .Hour },
168+ },
169+ currentTime : time .Date (2025 , time .November , 8 , 14 , 0 , 0 , 0 , time .UTC ),
170+ expectedTime : time .Date (2025 , time .November , 9 , 1 , 0 , 0 , 0 , time .UTC ),
171+ expectedState : LightStateOff ,
172+ },
173+ {
174+ name : "TurnedOnYesterdayAndTurnsOffLater" ,
175+ ls : LightSchedule {
176+ StartTime : & StartTime {Time : time .Date (0 , 0 , 0 , 20 , 0 , 0 , 0 , time .UTC )},
177+ Duration : & Duration {Duration : 12 * time .Hour },
178+ },
179+ currentTime : time .Date (2025 , time .November , 8 , 6 , 0 , 0 , 0 , time .UTC ),
180+ expectedTime : time .Date (2025 , time .November , 8 , 8 , 0 , 0 , 0 , time .UTC ),
181+ expectedState : LightStateOff ,
182+ },
183+ {
184+ // Light turns on at 7AM and off at 7PM. It is currently 10PM, so it will turn on tomorrow morning
185+ name : "TurnsOnAgainTomorrow" ,
186+ ls : LightSchedule {
187+ StartTime : & StartTime {Time : time .Date (0 , 0 , 0 , 0o7 , 0 , 0 , 0 , time .UTC )},
188+ Duration : & Duration {Duration : 12 * time .Hour },
189+ },
190+ currentTime : time .Date (2023 , time .November , 8 , 22 , 0 , 0 , 0 , time .UTC ),
191+ expectedTime : time .Date (2023 , time .November , 9 , 0o7 , 0 , 0 , 0 , time .UTC ),
192+ expectedState : LightStateOn ,
193+ },
194+ }
195+
196+ for _ , tt := range tests {
197+ t .Run (tt .name , func (t * testing.T ) {
198+ nextTime , nextState := tt .ls .NextChange (tt .currentTime )
199+ assert .Equal (t , tt .expectedTime , nextTime )
200+ assert .Equal (t , tt .expectedState , nextState )
201+ })
202+ }
203+ }
204+
205+ func TestExpectedStateAtTime (t * testing.T ) {
206+ tests := []struct {
207+ name string
208+ ls LightSchedule
209+ currentTime time.Time
210+ expectedState LightState
211+ }{
212+ {
213+ name : "OnInOneHour_CurrentlyOff" ,
214+ ls : LightSchedule {
215+ StartTime : & StartTime {Time : time .Date (0 , 0 , 0 , 13 , 0 , 0 , 0 , time .UTC )},
216+ Duration : & Duration {Duration : 12 * time .Hour },
217+ },
218+ currentTime : time .Date (2025 , time .November , 8 , 12 , 0 , 0 , 0 , time .UTC ),
219+ expectedState : LightStateOff ,
220+ },
221+ {
222+ name : "OffInElevenHours_CurrentlyOn" ,
223+ ls : LightSchedule {
224+ StartTime : & StartTime {Time : time .Date (0 , 0 , 0 , 13 , 0 , 0 , 0 , time .UTC )},
225+ Duration : & Duration {Duration : 12 * time .Hour },
226+ },
227+ currentTime : time .Date (2025 , time .November , 8 , 14 , 0 , 0 , 0 , time .UTC ),
228+ expectedState : LightStateOn ,
229+ },
230+ {
231+ name : "TurnedOnYesterdayAndTurnsOffLater_CurrentlyOn" ,
232+ ls : LightSchedule {
233+ StartTime : & StartTime {Time : time .Date (0 , 0 , 0 , 20 , 0 , 0 , 0 , time .UTC )},
234+ Duration : & Duration {Duration : 12 * time .Hour },
235+ },
236+ currentTime : time .Date (2025 , time .November , 8 , 6 , 0 , 0 , 0 , time .UTC ),
237+ expectedState : LightStateOn ,
238+ },
239+ {
240+ // Light runs from 5PM to 5AM and it is currently 8AM
241+ name : "CurrentlyOff" ,
242+ ls : LightSchedule {
243+ StartTime : & StartTime {Time : time .Date (0 , 0 , 0 , 17 , 0 , 0 , 0 , time .UTC )},
244+ Duration : & Duration {Duration : 12 * time .Hour },
245+ },
246+ currentTime : time .Date (2025 , time .November , 9 , 8 , 0 , 0 , 0 , time .UTC ),
247+ expectedState : LightStateOff ,
248+ },
249+ }
250+
251+ for _ , tt := range tests {
252+ t .Run (tt .name , func (t * testing.T ) {
253+ currentState := tt .ls .ExpectedStateAtTime (tt .currentTime )
254+ assert .Equal (t , tt .expectedState , currentState )
255+ })
256+ }
257+ }
0 commit comments