Coverage for /home/jenkins/workspace/NDS/Zserio/NDS_ZSERIO-linux-build/compiler/extensions/python/runtime/tests/test_bitsizeof.py: 100%

225 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2023-12-13 15:12 +0000

1import unittest 

2 

3from zserio.bitbuffer import BitBuffer 

4from zserio.bitsizeof import (bitsizeof_varint16, bitsizeof_varint32, bitsizeof_varint64, bitsizeof_varint, 

5 bitsizeof_varuint16, bitsizeof_varuint32, bitsizeof_varuint64, bitsizeof_varuint, 

6 bitsizeof_varsize, bitsizeof_string, bitsizeof_bitbuffer) 

7from zserio.exception import PythonRuntimeException 

8from zserio.limits import INT64_MIN 

9 

10class BitSizeOfTest(unittest.TestCase): 

11 

12 def test_bitsizeof_varint16(self): 

13 self.assertEqual(1 * 8, bitsizeof_varint16(0)) 

14 

15 self.assertEqual(1 * 8, bitsizeof_varint16(1 << (0))) 

16 self.assertEqual(1 * 8, bitsizeof_varint16(-(1 << (0)))) 

17 self.assertEqual(1 * 8, bitsizeof_varint16((1 << (6)) - 1)) 

18 self.assertEqual(1 * 8, bitsizeof_varint16(-((1 << (6)) - 1))) 

19 

20 self.assertEqual(2 * 8, bitsizeof_varint16(1 << (6))) 

21 self.assertEqual(2 * 8, bitsizeof_varint16(-(1 << (6)))) 

22 self.assertEqual(2 * 8, bitsizeof_varint16((1 << (6 + 8)) - 1)) 

23 self.assertEqual(2 * 8, bitsizeof_varint16(-((1 << (6 + 8)) - 1))) 

24 

25 with self.assertRaises(PythonRuntimeException): 

26 bitsizeof_varint16(-(1 << (6 + 8))) # below the lower bound 

27 

28 with self.assertRaises(PythonRuntimeException): 

29 bitsizeof_varint16(1 << (6 + 8)) # above the upper bound 

30 

31 def test_bitsizeof_varint32(self): 

32 self.assertEqual(1 * 8, bitsizeof_varint32(0)) 

33 

34 self.assertEqual(1 * 8, bitsizeof_varint32(1 << (0))) 

35 self.assertEqual(1 * 8, bitsizeof_varint32(-(1 << (0)))) 

36 self.assertEqual(1 * 8, bitsizeof_varint32((1 << (6)) - 1)) 

37 self.assertEqual(1 * 8, bitsizeof_varint32(-((1 << (6)) - 1))) 

38 

39 self.assertEqual(2 * 8, bitsizeof_varint32(1 << (6))) 

40 self.assertEqual(2 * 8, bitsizeof_varint32(-(1 << (6)))) 

41 self.assertEqual(2 * 8, bitsizeof_varint32((1 << (6 + 7)) - 1)) 

42 self.assertEqual(2 * 8, bitsizeof_varint32(-((1 << (6 + 7)) - 1))) 

43 

44 self.assertEqual(3 * 8, bitsizeof_varint32(1 << (6 + 7))) 

45 self.assertEqual(3 * 8, bitsizeof_varint32(-(1 << (6 + 7)))) 

46 self.assertEqual(3 * 8, bitsizeof_varint32((1 << (6 + 7 + 7)) - 1)) 

47 self.assertEqual(3 * 8, bitsizeof_varint32(-((1 << (6 + 7 + 7)) - 1))) 

48 

49 self.assertEqual(4 * 8, bitsizeof_varint32(1 << (6 + 7 + 7))) 

50 self.assertEqual(4 * 8, bitsizeof_varint32(-(1 << (6 + 7 + 7)))) 

51 self.assertEqual(4 * 8, bitsizeof_varint32((1 << (6 + 7 + 7 + 8)) - 1)) 

52 self.assertEqual(4 * 8, bitsizeof_varint32(-((1 << (6 + 7 + 7 + 8)) - 1))) 

53 

54 with self.assertRaises(PythonRuntimeException): 

55 bitsizeof_varint32(-(1 << (6 + 7 + 7 + 8))) # below the lower bound 

56 

57 with self.assertRaises(PythonRuntimeException): 

58 bitsizeof_varint32(1 << (6 + 7 + 7 + 8)) # above the upper bound 

59 

60 def test_bitsizeof_varint64(self): 

61 self.assertEqual(1 * 8, bitsizeof_varint64(0)) 

62 

63 self.assertEqual(1 * 8, bitsizeof_varint64(1 << (0))) 

64 self.assertEqual(1 * 8, bitsizeof_varint64(-(1 << (0)))) 

65 self.assertEqual(1 * 8, bitsizeof_varint64((1 << (6)) - 1)) 

66 self.assertEqual(1 * 8, bitsizeof_varint64(-((1 << (6)) - 1))) 

67 

68 self.assertEqual(2 * 8, bitsizeof_varint64(1 << (6))) 

69 self.assertEqual(2 * 8, bitsizeof_varint64(-(1 << (6)))) 

70 self.assertEqual(2 * 8, bitsizeof_varint64((1 << (6 + 7)) - 1)) 

71 self.assertEqual(2 * 8, bitsizeof_varint64(-((1 << (6 + 7)) - 1))) 

72 

73 self.assertEqual(3 * 8, bitsizeof_varint64(1 << (6 + 7))) 

74 self.assertEqual(3 * 8, bitsizeof_varint64(-(1 << (6 + 7)))) 

75 self.assertEqual(3 * 8, bitsizeof_varint64((1 << (6 + 7 + 7)) - 1)) 

76 self.assertEqual(3 * 8, bitsizeof_varint64(-((1 << (6 + 7 + 7)) - 1))) 

77 

78 self.assertEqual(4 * 8, bitsizeof_varint64(1 << (6 + 7 + 7))) 

79 self.assertEqual(4 * 8, bitsizeof_varint64(-(1 << (6 + 7 + 7)))) 

80 self.assertEqual(4 * 8, bitsizeof_varint64((1 << (6 + 7 + 7 + 7)) - 1)) 

81 self.assertEqual(4 * 8, bitsizeof_varint64(-((1 << (6 + 7 + 7 + 7)) - 1))) 

82 

83 self.assertEqual(5 * 8, bitsizeof_varint64(1 << (6 + 7 + 7 + 7))) 

84 self.assertEqual(5 * 8, bitsizeof_varint64(-(1 << (6 + 7 + 7 + 7)))) 

85 self.assertEqual(5 * 8, bitsizeof_varint64((1 << (6 + 7 + 7 + 7 + 7)) - 1)) 

86 self.assertEqual(5 * 8, bitsizeof_varint64(-((1 << (6 + 7 + 7 + 7 + 7)) - 1))) 

87 

88 self.assertEqual(6 * 8, bitsizeof_varint64(1 << (6 + 7 + 7 + 7 + 7))) 

89 self.assertEqual(6 * 8, bitsizeof_varint64(-(1 << (6 + 7 + 7 + 7 + 7)))) 

90 self.assertEqual(6 * 8, bitsizeof_varint64((1 << (6 + 7 + 7 + 7 + 7 + 7)) - 1)) 

91 self.assertEqual(6 * 8, bitsizeof_varint64(-((1 << (6 + 7 + 7 + 7 + 7 + 7)) - 1))) 

92 

93 self.assertEqual(7 * 8, bitsizeof_varint64(1 << (6 + 7 + 7 + 7 + 7 + 7))) 

94 self.assertEqual(7 * 8, bitsizeof_varint64(-(1 << (6 + 7 + 7 + 7 + 7 + 7)))) 

95 self.assertEqual(7 * 8, bitsizeof_varint64((1 << (6 + 7 + 7 + 7 + 7 + 7 + 7)) - 1)) 

96 self.assertEqual(7 * 8, bitsizeof_varint64(-((1 << (6 + 7 + 7 + 7 + 7 + 7 + 7)) - 1))) 

97 

98 self.assertEqual(8 * 8, bitsizeof_varint64(1 << (6 + 7 + 7 + 7 + 7 + 7 + 7))) 

99 self.assertEqual(8 * 8, bitsizeof_varint64(-(1 << (6 + 7 + 7 + 7 + 7 + 7 + 7)))) 

100 self.assertEqual(8 * 8, bitsizeof_varint64((1 << (6 + 7 + 7 + 7 + 7 + 7 + 7 + 8)) - 1)) 

101 self.assertEqual(8 * 8, bitsizeof_varint64(-((1 << (6 + 7 + 7 + 7 + 7 + 7 + 7 + 8)) - 1))) 

102 

103 with self.assertRaises(PythonRuntimeException): 

104 bitsizeof_varint64(-(1 << (6 + 7 + 7 + 7 + 7 + 7 + 7 + 8))) # below the lower bound 

105 

106 with self.assertRaises(PythonRuntimeException): 

107 bitsizeof_varint64(1 << (6 + 7 + 7 + 7 + 7 + 7 + 7 + 8)) # above the upper bound 

108 

109 def test_bitsizeof_varint(self): 

110 self.assertEqual(8, bitsizeof_varint(0)) 

111 self.assertEqual(8, bitsizeof_varint(-(1 << 6) + 1)) 

112 self.assertEqual(8, bitsizeof_varint((1 << 6) - 1)) 

113 self.assertEqual(16, bitsizeof_varint(-(1 << 6))) 

114 self.assertEqual(16, bitsizeof_varint((1 << 6))) 

115 self.assertEqual(16, bitsizeof_varint(-(1 << 13) + 1)) 

116 self.assertEqual(16, bitsizeof_varint((1 << 13) - 1)) 

117 self.assertEqual(24, bitsizeof_varint(-(1 << 13))) 

118 self.assertEqual(24, bitsizeof_varint((1 << 13))) 

119 self.assertEqual(24, bitsizeof_varint(-(1 << 20) + 1)) 

120 self.assertEqual(24, bitsizeof_varint((1 << 20) - 1)) 

121 self.assertEqual(32, bitsizeof_varint(-(1 << 20))) 

122 self.assertEqual(32, bitsizeof_varint((1 << 20))) 

123 self.assertEqual(32, bitsizeof_varint(-(1 << 27) + 1)) 

124 self.assertEqual(32, bitsizeof_varint((1 << 27) - 1)) 

125 self.assertEqual(40, bitsizeof_varint(-(1 << 27))) 

126 self.assertEqual(40, bitsizeof_varint((1 << 27))) 

127 self.assertEqual(40, bitsizeof_varint(-(1 << 34) + 1)) 

128 self.assertEqual(40, bitsizeof_varint((1 << 34) - 1)) 

129 self.assertEqual(48, bitsizeof_varint(-(1 << 34))) 

130 self.assertEqual(48, bitsizeof_varint((1 << 34))) 

131 self.assertEqual(48, bitsizeof_varint(-(1 << 41) + 1)) 

132 self.assertEqual(48, bitsizeof_varint((1 << 41) - 1)) 

133 self.assertEqual(56, bitsizeof_varint(-(1 << 41))) 

134 self.assertEqual(56, bitsizeof_varint((1 << 41))) 

135 self.assertEqual(56, bitsizeof_varint(-(1 << 48) + 1)) 

136 self.assertEqual(56, bitsizeof_varint((1 << 48) - 1)) 

137 self.assertEqual(64, bitsizeof_varint(-(1 << 48))) 

138 self.assertEqual(64, bitsizeof_varint((1 << 48))) 

139 self.assertEqual(64, bitsizeof_varint(-(1 << 55) + 1)) 

140 self.assertEqual(64, bitsizeof_varint((1 << 55) - 1)) 

141 self.assertEqual(72, bitsizeof_varint(-(1 << 55))) 

142 self.assertEqual(72, bitsizeof_varint((1 << 55))) 

143 self.assertEqual(72, bitsizeof_varint(-(1 << 63) + 1)) 

144 self.assertEqual(72, bitsizeof_varint((1 << 63) - 1)) 

145 

146 # special case, INT64_MIN is stored as -0 

147 self.assertEqual(8, bitsizeof_varint(INT64_MIN)) 

148 

149 with self.assertRaises(PythonRuntimeException): 

150 bitsizeof_varint(INT64_MIN - 1) # below the lower bound 

151 

152 with self.assertRaises(PythonRuntimeException): 

153 bitsizeof_varint(1 << 63) # above the upper bound 

154 

155 def test_bitsizeof_varuint16(self): 

156 self.assertEqual(1 * 8, bitsizeof_varuint16(0)) 

157 

158 self.assertEqual(1 * 8, bitsizeof_varuint16(1 << (0))) 

159 self.assertEqual(1 * 8, bitsizeof_varuint16((1 << (7)) - 1)) 

160 

161 self.assertEqual(2 * 8, bitsizeof_varuint16(1 << (7))) 

162 self.assertEqual(2 * 8, bitsizeof_varuint16((1 << (7 + 8)) - 1)) 

163 

164 with self.assertRaises(PythonRuntimeException): 

165 bitsizeof_varuint16(-1) # below the lower bound 

166 

167 with self.assertRaises(PythonRuntimeException): 

168 bitsizeof_varuint16(1 << (7 + 8)) # above the upper bound 

169 

170 def test_bitsizeof_varuint32(self): 

171 self.assertEqual(1 * 8, bitsizeof_varuint32(0)) 

172 

173 self.assertEqual(1 * 8, bitsizeof_varuint32(1 << (0))) 

174 self.assertEqual(1 * 8, bitsizeof_varuint32((1 << (7)) - 1)) 

175 

176 self.assertEqual(2 * 8, bitsizeof_varuint32(1 << (7))) 

177 self.assertEqual(2 * 8, bitsizeof_varuint32((1 << (7 + 7)) - 1)) 

178 

179 self.assertEqual(3 * 8, bitsizeof_varuint32(1 << (7 + 7))) 

180 self.assertEqual(3 * 8, bitsizeof_varuint32((1 << (7 + 7 + 7)) - 1)) 

181 

182 self.assertEqual(4 * 8, bitsizeof_varuint32(1 << (7 + 7 + 7))) 

183 self.assertEqual(4 * 8, bitsizeof_varuint32((1 << (7 + 7 + 7 + 8)) - 1)) 

184 

185 with self.assertRaises(PythonRuntimeException): 

186 bitsizeof_varuint32(-1) # below the lower bound 

187 

188 with self.assertRaises(PythonRuntimeException): 

189 bitsizeof_varuint32(1 << (7 + 7 + 7 + 8)) # above the upper bound 

190 

191 def test_bitsizeof_varuint64(self): 

192 self.assertEqual(1 * 8, bitsizeof_varuint64(0)) 

193 

194 self.assertEqual(1 * 8, bitsizeof_varuint64(1 << (0))) 

195 self.assertEqual(1 * 8, bitsizeof_varuint64((1 << (7)) - 1)) 

196 

197 self.assertEqual(2 * 8, bitsizeof_varuint64(1 << (7))) 

198 self.assertEqual(2 * 8, bitsizeof_varuint64((1 << (7 + 7)) - 1)) 

199 

200 self.assertEqual(3 * 8, bitsizeof_varuint64(1 << (7 + 7))) 

201 self.assertEqual(3 * 8, bitsizeof_varuint64((1 << (7 + 7 + 7)) - 1)) 

202 

203 self.assertEqual(4 * 8, bitsizeof_varuint64(1 << (7 + 7 + 7))) 

204 self.assertEqual(4 * 8, bitsizeof_varuint64((1 << (7 + 7 + 7 + 7)) - 1)) 

205 

206 self.assertEqual(5 * 8, bitsizeof_varuint64(1 << (7 + 7 + 7 + 7))) 

207 self.assertEqual(5 * 8, bitsizeof_varuint64((1 << (7 + 7 + 7 + 7 + 7)) - 1)) 

208 

209 self.assertEqual(6 * 8, bitsizeof_varuint64(1 << (7 + 7 + 7 + 7 + 7))) 

210 self.assertEqual(6 * 8, bitsizeof_varuint64((1 << (7 + 7 + 7 + 7 + 7 + 7)) - 1)) 

211 

212 self.assertEqual(7 * 8, bitsizeof_varuint64(1 << (7 + 7 + 7 + 7 + 7 + 7))) 

213 self.assertEqual(7 * 8, bitsizeof_varuint64((1 << (7 + 7 + 7 + 7 + 7 + 7 + 7)) - 1)) 

214 

215 self.assertEqual(8 * 8, bitsizeof_varuint64(1 << (7 + 7 + 7 + 7 + 7 + 7 + 7))) 

216 self.assertEqual(8 * 8, bitsizeof_varuint64((1 << (7 + 7 + 7 + 7 + 7 + 7 + 7 + 8)) - 1)) 

217 

218 with self.assertRaises(PythonRuntimeException): 

219 bitsizeof_varuint64(-1) # below the lower bound 

220 

221 with self.assertRaises(PythonRuntimeException): 

222 bitsizeof_varuint64(1 << (7 + 7 + 7 + 7 + 7 + 7 + 7 + 8)) # above the upper bound 

223 

224 def test_bitsizeof_varuint(self): 

225 self.assertEqual(8, bitsizeof_varuint(0)) 

226 self.assertEqual(8, bitsizeof_varuint((1 << 7) - 1)) 

227 self.assertEqual(16, bitsizeof_varuint((1 << 7))) 

228 self.assertEqual(16, bitsizeof_varuint((1 << 14) - 1)) 

229 self.assertEqual(24, bitsizeof_varuint((1 << 14))) 

230 self.assertEqual(24, bitsizeof_varuint((1 << 21) - 1)) 

231 self.assertEqual(32, bitsizeof_varuint((1 << 21))) 

232 self.assertEqual(32, bitsizeof_varuint((1 << 28) - 1)) 

233 self.assertEqual(40, bitsizeof_varuint((1 << 28))) 

234 self.assertEqual(40, bitsizeof_varuint((1 << 35) - 1)) 

235 self.assertEqual(48, bitsizeof_varuint((1 << 35))) 

236 self.assertEqual(48, bitsizeof_varuint((1 << 42) - 1)) 

237 self.assertEqual(56, bitsizeof_varuint((1 << 42))) 

238 self.assertEqual(56, bitsizeof_varuint((1 << 49) - 1)) 

239 self.assertEqual(64, bitsizeof_varuint((1 << 49))) 

240 self.assertEqual(64, bitsizeof_varuint((1 << 56) - 1)) 

241 self.assertEqual(72, bitsizeof_varuint((1 << 56))) 

242 self.assertEqual(72, bitsizeof_varuint((1 << 64) - 1)) 

243 

244 with self.assertRaises(PythonRuntimeException): 

245 bitsizeof_varuint(-1) # below the lower bound 

246 

247 with self.assertRaises(PythonRuntimeException): 

248 bitsizeof_varuint(1 << 64) # above the upper bound 

249 

250 def test_bitsizeof_varsize(self): 

251 self.assertEqual(1 * 8, bitsizeof_varsize(0)) 

252 

253 self.assertEqual(1 * 8, bitsizeof_varsize(1 << (0))) 

254 self.assertEqual(1 * 8, bitsizeof_varsize((1 << (7)) - 1)) 

255 

256 self.assertEqual(2 * 8, bitsizeof_varsize(1 << (7))) 

257 self.assertEqual(2 * 8, bitsizeof_varsize((1 << (7 + 7)) - 1)) 

258 

259 self.assertEqual(3 * 8, bitsizeof_varsize(1 << (7 + 7))) 

260 self.assertEqual(3 * 8, bitsizeof_varsize((1 << (7 + 7 + 7)) - 1)) 

261 

262 self.assertEqual(4 * 8, bitsizeof_varsize(1 << (7 + 7 + 7))) 

263 self.assertEqual(4 * 8, bitsizeof_varsize((1 << (7 + 7 + 7 + 7)) - 1)) 

264 

265 self.assertEqual(5 * 8, bitsizeof_varsize(1 << (7 + 7 + 7 + 7))) 

266 self.assertEqual(5 * 8, bitsizeof_varsize((1 << (2 + 7 + 7 + 7 + 8)) - 1)) 

267 

268 with self.assertRaises(PythonRuntimeException): 

269 bitsizeof_varsize(-1) # below the lower bound 

270 

271 with self.assertRaises(PythonRuntimeException): 

272 bitsizeof_varsize(1 << (2 + 7 + 7 + 7 + 8)) # above the upper bound 

273 

274 def test_bitsizeof_string(self): 

275 self.assertEqual((1 + 1) * 8, bitsizeof_string("T")) 

276 self.assertEqual((1 + 4) * 8, bitsizeof_string("TEST")) 

277 

278 test_string_length = 1 << 7 # 2 bytes per character! 

279 test_string = (b'\xc2\xAB' * test_string_length).decode("utf-8") 

280 self.assertEqual((2 + 2 * test_string_length) * 8, bitsizeof_string(test_string)) 

281 

282 def test_bitsizeof_bitbuffer(self): 

283 test_bitbuffer1 = BitBuffer(bytes([0xAB, 0x03]), 8) 

284 self.assertEqual(8 + 8, bitsizeof_bitbuffer(test_bitbuffer1)) 

285 

286 test_bitbuffer2 = BitBuffer(bytes([0xAB, 0x03]), 11) 

287 self.assertEqual(8 + 11, bitsizeof_bitbuffer(test_bitbuffer2)) 

288 

289 test_bitbuffer3 = BitBuffer(bytes([0xAB, 0xCD]), 16) 

290 self.assertEqual(8 + 16, bitsizeof_bitbuffer(test_bitbuffer3)) 

291 

292 test_bitbuffer4 = BitBuffer(bytes([0xAB, 0xCD])) 

293 self.assertEqual(8 + 16, bitsizeof_bitbuffer(test_bitbuffer4)) 

294 

295 test_bitbuffer5 = BitBuffer(bytes(16 * [1]), 127) 

296 self.assertEqual(8 + 15 * 8 + 7, bitsizeof_bitbuffer(test_bitbuffer5)) 

297 

298 test_bitbuffer6 = BitBuffer(bytes(16 * [1]), 128) 

299 self.assertEqual(16 + 16 * 8, bitsizeof_bitbuffer(test_bitbuffer6))