89 lines
4.6 KiB
Swift
89 lines
4.6 KiB
Swift
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")
|
|
}
|
|
}
|