Coverage for tests/test_frame.py: 97%
183 statements
« prev ^ index » next coverage.py v7.16.1, created at 2026-09-23 09:33 +0000
« prev ^ index » next coverage.py v7.16.1, created at 2026-09-23 09:33 +0000
1import math
2import unittest
4import numpy as np
5from numpy.testing import assert_allclose
7import astshim as ast
8from astshim.test import MappingTestCase
11class TestFrame(MappingTestCase):
13 def test_FrameBasics(self):
14 frame = ast.Frame(2)
15 self.assertEqual(frame.className, "Frame")
16 self.assertEqual(frame.nIn, 2)
17 self.assertEqual(frame.nAxes, 2)
18 self.assertEqual(frame.maxAxes, 2)
19 self.assertEqual(frame.minAxes, 2)
20 self.assertEqual(frame.alignSystem, "Cartesian")
21 self.assertEqual(frame.dut1, 0.0)
22 self.assertEqual(frame.epoch, 2000.0)
23 self.assertEqual(frame.obsAlt, 0.0)
24 self.assertEqual(frame.obsLat, "N0:00:00.00")
25 self.assertEqual(frame.obsLon, "E0:00:00.00")
26 self.assertTrue(frame.permute)
27 self.assertFalse(frame.preserveAxes)
28 self.assertEqual(frame.system, "Cartesian")
29 self.assertEqual(frame.title, "2-d coordinate system")
30 self.assertEqual(frame.getDigits(), 7)
32 for axis in (1, 2):
33 self.assertGreater(abs(frame.getBottom(axis)), 1e99)
34 self.assertGreater(abs(frame.getTop(axis)), 1e99)
35 self.assertGreater(frame.getTop(axis), frame.getBottom(axis))
36 self.assertTrue(frame.getDirection(axis))
37 self.assertEqual(frame.getDigits(axis), 7)
38 self.assertEqual(frame.getInternalUnit(axis), "")
39 # NormUnit is derived from Unit, and equals it when nothing can
40 # be simplified. That holds from AST 9.5.0 on; before it the
41 # value came from the Axis InternalUnit. AST 9.4.x is not
42 # supported at all - see the mainpage - so it is not accounted
43 # for here.
44 if ast.astVersion() >= 9005000: 44 ↛ 45line 44 didn't jump to line 45 because the condition on line 44 was never true
45 self.assertEqual(frame.getNormUnit(axis), frame.getUnit(axis))
46 self.assertEqual(frame.getNormUnit(axis), "")
47 else:
48 self.assertEqual(frame.getNormUnit(axis), "")
49 self.assertEqual(frame.getSymbol(axis), "x{}".format(axis))
50 self.assertEqual(frame.getUnit(axis), "")
52 self.checkCopy(frame)
53 self.checkPersistence(frame)
55 def test_FrameSetDigits(self):
56 frame = ast.Frame(2)
57 self.assertEqual(frame.getDigits(), 7)
58 for axis in (1, 2):
59 self.assertEqual(frame.getDigits(axis), 7)
61 frame.setDigits(1, 9)
62 self.assertEqual(frame.getDigits(), 7)
63 self.assertEqual(frame.getDigits(1), 9)
64 self.assertEqual(frame.getDigits(2), 7)
66 frame.setDigits(2, 4)
67 self.assertEqual(frame.getDigits(), 7)
68 self.assertEqual(frame.getDigits(1), 9)
69 self.assertEqual(frame.getDigits(2), 4)
71 def test_FrameLabels(self):
72 frame = ast.Frame(2, "label(1)=a b,label(2)=c d")
74 self.assertEqual(frame.getLabel(1), "a b")
75 self.assertEqual(frame.getLabel(2), "c d")
76 frame.setLabel(2, "A new label")
77 self.assertEqual(frame.getLabel(2), "A new label")
78 frame.clear("Label(2)")
79 self.assertEqual(frame.getLabel(2), "Axis 2")
81 def test_FrameTitle(self):
82 frame = ast.Frame(3, "Title=A Title")
84 self.assertEqual(frame.title, "A Title")
85 testtitle = "Test Frame"
86 frame.title = testtitle
87 frame.clear("Title")
88 self.assertEqual(frame.title, "3-d coordinate system")
90 def test_FrameAngle(self):
91 """Test Frame.angle"""
92 frame = ast.Frame(2)
93 angle = frame.angle([4, 3], [0, 0], [4, 0])
94 self.assertEqual(angle, math.atan2(3, 4))
96 def test_FrameAxis(self):
97 """Test Frame.axAngle, axDistance and axOffset"""
98 frame = ast.Frame(2)
99 angle = frame.axAngle([0, 0], [4, 3], 1)
100 self.assertEqual(angle, -math.atan2(3, 4))
101 distance = frame.axDistance(1, 0, 4)
102 self.assertEqual(distance, 4)
103 axoffset = frame.axOffset(1, 1, 4)
104 self.assertEqual(axoffset, 5)
106 def test_FrameConvert(self):
107 frame = ast.Frame(2)
108 nframe = ast.Frame(2)
109 fset = frame.convert(nframe)
110 self.assertEqual(fset.className, "FrameSet")
112 # the conversion FrameSet should contain two frames
113 # connected by a unit mapping with 2 axes
114 self.assertEqual(fset.nFrame, 2)
115 self.assertEqual(fset.nIn, 2)
116 self.assertEqual(fset.nOut, 2)
117 indata = np.array([
118 [1.1, 2.2],
119 [-43.5, 1309.31],
120 ])
121 outdata = fset.applyForward(indata)
122 assert_allclose(outdata, indata)
123 self.checkRoundTrip(fset, indata)
125 self.assertIsNone(frame.convert(ast.Frame(3)))
127 def test_FrameFindFrame(self):
128 frame = ast.Frame(2)
129 nframe = ast.Frame(2)
130 fset = frame.findFrame(nframe)
131 self.assertEqual(fset.className, "FrameSet")
132 self.assertEqual(fset.nFrame, 2)
134 # the found FrameSet should contain two frames
135 # connected by a unit mapping with 2 axes
136 self.assertEqual(fset.nIn, 2)
137 self.assertEqual(fset.nOut, 2)
138 indata = np.array([
139 [1.1, 2.2],
140 [-43.5, 1309.31],
141 ])
142 outdata = fset.applyForward(indata)
143 assert_allclose(outdata, indata)
144 self.checkRoundTrip(fset, indata)
146 self.assertIsNone(frame.findFrame(ast.Frame(3)))
148 def test_FrameDistance(self):
149 frame = ast.Frame(2)
150 distance = frame.distance([0, 0], [4, 3])
151 self.assertEqual(distance, 5)
153 def test_FrameFormat(self):
154 frame = ast.Frame(2)
155 fmt = frame.format(1, 55.270)
156 self.assertEqual(fmt, "55.27")
158 def test_FrameIntersect(self):
159 frame = ast.Frame(2)
160 cross = frame.intersect([-1, 1], [1, 1], [0, 0], [2, 2])
161 self.assertAlmostEqual(cross[0], 1.0)
162 self.assertAlmostEqual(cross[1], 1.0)
164 def test_FrameMatchAxes(self):
165 frame = ast.Frame(2)
166 frame2 = ast.Frame(3)
167 axes = frame.matchAxes(frame2)
168 self.assertEqual(axes[0], 1)
169 self.assertEqual(axes[1], 2)
170 self.assertEqual(axes[2], 0)
172 def test_FrameNorm(self):
173 frame = ast.Frame(2)
174 # arbitrary, but large enough to wrap if applied to an SphFrame
175 coords = [33.5, 223.4]
176 ncoords = frame.norm(coords)
177 self.assertEqual(ncoords[0], coords[0])
179 def test_FrameOffset(self):
180 """Test Frame.offset and Frame.offset2"""
181 frame = ast.Frame(2)
182 point = frame.offset([0, 0], [4, 3], 10)
183 self.assertEqual(point[0], 8)
184 self.assertEqual(point[1], 6)
185 dp = frame.offset2([0, 0], math.atan2(4, 3), 10)
186 self.assertAlmostEqual(dp.point[0], 8)
187 self.assertAlmostEqual(dp.point[1], 6)
189 def test_FrameOver(self):
190 frame1 = ast.Frame(2, "label(1)=a, label(2)=b")
191 initialNumFrames = frame1.getNObject() # may be >1 when run using pytest
192 frame2 = ast.Frame(1, "label(1)=c")
193 self.assertEqual(frame1.getNObject(), initialNumFrames + 1)
194 cf = frame1.under(frame2)
195 self.assertEqual(cf.nAxes, 3)
196 self.assertEqual(cf.getLabel(1), "a")
197 self.assertEqual(cf.getLabel(2), "b")
198 self.assertEqual(cf.getLabel(3), "c")
200 # check that the contained frames are shallow copies
201 self.assertEqual(frame1.getNObject(), initialNumFrames + 1)
202 self.assertEqual(frame1.getRefCount(), 2)
203 self.assertEqual(frame2.getRefCount(), 2)
205 def test_FramePerm(self):
206 frame = ast.Frame(2)
207 frame.permAxes([2, 1])
208 fm = frame.pickAxes([2])
209 self.assertEqual(fm.frame.className, "Frame")
210 self.assertEqual(fm.frame.nIn, 1)
211 self.assertEqual(fm.mapping.className, "PermMap")
212 self.assertEqual(fm.mapping.nIn, 2)
213 self.assertEqual(fm.mapping.nOut, 1)
215 def test_FrameResolve(self):
216 frame = ast.Frame(2)
217 res = frame.resolve([0, 0], [2, 1], [0, 4])
218 theta = math.atan2(1, 2)
219 d1pred = 4 * math.sin(theta)
220 d2pred = 4 * math.cos(theta)
221 predpoint = [
222 d1pred * math.cos(theta),
223 d1pred * math.sin(theta),
224 ]
225 self.assertAlmostEqual(res.d1, d1pred)
226 self.assertAlmostEqual(res.d2, d2pred)
227 assert_allclose(res.point, predpoint)
229 def test_FrameUnformat(self):
230 frame = ast.Frame(2)
231 nrv = frame.unformat(1, "56.4 #")
232 self.assertEqual(nrv.nread, 5)
233 self.assertEqual(nrv.value, 56.4)
235 def test_FrameActiveUnit(self):
236 """Test the ActiveUnit property"""
237 frame = ast.Frame(2)
238 self.assertFalse(frame.activeUnit)
239 frame.activeUnit = True
240 self.assertTrue(frame.activeUnit)
243if __name__ == "__main__": 243 ↛ 244line 243 didn't jump to line 244 because the condition on line 243 was never true
244 unittest.main()