A library that computes the ephemerides.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

144 lines
6.8 KiB

  1. #!/usr/bin/env python3
  2. # Kosmorrolib - The Library To Compute Your Ephemerides
  3. # Copyright (C) 2021 Jérôme Deuchnord <jerome@deuchnord.fr>
  4. #
  5. # This program is free software: you can redistribute it and/or modify
  6. # it under the terms of the GNU Affero General Public License as
  7. # published by the Free Software Foundation, either version 3 of the
  8. # License, or (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU Affero General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU Affero General Public License
  16. # along with this program. If not, see <https://www.gnu.org/licenses/>.
  17. import unittest
  18. from kosmorrolib.enum import MoonPhaseType
  19. from .testutils import expect_assertions
  20. from kosmorrolib import ephemerides
  21. from kosmorrolib.model import Position, MoonPhase
  22. from datetime import date
  23. from kosmorrolib.exceptions import OutOfRangeDateError
  24. class EphemeridesTestCase(unittest.TestCase):
  25. def test_get_ephemerides_for_aster_returns_correct_hours(self):
  26. position = Position(0, 0)
  27. eph = ephemerides.get_ephemerides(date=date(2019, 11, 18), position=position)
  28. @expect_assertions(self.assertRegex, num=3)
  29. def do_assertions(assert_regex):
  30. for ephemeris in eph:
  31. if ephemeris.object.skyfield_name == "SUN":
  32. assert_regex(ephemeris.rise_time.isoformat(), "^2019-11-18T05:42:")
  33. assert_regex(
  34. ephemeris.culmination_time.isoformat(), "^2019-11-18T11:45:"
  35. )
  36. assert_regex(ephemeris.set_time.isoformat(), "^2019-11-18T17:49:")
  37. break
  38. do_assertions()
  39. ###################################################################################################################
  40. ### MOON PHASE TESTS ###
  41. ###################################################################################################################
  42. def test_moon_phase_new_moon(self):
  43. phase = ephemerides.get_moon_phase(date(2019, 11, 25))
  44. self.assertEqual(MoonPhaseType.WANING_CRESCENT, phase.phase_type)
  45. self.assertIsNone(phase.time)
  46. self.assertRegexpMatches(phase.next_phase_date.isoformat(), "^2019-11-26T")
  47. phase = ephemerides.get_moon_phase(date(2019, 11, 26))
  48. self.assertEqual(MoonPhaseType.NEW_MOON, phase.phase_type)
  49. self.assertRegexpMatches(phase.next_phase_date.isoformat(), "^2019-12-04T")
  50. phase = ephemerides.get_moon_phase(date(2019, 11, 27))
  51. self.assertEqual(MoonPhaseType.WAXING_CRESCENT, phase.phase_type)
  52. self.assertIsNone(phase.time)
  53. self.assertRegexpMatches(phase.next_phase_date.isoformat(), "^2019-12-04T")
  54. def test_moon_phase_first_crescent(self):
  55. phase = ephemerides.get_moon_phase(date(2019, 11, 3))
  56. self.assertEqual(MoonPhaseType.WAXING_CRESCENT, phase.phase_type)
  57. self.assertIsNone(phase.time)
  58. self.assertRegexpMatches(phase.next_phase_date.isoformat(), "^2019-11-04T")
  59. phase = ephemerides.get_moon_phase(date(2019, 11, 4))
  60. self.assertEqual(MoonPhaseType.FIRST_QUARTER, phase.phase_type)
  61. self.assertRegexpMatches(phase.next_phase_date.isoformat(), "^2019-11-12T")
  62. phase = ephemerides.get_moon_phase(date(2019, 11, 5))
  63. self.assertEqual(MoonPhaseType.WAXING_GIBBOUS, phase.phase_type)
  64. self.assertIsNone(phase.time)
  65. self.assertRegexpMatches(phase.next_phase_date.isoformat(), "^2019-11-12T")
  66. def test_moon_phase_full_moon(self):
  67. phase = ephemerides.get_moon_phase(date(2019, 11, 11))
  68. self.assertEqual(MoonPhaseType.WAXING_GIBBOUS, phase.phase_type)
  69. self.assertIsNone(phase.time)
  70. self.assertRegexpMatches(phase.next_phase_date.isoformat(), "^2019-11-12T")
  71. phase = ephemerides.get_moon_phase(date(2019, 11, 12))
  72. self.assertEqual(MoonPhaseType.FULL_MOON, phase.phase_type)
  73. self.assertRegexpMatches(phase.next_phase_date.isoformat(), "^2019-11-19T")
  74. phase = ephemerides.get_moon_phase(date(2019, 11, 13))
  75. self.assertEqual(MoonPhaseType.WANING_GIBBOUS, phase.phase_type)
  76. self.assertIsNone(phase.time)
  77. self.assertRegexpMatches(phase.next_phase_date.isoformat(), "^2019-11-19T")
  78. def test_moon_phase_last_quarter(self):
  79. phase = ephemerides.get_moon_phase(date(2019, 11, 18))
  80. self.assertEqual(MoonPhaseType.WANING_GIBBOUS, phase.phase_type)
  81. self.assertIsNone(phase.time)
  82. self.assertRegexpMatches(phase.next_phase_date.isoformat(), "^2019-11-19T")
  83. phase = ephemerides.get_moon_phase(date(2019, 11, 19))
  84. self.assertEqual(MoonPhaseType.LAST_QUARTER, phase.phase_type)
  85. self.assertRegexpMatches(phase.next_phase_date.isoformat(), "^2019-11-26T")
  86. phase = ephemerides.get_moon_phase(date(2019, 11, 20))
  87. self.assertEqual(MoonPhaseType.WANING_CRESCENT, phase.phase_type)
  88. self.assertIsNone(phase.time)
  89. self.assertRegexpMatches(phase.next_phase_date.isoformat(), "^2019-11-26T")
  90. def test_moon_phase_prediction(self):
  91. phase = MoonPhase(MoonPhaseType.NEW_MOON, None, None)
  92. self.assertEqual(MoonPhaseType.FIRST_QUARTER, phase.get_next_phase())
  93. phase = MoonPhase(MoonPhaseType.WAXING_CRESCENT, None, None)
  94. self.assertEqual(MoonPhaseType.FIRST_QUARTER, phase.get_next_phase())
  95. phase = MoonPhase(MoonPhaseType.FIRST_QUARTER, None, None)
  96. self.assertEqual(MoonPhaseType.FULL_MOON, phase.get_next_phase())
  97. phase = MoonPhase(MoonPhaseType.WAXING_GIBBOUS, None, None)
  98. self.assertEqual(MoonPhaseType.FULL_MOON, phase.get_next_phase())
  99. phase = MoonPhase(MoonPhaseType.FULL_MOON, None, None)
  100. self.assertEqual(MoonPhaseType.LAST_QUARTER, phase.get_next_phase())
  101. phase = MoonPhase(MoonPhaseType.WANING_GIBBOUS, None, None)
  102. self.assertEqual(MoonPhaseType.LAST_QUARTER, phase.get_next_phase())
  103. phase = MoonPhase(MoonPhaseType.LAST_QUARTER, None, None)
  104. self.assertEqual(MoonPhaseType.NEW_MOON, phase.get_next_phase())
  105. phase = MoonPhase(MoonPhaseType.WANING_CRESCENT, None, None)
  106. self.assertEqual(MoonPhaseType.NEW_MOON, phase.get_next_phase())
  107. def test_get_ephemerides_raises_exception_on_out_of_date_range(self):
  108. with self.assertRaises(OutOfRangeDateError):
  109. ephemerides.get_ephemerides(Position(0, 0), date(1789, 5, 5))
  110. def test_get_moon_phase_raises_exception_on_out_of_date_range(self):
  111. with self.assertRaises(OutOfRangeDateError):
  112. ephemerides.get_moon_phase(date(1789, 5, 5))
  113. if __name__ == "__main__":
  114. unittest.main()