import Foundation @main enum UserCreatorChatDatePresentationCheck { static var assertions = 0 static func check(_ condition: Bool, _ message: String) { guard condition else { print("FAIL: \(message)"); exit(1) } assertions += 1 } static func checkTitles(for date: Date, calendar: Calendar, timeZone: TimeZone, expected: [String], label: String) { for (localeID, expectedTitle) in zip(["ko_KR", "en_US", "ja_JP"], expected) { let title = UserCreatorChatDatePresentation.title( for: date, locale: Locale(identifier: localeID), calendar: calendar, timeZone: timeZone ) check(title == expectedTitle, "\(label) \(localeID): expected '\(expectedTitle)', got '\(title)'") } } static func main() { let utc = TimeZone(secondsFromGMT: 0)! let seoul = TimeZone(identifier: "Asia/Seoul")! let losAngeles = TimeZone(identifier: "America/Los_Angeles")! var calendar = Calendar(identifier: .gregorian) calendar.timeZone = utc var seoulCalendar = calendar seoulCalendar.timeZone = seoul var losAngelesCalendar = calendar losAngelesCalendar.timeZone = losAngeles let fixtures: [(label: String, timestamp: String, calendar: Calendar, timeZone: TimeZone, expected: [String])] = [ ("Gregorian UTC fixture", "2026-10-16T12:00:00Z", calendar, utc, ["2026년 10월 16일 금요일", "Friday, October 16, 2026", "2026年10月16日 金曜日"]), ("previous year", "2025-10-16T12:00:00Z", calendar, utc, ["2025년 10월 16일 목요일", "Thursday, October 16, 2025", "2025年10月16日 木曜日"]), ("UTC boundary", "2026-10-16T15:30:00Z", calendar, utc, ["2026년 10월 16일 금요일", "Friday, October 16, 2026", "2026年10月16日 金曜日"]), ("Seoul boundary in every app locale", "2026-10-16T15:30:00Z", seoulCalendar, seoul, ["2026년 10월 17일 토요일", "Saturday, October 17, 2026", "2026年10月17日 土曜日"]), ("Los Angeles boundary in every app locale", "2026-10-16T15:30:00Z", losAngelesCalendar, losAngeles, ["2026년 10월 16일 금요일", "Friday, October 16, 2026", "2026年10月16日 金曜日"]), ("Los Angeles calendar normalized to Seoul", "2026-10-16T15:30:00Z", losAngelesCalendar, seoul, ["2026년 10월 17일 토요일", "Saturday, October 17, 2026", "2026年10月17日 土曜日"]), ("Seoul calendar normalized to Los Angeles", "2026-10-16T15:30:00Z", seoulCalendar, losAngeles, ["2026년 10월 16일 금요일", "Friday, October 16, 2026", "2026年10月16日 金曜日"]) ] let isoFormatter = ISO8601DateFormatter() for fixture in fixtures { checkTitles( for: isoFormatter.date(from: fixture.timestamp)!, calendar: fixture.calendar, timeZone: fixture.timeZone, expected: fixture.expected, label: fixture.label ) } let englishMonths = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] let englishWeekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] let koreanWeekdays = ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"] let japaneseWeekdays = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"] let today = Date() let yesterday = calendar.date(byAdding: .day, value: -1, to: today)! for (label, date) in [("today without relative wording", today), ("yesterday without relative wording", yesterday)] { let components = calendar.dateComponents([.year, .month, .day, .weekday], from: date) let year = components.year! let month = components.month! let day = components.day! let weekday = components.weekday! - 1 checkTitles( for: date, calendar: calendar, timeZone: utc, expected: [ "\(year)년 \(month)월 \(day)일 \(koreanWeekdays[weekday])", "\(englishWeekdays[weekday]), \(englishMonths[month - 1]) \(day), \(year)", "\(year)年\(month)月\(day)日 \(japaneseWeekdays[weekday])" ], label: label ) } print("PASS: \(assertions) assertions") } }