Guido van Rossum | 4dfe8a1 | 2006-04-22 23:28:04 +0000 | [diff] [blame] | 1 | """Unit tests for the bytes type.""" |
| 2 | |
| 3 | import sys |
| 4 | import unittest |
| 5 | import test.test_support |
| 6 | |
| 7 | |
| 8 | class BytesTest(unittest.TestCase): |
| 9 | |
| 10 | def test_basics(self): |
| 11 | b = bytes() |
| 12 | self.assertEqual(type(b), bytes) |
| 13 | self.assertEqual(b.__class__, bytes) |
| 14 | |
| 15 | def test_empty_sequence(self): |
| 16 | b = bytes() |
| 17 | self.assertEqual(len(b), 0) |
| 18 | self.assertRaises(IndexError, lambda: b[0]) |
| 19 | self.assertRaises(IndexError, lambda: b[1]) |
| 20 | self.assertRaises(IndexError, lambda: b[sys.maxint]) |
| 21 | self.assertRaises(IndexError, lambda: b[sys.maxint+1]) |
| 22 | self.assertRaises(IndexError, lambda: b[10**100]) |
| 23 | self.assertRaises(IndexError, lambda: b[-1]) |
| 24 | self.assertRaises(IndexError, lambda: b[-2]) |
| 25 | self.assertRaises(IndexError, lambda: b[-sys.maxint]) |
| 26 | self.assertRaises(IndexError, lambda: b[-sys.maxint-1]) |
| 27 | self.assertRaises(IndexError, lambda: b[-sys.maxint-2]) |
| 28 | self.assertRaises(IndexError, lambda: b[-10**100]) |
| 29 | |
| 30 | def test_from_list(self): |
| 31 | ints = list(range(256)) |
| 32 | b = bytes(i for i in ints) |
| 33 | self.assertEqual(len(b), 256) |
| 34 | self.assertEqual(list(b), ints) |
| 35 | |
| 36 | def test_from_index(self): |
| 37 | class C: |
| 38 | def __init__(self, i=0): |
| 39 | self.i = i |
| 40 | def __index__(self): |
| 41 | return self.i |
| 42 | b = bytes([C(), C(1), C(254), C(255)]) |
| 43 | self.assertEqual(list(b), [0, 1, 254, 255]) |
Guido van Rossum | e06b6b8 | 2006-04-23 07:43:54 +0000 | [diff] [blame^] | 44 | self.assertRaises(ValueError, bytes, [C(-1)]) |
| 45 | self.assertRaises(ValueError, bytes, [C(256)]) |
Guido van Rossum | 4dfe8a1 | 2006-04-22 23:28:04 +0000 | [diff] [blame] | 46 | |
| 47 | def test_constructor_type_errors(self): |
Guido van Rossum | e06b6b8 | 2006-04-23 07:43:54 +0000 | [diff] [blame^] | 48 | self.assertRaises(TypeError, bytes, 0) |
Guido van Rossum | 4dfe8a1 | 2006-04-22 23:28:04 +0000 | [diff] [blame] | 49 | class C: |
| 50 | pass |
Guido van Rossum | e06b6b8 | 2006-04-23 07:43:54 +0000 | [diff] [blame^] | 51 | self.assertRaises(TypeError, bytes, ["0"]) |
| 52 | self.assertRaises(TypeError, bytes, [0.0]) |
| 53 | self.assertRaises(TypeError, bytes, [None]) |
| 54 | self.assertRaises(TypeError, bytes, [C()]) |
Guido van Rossum | 4dfe8a1 | 2006-04-22 23:28:04 +0000 | [diff] [blame] | 55 | |
| 56 | def test_constructor_value_errors(self): |
Guido van Rossum | e06b6b8 | 2006-04-23 07:43:54 +0000 | [diff] [blame^] | 57 | self.assertRaises(ValueError, bytes, [-1]) |
| 58 | self.assertRaises(ValueError, bytes, [-sys.maxint]) |
| 59 | self.assertRaises(ValueError, bytes, [-sys.maxint-1]) |
| 60 | self.assertRaises(ValueError, bytes, [-sys.maxint-2]) |
| 61 | self.assertRaises(ValueError, bytes, [-10**100]) |
| 62 | self.assertRaises(ValueError, bytes, [256]) |
| 63 | self.assertRaises(ValueError, bytes, [257]) |
| 64 | self.assertRaises(ValueError, bytes, [sys.maxint]) |
| 65 | self.assertRaises(ValueError, bytes, [sys.maxint+1]) |
| 66 | self.assertRaises(ValueError, bytes, [10**100]) |
Guido van Rossum | 4dfe8a1 | 2006-04-22 23:28:04 +0000 | [diff] [blame] | 67 | |
| 68 | def test_repr(self): |
| 69 | self.assertEqual(repr(bytes()), "bytes()") |
| 70 | self.assertEqual(repr(bytes([0])), "bytes([0x00])") |
| 71 | self.assertEqual(repr(bytes([0, 1, 254, 255])), "bytes([0x00, 0x01, 0xfe, 0xff])") |
| 72 | |
| 73 | def test_compare(self): |
| 74 | b1 = bytes([1, 2, 3]) |
| 75 | b2 = bytes([1, 2, 3]) |
| 76 | b3 = bytes([1, 3]) |
| 77 | |
| 78 | self.failUnless(b1 == b2) |
| 79 | self.failUnless(b2 != b3) |
| 80 | self.failUnless(b1 <= b2) |
| 81 | self.failUnless(b1 <= b3) |
| 82 | self.failUnless(b1 < b3) |
| 83 | self.failUnless(b1 >= b2) |
| 84 | self.failUnless(b3 >= b2) |
| 85 | self.failUnless(b3 > b2) |
| 86 | |
| 87 | self.failIf(b1 != b2) |
| 88 | self.failIf(b2 == b3) |
| 89 | self.failIf(b1 > b2) |
| 90 | self.failIf(b1 > b3) |
| 91 | self.failIf(b1 >= b3) |
| 92 | self.failIf(b1 < b2) |
| 93 | self.failIf(b3 < b2) |
| 94 | self.failIf(b3 <= b2) |
| 95 | |
| 96 | def test_nohash(self): |
| 97 | self.assertRaises(TypeError, hash, bytes()) |
| 98 | |
| 99 | def test_doc(self): |
| 100 | self.failUnless(bytes.__doc__ != None) |
| 101 | self.failUnless(bytes.__doc__.startswith("bytes(")) |
| 102 | |
Guido van Rossum | e06b6b8 | 2006-04-23 07:43:54 +0000 | [diff] [blame^] | 103 | # XXX More stuff to test and build (TDD): |
| 104 | # constructor from str: bytes(<str>) == bytes(map(ord, <str>))? |
| 105 | # encoding constructor: bytes(<unicode>[, <encoding>[, <errors>]]) |
| 106 | # default encoding Latin-1? (Matching ord) |
| 107 | # slicing |
| 108 | # extended slicing? |
| 109 | # item assignment |
| 110 | # slice assignment |
| 111 | # extended slice assignment? |
| 112 | # __contains__ with simple int arg |
| 113 | # __contains__ with another bytes arg? |
| 114 | # find/index? (int or bytes arg?) |
| 115 | # count? (int arg) |
| 116 | # concatenation (+) |
| 117 | # repeat? |
| 118 | # extend? |
| 119 | # append? |
| 120 | # insert? |
| 121 | # pop? |
| 122 | # __reversed__? |
| 123 | # reverse? (inplace) |
| 124 | # NOT sort! |
| 125 | # __iter__? (optimization) |
| 126 | # __str__? (could return "".join(map(chr, self)) |
| 127 | # decode |
| 128 | # buffer API |
| 129 | # check that regexp searches work |
| 130 | # (I suppose re.sub() returns a string) |
| 131 | # file.readinto |
| 132 | # file.write |
| 133 | |
Guido van Rossum | 4dfe8a1 | 2006-04-22 23:28:04 +0000 | [diff] [blame] | 134 | |
| 135 | def test_main(): |
Thomas Wouters | 5f6f27d | 2006-04-23 00:19:58 +0000 | [diff] [blame] | 136 | test.test_support.run_unittest(BytesTest) |
Guido van Rossum | 4dfe8a1 | 2006-04-22 23:28:04 +0000 | [diff] [blame] | 137 | |
| 138 | |
| 139 | if __name__ == "__main__": |
| 140 | ##test_main() |
| 141 | unittest.main() |