Download this file
| 1 | import XCTest |
| 2 | @testable import CalendarKit |
| 3 | final class CivilDateTests: XCTestCase { |
| 4 | @MainActor func testNewEventStartsAtNineAcrossDST() { |
| 5 | for day in ["2026-03-29", "2026-10-25"] { |
| 6 | let date=ISO8601DateFormatter().date(from: day+"T12:00:00Z")! |
| 7 | let model=CalendarModel(zone: "Europe/Dublin", date: date) |
| 8 | XCTAssertEqual(model.newEvent().start_local, day+"T09:00") |
| 9 | } |
| 10 | } |
| 11 | @MainActor func testGapCannotSilentlyBecomeToday() { |
| 12 | let model=CalendarModel(zone: "Europe/Dublin") |
| 13 | XCTAssertNil(model.parse("2026-03-29T01:30", allDay: false, zone: "Europe/Dublin")) |
| 14 | } |
| 15 | func testAllDayUsesOccurrenceCivilDatesAcrossZones() { |
| 16 | var event=CalendarEvent(); event.all_day=true |
| 17 | event.day_start="2026-09-12"; event.day_end="2026-09-13" |
| 18 | event.start_local="2026-09-01"; event.end_local="2026-09-02" // recurrence master must not win |
| 19 | event.tz="UTC"; event.start=1789171200; event.end=1789257600 |
| 20 | for zone in ["America/Los_Angeles", "Pacific/Kiritimati"] { |
| 21 | var calendar=Calendar(identifier: .gregorian);calendar.timeZone=TimeZone(identifier: zone)! |
| 22 | for day in [11,12,13] { |
| 23 | let date=calendar.date(from: DateComponents(year:2026,month:9,day:day,hour:12))! |
| 24 | XCTAssertEqual(event.occurs(on:date,calendar:calendar),day==12) |
| 25 | } |
| 26 | } |
| 27 | } |
| 28 | } |
| 29 | |