blob: 1ba5e11ab772803e0f82f3b00dca9980cfeaa43c [file] [log] [blame]
Guido van Rossum4dfe8a12006-04-22 23:28:04 +00001"""Unit tests for the bytes type."""
2
3import sys
4import unittest
5import test.test_support
6
7
8class 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 Rossume06b6b82006-04-23 07:43:54 +000044 self.assertRaises(ValueError, bytes, [C(-1)])
45 self.assertRaises(ValueError, bytes, [C(256)])
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000046
47 def test_constructor_type_errors(self):
Guido van Rossume06b6b82006-04-23 07:43:54 +000048 self.assertRaises(TypeError, bytes, 0)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +000049 class C:
50 pass
Guido van Rossume06b6b82006-04-23 07:43:54 +000051 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 Rossum4dfe8a12006-04-22 23:28:04 +000055
56 def test_constructor_value_errors(self):
Guido van Rossume06b6b82006-04-23 07:43:54 +000057 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 Rossum4dfe8a12006-04-22 23:28:04 +000067
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 Rossume06b6b82006-04-23 07:43:54 +0000103 # 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 Rossum4dfe8a12006-04-22 23:28:04 +0000134
135def test_main():
Thomas Wouters5f6f27d2006-04-23 00:19:58 +0000136 test.test_support.run_unittest(BytesTest)
Guido van Rossum4dfe8a12006-04-22 23:28:04 +0000137
138
139if __name__ == "__main__":
140 ##test_main()
141 unittest.main()