// // MoonWatchTests.swift // MoonWatchTests // // Created by david on 4/26/26. // import Testing @testable import MoonWatch struct MoonWatchTests { private let iso8601: ISO8601DateFormatter = { let f = ISO8601DateFormatter() f.formatOptions = [.withInternetDateTime] return f }() @Test func julianDayUnixEpoch() { let utc = try #require(iso8601.date(from: "1970-01-01T00:00:00Z")) let jd = MoonPhaseCalculator.julianDay(for: utc) #expect(abs(jd - 2_440_587.5) < 0.0001) } /// Full moon near total lunar eclipse peak (UTC). @Test func goldenFullMoonJanuary2019() { let date = try #require(iso8601.date(from: "2019-01-21T05:16:00Z")) let s = MoonPhaseCalculator.snapshot(for: date) #expect(s.namedPhase == .fullMoon) #expect(s.normalizedPhase > 0.5 && s.normalizedPhase < 0.52) #expect(s.illuminatedFraction > 0.99) } /// New moon (UTC). @Test func goldenNewMoonNovember2024() { let date = try #require(iso8601.date(from: "2024-11-01T13:00:00Z")) let s = MoonPhaseCalculator.snapshot(for: date) #expect(s.namedPhase == .newMoon) #expect(s.normalizedPhase >= 0 && s.normalizedPhase < 0.02) #expect(s.illuminatedFraction < 0.02) } /// First quarter (UTC). @Test func goldenFirstQuarterOctober2024() { let date = try #require(iso8601.date(from: "2024-10-10T19:00:00Z")) let s = MoonPhaseCalculator.snapshot(for: date) #expect(s.namedPhase == .firstQuarter) #expect(s.normalizedPhase > 0.25 && s.normalizedPhase < 0.28) #expect(s.illuminatedFraction > 0.45 && s.illuminatedFraction < 0.60) } }