選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 

82 行
4.0 KiB

  1. import unittest
  2. from datetime import date, datetime
  3. from json import dumps
  4. from kosmorrolib import events
  5. from kosmorrolib.data import Event, ASTERS
  6. from kosmorrolib.core import get_timescale
  7. from unittest_data_provider import data_provider
  8. from kosmorrolib.exceptions import OutOfRangeDateError
  9. class EventTestCase(unittest.TestCase):
  10. def setUp(self) -> None:
  11. self.maxDiff = None
  12. def test_event_only_accepts_valid_values(self):
  13. with self.assertRaises(ValueError):
  14. Event('SUPERNOVA', None, get_timescale().now())
  15. expected_events_provider = lambda: (
  16. (date(2020, 2, 7), []),
  17. (date(2020, 10, 13), [Event('OPPOSITION', [ASTERS[4]], datetime(2020, 10, 13, 23, 25))]),
  18. (date(2022, 12, 8), [Event('CONJUNCTION', [ASTERS[1], ASTERS[4]], datetime(2022, 12, 8, 4, 18)),
  19. Event('OPPOSITION', [ASTERS[4]], datetime(2022, 12, 8, 5, 41))]),
  20. (date(2025, 1, 16), [Event('OPPOSITION', [ASTERS[4]], datetime(2025, 1, 16, 2, 38))]),
  21. (date(2027, 2, 19), [Event('MOON_PERIGEE', [ASTERS[1]], datetime(2027, 2, 19, 7, 38)),
  22. Event('OPPOSITION', [ASTERS[4]], datetime(2027, 2, 19, 15, 50))]),
  23. (date(2020, 1, 2), [Event('MOON_APOGEE', [ASTERS[1]], datetime(2020, 1, 2, 1, 32)),
  24. Event('CONJUNCTION', [ASTERS[2], ASTERS[5]], datetime(2020, 1, 2, 16, 41))]),
  25. (date(2020, 1, 12), [Event('CONJUNCTION', [ASTERS[2], ASTERS[6]], datetime(2020, 1, 12, 9, 51)),
  26. Event('CONJUNCTION', [ASTERS[2], ASTERS[9]], datetime(2020, 1, 12, 10, 13)),
  27. Event('CONJUNCTION', [ASTERS[6], ASTERS[9]], datetime(2020, 1, 12, 16, 57))]),
  28. (date(2020, 2, 10), [Event('MAXIMAL_ELONGATION', [ASTERS[2]], datetime(2020, 2, 10, 13, 46), details='18.2°'),
  29. Event('MOON_PERIGEE', [ASTERS[1]], datetime(2020, 2, 10, 20, 34))]),
  30. (date(2020, 3, 24), [Event('MAXIMAL_ELONGATION', [ASTERS[2]], datetime(2020, 3, 24, 1, 56), details='27.8°'),
  31. Event('MOON_APOGEE', [ASTERS[1]], datetime(2020, 3, 24, 15, 39)),
  32. Event('MAXIMAL_ELONGATION', [ASTERS[3]], datetime(2020, 3, 24, 21, 58), details='46.1°')]),
  33. (date(2005, 6, 16), [Event('OCCULTATION', [ASTERS[1], ASTERS[5]], datetime(2005, 6, 16, 6, 31))]),
  34. (date(2020, 4, 7), [Event('MOON_PERIGEE', [ASTERS[1]], datetime(2020, 4, 7, 18, 14))]),
  35. (date(2020, 1, 29), [Event('MOON_APOGEE', [ASTERS[1]], datetime(2020, 1, 29, 21, 32))])
  36. )
  37. @data_provider(expected_events_provider)
  38. def test_search_events(self, d: date, expected_events: [Event]):
  39. actual_events = events.search_events(d)
  40. self.assertEqual(len(expected_events), len(actual_events),
  41. 'Expected %d elements, got %d for date %s.\n%s' % (len(expected_events),
  42. len(actual_events),
  43. d.isoformat(),
  44. actual_events))
  45. for i, expected_event in enumerate(expected_events):
  46. actual_event = actual_events[i]
  47. # Remove unnecessary precision (seconds and microseconds)
  48. actual_event.start_time = datetime(actual_event.start_time.year,
  49. actual_event.start_time.month,
  50. actual_event.start_time.day,
  51. actual_event.start_time.hour,
  52. actual_event.start_time.minute)
  53. self.assertEqual(expected_event.__dict__, actual_event.__dict__)
  54. def test_get_events_raises_exception_on_out_of_date_range(self):
  55. with self.assertRaises(OutOfRangeDateError):
  56. events.search_events(date(1789, 5, 5))
  57. if __name__ == '__main__':
  58. unittest.main()