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

93 行
4.3 KiB

  1. import unittest
  2. from datetime import date
  3. from kosmorrolib import events
  4. from kosmorrolib.data import Event
  5. from kosmorrolib.core import get_timescale
  6. class MyTestCase(unittest.TestCase):
  7. def test_event_only_accepts_valid_values(self):
  8. with self.assertRaises(ValueError):
  9. Event('SUPERNOVA', None, get_timescale().now())
  10. def test_find_oppositions(self):
  11. # Test case: Mars opposition
  12. # Source of the information: https://promenade.imcce.fr/en/pages6/887.html#mar
  13. o1 = (events.search_events(date(2020, 10, 13)), '^2020-10-13T23:25')
  14. o2 = (events.search_events(date(2022, 12, 8)), '^2022-12-08T05:41')
  15. o3 = (events.search_events(date(2025, 1, 16)), '^2025-01-16T02:38')
  16. o4 = (events.search_events(date(2027, 2, 19)), '^2027-02-19T15:50')
  17. for (o, expected_date) in [o1, o2, o3, o4]:
  18. self.assertEqual(1, len(o), 'Expected 1 event for %s, got %d' % (expected_date, len(o)))
  19. self.assertEqual('OPPOSITION', o[0].event_type)
  20. self.assertEqual('MARS', o[0].objects[0].skyfield_name)
  21. self.assertRegex(o[0].start_time.isoformat(), expected_date)
  22. self.assertIsNone(o[0].end_time)
  23. self.assertEqual('Mars is in opposition', o[0].get_description())
  24. def test_find_conjunctions(self):
  25. MERCURY = 'MERCURY'
  26. JUPITER = 'JUPITER BARYCENTER'
  27. SATURN = 'SATURN BARYCENTER'
  28. PLUTO = 'PLUTO BARYCENTER'
  29. c1 = (events.search_events(date(2020, 1, 2)), [([MERCURY, JUPITER], '^2020-01-02T16:41')])
  30. c2 = (events.search_events(date(2020, 1, 12)), [([MERCURY, SATURN], '^2020-01-12T09:51'),
  31. ([MERCURY, PLUTO], '^2020-01-12T10:13'),
  32. ([SATURN, PLUTO], '^2020-01-12T16:57')])
  33. c3 = (events.search_events(date(2020, 2, 7)), [])
  34. for (c, expected_dates) in [c1, c2]:
  35. self.assertEqual(len(expected_dates), len(c),
  36. 'Expected %d event(s) for %s, got %d' % (len(expected_dates), expected_dates, len(c)))
  37. i = 0
  38. for conjunction in c:
  39. self.assertEqual('CONJUNCTION', conjunction.event_type)
  40. objects, expected_date = expected_dates[i]
  41. j = 0
  42. self.assertRegex(conjunction.start_time.isoformat(), expected_date)
  43. for object in objects:
  44. self.assertEqual(object, conjunction.objects[j].skyfield_name)
  45. j += 1
  46. self.assertIsNone(conjunction.end_time)
  47. self.assertRegex(conjunction.get_description(), ' are in conjunction$')
  48. i += 1
  49. def test_find_maximal_elongation(self):
  50. e = events.search_events(date(2020, 2, 10))
  51. self.assertEquals(1, len(e), 'Expected 1 events, got %d.' % len(e))
  52. e = e[0]
  53. self.assertEquals('MAXIMAL_ELONGATION', e.event_type)
  54. self.assertEquals(1, len(e.objects))
  55. self.assertEquals('MERCURY', e.objects[0].skyfield_name)
  56. self.assertEqual('18.2°', e.details)
  57. self.assertEquals((2020, 2, 10, 13, 46), (e.start_time.year, e.start_time.month, e.start_time.day,
  58. e.start_time.hour, e.start_time.minute))
  59. e = events.search_events(date(2020, 3, 24))
  60. self.assertEquals(2, len(e), 'Expected 2 events, got %d.' % len(e))
  61. self.assertEquals('MAXIMAL_ELONGATION', e[0].event_type)
  62. self.assertEquals(1, len(e[0].objects))
  63. self.assertEquals('MERCURY', e[0].objects[0].skyfield_name)
  64. self.assertEqual('27.8°', e[0].details)
  65. self.assertEquals((2020, 3, 24, 1, 56), (e[0].start_time.year, e[0].start_time.month, e[0].start_time.day,
  66. e[0].start_time.hour, e[0].start_time.minute))
  67. self.assertEquals('MAXIMAL_ELONGATION', e[1].event_type)
  68. self.assertEquals(1, len(e[1].objects))
  69. self.assertEquals('VENUS', e[1].objects[0].skyfield_name)
  70. self.assertEqual('46.1°', e[1].details)
  71. self.assertEquals((2020, 3, 24, 21, 58), (e[1].start_time.year, e[1].start_time.month, e[1].start_time.day,
  72. e[1].start_time.hour, e[1].start_time.minute))
  73. if __name__ == '__main__':
  74. unittest.main()