TM-SGNL-iOS/Signal/test/util/DateUtilTest.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

232 lines
13 KiB
Swift

//
// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import XCTest
import SignalServiceKit
class DateUtilTest: XCTestCase {
func buildDate(year: Int = 0,
month: Int = 0,
day: Int = 0,
hour: Int = 0,
minute: Int = 0,
second: Int = 0) -> Date {
let calendar = Calendar.current
let timeZone = TimeZone.current
let dateComponents = DateComponents(calendar: calendar,
timeZone: timeZone,
year: year,
month: month,
day: day,
hour: hour,
minute: minute,
second: second)
return calendar.date(from: dateComponents)!
}
func testDateComparison() {
let firstDate = Date()
let sameDate = Date(timeIntervalSinceReferenceDate: firstDate.timeIntervalSinceReferenceDate)
let laterDate = Date(timeIntervalSinceReferenceDate: firstDate.timeIntervalSinceReferenceDate + 1)
XCTAssertEqual(firstDate.timeIntervalSinceReferenceDate, sameDate.timeIntervalSinceReferenceDate)
XCTAssertNotEqual(firstDate.timeIntervalSinceReferenceDate, laterDate.timeIntervalSinceReferenceDate)
XCTAssertEqual(firstDate, sameDate)
XCTAssertNotEqual(firstDate, laterDate)
XCTAssertTrue(firstDate.timeIntervalSinceReferenceDate < laterDate.timeIntervalSinceReferenceDate)
XCTAssertFalse(firstDate.isBefore(sameDate))
XCTAssertTrue(firstDate.isBefore(laterDate))
XCTAssertFalse(laterDate.isBefore(firstDate))
XCTAssertFalse(firstDate.isAfter(sameDate))
XCTAssertFalse(firstDate.isAfter(laterDate))
XCTAssertTrue(laterDate.isAfter(firstDate))
}
func testDateComparators() {
// Use a specific reference date to make this test deterministic,
// and to avoid failing around midnight, new year's, etc.
var nowDateComponents = DateComponents()
nowDateComponents.year = 2015
nowDateComponents.month = 8
nowDateComponents.day = 31
nowDateComponents.hour = 8
let now = Calendar.current.date(from: nowDateComponents)!
let formatter = DateFormatter()
formatter.dateStyle = .long
formatter.timeStyle = .long
Logger.info("now: \(formatter.string(from: now))")
let oneSecondAgo =
Date(timeIntervalSinceReferenceDate: now.timeIntervalSinceReferenceDate - kSecondInterval)
let oneMinuteAgo =
Date(timeIntervalSinceReferenceDate: now.timeIntervalSinceReferenceDate - kMinuteInterval)
let oneDayAgo =
Date(timeIntervalSinceReferenceDate: now.timeIntervalSinceReferenceDate - kDayInterval)
let threeDaysAgo =
Date(timeIntervalSinceReferenceDate: now.timeIntervalSinceReferenceDate - kDayInterval * 3)
let tenDaysAgo =
Date(timeIntervalSinceReferenceDate: now.timeIntervalSinceReferenceDate - kDayInterval * 10)
let oneYearAgo =
Date(timeIntervalSinceReferenceDate: now.timeIntervalSinceReferenceDate - kYearInterval)
let twoYearsAgo =
Date(timeIntervalSinceReferenceDate: now.timeIntervalSinceReferenceDate - kYearInterval * 2)
let oneSecondAhead =
Date(timeIntervalSinceReferenceDate: now.timeIntervalSinceReferenceDate + kSecondInterval)
let oneMinuteAhead =
Date(timeIntervalSinceReferenceDate: now.timeIntervalSinceReferenceDate + kMinuteInterval)
let oneDayAhead =
Date(timeIntervalSinceReferenceDate: now.timeIntervalSinceReferenceDate + kDayInterval)
let threeDaysAhead =
Date(timeIntervalSinceReferenceDate: now.timeIntervalSinceReferenceDate + kDayInterval * 3)
let tenDaysAhead =
Date(timeIntervalSinceReferenceDate: now.timeIntervalSinceReferenceDate + kDayInterval * 10)
let oneYearAhead =
Date(timeIntervalSinceReferenceDate: now.timeIntervalSinceReferenceDate + kYearInterval)
let twoYearsAhead =
Date(timeIntervalSinceReferenceDate: now.timeIntervalSinceReferenceDate + kYearInterval * 2)
Logger.info("oneSecondAgo: \(formatter.string(from: oneSecondAgo))")
XCTAssertTrue(DateUtil.dateIsToday(oneSecondAgo, now: now))
XCTAssertTrue(DateUtil.dateIsToday(oneMinuteAgo, now: now))
XCTAssertFalse(DateUtil.dateIsToday(oneDayAgo, now: now))
XCTAssertFalse(DateUtil.dateIsToday(threeDaysAgo, now: now))
XCTAssertFalse(DateUtil.dateIsToday(tenDaysAgo, now: now))
XCTAssertFalse(DateUtil.dateIsToday(oneYearAgo, now: now))
XCTAssertFalse(DateUtil.dateIsToday(twoYearsAgo, now: now))
XCTAssertTrue(DateUtil.dateIsToday(oneSecondAhead, now: now))
XCTAssertTrue(DateUtil.dateIsToday(oneMinuteAhead, now: now))
XCTAssertFalse(DateUtil.dateIsToday(oneDayAhead, now: now))
XCTAssertFalse(DateUtil.dateIsToday(threeDaysAhead, now: now))
XCTAssertFalse(DateUtil.dateIsToday(tenDaysAhead, now: now))
XCTAssertFalse(DateUtil.dateIsToday(oneYearAhead, now: now))
XCTAssertFalse(DateUtil.dateIsToday(twoYearsAhead, now: now))
XCTAssertFalse(DateUtil.dateIsYesterday(oneSecondAgo, now: now))
XCTAssertFalse(DateUtil.dateIsYesterday(oneMinuteAgo, now: now))
XCTAssertTrue(DateUtil.dateIsYesterday(oneDayAgo, now: now))
XCTAssertFalse(DateUtil.dateIsYesterday(threeDaysAgo, now: now))
XCTAssertFalse(DateUtil.dateIsYesterday(tenDaysAgo, now: now))
XCTAssertFalse(DateUtil.dateIsYesterday(oneYearAgo, now: now))
XCTAssertFalse(DateUtil.dateIsYesterday(twoYearsAgo, now: now))
XCTAssertFalse(DateUtil.dateIsYesterday(oneSecondAhead, now: now))
XCTAssertFalse(DateUtil.dateIsYesterday(oneMinuteAhead, now: now))
XCTAssertFalse(DateUtil.dateIsYesterday(oneDayAhead, now: now))
XCTAssertFalse(DateUtil.dateIsYesterday(threeDaysAhead, now: now))
XCTAssertFalse(DateUtil.dateIsYesterday(tenDaysAhead, now: now))
XCTAssertFalse(DateUtil.dateIsYesterday(oneYearAhead, now: now))
XCTAssertFalse(DateUtil.dateIsYesterday(twoYearsAhead, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanToday(oneSecondAgo, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanToday(oneMinuteAgo, now: now))
XCTAssertTrue(DateUtil.dateIsOlderThanToday(oneDayAgo, now: now))
XCTAssertTrue(DateUtil.dateIsOlderThanToday(threeDaysAgo, now: now))
XCTAssertTrue(DateUtil.dateIsOlderThanToday(tenDaysAgo, now: now))
XCTAssertTrue(DateUtil.dateIsOlderThanToday(oneYearAgo, now: now))
XCTAssertTrue(DateUtil.dateIsOlderThanToday(twoYearsAgo, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanToday(oneSecondAhead, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanToday(oneMinuteAhead, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanToday(oneDayAhead, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanToday(threeDaysAhead, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanToday(tenDaysAhead, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanToday(oneYearAhead, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanToday(twoYearsAhead, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanOneWeek(oneSecondAgo, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanOneWeek(oneMinuteAgo, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanOneWeek(oneDayAgo, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanOneWeek(threeDaysAgo, now: now))
XCTAssertTrue(DateUtil.dateIsOlderThanOneWeek(tenDaysAgo, now: now))
XCTAssertTrue(DateUtil.dateIsOlderThanOneWeek(oneYearAgo, now: now))
XCTAssertTrue(DateUtil.dateIsOlderThanOneWeek(twoYearsAgo, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanOneWeek(oneSecondAhead, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanOneWeek(oneMinuteAhead, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanOneWeek(oneDayAhead, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanOneWeek(threeDaysAhead, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanOneWeek(tenDaysAhead, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanOneWeek(oneYearAhead, now: now))
XCTAssertFalse(DateUtil.dateIsOlderThanOneWeek(twoYearsAhead, now: now))
XCTAssertTrue(DateUtil.dateIsThisYear(oneSecondAgo, now: now))
XCTAssertTrue(DateUtil.dateIsThisYear(oneMinuteAgo, now: now))
XCTAssertTrue(DateUtil.dateIsThisYear(oneDayAgo, now: now))
XCTAssertFalse(DateUtil.dateIsThisYear(oneYearAgo, now: now))
XCTAssertFalse(DateUtil.dateIsThisYear(twoYearsAgo, now: now))
XCTAssertTrue(DateUtil.dateIsThisYear(oneSecondAhead, now: now))
XCTAssertTrue(DateUtil.dateIsThisYear(oneMinuteAhead, now: now))
XCTAssertTrue(DateUtil.dateIsThisYear(oneDayAhead, now: now))
XCTAssertFalse(DateUtil.dateIsThisYear(oneYearAhead, now: now))
XCTAssertFalse(DateUtil.dateIsThisYear(twoYearsAhead, now: now))
}
func testDateComparators_timezoneVMidnight () {
let formatter = DateFormatter()
formatter.dateStyle = .long
formatter.timeStyle = .long
let yesterdayBeforeMidnight = buildDate(year: 2015, month: 8, day: 10, hour: 23, minute: 55)
Logger.info("yesterdayBeforeMidnight: \(formatter.string(from: yesterdayBeforeMidnight))")
let todayAfterMidnight = buildDate(year: 2015, month: 8, day: 11, hour: 0, minute: 5)
Logger.info("todayAfterMidnight: \(formatter.string(from: todayAfterMidnight))")
let todayNoon = buildDate(year: 2015, month: 8, day: 11, hour: 12, minute: 0)
Logger.info("todayNoon: \(formatter.string(from: todayNoon))")
// Before Midnight, after Midnight.
XCTAssertFalse(DateUtil.dateIsToday(yesterdayBeforeMidnight, now: todayAfterMidnight))
XCTAssertTrue(DateUtil.dateIsYesterday(yesterdayBeforeMidnight, now: todayAfterMidnight))
XCTAssertTrue(DateUtil.dateIsOlderThanToday(yesterdayBeforeMidnight, now: todayAfterMidnight))
XCTAssertFalse(DateUtil.dateIsOlderThanOneWeek(yesterdayBeforeMidnight, now: todayAfterMidnight))
XCTAssertTrue(DateUtil.dateIsThisYear(yesterdayBeforeMidnight, now: todayAfterMidnight))
// Before Midnight, noon.
XCTAssertFalse(DateUtil.dateIsToday(yesterdayBeforeMidnight, now: todayNoon))
XCTAssertTrue(DateUtil.dateIsYesterday(yesterdayBeforeMidnight, now: todayNoon))
XCTAssertTrue(DateUtil.dateIsOlderThanToday(yesterdayBeforeMidnight, now: todayNoon))
XCTAssertFalse(DateUtil.dateIsOlderThanOneWeek(yesterdayBeforeMidnight, now: todayNoon))
XCTAssertTrue(DateUtil.dateIsThisYear(yesterdayBeforeMidnight, now: todayNoon))
// After Midnight, noon.
XCTAssertTrue(DateUtil.dateIsToday(todayAfterMidnight, now: todayNoon))
XCTAssertFalse(DateUtil.dateIsYesterday(todayAfterMidnight, now: todayNoon))
XCTAssertFalse(DateUtil.dateIsOlderThanToday(todayAfterMidnight, now: todayNoon))
XCTAssertFalse(DateUtil.dateIsOlderThanOneWeek(todayAfterMidnight, now: todayNoon))
XCTAssertTrue(DateUtil.dateIsThisYear(todayAfterMidnight, now: todayNoon))
}
func testDaysFrom() {
let date1 = buildDate(year: 2017, month: 5, day: 17, hour: 19, minute: 37, second: 23)
let date2 = buildDate(year: 2017, month: 5, day: 17, hour: 0, minute: 1, second: 2)
let date3 = buildDate(year: 2017, month: 5, day: 16, hour: 0, minute: 1, second: 2)
let date4 = buildDate(year: 2017, month: 5, day: 18, hour: 0, minute: 1, second: 2)
XCTAssertEqual(0, DateUtil.daysFrom(firstDate: date1, toSecondDate: date2))
XCTAssertEqual(-1, DateUtil.daysFrom(firstDate: date1, toSecondDate: date3))
XCTAssertEqual(+1, DateUtil.daysFrom(firstDate: date3, toSecondDate: date1))
XCTAssertEqual(+1, DateUtil.daysFrom(firstDate: date1, toSecondDate: date4))
XCTAssertEqual(-1, DateUtil.daysFrom(firstDate: date4, toSecondDate: date1))
}
func testFastDaysFrom() {
let referenceDate = buildDate(year: 2021, month: 9, day: 6, hour: 13, minute: 08, second: 5)
let date1 = buildDate(year: 2017, month: 5, day: 17, hour: 19, minute: 37, second: 23)
let date2 = buildDate(year: 2017, month: 5, day: 17, hour: 0, minute: 1, second: 2)
let date3 = buildDate(year: 2017, month: 5, day: 16, hour: 5, minute: 31, second: 13)
let date4 = buildDate(year: 2017, month: 5, day: 18, hour: 23, minute: 51, second: 34)
XCTAssertEqual(1573, DateUtil.daysFrom(firstDate: date1, toSecondDate: referenceDate))
XCTAssertEqual(1573, DateUtil.daysFrom(firstDate: date2, toSecondDate: referenceDate))
XCTAssertEqual(1574, DateUtil.daysFrom(firstDate: date3, toSecondDate: referenceDate))
XCTAssertEqual(1572, DateUtil.daysFrom(firstDate: date4, toSecondDate: referenceDate))
}
}