in glean-core/ios/GleanTests/Metrics/DatetimeMetricTypeTests.swift [127:177]
func testDateExtensionfromISO8601String() {
// Bad date strings return null
let badDate = Date.fromISO8601String(dateString: "Not a date string", precision: .minute)
XCTAssertNil(badDate)
// Create a an array of tuple values to facilitate testing each precision
let dateStrings: [(String, TimeUnit)] = [
("2004-12-09T08:03:01.150-08:00", .nanosecond),
("2004-12-09T08:03:01.150-08:00", .microsecond),
("2004-12-09T08:03:01.150-08:00", .millisecond),
("2004-12-09T08:03:01-08:00", .second),
("2004-12-09T08:03-08:00", .minute),
("2004-12-09T08-08:00", .hour),
("2004-12-09-08:00", .day)
]
for (dateString, precision) in dateStrings {
let date = Date.fromISO8601String(dateString: dateString, precision: precision)
// Make sure it is not nil
XCTAssertNotNil(date)
// Validate pieces
let components = Calendar.current.dateComponents(in: TimeZone(abbreviation: "GMT-8")!, from: date!)
switch precision {
case .nanosecond:
// This is 150000095 due to floating point imprecision and that our support ISO8601
// doesn't really handle nano and micro seconds
XCTAssertEqual(150_000_095, components.nanosecond ?? 0)
fallthrough
case .microsecond:
XCTAssertEqual(150_000, (components.nanosecond ?? 0) / 1000)
fallthrough
case .millisecond:
XCTAssertEqual(150, (components.nanosecond ?? 0) / 1_000_000)
fallthrough
case .second:
XCTAssertEqual(1, components.second ?? 0)
fallthrough
case .minute:
XCTAssertEqual(3, components.minute ?? 0)
fallthrough
case .hour:
XCTAssertEqual(8, components.hour ?? 0)
fallthrough
case .day:
XCTAssertEqual(9, components.day ?? 0)
XCTAssertEqual(12, components.month ?? 0)
XCTAssertEqual(2004, components.year ?? 0)
}
}
}