From 97de1770e547c507b402efbbf418e86dccd84dbc Mon Sep 17 00:00:00 2001 From: sakamossan Date: Thu, 17 Sep 2026 09:14:09 +0900 Subject: [PATCH] Use a Gregorian calendar for --due-date components EKReminder.dueDateComponents only accepts DateComponents whose calendar is Gregorian or nil. Calendar.current follows the user's calendar setting, so with e.g. the Japanese calendar every --due-date aborted with 'Calendar must be nil or Gregorian'. Build the test expectations with a Gregorian calendar as well so the tests don't depend on the machine's calendar setting. --- .../RemindersLibrary/NaturalLanguage.swift | 2 +- .../RemindersTests/NaturalLanguageTests.swift | 44 +++++++++++-------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/Sources/RemindersLibrary/NaturalLanguage.swift b/Sources/RemindersLibrary/NaturalLanguage.swift index b9f9baf..41ef53a 100644 --- a/Sources/RemindersLibrary/NaturalLanguage.swift +++ b/Sources/RemindersLibrary/NaturalLanguage.swift @@ -1,7 +1,7 @@ import ArgumentParser import Foundation -private let calendar = Calendar.current +private let calendar = Calendar(identifier: .gregorian) private let allComponents: Set = [ .era, .year, .yearForWeekOfYear, .quarter, .month, .weekOfYear, .weekOfMonth, .weekday, .weekdayOrdinal, .day, diff --git a/Tests/RemindersTests/NaturalLanguageTests.swift b/Tests/RemindersTests/NaturalLanguageTests.swift index 1ccda53..b7f7fdd 100644 --- a/Tests/RemindersTests/NaturalLanguageTests.swift +++ b/Tests/RemindersTests/NaturalLanguageTests.swift @@ -3,10 +3,12 @@ import Foundation import XCTest final class NaturalLanguageTests: XCTestCase { + private let calendar = Calendar(identifier: .gregorian) + func testYesterday() throws { let components = try XCTUnwrap(DateComponents(argument: "yesterday")) - let tomorrow = try XCTUnwrap(Calendar.current.date(byAdding: .day, value: -1, to: Date())) - let expectedComponents = Calendar.current.dateComponents( + let tomorrow = try XCTUnwrap(calendar.date(byAdding: .day, value: -1, to: Date())) + let expectedComponents = calendar.dateComponents( calendarComponents(except: timeComponents), from: tomorrow) XCTAssertEqual(components, expectedComponents) @@ -14,7 +16,7 @@ final class NaturalLanguageTests: XCTestCase { func testTodayString() throws { let components = try XCTUnwrap(DateComponents(argument: "today")) - let expectedComponents = Calendar.current.dateComponents( + let expectedComponents = calendar.dateComponents( calendarComponents(except: timeComponents), from: Date()) XCTAssertEqual(components, expectedComponents) @@ -22,43 +24,49 @@ final class NaturalLanguageTests: XCTestCase { func testTodayNoon() throws { let components = try XCTUnwrap(DateComponents(argument: "12:00")) - let today = try XCTUnwrap(Calendar.current.date(bySettingHour: 12, minute: 0, second: 0, of: Date())) - let expectedComponents = Calendar.current.dateComponents(calendarComponents(), from: today) + let today = try XCTUnwrap(calendar.date(bySettingHour: 12, minute: 0, second: 0, of: Date())) + let expectedComponents = calendar.dateComponents(calendarComponents(), from: today) XCTAssertEqual(components, expectedComponents) } func testTonight() throws { let components = try XCTUnwrap(DateComponents(argument: "tonight")) - let today = try XCTUnwrap(Calendar.current.date(bySettingHour: 19, minute: 0, second: 0, of: Date())) - let expectedComponents = Calendar.current.dateComponents(calendarComponents(), from: today) + let today = try XCTUnwrap(calendar.date(bySettingHour: 19, minute: 0, second: 0, of: Date())) + let expectedComponents = calendar.dateComponents(calendarComponents(), from: today) XCTAssertEqual(components, expectedComponents) } func testTomorrow() throws { let components = try XCTUnwrap(DateComponents(argument: "tomorrow")) - let tomorrow = try XCTUnwrap(Calendar.current.date(byAdding: .day, value: 1, to: Date())) - let expectedComponents = Calendar.current.dateComponents( + let tomorrow = try XCTUnwrap(calendar.date(byAdding: .day, value: 1, to: Date())) + let expectedComponents = calendar.dateComponents( calendarComponents(except: timeComponents), from: tomorrow) XCTAssertEqual(components, expectedComponents) } + func testUsesGregorianCalendar() throws { + let components = try XCTUnwrap(DateComponents(argument: "tomorrow")) + + XCTAssertEqual(components.calendar?.identifier, .gregorian) + } + func testTomorrowAtTime() throws { let components = try XCTUnwrap(DateComponents(argument: "tomorrow 9pm")) - let tomorrow = try XCTUnwrap(Calendar.current.date(byAdding: .day, value: 1, to: Date())) + let tomorrow = try XCTUnwrap(calendar.date(byAdding: .day, value: 1, to: Date())) let tomorrowAt9 = try XCTUnwrap( - Calendar.current.date(bySettingHour: 21, minute: 0, second: 0, of: tomorrow)) - let expectedComponents = Calendar.current.dateComponents(calendarComponents(), from: tomorrowAt9) + calendar.date(bySettingHour: 21, minute: 0, second: 0, of: tomorrow)) + let expectedComponents = calendar.dateComponents(calendarComponents(), from: tomorrowAt9) XCTAssertEqual(components, expectedComponents) } func testRelativeDayCount() throws { let components = try XCTUnwrap(DateComponents(argument: "in 2 days")) - let tomorrow = try XCTUnwrap(Calendar.current.date(byAdding: .day, value: 2, to: Date())) - let expectedComponents = Calendar.current.dateComponents( + let tomorrow = try XCTUnwrap(calendar.date(byAdding: .day, value: 2, to: Date())) + let expectedComponents = calendar.dateComponents( calendarComponents(except: timeComponents), from: tomorrow) XCTAssertEqual(components, expectedComponents) @@ -66,9 +74,9 @@ final class NaturalLanguageTests: XCTestCase { func testNextSaturday() throws { let components = try XCTUnwrap(DateComponents(argument: "next saturday")) - let date = try XCTUnwrap(Calendar.current.date(from: components)) + let date = try XCTUnwrap(calendar.date(from: components)) - XCTAssertTrue(Calendar.current.isDateInWeekend(date)) + XCTAssertTrue(calendar.isDateInWeekend(date)) } // FB8921206 @@ -76,9 +84,9 @@ final class NaturalLanguageTests: XCTestCase { // TODO: This should be inverted but DataDetector doesn't support it right now XCTAssertNil(DateComponents(argument: "next weekend")) // let components = try XCTUnwrap(DateComponents(argument: "next weekend")) - // let date = try XCTUnwrap(Calendar.current.date(from: components)) + // let date = try XCTUnwrap(calendar.date(from: components)) - // XCTAssertTrue(Calendar.current.isDateInWeekend(date)) + // XCTAssertTrue(calendar.isDateInWeekend(date)) } func testSpecificDays() throws {