blob: 04eedf1757a5016f21fb80d8d17237039741a702 [file] [log] [blame]
Barry Warsaw408b6d32002-07-30 23:27:12 +00001from test.test_support import TestFailed, have_unicode
Guido van Rossum24512e62000-03-06 21:00:29 +00002
3class base_set:
4
Fred Drake004d5e62000-10-23 17:22:08 +00005 def __init__(self, el):
6 self.el = el
Guido van Rossum24512e62000-03-06 21:00:29 +00007
8class set(base_set):
9
Fred Drake004d5e62000-10-23 17:22:08 +000010 def __contains__(self, el):
11 return self.el == el
Guido van Rossum24512e62000-03-06 21:00:29 +000012
13class seq(base_set):
14
Fred Drake004d5e62000-10-23 17:22:08 +000015 def __getitem__(self, n):
16 return [self.el][n]
Guido van Rossum24512e62000-03-06 21:00:29 +000017
18def check(ok, *args):
19 if not ok:
Guido van Rossum45ad3c42000-04-10 13:52:13 +000020 raise TestFailed, " ".join(map(str, args))
Guido van Rossum24512e62000-03-06 21:00:29 +000021
22a = base_set(1)
23b = set(1)
24c = seq(1)
25
26check(1 in b, "1 not in set(1)")
27check(0 not in b, "0 in set(1)")
28check(1 in c, "1 not in seq(1)")
29check(0 not in c, "0 in seq(1)")
30
31try:
Fred Drake004d5e62000-10-23 17:22:08 +000032 1 in a
33 check(0, "in base_set did not raise error")
Tim Petersde9725f2001-05-05 10:06:17 +000034except TypeError:
Fred Drake004d5e62000-10-23 17:22:08 +000035 pass
Guido van Rossum24512e62000-03-06 21:00:29 +000036
37try:
Fred Drake004d5e62000-10-23 17:22:08 +000038 1 not in a
39 check(0, "not in base_set did not raise error")
Tim Petersde9725f2001-05-05 10:06:17 +000040except TypeError:
Fred Drake004d5e62000-10-23 17:22:08 +000041 pass
Guido van Rossumda2361a2000-03-07 15:52:01 +000042
43# Test char in string
44
45check('c' in 'abc', "'c' not in 'abc'")
46check('d' not in 'abc', "'d' in 'abc'")
47
Barry Warsaw817918c2002-08-06 16:58:21 +000048check('' in '', "'' not in ''")
49check('' in 'abc', "'' not in 'abc'")
Guido van Rossumda2361a2000-03-07 15:52:01 +000050
51try:
Fred Drake004d5e62000-10-23 17:22:08 +000052 None in 'abc'
53 check(0, "None in 'abc' did not raise error")
Guido van Rossumda2361a2000-03-07 15:52:01 +000054except TypeError:
Fred Drake004d5e62000-10-23 17:22:08 +000055 pass
Guido van Rossum45ad3c42000-04-10 13:52:13 +000056
Guido van Rossum45ad3c42000-04-10 13:52:13 +000057
Martin v. Löwis339d0f72001-08-17 18:39:25 +000058if have_unicode:
Guido van Rossum45ad3c42000-04-10 13:52:13 +000059
Martin v. Löwis339d0f72001-08-17 18:39:25 +000060 # Test char in Unicode
Guido van Rossum45ad3c42000-04-10 13:52:13 +000061
Martin v. Löwis339d0f72001-08-17 18:39:25 +000062 check('c' in unicode('abc'), "'c' not in u'abc'")
63 check('d' not in unicode('abc'), "'d' in u'abc'")
Guido van Rossum45ad3c42000-04-10 13:52:13 +000064
Barry Warsaw817918c2002-08-06 16:58:21 +000065 check('' in unicode(''), "'' not in u''")
66 check(unicode('') in '', "u'' not in ''")
67 check(unicode('') in unicode(''), "u'' not in u''")
68 check('' in unicode('abc'), "'' not in u'abc'")
69 check(unicode('') in 'abc', "u'' not in 'abc'")
70 check(unicode('') in unicode('abc'), "u'' not in u'abc'")
Guido van Rossum45ad3c42000-04-10 13:52:13 +000071
Martin v. Löwis339d0f72001-08-17 18:39:25 +000072 try:
73 None in unicode('abc')
74 check(0, "None in u'abc' did not raise error")
75 except TypeError:
76 pass
Guido van Rossum45ad3c42000-04-10 13:52:13 +000077
Martin v. Löwis339d0f72001-08-17 18:39:25 +000078 # Test Unicode char in Unicode
Guido van Rossum45ad3c42000-04-10 13:52:13 +000079
Martin v. Löwis339d0f72001-08-17 18:39:25 +000080 check(unicode('c') in unicode('abc'), "u'c' not in u'abc'")
81 check(unicode('d') not in unicode('abc'), "u'd' in u'abc'")
Guido van Rossum45ad3c42000-04-10 13:52:13 +000082
Martin v. Löwis339d0f72001-08-17 18:39:25 +000083 # Test Unicode char in string
Guido van Rossum45ad3c42000-04-10 13:52:13 +000084
Martin v. Löwis339d0f72001-08-17 18:39:25 +000085 check(unicode('c') in 'abc', "u'c' not in 'abc'")
86 check(unicode('d') not in 'abc', "u'd' in 'abc'")
87
Jeremy Hylton035a07e2000-04-27 21:40:08 +000088# A collection of tests on builtin sequence types
89a = range(10)
90for i in a:
Fred Drake004d5e62000-10-23 17:22:08 +000091 check(i in a, "%s not in %s" % (`i`, `a`))
Jeremy Hylton035a07e2000-04-27 21:40:08 +000092check(16 not in a, "16 not in %s" % `a`)
93check(a not in a, "%s not in %s" % (`a`, `a`))
94
95a = tuple(a)
96for i in a:
Fred Drake004d5e62000-10-23 17:22:08 +000097 check(i in a, "%s not in %s" % (`i`, `a`))
Jeremy Hylton035a07e2000-04-27 21:40:08 +000098check(16 not in a, "16 not in %s" % `a`)
99check(a not in a, "%s not in %s" % (`a`, `a`))
100
101class Deviant1:
Fred Drake004d5e62000-10-23 17:22:08 +0000102 """Behaves strangely when compared
Jeremy Hylton035a07e2000-04-27 21:40:08 +0000103
Fred Drake004d5e62000-10-23 17:22:08 +0000104 This class is designed to make sure that the contains code
105 works when the list is modified during the check.
106 """
Jeremy Hylton035a07e2000-04-27 21:40:08 +0000107
Fred Drake004d5e62000-10-23 17:22:08 +0000108 aList = range(15)
109
110 def __cmp__(self, other):
111 if other == 12:
112 self.aList.remove(12)
113 self.aList.remove(13)
114 self.aList.remove(14)
115 return 1
Jeremy Hylton035a07e2000-04-27 21:40:08 +0000116
117check(Deviant1() not in Deviant1.aList, "Deviant1 failed")
118
119class Deviant2:
Fred Drake004d5e62000-10-23 17:22:08 +0000120 """Behaves strangely when compared
Jeremy Hylton035a07e2000-04-27 21:40:08 +0000121
Fred Drake004d5e62000-10-23 17:22:08 +0000122 This class raises an exception during comparison. That in
123 turn causes the comparison to fail with a TypeError.
124 """
Jeremy Hylton035a07e2000-04-27 21:40:08 +0000125
Fred Drake004d5e62000-10-23 17:22:08 +0000126 def __cmp__(self, other):
127 if other == 4:
128 raise RuntimeError, "gotcha"
Jeremy Hylton035a07e2000-04-27 21:40:08 +0000129
130try:
Fred Drake004d5e62000-10-23 17:22:08 +0000131 check(Deviant2() not in a, "oops")
Jeremy Hylton035a07e2000-04-27 21:40:08 +0000132except TypeError:
Fred Drake004d5e62000-10-23 17:22:08 +0000133 pass