@@ -233,15 +233,53 @@ struct UsageDTOTests {
233233 #expect ( state . state ( for : id , on : date ( " 2026-03-15T05:00:00-04:00 " ) , period : later ) == . under )
234234 }
235235
236- @ Test func movingTheResetEarlierCannotRefundASpentRecord ( ) {
236+ @ Test func movingTheResetEarlierReleasesASpentRecordAtTheNewReset ( ) {
237237 let noon = date ( " 2026-03-14T12:00:00-04:00 " )
238238 let later = newYorkPeriod ( resetAt : 4 )
239239 let state = UsageDayStateDTO
240240 . fresh ( on : noon , period : later )
241241 . recording ( . reached , for : id , on : noon , period : later )
242+ . moving ( from : later , to : nyPeriod , on : noon + . hours ( 1 ) )
242243
243- #expect ( state . state ( for : id , on : date ( " 2026-03-15T01:00:00-04:00 " ) , period : nyPeriod ) == . reached )
244- #expect ( state . state ( for : id , on : date ( " 2026-03-15T09:00:00-04:00 " ) , period : nyPeriod ) == . under )
244+ #expect ( state . state ( for : id , on : date ( " 2026-03-14T23:00:00-04:00 " ) , period : nyPeriod ) == . reached )
245+ #expect ( state . state ( for : id , on : date ( " 2026-03-15T00:30:00-04:00 " ) , period : nyPeriod ) == . under )
246+ }
247+
248+ @ Test func movingTheResetPastTheCurrentTimeReleasesASpentRecordAtTheNewReset ( ) {
249+ let spentAt = date ( " 2026-03-14T15:00:00-04:00 " )
250+ let later = newYorkPeriod ( resetAt : 16 )
251+ let state = UsageDayStateDTO
252+ . fresh ( on : spentAt , period : nyPeriod )
253+ . recording ( . reached , for : id , on : spentAt , period : nyPeriod )
254+ . moving ( from : nyPeriod , to : later , on : date ( " 2026-03-14T15:30:00-04:00 " ) )
255+
256+ #expect ( state . state ( for : id , on : date ( " 2026-03-14T15:59:00-04:00 " ) , period : later ) == . reached )
257+ #expect ( state . state ( for : id , on : date ( " 2026-03-14T16:01:00-04:00 " ) , period : later ) == . under )
258+ }
259+
260+ @ Test func movingTheResetDoesNotReviveAnExpiredRecord ( ) {
261+ let yesterday = date ( " 2026-03-13T12:00:00-04:00 " )
262+ let now = date ( " 2026-03-14T15:30:00-04:00 " )
263+ let later = newYorkPeriod ( resetAt : 16 )
264+ let state = UsageDayStateDTO
265+ . fresh ( on : yesterday , period : nyPeriod )
266+ . recording ( . reached , for : id , on : yesterday , period : nyPeriod )
267+ . moving ( from : nyPeriod , to : later , on : now )
268+
269+ #expect ( state . state ( for : id , on : now , period : later ) == . under )
270+ }
271+
272+ @ Test func movingTheResetKeepsTheOverride ( ) {
273+ let noon = date ( " 2026-03-14T12:00:00-04:00 " )
274+ let later = newYorkPeriod ( resetAt : 16 )
275+ let state = UsageDayStateDTO
276+ . fresh ( on : noon , period : nyPeriod )
277+ . overriding ( on : noon , period : nyPeriod )
278+ . moving ( from : nyPeriod , to : later , on : noon )
279+
280+ #expect ( state . isOverridden )
281+ #expect ( state . isStale ( on : date ( " 2026-03-14T15:59:00-04:00 " ) , period : later ) == false )
282+ #expect ( state . isStale ( on : date ( " 2026-03-14T16:01:00-04:00 " ) , period : later ) )
245283 }
246284
247285 @ Test func aReportClaimingMoreUseThanTimeSinceTheResetIsImplausible ( ) {
0 commit comments