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