1# -*- coding: utf-8 -*-
2
3import ephem, unittest
4
5tle_lines = (
6    'ISS (ZARYA)             ',
7    '1 25544U 98067A   09119.77864163  .00009789  00000-0  76089-4 0  7650',
8    '2 25544  51.6397 195.1243 0008906 304.8273 151.9344 15.72498628598335',
9    )
10
11if not hasattr(unittest.TestCase, 'assertRaisesRegex'):
12    setattr(unittest.TestCase, 'assertRaisesRegex',
13            unittest.TestCase.assertRaisesRegexp)
14
15class SatelliteTests(unittest.TestCase):
16    def setUp(self):
17        self.iss = ephem.readtle(*tle_lines)
18        self.atlanta = ephem.city('Atlanta')
19
20    def test_TLE_checksum(self):
21        lines = list(tle_lines)
22        lines[1] = lines[1][:-1] + '1'
23        expected = 'incorrect TLE checksum at end of line'
24        self.assertRaisesRegex(ValueError, expected, ephem.readtle, *lines)
25
26    def test_normal_methods(self):
27        for which in ['previous', 'next']:
28            for event in ['transit', 'antitransit', 'rising', 'setting']:
29                method_name = which + '_' + event
30                method = getattr(self.atlanta, method_name)
31                self.assertRaises(TypeError, method, self.iss)
32
33    def test_attribute_values_and_roundtrips(self):
34        def check():
35            self.assertEqual(self.iss.epoch, 39931.27864163)
36            self.assertEqual(self.iss.n, 15.72498628)
37            self.assertEqual(self.iss.inc, 51.63970184326172)
38            self.assertEqual(self.iss.raan, 195.12429809570312)
39            self.assertEqual(self.iss.e, 0.0008905999711714685)
40            self.assertEqual(self.iss.ap, 304.8273010253906)
41            self.assertEqual(self.iss.M, 151.9344024658203)
42            self.assertEqual(self.iss.decay, 9.788999886950478e-05)
43            self.assertEqual(self.iss.drag, 7.60890034143813e-05)
44            self.assertEqual(self.iss.orbit, 59833)
45
46        check()
47
48        self.iss.epoch = self.iss.epoch
49        self.iss.n = self.iss.n
50        self.iss.inc = self.iss.inc
51        self.iss.raan = self.iss.raan
52        self.iss.e = self.iss.e
53        self.iss.ap = self.iss.ap
54        self.iss.M = self.iss.M
55        self.iss.decay = self.iss.decay
56        self.iss.drag = self.iss.drag
57        self.iss.orbit = self.iss.orbit
58
59        check()
60
61    def test_next_pass(self):
62        iss = self.iss
63        self.atlanta.date = '2009/4/30'
64        rt, raz, tt, talt, st, saz = self.atlanta.next_pass(iss)
65
66        # Calsky says (using EST, and probably a different horizon):
67        #  Rise(invis.)  1h02m17s  --.-mag  az:192.0° SSW
68        #  Culmination   1h06m39s  --.-mag  az:128.2° SE   h:16.0°
69        #  Set (invis.)  1h11m04s  --.-m  az: 64.9° ENE
70
71        self.assertAlmostEqual(ephem.Date('2009/4/30 5:02:17'), rt, 3)
72        self.assertAlmostEqual(ephem.Date('2009/4/30 5:06:39'), tt, 3)
73        self.assertAlmostEqual(ephem.Date('2009/4/30 5:11:04'), st, 3)
74
75        self.assertAlmostEqual(ephem.degrees('192.0'), raz, 1)
76        self.assertAlmostEqual(ephem.degrees('16.0'), talt, 1)
77        self.assertAlmostEqual(ephem.degrees('64.9'), saz, 1)
78
79    def test_next_pass_consecutive(self):
80        # Issue #63
81        iss = self.iss
82        # At this time, the ISS is already above the horizon
83        self.atlanta.date = '2009/4/29 15:51:00'
84        rt, raz, tt, talt, st, saz = self.atlanta.next_pass(iss)
85
86        self.assertAlmostEqual(ephem.Date('2009/4/30 5:02:17'), rt, 3)
87        self.assertAlmostEqual(ephem.Date('2009/4/30 5:06:39'), tt, 3)
88        self.assertAlmostEqual(ephem.Date('2009/4/30 5:11:04'), st, 3)
89
90        self.assertAlmostEqual(ephem.degrees('192.0'), raz, 1)
91        self.assertAlmostEqual(ephem.degrees('16.0'), talt, 1)
92        self.assertAlmostEqual(ephem.degrees('64.9'), saz, 1)
93
94    def test_next_pass_notsinglepass(self):
95        # Issue #63
96        iss = self.iss
97        # At this time, the ISS is already above the horizon
98        self.atlanta.date = '2009/4/29 15:51:00'
99        rt, raz, tt, talt, st, saz = self.atlanta.next_pass(iss, singlepass=False)
100
101        self.assertAlmostEqual(ephem.Date('2009/4/30 5:02:17'), rt, 3)
102        self.assertAlmostEqual(ephem.Date('2009/4/29 15:51:35'), tt, 3)
103        self.assertAlmostEqual(ephem.Date('2009/4/29 15:54:01'), st, 3)
104
105        self.assertAlmostEqual(ephem.degrees('192.0'), raz, 1)
106        self.assertAlmostEqual(ephem.degrees('2.1'), talt, 1)
107        self.assertAlmostEqual(ephem.degrees('209.0'), saz, 1)
108
109    def test_more_than_one_year_before_TLE(self):
110        self.assertRaises(ValueError, self.iss.compute, '2008/4/28')
111
112    def test_more_than_one_year_after_TLE(self):
113        self.assertRaises(ValueError, self.iss.compute, '2010/4/30 20:00')
114