test(09-01): add timezone boundary tests for date range filtering

- Tests game at range start in different timezone (included)
- Tests game before range start in different timezone (excluded)
- Tests game at range end in different timezone (included)
- Tests game after range end in different timezone (excluded)

All tests pass - DateInterval.contains() correctly handles timezone boundaries.
This commit is contained in:
Trey t
2026-01-10 12:48:26 -06:00
parent 72a846e75b
commit 9ec2a06b7a

View File

@@ -669,4 +669,202 @@ struct ScenarioAPlannerSwiftTests {
#expect(option.isValid)
}
}
// MARK: - Timezone Boundary Tests
@Test("game at range start in different timezone is included")
func plan_GameAtRangeStartDifferentTimezone_Included() {
// Date range: Jan 5 00:00 PST to Jan 10 23:59 PST
let pstCalendar = Calendar.current
var pstComponents = DateComponents()
pstComponents.year = 2026
pstComponents.month = 1
pstComponents.day = 5
pstComponents.hour = 0
pstComponents.minute = 0
pstComponents.timeZone = TimeZone(identifier: "America/Los_Angeles")!
let rangeStart = pstCalendar.date(from: pstComponents)!
var endComponents = DateComponents()
endComponents.year = 2026
endComponents.month = 1
endComponents.day = 10
endComponents.hour = 23
endComponents.minute = 59
endComponents.timeZone = TimeZone(identifier: "America/Los_Angeles")!
let rangeEnd = pstCalendar.date(from: endComponents)!
let dateRange = DateInterval(start: rangeStart, end: rangeEnd)
// Game: Jan 5 19:00 EST (New York) = Jan 5 16:00 PST
let nyStadium = makeStadium(city: "New York", latitude: 40.7128, longitude: -74.0060)
var estComponents = DateComponents()
estComponents.year = 2026
estComponents.month = 1
estComponents.day = 5
estComponents.hour = 19
estComponents.minute = 0
estComponents.timeZone = TimeZone(identifier: "America/New_York")!
let gameTime = pstCalendar.date(from: estComponents)!
let game = makeGame(stadiumId: nyStadium.id, dateTime: gameTime)
let result = plan(
games: [game],
stadiums: [nyStadium],
dateRange: dateRange
)
// Game should be included (within PST range)
#expect(result.isSuccess)
#expect(result.options.first?.stops.count == 1)
}
@Test("game just before range start in different timezone is excluded")
func plan_GameBeforeRangeStartDifferentTimezone_Excluded() {
// Date range: Jan 5 00:00 PST to Jan 10 23:59 PST
let pstCalendar = Calendar.current
var pstComponents = DateComponents()
pstComponents.year = 2026
pstComponents.month = 1
pstComponents.day = 5
pstComponents.hour = 0
pstComponents.minute = 0
pstComponents.timeZone = TimeZone(identifier: "America/Los_Angeles")!
let rangeStart = pstCalendar.date(from: pstComponents)!
var endComponents = DateComponents()
endComponents.year = 2026
endComponents.month = 1
endComponents.day = 10
endComponents.hour = 23
endComponents.minute = 59
endComponents.timeZone = TimeZone(identifier: "America/Los_Angeles")!
let rangeEnd = pstCalendar.date(from: endComponents)!
let dateRange = DateInterval(start: rangeStart, end: rangeEnd)
// Game: Jan 4 22:00 EST (New York) = Jan 4 19:00 PST
let nyStadium = makeStadium(city: "New York", latitude: 40.7128, longitude: -74.0060)
var estComponents = DateComponents()
estComponents.year = 2026
estComponents.month = 1
estComponents.day = 4
estComponents.hour = 22
estComponents.minute = 0
estComponents.timeZone = TimeZone(identifier: "America/New_York")!
let gameTime = pstCalendar.date(from: estComponents)!
let game = makeGame(stadiumId: nyStadium.id, dateTime: gameTime)
let result = plan(
games: [game],
stadiums: [nyStadium],
dateRange: dateRange
)
// Game should be excluded (before PST range start)
#expect(result.failure?.reason == .noGamesInRange)
}
@Test("game at range end in different timezone is included")
func plan_GameAtRangeEndDifferentTimezone_Included() {
// Date range: Jan 5 00:00 PST to Jan 10 23:59 PST
let pstCalendar = Calendar.current
var pstComponents = DateComponents()
pstComponents.year = 2026
pstComponents.month = 1
pstComponents.day = 5
pstComponents.hour = 0
pstComponents.minute = 0
pstComponents.timeZone = TimeZone(identifier: "America/Los_Angeles")!
let rangeStart = pstCalendar.date(from: pstComponents)!
var endComponents = DateComponents()
endComponents.year = 2026
endComponents.month = 1
endComponents.day = 10
endComponents.hour = 23
endComponents.minute = 59
endComponents.timeZone = TimeZone(identifier: "America/Los_Angeles")!
let rangeEnd = pstCalendar.date(from: endComponents)!
let dateRange = DateInterval(start: rangeStart, end: rangeEnd)
// Game: Jan 10 21:00 EST (New York) = Jan 10 18:00 PST
let nyStadium = makeStadium(city: "New York", latitude: 40.7128, longitude: -74.0060)
var estComponents = DateComponents()
estComponents.year = 2026
estComponents.month = 1
estComponents.day = 10
estComponents.hour = 21
estComponents.minute = 0
estComponents.timeZone = TimeZone(identifier: "America/New_York")!
let gameTime = pstCalendar.date(from: estComponents)!
let game = makeGame(stadiumId: nyStadium.id, dateTime: gameTime)
let result = plan(
games: [game],
stadiums: [nyStadium],
dateRange: dateRange
)
// Game should be included (within PST range)
#expect(result.isSuccess)
#expect(result.options.first?.stops.count == 1)
}
@Test("game just after range end in different timezone is excluded")
func plan_GameAfterRangeEndDifferentTimezone_Excluded() {
// Date range: Jan 5 00:00 PST to Jan 10 23:59 PST
let pstCalendar = Calendar.current
var pstComponents = DateComponents()
pstComponents.year = 2026
pstComponents.month = 1
pstComponents.day = 5
pstComponents.hour = 0
pstComponents.minute = 0
pstComponents.timeZone = TimeZone(identifier: "America/Los_Angeles")!
let rangeStart = pstCalendar.date(from: pstComponents)!
var endComponents = DateComponents()
endComponents.year = 2026
endComponents.month = 1
endComponents.day = 10
endComponents.hour = 23
endComponents.minute = 59
endComponents.timeZone = TimeZone(identifier: "America/Los_Angeles")!
let rangeEnd = pstCalendar.date(from: endComponents)!
let dateRange = DateInterval(start: rangeStart, end: rangeEnd)
// Game: Jan 11 02:00 EST (New York) = Jan 10 23:00 PST
// This is actually WITHIN the range (before 23:59 PST)
// Let me adjust: Jan 11 03:00 EST = Jan 11 00:00 PST (after range)
let nyStadium = makeStadium(city: "New York", latitude: 40.7128, longitude: -74.0060)
var estComponents = DateComponents()
estComponents.year = 2026
estComponents.month = 1
estComponents.day = 11
estComponents.hour = 3
estComponents.minute = 0
estComponents.timeZone = TimeZone(identifier: "America/New_York")!
let gameTime = pstCalendar.date(from: estComponents)!
let game = makeGame(stadiumId: nyStadium.id, dateTime: gameTime)
let result = plan(
games: [game],
stadiums: [nyStadium],
dateRange: dateRange
)
// Game should be excluded (after PST range end)
#expect(result.failure?.reason == .noGamesInRange)
}
}