Skip to content

Commit

Permalink
Merge pull request #43 from mannylopez/manny-lopez--FullMoonName-issue42
Browse files Browse the repository at this point in the history
Add timezone to fullMoonName computed property
  • Loading branch information
mannylopez authored Sep 5, 2024
2 parents b1f9739 + 228ecec commit 521310a
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 3 deletions.
9 changes: 6 additions & 3 deletions Sources/TinyMoon/TinyMoon+Moon.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ extension TinyMoon {

init(date: Date, timeZone: TimeZone = TimeZone.current) {
self.date = date
self.timeZone = timeZone
julianDay = AstronomicalConstant.julianDay(date)
let moonDetail = AstronomicalConstant.getMoonPhase(julianDay: julianDay)
daysElapsedInCycle = moonDetail.daysElapsedInCycle
Expand Down Expand Up @@ -67,7 +68,8 @@ extension TinyMoon {

public var fullMoonName: String? {
if isFullMoon() {
let calendar = Calendar.current
var calendar = Calendar.current
calendar.timeZone = timeZone
let components = calendar.dateComponents([.month], from: date)
if let month = components.month {
return fullMoonName(month: month)
Expand Down Expand Up @@ -143,7 +145,6 @@ extension TinyMoon {
return daysUntilNewMoon - 1
}


/// Determines the moon phase for a given date, considering both major and minor moon phases.
///
/// This function first checks if the specified date includes one of the major moon phases (new moon, first quarter, full moon, last quarter) within it's 24 hours.
Expand Down Expand Up @@ -291,6 +292,8 @@ extension TinyMoon {

// MARK: Private

private let timeZone: TimeZone

private func fullMoonName(month: Int) -> String? {
switch month {
case 1: "Wolf Moon"
Expand All @@ -315,7 +318,7 @@ extension TinyMoon {
// MARK: - TinyMoon.Moon + Equatable

extension TinyMoon.Moon: Equatable {
public static func == (lhs: TinyMoon.Moon, rhs: TinyMoon.Moon) -> Bool {
public static func ==(lhs: TinyMoon.Moon, rhs: TinyMoon.Moon) -> Bool {
lhs.julianDay == rhs.julianDay
&& lhs.daysElapsedInCycle == rhs.daysElapsedInCycle
&& lhs.ageOfMoon.days == rhs.ageOfMoon.days
Expand Down
3 changes: 3 additions & 0 deletions Tests/TinyMoonTests/Helpers/TimeTestHelper.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ enum TimeTestHelper {
case utc
case pacific
case tokyo
case eastern

static func createTimeZone(timeZone: TimeZoneOption) -> TimeZone {
switch timeZone {
Expand All @@ -17,6 +18,8 @@ enum TimeTestHelper {
TimeZone(identifier: "America/Los_Angeles")!
case .tokyo:
TimeZone(identifier: "Asia/Tokyo")!
case .eastern:
TimeZone(identifier: "America/New_York")!
}
}
}
Expand Down
16 changes: 16 additions & 0 deletions Tests/TinyMoonTests/TinyMoonTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -330,18 +330,22 @@ final class TinyMoonTests: XCTestCase {
date = TimeTestHelper.formatDate(year: 2024, month: 06, day: 21, timeZone: pacificTimeZone)
moon = TinyMoon.calculateMoonPhase(date, timeZone: pacificTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.fullMoonName, "Strawberry Moon")

date = TimeTestHelper.formatDate(year: 2024, month: 06, day: 22, timeZone: utcTimeZone)
moon = TinyMoon.calculateMoonPhase(date, timeZone: utcTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.fullMoonName, "Strawberry Moon")

date = TimeTestHelper.formatDate(year: 2024, month: 06, day: 22, timeZone: pacificTimeZone)
moon = TinyMoon.calculateMoonPhase(date, timeZone: pacificTimeZone)
XCTAssertNotEqual(moon.moonPhase, .fullMoon)
XCTAssertNil(moon.fullMoonName)

date = TimeTestHelper.formatDate(year: 2024, month: 06, day: 21, timeZone: utcTimeZone)
moon = TinyMoon.calculateMoonPhase(date, timeZone: utcTimeZone)
XCTAssertNotEqual(moon.moonPhase, .fullMoon)
XCTAssertNil(moon.fullMoonName)


// Full Moon on
Expand All @@ -350,37 +354,45 @@ final class TinyMoonTests: XCTestCase {
date = TimeTestHelper.formatDate(year: 2024, month: 08, day: 19, timeZone: utcTimeZone)
moon = TinyMoon.calculateMoonPhase(date, timeZone: utcTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.fullMoonName, "Sturgeon Moon")

date = TimeTestHelper.formatDate(year: 2024, month: 08, day: 20, timeZone: tokyoTimeZone)
moon = TinyMoon.calculateMoonPhase(date, timeZone: tokyoTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.fullMoonName, "Sturgeon Moon")

date = TimeTestHelper.formatDate(year: 2024, month: 08, day: 19, timeZone: tokyoTimeZone)
moon = TinyMoon.calculateMoonPhase(date, timeZone: tokyoTimeZone)
XCTAssertNotEqual(moon.moonPhase, .fullMoon)
XCTAssertNil(moon.fullMoonName)

date = TimeTestHelper.formatDate(year: 2024, month: 08, day: 20, timeZone: utcTimeZone)
moon = TinyMoon.calculateMoonPhase(date, timeZone: utcTimeZone)
XCTAssertNotEqual(moon.moonPhase, .fullMoon)
XCTAssertNil(moon.fullMoonName)

// Full Moon on
// - UTC: Nov 15 21:28
// - Tokyo Nov 16 06:28
date = TimeTestHelper.formatDate(year: 2024, month: 11, day: 15, timeZone: utcTimeZone)
moon = TinyMoon.calculateMoonPhase(date, timeZone: utcTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.fullMoonName, "Beaver Moon")

date = TimeTestHelper.formatDate(year: 2024, month: 11, day: 16, timeZone: tokyoTimeZone)
moon = TinyMoon.calculateMoonPhase(date, timeZone: tokyoTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.fullMoonName, "Beaver Moon")

date = TimeTestHelper.formatDate(year: 2024, month: 11, day: 16, timeZone: utcTimeZone)
moon = TinyMoon.calculateMoonPhase(date, timeZone: utcTimeZone)
XCTAssertNotEqual(moon.moonPhase, .fullMoon)
XCTAssertNil(moon.fullMoonName)

date = TimeTestHelper.formatDate(year: 2024, month: 11, day: 15, timeZone: tokyoTimeZone)
moon = TinyMoon.calculateMoonPhase(date, timeZone: tokyoTimeZone)
XCTAssertNotEqual(moon.moonPhase, .fullMoon)
XCTAssertNil(moon.fullMoonName)
}

// These following moon phases happen within 5 hours of midnight, so these tests aim to check that the phase is calculated correctly and lands on the correct day
Expand All @@ -398,6 +410,7 @@ final class TinyMoonTests: XCTestCase {
var date = TimeTestHelper.formatDate(year: 2024, month: 2, day: 24, hour: 4, minute: 30, timeZone: pacificTimeZone)
var moon = TinyMoon.calculateMoonPhase(date, timeZone: pacificTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.fullMoonName, "Snow Moon")

// New moon on 3/10/2024 @ 01:00 PST
date = TimeTestHelper.formatDate(year: 2024, month: 3, day: 10, hour: 1, minute: 0, timeZone: pacificTimeZone)
Expand All @@ -408,6 +421,7 @@ final class TinyMoonTests: XCTestCase {
date = TimeTestHelper.formatDate(year: 2024, month: 3, day: 25, hour: 0, minute: 0, timeZone: pacificTimeZone)
moon = TinyMoon.calculateMoonPhase(date, timeZone: pacificTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.fullMoonName, "Worm Moon")

// New moon on 3/10/2024 @ 01:00 PST
date = TimeTestHelper.formatDate(year: 2024, month: 3, day: 10, hour: 1, minute: 0, timeZone: pacificTimeZone)
Expand All @@ -428,6 +442,7 @@ final class TinyMoonTests: XCTestCase {
date = TimeTestHelper.formatDate(year: 2024, month: 12, day: 15, hour: 1, minute: 01, timeZone: pacificTimeZone)
moon = TinyMoon.calculateMoonPhase(date, timeZone: pacificTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.fullMoonName, "Cold Moon")

// MARK: - UTC margin of error tests
// Values from https://www.timeanddate.com/moon/phases/timezone/utc
Expand All @@ -441,6 +456,7 @@ final class TinyMoonTests: XCTestCase {
date = TimeTestHelper.formatDate(year: 2024, month: 4, day: 23, hour: 23, minute: 48, timeZone: utcTimeZone)
moon = TinyMoon.calculateMoonPhase(date, timeZone: utcTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.fullMoonName, "Pink Moon")

// New moon on 9/3/2024 @ 01:55 UTC
date = TimeTestHelper.formatDate(year: 2024, month: 9, day: 3, hour: 1, minute: 55, timeZone: utcTimeZone)
Expand Down
13 changes: 13 additions & 0 deletions Tests/TinyMoonTests/UTCTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,7 @@ final class UTCTests: XCTestCase {
XCTAssertEqual(moon.daysTillFullMoon, 0)
XCTAssertEqual(moon.illuminatedFraction, 0.9911480207511427)
XCTAssertEqual(moon.phaseFraction, 0.47000746748499334)
XCTAssertEqual(moon.fullMoonName, "Sturgeon Moon")
if moon.emoji == fullMoonEmoji { correct += 1 } else { incorrect += 1 }

print("Exact")
Expand All @@ -270,83 +271,95 @@ final class UTCTests: XCTestCase {
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.emoji, fullMoonEmoji)
XCTAssertEqual(moon.daysTillFullMoon, 0)
XCTAssertEqual(moon.fullMoonName, "Wolf Moon")
if moon.emoji == fullMoonEmoji { correct += 1 } else { incorrect += 1 }

date = TimeTestHelper.formatDate(year: 2024, month: 02, day: 24)
moon = TinyMoon.calculateMoonPhase(date, timeZone: utcTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.emoji, fullMoonEmoji)
XCTAssertEqual(moon.daysTillFullMoon, 0)
XCTAssertEqual(moon.fullMoonName, "Snow Moon")
if moon.emoji == fullMoonEmoji { correct += 1 } else { incorrect += 1 }

date = TimeTestHelper.formatDate(year: 2024, month: 03, day: 25)
moon = TinyMoon.calculateMoonPhase(date, timeZone: utcTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.emoji, fullMoonEmoji)
XCTAssertEqual(moon.daysTillFullMoon, 0)
XCTAssertEqual(moon.fullMoonName, "Worm Moon")
if moon.emoji == fullMoonEmoji { correct += 1 } else { incorrect += 1 }

date = TimeTestHelper.formatDate(year: 2024, month: 04, day: 23)
moon = TinyMoon.calculateMoonPhase(date, timeZone: utcTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.emoji, fullMoonEmoji)
XCTAssertEqual(moon.daysTillFullMoon, 0)
XCTAssertEqual(moon.fullMoonName, "Pink Moon")
if moon.emoji == fullMoonEmoji { correct += 1 } else { incorrect += 1 }

date = TimeTestHelper.formatDate(year: 2024, month: 05, day: 23)
moon = TinyMoon.calculateMoonPhase(date, timeZone: utcTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.emoji, fullMoonEmoji)
XCTAssertEqual(moon.daysTillFullMoon, 0)
XCTAssertEqual(moon.fullMoonName, "Flower Moon")
if moon.emoji == fullMoonEmoji { correct += 1 } else { incorrect += 1 }

date = TimeTestHelper.formatDate(year: 2024, month: 06, day: 22)
moon = TinyMoon.calculateMoonPhase(date, timeZone: utcTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.emoji, fullMoonEmoji)
XCTAssertEqual(moon.daysTillFullMoon, 0)
XCTAssertEqual(moon.fullMoonName, "Strawberry Moon")
if moon.emoji == fullMoonEmoji { correct += 1 } else { incorrect += 1 }

date = TimeTestHelper.formatDate(year: 2024, month: 07, day: 21)
moon = TinyMoon.calculateMoonPhase(date, timeZone: utcTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.emoji, fullMoonEmoji)
XCTAssertEqual(moon.daysTillFullMoon, 0)
XCTAssertEqual(moon.fullMoonName, "Buck Moon")
if moon.emoji == fullMoonEmoji { correct += 1 } else { incorrect += 1 }

date = TimeTestHelper.formatDate(year: 2024, month: 08, day: 19)
moon = TinyMoon.calculateMoonPhase(date, timeZone: utcTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.emoji, fullMoonEmoji)
XCTAssertEqual(moon.daysTillFullMoon, 0)
XCTAssertEqual(moon.fullMoonName, "Sturgeon Moon")
if moon.emoji == fullMoonEmoji { correct += 1 } else { incorrect += 1 }

date = TimeTestHelper.formatDate(year: 2024, month: 09, day: 18)
moon = TinyMoon.calculateMoonPhase(date, timeZone: utcTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.emoji, fullMoonEmoji)
XCTAssertEqual(moon.daysTillFullMoon, 0)
XCTAssertEqual(moon.fullMoonName, "Harvest Moon")
if moon.emoji == fullMoonEmoji { correct += 1 } else { incorrect += 1 }

date = TimeTestHelper.formatDate(year: 2024, month: 10, day: 17)
moon = TinyMoon.calculateMoonPhase(date, timeZone: utcTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.emoji, fullMoonEmoji)
XCTAssertEqual(moon.daysTillFullMoon, 0)
XCTAssertEqual(moon.fullMoonName, "Hunter's Moon")
if moon.emoji == fullMoonEmoji { correct += 1 } else { incorrect += 1 }

date = TimeTestHelper.formatDate(year: 2024, month: 11, day: 15)
moon = TinyMoon.calculateMoonPhase(date, timeZone: utcTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.emoji, fullMoonEmoji)
XCTAssertEqual(moon.daysTillFullMoon, 0)
XCTAssertEqual(moon.fullMoonName, "Beaver Moon")
if moon.emoji == fullMoonEmoji { correct += 1 } else { incorrect += 1 }

date = TimeTestHelper.formatDate(year: 2024, month: 12, day: 15)
moon = TinyMoon.calculateMoonPhase(date, timeZone: utcTimeZone)
XCTAssertEqual(moon.moonPhase, .fullMoon)
XCTAssertEqual(moon.emoji, fullMoonEmoji)
XCTAssertEqual(moon.daysTillFullMoon, 0)
XCTAssertEqual(moon.fullMoonName, "Cold Moon")
if moon.emoji == fullMoonEmoji { correct += 1 } else { incorrect += 1 }

printResults(.fullMoon, correct: correct, incorrect: incorrect)
Expand Down

0 comments on commit 521310a

Please sign in to comment.