Skip to content

Commit 521310a

Browse files
authored
Merge pull request #43 from mannylopez/manny-lopez--FullMoonName-issue42
Add timezone to fullMoonName computed property
2 parents b1f9739 + 228ecec commit 521310a

4 files changed

Lines changed: 38 additions & 3 deletions

File tree

Sources/TinyMoon/TinyMoon+Moon.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ extension TinyMoon {
2121

2222
init(date: Date, timeZone: TimeZone = TimeZone.current) {
2323
self.date = date
24+
self.timeZone = timeZone
2425
julianDay = AstronomicalConstant.julianDay(date)
2526
let moonDetail = AstronomicalConstant.getMoonPhase(julianDay: julianDay)
2627
daysElapsedInCycle = moonDetail.daysElapsedInCycle
@@ -67,7 +68,8 @@ extension TinyMoon {
6768

6869
public var fullMoonName: String? {
6970
if isFullMoon() {
70-
let calendar = Calendar.current
71+
var calendar = Calendar.current
72+
calendar.timeZone = timeZone
7173
let components = calendar.dateComponents([.month], from: date)
7274
if let month = components.month {
7375
return fullMoonName(month: month)
@@ -143,7 +145,6 @@ extension TinyMoon {
143145
return daysUntilNewMoon - 1
144146
}
145147

146-
147148
/// Determines the moon phase for a given date, considering both major and minor moon phases.
148149
///
149150
/// 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.
@@ -291,6 +292,8 @@ extension TinyMoon {
291292

292293
// MARK: Private
293294

295+
private let timeZone: TimeZone
296+
294297
private func fullMoonName(month: Int) -> String? {
295298
switch month {
296299
case 1: "Wolf Moon"
@@ -315,7 +318,7 @@ extension TinyMoon {
315318
// MARK: - TinyMoon.Moon + Equatable
316319

317320
extension TinyMoon.Moon: Equatable {
318-
public static func == (lhs: TinyMoon.Moon, rhs: TinyMoon.Moon) -> Bool {
321+
public static func ==(lhs: TinyMoon.Moon, rhs: TinyMoon.Moon) -> Bool {
319322
lhs.julianDay == rhs.julianDay
320323
&& lhs.daysElapsedInCycle == rhs.daysElapsedInCycle
321324
&& lhs.ageOfMoon.days == rhs.ageOfMoon.days

Tests/TinyMoonTests/Helpers/TimeTestHelper.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ enum TimeTestHelper {
88
case utc
99
case pacific
1010
case tokyo
11+
case eastern
1112

1213
static func createTimeZone(timeZone: TimeZoneOption) -> TimeZone {
1314
switch timeZone {
@@ -17,6 +18,8 @@ enum TimeTestHelper {
1718
TimeZone(identifier: "America/Los_Angeles")!
1819
case .tokyo:
1920
TimeZone(identifier: "Asia/Tokyo")!
21+
case .eastern:
22+
TimeZone(identifier: "America/New_York")!
2023
}
2124
}
2225
}

Tests/TinyMoonTests/TinyMoonTests.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,18 +330,22 @@ final class TinyMoonTests: XCTestCase {
330330
date = TimeTestHelper.formatDate(year: 2024, month: 06, day: 21, timeZone: pacificTimeZone)
331331
moon = TinyMoon.calculateMoonPhase(date, timeZone: pacificTimeZone)
332332
XCTAssertEqual(moon.moonPhase, .fullMoon)
333+
XCTAssertEqual(moon.fullMoonName, "Strawberry Moon")
333334

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

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

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

346350

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

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

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

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

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

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

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

381392
date = TimeTestHelper.formatDate(year: 2024, month: 11, day: 15, timeZone: tokyoTimeZone)
382393
moon = TinyMoon.calculateMoonPhase(date, timeZone: tokyoTimeZone)
383394
XCTAssertNotEqual(moon.moonPhase, .fullMoon)
395+
XCTAssertNil(moon.fullMoonName)
384396
}
385397

386398
// 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
@@ -398,6 +410,7 @@ final class TinyMoonTests: XCTestCase {
398410
var date = TimeTestHelper.formatDate(year: 2024, month: 2, day: 24, hour: 4, minute: 30, timeZone: pacificTimeZone)
399411
var moon = TinyMoon.calculateMoonPhase(date, timeZone: pacificTimeZone)
400412
XCTAssertEqual(moon.moonPhase, .fullMoon)
413+
XCTAssertEqual(moon.fullMoonName, "Snow Moon")
401414

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

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

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

445461
// New moon on 9/3/2024 @ 01:55 UTC
446462
date = TimeTestHelper.formatDate(year: 2024, month: 9, day: 3, hour: 1, minute: 55, timeZone: utcTimeZone)

Tests/TinyMoonTests/UTCTests.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ final class UTCTests: XCTestCase {
253253
XCTAssertEqual(moon.daysTillFullMoon, 0)
254254
XCTAssertEqual(moon.illuminatedFraction, 0.9911480207511427)
255255
XCTAssertEqual(moon.phaseFraction, 0.47000746748499334)
256+
XCTAssertEqual(moon.fullMoonName, "Sturgeon Moon")
256257
if moon.emoji == fullMoonEmoji { correct += 1 } else { incorrect += 1 }
257258

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

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

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

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

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

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

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

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

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

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

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

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

352365
printResults(.fullMoon, correct: correct, incorrect: incorrect)

0 commit comments

Comments
 (0)