1 # Copyright (c) Twisted Matrix Laboratories.
2 # See LICENSE for details.
6 Tests for L{twisted.python.compat}.
11 from twisted.trial import unittest
13 from twisted.python.compat import set, frozenset, reduce
17 class IterableCounter:
18 def __init__(self, lim=0):
27 if self.i >= self.lim:
31 class CompatTestCase(unittest.TestCase):
35 self.assertEqual(d1, d2)
37 self.assertNotEquals(d1, d2)
39 self.assertEqual(d1, d2)
42 self.assertEqual(bool('hi'), True)
43 self.assertEqual(bool(True), True)
44 self.assertEqual(bool(''), False)
45 self.assertEqual(bool(False), False)
47 def testIteration(self):
48 lst1, lst2 = range(10), []
52 self.assertEqual(lst1, lst2)
58 lst2.append(iterable.next())
61 self.assertEqual(lst1, lst2)
64 for i in iter(IterableCounter(10)):
66 self.assertEqual(lst1, lst2)
70 iterable = iter(IterableCounter(10))
72 lst2.append(iterable.next())
75 self.assertEqual(lst1, lst2)
78 for i in iter(IterableCounter(20).next, 10):
80 self.assertEqual(lst1, lst2)
82 def testIsinstance(self):
83 self.assert_(isinstance(u'hi', types.StringTypes))
84 self.assert_(isinstance(self, unittest.TestCase))
85 # I'm pretty sure it's impossible to implement this
86 # without replacing isinstance on 2.2 as well :(
87 # self.assert_(isinstance({}, dict))
90 self.assertEqual(' x '.lstrip(' '), 'x ')
91 self.assertEqual(' x x'.lstrip(' '), 'x x')
92 self.assertEqual(' x '.rstrip(' '), ' x')
93 self.assertEqual('x x '.rstrip(' '), 'x x')
95 self.assertEqual('\t x '.lstrip('\t '), 'x ')
96 self.assertEqual(' \tx x'.lstrip('\t '), 'x x')
97 self.assertEqual(' x\t '.rstrip(' \t'), ' x')
98 self.assertEqual('x x \t'.rstrip(' \t'), 'x x')
100 self.assertEqual('\t x '.strip('\t '), 'x')
101 self.assertEqual(' \tx x'.strip('\t '), 'x x')
102 self.assertEqual(' x\t '.strip(' \t'), 'x')
103 self.assertEqual('x x \t'.strip(' \t'), 'x x')
106 from twisted.python.compat import inet_ntop
108 f = lambda a: inet_ntop(socket.AF_INET6, a)
109 g = lambda a: inet_ntop(socket.AF_INET, a)
111 self.assertEqual('::', f('\x00' * 16))
112 self.assertEqual('::1', f('\x00' * 15 + '\x01'))
114 'aef:b01:506:1001:ffff:9997:55:170',
115 f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70'))
117 self.assertEqual('1.0.1.0', g('\x01\x00\x01\x00'))
118 self.assertEqual('170.85.170.85', g('\xaa\x55\xaa\x55'))
119 self.assertEqual('255.255.255.255', g('\xff\xff\xff\xff'))
121 self.assertEqual('100::', f('\x01' + '\x00' * 15))
122 self.assertEqual('100::1', f('\x01' + '\x00' * 14 + '\x01'))
125 from twisted.python.compat import inet_pton
127 f = lambda a: inet_pton(socket.AF_INET6, a)
128 g = lambda a: inet_pton(socket.AF_INET, a)
130 self.assertEqual('\x00\x00\x00\x00', g('0.0.0.0'))
131 self.assertEqual('\xff\x00\xff\x00', g('255.0.255.0'))
132 self.assertEqual('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
134 self.assertEqual('\x00' * 16, f('::'))
135 self.assertEqual('\x00' * 16, f('0::0'))
136 self.assertEqual('\x00\x01' + '\x00' * 14, f('1::'))
138 '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
139 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae'))
141 self.assertEqual('\x00' * 14 + '\x00\x01', f('::1'))
142 self.assertEqual('\x00' * 12 + '\x01\x02\x03\x04', f('::1.2.3.4'))
144 '\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x01\x02\x03\xff',
145 f('1:2:3:4:5:6:1.2.3.255'))
147 for badaddr in ['1:2:3:4:5:6:7:8:', ':1:2:3:4:5:6:7:8', '1::2::3',
148 '1:::3', ':::', '1:2', '::1.2', '1.2.3.4::',
149 'abcd:1.2.3.4:abcd:abcd:abcd:abcd:abcd',
150 '1234:1.2.3.4:1234:1234:1234:1234:1234:1234',
152 self.assertRaises(ValueError, f, badaddr)
156 L{set} should behave like the expected set interface.
164 self.assertEqual(b, ['a', 'b', 'c'])
168 self.assertEqual(b, ['a', 'c'])
176 self.assertEqual(b, ['a', 'c', 'r', 's'])
179 def test_frozenset(self):
181 L{frozenset} should behave like the expected frozenset interface.
183 a = frozenset(['a', 'b'])
184 self.assertRaises(AttributeError, getattr, a, "add")
185 self.assertEqual(list(a), ['a', 'b'])
187 b = frozenset(['r', 's'])
191 self.assertEqual(b, ['a', 'b', 'r', 's'])
194 def test_reduce(self):
196 L{reduce} should behave like the builtin reduce.
198 self.assertEqual(15, reduce(lambda x, y: x + y, [1, 2, 3, 4, 5]))
199 self.assertEqual(16, reduce(lambda x, y: x + y, [1, 2, 3, 4, 5], 1))