Files
SwiftDate/Tests/SwiftDateTests/TestDateInRegion+Math.swift

122 lines
5.7 KiB
Swift

//
// SwiftDate
// Parse, validate, manipulate, and display dates, time and timezones in Swift
//
// Created by Daniele Margutti
// - Web: https://www.danielemargutti.com
// - Twitter: https://twitter.com/danielemargutti
// - Mail: hello@danielemargutti.com
//
// Copyright © 2019 Daniele Margutti. Licensed under MIT License.
//
import SwiftDate
import XCTest
class TestDateInRegion_Math: XCTestCase {
func testDateInRegion_DateTruncated() {
let format = "yyyy-MM-dd HH:mm:ss"
let rome = Region(calendar: Calendars.gregorian, zone: Zones.europeRome, locale: Locales.italian)
let d1 = DateInRegion("2017-07-22 15:03:50", format: format, region: rome)!
let d1_truncatedAt = d1.dateTruncated(at: [.month, .day, .minute])
let d1_truncatedFrom = d1.dateTruncated(from: .hour)
XCTAssert( d1_truncatedAt?.description == "{abs_date=\'2017-01-01T14:00:50Z\', rep_date=\'2017-01-01T15:00:50+01:00\', region={calendar=\'gregorian\', timezone=\'Europe/Rome\', locale=\'it\'}", "Failed to truncate date at components")
XCTAssert( d1_truncatedFrom?.description == "{abs_date=\'2017-07-21T22:00:00Z\', rep_date=\'2017-07-22T00:00:00+02:00\', region={calendar=\'gregorian\', timezone=\'Europe/Rome\', locale=\'it\'}", "Failed to truncate date from hour component")
}
func testDateInRegion_Rounding() {
let format = "yyyy-MM-dd HH:mm:ss"
let rome = Region(calendar: Calendars.gregorian, zone: Zones.europeRome, locale: Locales.italian)
// Round down 10m
let d1 = DateInRegion("2017-07-22 00:03:50", format: format, region: rome)
let d1_rounded = d1?.dateRoundedAt(.to10Mins)
XCTAssert( d1_rounded?.description == "{abs_date=\'2017-07-21T22:00:00Z\', rep_date=\'2017-07-22T00:00:00+02:00\', region={calendar=\'gregorian\', timezone=\'Europe/Rome\', locale=\'it\'}", "Failed to round a date down 10mins")
// Round up 10min
let d2 = DateInRegion("2015-01-24 15:07:20", format: format, region: rome)
let d2_roundedup10 = d2?.dateRoundedAt(.to10Mins)
XCTAssert( d2_roundedup10?.description == "{abs_date=\'2015-01-24T14:10:00Z\', rep_date=\'2015-01-24T15:10:00+01:00\', region={calendar=\'gregorian\', timezone=\'Europe/Rome\', locale=\'it\'}", "Failed to round a date up 10mins")
// Round up 30min
let d2_roundedc30 = d2?.dateRoundedAt(.toCeil30Mins)
XCTAssert( d2_roundedc30?.description == "{abs_date=\'2015-01-24T14:30:00Z\', rep_date=\'2015-01-24T15:30:00+01:00\', region={calendar=\'gregorian\', timezone=\'Europe/Rome\', locale=\'it\'}", "Failed to round a date ceil 30mins")
}
func testDateInRegion_MathOperations() {
let regionRome = Region(calendar: Calendars.gregorian, zone: Zones.europeRome, locale: Locales.italian)
let dateFormat = "yyyy-MM-dd HH:mm:ss"
let date1 = DateInRegion("2017-07-22 00:00:00", format: dateFormat, region: regionRome)!
let date2 = DateInRegion("2017-07-22 00:00:00", format: dateFormat, region: regionRome)!
let date3 = DateInRegion("2018-08-23 10:50:20", format: dateFormat, region: regionRome)!
// TEST #1
// (DateInRegion - DateInRegion) -> DateComponents
XCTAssert( date1.componentsTo(date2).isZero, "Failed to extract components from math operation between dates")
XCTAssert( date3.componentsTo(date2).hour == 10, "Failed to extract components from math operation between dates")
XCTAssert( date3.componentsTo(date2).day == 1, "Failed to extract components from math operation between dates")
XCTAssert( date3.componentsTo(date2).year == 1, "Failed to extract components from math operation between dates")
// TEST #2
// (DateInRegion + DateComponents) -> DateInRegion
let components1 = DateComponents.create {
$0.day = 1
$0.hour = 2
$0.minute = 30
}
let finalDate1 = (date1 + components1).toFormat(dateFormat)
XCTAssert( (finalDate1 == "2017-07-23 02:30:00"), "Failed to sum date to components and get the exact final date")
// TEST #3
let components2 = DateComponents.create {
$0.year = 1
$0.weekOfYear = 2
}
let finalDate2 = (date1 + components2).toFormat(dateFormat)
XCTAssert( (finalDate2 == "2018-08-05 00:00:00"), "Failed to sum date to components and get the exact final date")
// TEST #4
// (DateInRegion - DateComponents) -> DateInRegion
let finalDate3 = (date1 - DateComponents.create({
$0.day = 30
$0.hour = 27
})).toFormat(dateFormat)
XCTAssert( (finalDate3 == "2017-06-20 21:00:00"), "Failed to minus date to components and get the exact final date")
// TEST #5
let finalDate4 = (date1 + [Calendar.Component.year: 1]).toFormat(dateFormat)
XCTAssert( (finalDate4 == "2018-07-22 00:00:00"), "Failed to add components dict and get the exact final date")
// TEST #6
let finalDate5 = (date1 + [Calendar.Component.day: 20, Calendar.Component.hour: 10]).toFormat(dateFormat)
XCTAssert( (finalDate5 == "2017-08-11 10:00:00"), "Failed to add components dict and get the exact final date")
}
func testNextWeekday() {
let regionRome = Region(calendar: Calendars.gregorian, zone: Zones.europeRome, locale: Locales.italian)
let dateFormat = "yyyy-MM-dd HH:mm:ss"
let date1 = DateInRegion("2019-05-11 00:00:00", format: dateFormat, region: regionRome)!
let nextFriday = date1.nextWeekday(.friday)
XCTAssert(nextFriday.toISO() == "2019-05-17T00:00:00+02:00", "Failed to get the next weekday from date")
}
func testDateAtWeekdayOrdinal() {
let regionRome = Region(calendar: Calendars.gregorian, zone: Zones.europeRome, locale: Locales.italian)
let dateFormat = "yyyy-MM-dd HH:mm:ss"
let date1 = DateInRegion("2019-05-11 00:00:00", format: dateFormat, region: regionRome)!
let result = date1.dateAt(weekdayOrdinal: 3, weekday: .friday, monthNumber: date1.month + 1)
XCTAssert(result.toISO() == "2019-06-21T00:00:00+02:00", "Failed to get the next weekday from date")
}
}