| 186 | import binascii |
| 187 | |
| 188 | class IntTester(unittest.TestCase): |
| 189 | def __init__(self, format): |
| 190 | super(IntTester, self).__init__(methodName='test_one') |
| 191 | self.format = format |
| 192 | self.code = format[-1] |
| 193 | self.byteorder = format[:-1] |
| 194 | if not self.byteorder in byteorders: |
| 195 | raise ValueError("unrecognized packing byteorder: %s" % |
| 196 | self.byteorder) |
| 197 | self.bytesize = struct.calcsize(format) |
| 198 | self.bitsize = self.bytesize * 8 |
| 199 | if self.code in tuple('bhilqn'): |
| 200 | self.signed = True |
| 201 | self.min_value = -(2**(self.bitsize-1)) |
| 202 | self.max_value = 2**(self.bitsize-1) - 1 |
| 203 | elif self.code in tuple('BHILQN'): |
| 204 | self.signed = False |
| 205 | self.min_value = 0 |
| 206 | self.max_value = 2**self.bitsize - 1 |
| 207 | else: |
| 208 | raise ValueError("unrecognized format code: %s" % |
| 209 | self.code) |
| 210 | |
| 211 | def test_one(self, x, pack=struct.pack, |
| 212 | unpack=struct.unpack, |
| 213 | unhexlify=binascii.unhexlify): |
| 214 | |
| 215 | format = self.format |
| 216 | if self.min_value <= x <= self.max_value: |
| 217 | expected = x |
| 218 | if self.signed and x < 0: |
| 219 | expected += 1 << self.bitsize |
| 220 | self.assertGreaterEqual(expected, 0) |
| 221 | expected = '%x' % expected |
| 222 | if len(expected) & 1: |
| 223 | expected = "0" + expected |
| 224 | expected = expected.encode('ascii') |
| 225 | expected = unhexlify(expected) |
| 226 | expected = (b"\x00" * (self.bytesize - len(expected)) + |
| 227 | expected) |
| 228 | if (self.byteorder == '<' or |
| 229 | self.byteorder in ('', '@', '=') and not ISBIGENDIAN): |
| 230 | expected = string_reverse(expected) |
| 231 | self.assertEqual(len(expected), self.bytesize) |
| 232 | |
| 233 | # Pack work? |
| 234 | got = pack(format, x) |
| 235 | self.assertEqual(got, expected) |
| 236 | |
| 237 | # Unpack work? |
| 238 | retrieved = unpack(format, got)[0] |
| 239 | self.assertEqual(x, retrieved) |
| 240 | |
| 241 | # Adding any byte should cause a "too big" error. |
| 242 | self.assertRaises((struct.error, TypeError), unpack, format, |
| 243 | b'\x01' + got) |
| 244 | else: |
| 245 | # x is out of range -- verify pack realizes that. |
no outgoing calls
searching dependent graphs…