Coverage for tests/test_float.py: 100%

107 statements  

« prev     ^ index     » next       coverage.py v7.4.1, created at 2024-02-08 22:32 +0100

1""" 

2test for Float() 

3""" 

4import unittest 

5import math 

6 

7from stricto import Float, Error 

8 

9 

10def pair_only(value, o): # pylint: disable=unused-argument 

11 """ 

12 return the value if par, or value +1  

13 """ 

14 return value + 1.0 if value % 2 else value 

15 

16 

17def check_pair(value, o): # pylint: disable=unused-argument 

18 """ 

19 return true if pair 

20 """ 

21 return not value % 2 

22 

23 

24class TestInt(unittest.TestCase): 

25 """ 

26 Test on Float 

27 """ 

28 def __init__(self, m): 

29 unittest.TestCase.__init__(self, m) 

30 self.on_change_bool = False 

31 

32 def test_error_type(self): 

33 """ 

34 Test error of type 

35 """ 

36 a = Float() 

37 with self.assertRaises(Error) as e: 

38 a.set("dd") 

39 self.assertEqual(e.exception.message, "Must be a float") 

40 

41 def test_default(self): 

42 """ 

43 Test default value 

44 """ 

45 a = Float() 

46 self.assertEqual(a, None) 

47 a = Float(default=3.14) 

48 b = a + 2.0 

49 self.assertEqual(a, 3.14) 

50 self.assertEqual(math.isclose(b.get_value(), 5.14), True) 

51 

52 def test_min(self): 

53 """ 

54 Test min 

55 """ 

56 a = Float(min=10.0) 

57 with self.assertRaises(Error) as e: 

58 a.set(9.9) 

59 self.assertEqual(e.exception.message, "Must be above Minimal") 

60 

61 def test_max(self): 

62 """ 

63 Test max 

64 """ 

65 a = Float(max=10.0) 

66 with self.assertRaises(Error) as e: 

67 a.set(10.00001) 

68 self.assertEqual(e.exception.message, "Must be below Maximal") 

69 

70 def test_float_operator(self): 

71 """ 

72 Test __operators__ 

73 """ 

74 c = Float( default=5.0) 

75 for d in [ Float(default=2.0), 2.0 ]: 

76 self.assertEqual(c+d, 7) 

77 self.assertEqual(c-d, 3) 

78 self.assertEqual(c*d, 10) 

79 self.assertEqual(c**d, 25) 

80 self.assertEqual(c//d, 2) 

81 self.assertEqual(c/d, 2.5) 

82 self.assertEqual(c%d, 1) 

83 

84 def test_copy(self): 

85 """ 

86 Test ref and copy() 

87 """ 

88 a = Float(max=10.0) 

89 a.set(9.0) 

90 b = a.copy() 

91 self.assertEqual(b, 9.0) 

92 with self.assertRaises(Error) as e: 

93 b.set(a + 3) 

94 self.assertEqual(e.exception.message, "Must be below Maximal") 

95 

96 def test_comparison(self): 

97 """ 

98 test comparison operators 

99 """ 

100 a = Float(max=10.0) 

101 a.set(9.0) 

102 b = Float() 

103 b.set(9.0) 

104 self.assertEqual(b, a) 

105 b.set(11.0) 

106 self.assertGreater(b, a) 

107 self.assertGreaterEqual(b, a) 

108 

109 def test_object_affectation(self): 

110 """ 

111 Test __add__ 

112 """ 

113 a = Float(max=10.0) 

114 a.set(9.0) 

115 b = Float() 

116 b.set(9.0) 

117 with self.assertRaises(Error) as e: 

118 c = a + b 

119 self.assertEqual(e.exception.message, "Must be below Maximal") 

120 c = b + a 

121 self.assertEqual(type(c), Float) 

122 self.assertEqual(c, 18.0) 

123 

124 def test_transform(self): 

125 """ 

126 Test transform= option 

127 """ 

128 a = Float(transform=pair_only) 

129 a.set(10.0) 

130 self.assertEqual(a, 10.0) 

131 a.set(9.0) 

132 self.assertEqual(a, 10.0) 

133 

134 def test_transform_lambda(self): 

135 """ 

136 Test transform with a lambda 

137 """ 

138 a = Float(transform=lambda value, o: value + 1.0 if value % 2 else value) 

139 a.set(10.0) 

140 self.assertEqual(a, 10.0) 

141 a.set(9.0) 

142 self.assertEqual(a, 10.0) 

143 

144 def test_constraint(self): 

145 """ 

146 Test constraints 

147 """ 

148 a = Float(constraint=check_pair) 

149 with self.assertRaises(Error) as e: 

150 a.set(11.0) 

151 self.assertEqual(e.exception.message, "constraint not validated") 

152 a = Float(constraint=[check_pair]) 

153 with self.assertRaises(Error) as e: 

154 a.set(11.0) 

155 self.assertEqual(e.exception.message, "constraint not validated") 

156 a.set(10.0) 

157 self.assertEqual(a, 10.0) 

158 

159 def test_transform_on_change(self): 

160 """ 

161 Test onChange option 

162 """ 

163 self.on_change_bool = False 

164 

165 def change_test(old_value, value, o): # pylint: disable=unused-argument 

166 """ 

167 just a change option 

168 """ 

169 self.on_change_bool = True 

170 

171 a = Float(onChange=change_test) 

172 self.on_change_bool = False 

173 a.set(10.0) 

174 self.assertEqual(self.on_change_bool, True) 

175 self.on_change_bool = False 

176 a.set(10.0) 

177 self.assertEqual(self.on_change_bool, False) 

178 a.set(11.0) 

179 self.assertEqual(self.on_change_bool, True)