A library that computes the ephemerides.
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 

144 lignes
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()