func testDateExtensionfromISO8601String()

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)
            }
        }
    }