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

1import math 

2import unittest 

3 

4import numpy as np 

5from numpy.testing import assert_allclose 

6 

7import astshim as ast 

8from astshim.test import MappingTestCase 

9 

10 

11class TestFrame(MappingTestCase): 

12 

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) 

31 

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), "") 

51 

52 self.checkCopy(frame) 

53 self.checkPersistence(frame) 

54 

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) 

60 

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) 

65 

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) 

70 

71 def test_FrameLabels(self): 

72 frame = ast.Frame(2, "label(1)=a b,label(2)=c d") 

73 

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") 

80 

81 def test_FrameTitle(self): 

82 frame = ast.Frame(3, "Title=A Title") 

83 

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") 

89 

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)) 

95 

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) 

105 

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") 

111 

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) 

124 

125 self.assertIsNone(frame.convert(ast.Frame(3))) 

126 

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) 

133 

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) 

145 

146 self.assertIsNone(frame.findFrame(ast.Frame(3))) 

147 

148 def test_FrameDistance(self): 

149 frame = ast.Frame(2) 

150 distance = frame.distance([0, 0], [4, 3]) 

151 self.assertEqual(distance, 5) 

152 

153 def test_FrameFormat(self): 

154 frame = ast.Frame(2) 

155 fmt = frame.format(1, 55.270) 

156 self.assertEqual(fmt, "55.27") 

157 

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) 

163 

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) 

171 

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]) 

178 

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) 

188 

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") 

199 

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) 

204 

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) 

214 

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) 

228 

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) 

234 

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) 

241 

242 

243if __name__ == "__main__": 243 ↛ 244line 243 didn't jump to line 244 because the condition on line 243 was never true

244 unittest.main()