from test.test_support import have_unicode, run_unittest | |
import unittest | |
class base_set: | |
def __init__(self, el): | |
self.el = el | |
class set(base_set): | |
def __contains__(self, el): | |
return self.el == el | |
class seq(base_set): | |
def __getitem__(self, n): | |
return [self.el][n] | |
class TestContains(unittest.TestCase): | |
def test_common_tests(self): | |
a = base_set(1) | |
b = set(1) | |
c = seq(1) | |
self.assertIn(1, b) | |
self.assertNotIn(0, b) | |
self.assertIn(1, c) | |
self.assertNotIn(0, c) | |
self.assertRaises(TypeError, lambda: 1 in a) | |
self.assertRaises(TypeError, lambda: 1 not in a) | |
# test char in string | |
self.assertIn('c', 'abc') | |
self.assertNotIn('d', 'abc') | |
self.assertIn('', '') | |
self.assertIn('', 'abc') | |
self.assertRaises(TypeError, lambda: None in 'abc') | |
if have_unicode: | |
def test_char_in_unicode(self): | |
self.assertIn('c', unicode('abc')) | |
self.assertNotIn('d', unicode('abc')) | |
self.assertIn('', unicode('')) | |
self.assertIn(unicode(''), '') | |
self.assertIn(unicode(''), unicode('')) | |
self.assertIn('', unicode('abc')) | |
self.assertIn(unicode(''), 'abc') | |
self.assertIn(unicode(''), unicode('abc')) | |
self.assertRaises(TypeError, lambda: None in unicode('abc')) | |
# test Unicode char in Unicode | |
self.assertIn(unicode('c'), unicode('abc')) | |
self.assertNotIn(unicode('d'), unicode('abc')) | |
# test Unicode char in string | |
self.assertIn(unicode('c'), 'abc') | |
self.assertNotIn(unicode('d'), 'abc') | |
def test_builtin_sequence_types(self): | |
# a collection of tests on builtin sequence types | |
a = range(10) | |
for i in a: | |
self.assertIn(i, a) | |
self.assertNotIn(16, a) | |
self.assertNotIn(a, a) | |
a = tuple(a) | |
for i in a: | |
self.assertIn(i, a) | |
self.assertNotIn(16, a) | |
self.assertNotIn(a, a) | |
class Deviant1: | |
"""Behaves strangely when compared | |
This class is designed to make sure that the contains code | |
works when the list is modified during the check. | |
""" | |
aList = range(15) | |
def __cmp__(self, other): | |
if other == 12: | |
self.aList.remove(12) | |
self.aList.remove(13) | |
self.aList.remove(14) | |
return 1 | |
self.assertNotIn(Deviant1(), Deviant1.aList) | |
class Deviant2: | |
"""Behaves strangely when compared | |
This class raises an exception during comparison. That in | |
turn causes the comparison to fail with a TypeError. | |
""" | |
def __cmp__(self, other): | |
if other == 4: | |
raise RuntimeError, "gotcha" | |
try: | |
self.assertNotIn(Deviant2(), a) | |
except TypeError: | |
pass | |
def test_main(): | |
run_unittest(TestContains) | |
if __name__ == '__main__': | |
test_main() |