Coverage for tests/test_append.py: 12%

90 statements  

« prev     ^ index     » next       coverage.py v7.5.3, created at 2024-06-13 02:50 -0700

1import unittest 

2from numpy.testing import assert_allclose 

3 

4from astshim import Frame, SkyFrame, UnitMap, FrameSet, append 

5from astshim.test import makeForwardPolyMap, makeTwoWayPolyMap 

6 

7 

8class TestFrameSetAppend(unittest.TestCase): 

9 

10 def makeFrameSet(self, nIn, nOut): 

11 """Create a FrameSet with the specified dimensions. 

12 

13 The FrameSet shall have the following Frames: 

14 "base"(nIn, #1) 

15 | 

16 +-------------- 

17 | | 

18 "mid"(4, #2) "fork"(1, #4) 

19 | 

20 "current"(nOut, #3) 

21 """ 

22 frameSet = FrameSet(Frame(nIn, "Ident=base")) 

23 frameSet.addFrame(FrameSet.CURRENT, 

24 makeTwoWayPolyMap(nIn, 4), 

25 Frame(4, "Ident=mid")) 

26 frameSet.addFrame(FrameSet.CURRENT, 

27 makeTwoWayPolyMap(4, nOut), 

28 Frame(nOut, "Ident=current")) 

29 frameSet.addFrame(FrameSet.BASE, 

30 makeTwoWayPolyMap(nIn, 1), 

31 Frame(1, "Ident=fork")) 

32 

33 frameSet.current = 3 

34 assert frameSet.nFrame == 4 

35 assert frameSet.base == 1 

36 assert frameSet.getFrame(FrameSet.BASE).ident == "base" 

37 assert frameSet.getFrame(2).ident == "mid" 

38 assert frameSet.current == 3 

39 assert frameSet.getFrame(FrameSet.CURRENT).ident == "current" 

40 assert frameSet.getFrame(4).ident == "fork" 

41 return frameSet 

42 

43 def test_AppendEffect(self): 

44 """Check that a concatenated FrameSet transforms correctly. 

45 """ 

46 set1 = self.makeFrameSet(2, 3) 

47 set2 = self.makeFrameSet(3, 1) 

48 set12 = append(set1, set2) 

49 

50 # Can't match 1D output to 2D input 

51 with self.assertRaises(RuntimeError): 

52 append(set2, set1) 

53 

54 x = [1.2, 3.4] 

55 y_merged = set12.applyForward(x) 

56 y_separate = set2.applyForward(set1.applyForward(x)) 

57 assert_allclose(y_merged, y_separate) 

58 

59 y = [-0.3] 

60 x_merged = set12.applyInverse(y) 

61 x_separate = set1.applyInverse(set2.applyInverse(y)) 

62 assert_allclose(x_merged, x_separate) 

63 

64 # No side effects 

65 self.assertEqual(set1.base, 1) 

66 self.assertEqual(set1.current, 3) 

67 self.assertEqual(set2.base, 1) 

68 self.assertEqual(set2.current, 3) 

69 

70 def test_AppendFrames(self): 

71 """Check that a concatenated FrameSet preserves all Frames. 

72 """ 

73 set1 = self.makeFrameSet(1, 3) 

74 # AST docs say FrameSets always have contiguously numbered frames, 

75 # but let's make sure 

76 set1.removeFrame(2) 

77 set2 = self.makeFrameSet(3, 2) 

78 set12 = append(set1, set2) 

79 

80 self.assertEqual(set1.nFrame + set2.nFrame, set12.nFrame) 

81 for i in range(1, 1+set1.nFrame): 

82 oldFrame = set1.getFrame(i) 

83 newFrame = set12.getFrame(i) 

84 self.assertEqual(oldFrame.ident, newFrame.ident) 

85 self.assertEqual(oldFrame.nAxes, newFrame.nAxes) 

86 if i == set1.base: 

87 self.assertTrue(i == set12.base) 

88 else: 

89 self.assertFalse(i == set12.base) 

90 for i in range(1, 1+set2.nFrame): 

91 offset = set1.nFrame 

92 oldFrame = set2.getFrame(i) 

93 newFrame = set12.getFrame(offset + i) 

94 self.assertEqual(oldFrame.ident, newFrame.ident) 

95 self.assertEqual(oldFrame.nAxes, newFrame.nAxes) 

96 if i == set2.current: 

97 self.assertTrue(offset + i == set12.current) 

98 else: 

99 self.assertFalse(offset + i == set12.current) 

100 

101 def test_AppendIndependent(self): 

102 """Check that a concatenated FrameSet is not affected by changes 

103 to its constituents. 

104 """ 

105 set1 = self.makeFrameSet(3, 3) 

106 set2 = self.makeFrameSet(3, 3) 

107 set12 = append(set1, set2) 

108 

109 nTotal = set12.nFrame 

110 x = [1.2, 3.4, 5.6] 

111 y = set12.applyForward(x) 

112 

113 set1.addFrame(2, makeTwoWayPolyMap(4, 2), Frame(2, "Ident=extra")) 

114 set1.addFrame(1, makeTwoWayPolyMap(3, 3), Frame(3, "Ident=legume")) 

115 set1.removeFrame(3) 

116 set2.addFrame(4, makeForwardPolyMap(1, 4), Frame(4, "Ident=extra")) 

117 set2.base = 2 

118 

119 # Use exact equality because nothing should change 

120 self.assertEqual(set12.nFrame, nTotal) 

121 self.assertEqual(set12.applyForward(x), y) 

122 

123 def test_AppendMismatch(self): 

124 """Check that append behaves as expected when joining non-identical 

125 frames. 

126 """ 

127 set1 = self.makeFrameSet(3, 2) 

128 set2 = self.makeFrameSet(2, 3) 

129 set1.addFrame(FrameSet.CURRENT, makeForwardPolyMap(2, 2), 

130 SkyFrame("Ident=sky")) 

131 set12 = append(set1, set2) 

132 

133 x = [1.2, 3.4, 5.6] 

134 y_merged = set12.applyForward(x) 

135 y_separate = set2.applyForward(set1.applyForward(x)) 

136 assert_allclose(y_merged, y_separate) 

137 

138 iFrom = set1.current 

139 iTo = set1.nFrame + set2.base 

140 self.assertIsInstance(set12.getFrame(iFrom), SkyFrame) 

141 self.assertNotIsInstance(set12.getFrame(iTo), SkyFrame) 

142 self.assertIsInstance(set12.getMapping(iFrom, iTo), UnitMap) 

143 

144 

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

146 unittest.main()