python (3.11.7)

(root)/
lib/
python3.11/
test/
test_set.py
       1  import unittest
       2  from test import support
       3  from test.support import warnings_helper
       4  import gc
       5  import weakref
       6  import operator
       7  import copy
       8  import pickle
       9  from random import randrange, shuffle
      10  import warnings
      11  import collections
      12  import collections.abc
      13  import itertools
      14  
      15  class ESC[4;38;5;81mPassThru(ESC[4;38;5;149mException):
      16      pass
      17  
      18  def check_pass_thru():
      19      raise PassThru
      20      yield 1
      21  
      22  class ESC[4;38;5;81mBadCmp:
      23      def __hash__(self):
      24          return 1
      25      def __eq__(self, other):
      26          raise RuntimeError
      27  
      28  class ESC[4;38;5;81mReprWrapper:
      29      'Used to test self-referential repr() calls'
      30      def __repr__(self):
      31          return repr(self.value)
      32  
      33  class ESC[4;38;5;81mHashCountingInt(ESC[4;38;5;149mint):
      34      'int-like object that counts the number of times __hash__ is called'
      35      def __init__(self, *args):
      36          self.hash_count = 0
      37      def __hash__(self):
      38          self.hash_count += 1
      39          return int.__hash__(self)
      40  
      41  class ESC[4;38;5;81mTestJointOps:
      42      # Tests common to both set and frozenset
      43  
      44      def setUp(self):
      45          self.word = word = 'simsalabim'
      46          self.otherword = 'madagascar'
      47          self.letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
      48          self.s = self.thetype(word)
      49          self.d = dict.fromkeys(word)
      50  
      51      def test_new_or_init(self):
      52          self.assertRaises(TypeError, self.thetype, [], 2)
      53          self.assertRaises(TypeError, set().__init__, a=1)
      54  
      55      def test_uniquification(self):
      56          actual = sorted(self.s)
      57          expected = sorted(self.d)
      58          self.assertEqual(actual, expected)
      59          self.assertRaises(PassThru, self.thetype, check_pass_thru())
      60          self.assertRaises(TypeError, self.thetype, [[]])
      61  
      62      def test_len(self):
      63          self.assertEqual(len(self.s), len(self.d))
      64  
      65      def test_contains(self):
      66          for c in self.letters:
      67              self.assertEqual(c in self.s, c in self.d)
      68          self.assertRaises(TypeError, self.s.__contains__, [[]])
      69          s = self.thetype([frozenset(self.letters)])
      70          self.assertIn(self.thetype(self.letters), s)
      71  
      72      def test_union(self):
      73          u = self.s.union(self.otherword)
      74          for c in self.letters:
      75              self.assertEqual(c in u, c in self.d or c in self.otherword)
      76          self.assertEqual(self.s, self.thetype(self.word))
      77          self.assertEqual(type(u), self.basetype)
      78          self.assertRaises(PassThru, self.s.union, check_pass_thru())
      79          self.assertRaises(TypeError, self.s.union, [[]])
      80          for C in set, frozenset, dict.fromkeys, str, list, tuple:
      81              self.assertEqual(self.thetype('abcba').union(C('cdc')), set('abcd'))
      82              self.assertEqual(self.thetype('abcba').union(C('efgfe')), set('abcefg'))
      83              self.assertEqual(self.thetype('abcba').union(C('ccb')), set('abc'))
      84              self.assertEqual(self.thetype('abcba').union(C('ef')), set('abcef'))
      85              self.assertEqual(self.thetype('abcba').union(C('ef'), C('fg')), set('abcefg'))
      86  
      87          # Issue #6573
      88          x = self.thetype()
      89          self.assertEqual(x.union(set([1]), x, set([2])), self.thetype([1, 2]))
      90  
      91      def test_or(self):
      92          i = self.s.union(self.otherword)
      93          self.assertEqual(self.s | set(self.otherword), i)
      94          self.assertEqual(self.s | frozenset(self.otherword), i)
      95          try:
      96              self.s | self.otherword
      97          except TypeError:
      98              pass
      99          else:
     100              self.fail("s|t did not screen-out general iterables")
     101  
     102      def test_intersection(self):
     103          i = self.s.intersection(self.otherword)
     104          for c in self.letters:
     105              self.assertEqual(c in i, c in self.d and c in self.otherword)
     106          self.assertEqual(self.s, self.thetype(self.word))
     107          self.assertEqual(type(i), self.basetype)
     108          self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
     109          for C in set, frozenset, dict.fromkeys, str, list, tuple:
     110              self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
     111              self.assertEqual(self.thetype('abcba').intersection(C('efgfe')), set(''))
     112              self.assertEqual(self.thetype('abcba').intersection(C('ccb')), set('bc'))
     113              self.assertEqual(self.thetype('abcba').intersection(C('ef')), set(''))
     114              self.assertEqual(self.thetype('abcba').intersection(C('cbcf'), C('bag')), set('b'))
     115          s = self.thetype('abcba')
     116          z = s.intersection()
     117          if self.thetype == frozenset():
     118              self.assertEqual(id(s), id(z))
     119          else:
     120              self.assertNotEqual(id(s), id(z))
     121  
     122      def test_isdisjoint(self):
     123          def f(s1, s2):
     124              'Pure python equivalent of isdisjoint()'
     125              return not set(s1).intersection(s2)
     126          for larg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
     127              s1 = self.thetype(larg)
     128              for rarg in '', 'a', 'ab', 'abc', 'ababac', 'cdc', 'cc', 'efgfe', 'ccb', 'ef':
     129                  for C in set, frozenset, dict.fromkeys, str, list, tuple:
     130                      s2 = C(rarg)
     131                      actual = s1.isdisjoint(s2)
     132                      expected = f(s1, s2)
     133                      self.assertEqual(actual, expected)
     134                      self.assertTrue(actual is True or actual is False)
     135  
     136      def test_and(self):
     137          i = self.s.intersection(self.otherword)
     138          self.assertEqual(self.s & set(self.otherword), i)
     139          self.assertEqual(self.s & frozenset(self.otherword), i)
     140          try:
     141              self.s & self.otherword
     142          except TypeError:
     143              pass
     144          else:
     145              self.fail("s&t did not screen-out general iterables")
     146  
     147      def test_difference(self):
     148          i = self.s.difference(self.otherword)
     149          for c in self.letters:
     150              self.assertEqual(c in i, c in self.d and c not in self.otherword)
     151          self.assertEqual(self.s, self.thetype(self.word))
     152          self.assertEqual(type(i), self.basetype)
     153          self.assertRaises(PassThru, self.s.difference, check_pass_thru())
     154          self.assertRaises(TypeError, self.s.difference, [[]])
     155          for C in set, frozenset, dict.fromkeys, str, list, tuple:
     156              self.assertEqual(self.thetype('abcba').difference(C('cdc')), set('ab'))
     157              self.assertEqual(self.thetype('abcba').difference(C('efgfe')), set('abc'))
     158              self.assertEqual(self.thetype('abcba').difference(C('ccb')), set('a'))
     159              self.assertEqual(self.thetype('abcba').difference(C('ef')), set('abc'))
     160              self.assertEqual(self.thetype('abcba').difference(), set('abc'))
     161              self.assertEqual(self.thetype('abcba').difference(C('a'), C('b')), set('c'))
     162  
     163      def test_sub(self):
     164          i = self.s.difference(self.otherword)
     165          self.assertEqual(self.s - set(self.otherword), i)
     166          self.assertEqual(self.s - frozenset(self.otherword), i)
     167          try:
     168              self.s - self.otherword
     169          except TypeError:
     170              pass
     171          else:
     172              self.fail("s-t did not screen-out general iterables")
     173  
     174      def test_symmetric_difference(self):
     175          i = self.s.symmetric_difference(self.otherword)
     176          for c in self.letters:
     177              self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
     178          self.assertEqual(self.s, self.thetype(self.word))
     179          self.assertEqual(type(i), self.basetype)
     180          self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
     181          self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
     182          for C in set, frozenset, dict.fromkeys, str, list, tuple:
     183              self.assertEqual(self.thetype('abcba').symmetric_difference(C('cdc')), set('abd'))
     184              self.assertEqual(self.thetype('abcba').symmetric_difference(C('efgfe')), set('abcefg'))
     185              self.assertEqual(self.thetype('abcba').symmetric_difference(C('ccb')), set('a'))
     186              self.assertEqual(self.thetype('abcba').symmetric_difference(C('ef')), set('abcef'))
     187  
     188      def test_xor(self):
     189          i = self.s.symmetric_difference(self.otherword)
     190          self.assertEqual(self.s ^ set(self.otherword), i)
     191          self.assertEqual(self.s ^ frozenset(self.otherword), i)
     192          try:
     193              self.s ^ self.otherword
     194          except TypeError:
     195              pass
     196          else:
     197              self.fail("s^t did not screen-out general iterables")
     198  
     199      def test_equality(self):
     200          self.assertEqual(self.s, set(self.word))
     201          self.assertEqual(self.s, frozenset(self.word))
     202          self.assertEqual(self.s == self.word, False)
     203          self.assertNotEqual(self.s, set(self.otherword))
     204          self.assertNotEqual(self.s, frozenset(self.otherword))
     205          self.assertEqual(self.s != self.word, True)
     206  
     207      def test_setOfFrozensets(self):
     208          t = map(frozenset, ['abcdef', 'bcd', 'bdcb', 'fed', 'fedccba'])
     209          s = self.thetype(t)
     210          self.assertEqual(len(s), 3)
     211  
     212      def test_sub_and_super(self):
     213          p, q, r = map(self.thetype, ['ab', 'abcde', 'def'])
     214          self.assertTrue(p < q)
     215          self.assertTrue(p <= q)
     216          self.assertTrue(q <= q)
     217          self.assertTrue(q > p)
     218          self.assertTrue(q >= p)
     219          self.assertFalse(q < r)
     220          self.assertFalse(q <= r)
     221          self.assertFalse(q > r)
     222          self.assertFalse(q >= r)
     223          self.assertTrue(set('a').issubset('abc'))
     224          self.assertTrue(set('abc').issuperset('a'))
     225          self.assertFalse(set('a').issubset('cbs'))
     226          self.assertFalse(set('cbs').issuperset('a'))
     227  
     228      def test_pickling(self):
     229          for i in range(pickle.HIGHEST_PROTOCOL + 1):
     230              if type(self.s) not in (set, frozenset):
     231                  self.s.x = ['x']
     232                  self.s.z = ['z']
     233              p = pickle.dumps(self.s, i)
     234              dup = pickle.loads(p)
     235              self.assertEqual(self.s, dup, "%s != %s" % (self.s, dup))
     236              if type(self.s) not in (set, frozenset):
     237                  self.assertEqual(self.s.x, dup.x)
     238                  self.assertEqual(self.s.z, dup.z)
     239                  self.assertFalse(hasattr(self.s, 'y'))
     240                  del self.s.x, self.s.z
     241  
     242      def test_iterator_pickling(self):
     243          for proto in range(pickle.HIGHEST_PROTOCOL + 1):
     244              itorg = iter(self.s)
     245              data = self.thetype(self.s)
     246              d = pickle.dumps(itorg, proto)
     247              it = pickle.loads(d)
     248              # Set iterators unpickle as list iterators due to the
     249              # undefined order of set items.
     250              # self.assertEqual(type(itorg), type(it))
     251              self.assertIsInstance(it, collections.abc.Iterator)
     252              self.assertEqual(self.thetype(it), data)
     253  
     254              it = pickle.loads(d)
     255              try:
     256                  drop = next(it)
     257              except StopIteration:
     258                  continue
     259              d = pickle.dumps(it, proto)
     260              it = pickle.loads(d)
     261              self.assertEqual(self.thetype(it), data - self.thetype((drop,)))
     262  
     263      def test_deepcopy(self):
     264          class ESC[4;38;5;81mTracer:
     265              def __init__(self, value):
     266                  self.value = value
     267              def __hash__(self):
     268                  return self.value
     269              def __deepcopy__(self, memo=None):
     270                  return Tracer(self.value + 1)
     271          t = Tracer(10)
     272          s = self.thetype([t])
     273          dup = copy.deepcopy(s)
     274          self.assertNotEqual(id(s), id(dup))
     275          for elem in dup:
     276              newt = elem
     277          self.assertNotEqual(id(t), id(newt))
     278          self.assertEqual(t.value + 1, newt.value)
     279  
     280      def test_gc(self):
     281          # Create a nest of cycles to exercise overall ref count check
     282          class ESC[4;38;5;81mA:
     283              pass
     284          s = set(A() for i in range(1000))
     285          for elem in s:
     286              elem.cycle = s
     287              elem.sub = elem
     288              elem.set = set([elem])
     289  
     290      def test_subclass_with_custom_hash(self):
     291          # Bug #1257731
     292          class ESC[4;38;5;81mH(ESC[4;38;5;149mselfESC[4;38;5;149m.ESC[4;38;5;149mthetype):
     293              def __hash__(self):
     294                  return int(id(self) & 0x7fffffff)
     295          s=H()
     296          f=set()
     297          f.add(s)
     298          self.assertIn(s, f)
     299          f.remove(s)
     300          f.add(s)
     301          f.discard(s)
     302  
     303      def test_badcmp(self):
     304          s = self.thetype([BadCmp()])
     305          # Detect comparison errors during insertion and lookup
     306          self.assertRaises(RuntimeError, self.thetype, [BadCmp(), BadCmp()])
     307          self.assertRaises(RuntimeError, s.__contains__, BadCmp())
     308          # Detect errors during mutating operations
     309          if hasattr(s, 'add'):
     310              self.assertRaises(RuntimeError, s.add, BadCmp())
     311              self.assertRaises(RuntimeError, s.discard, BadCmp())
     312              self.assertRaises(RuntimeError, s.remove, BadCmp())
     313  
     314      def test_cyclical_repr(self):
     315          w = ReprWrapper()
     316          s = self.thetype([w])
     317          w.value = s
     318          if self.thetype == set:
     319              self.assertEqual(repr(s), '{set(...)}')
     320          else:
     321              name = repr(s).partition('(')[0]    # strip class name
     322              self.assertEqual(repr(s), '%s({%s(...)})' % (name, name))
     323  
     324      def test_do_not_rehash_dict_keys(self):
     325          n = 10
     326          d = dict.fromkeys(map(HashCountingInt, range(n)))
     327          self.assertEqual(sum(elem.hash_count for elem in d), n)
     328          s = self.thetype(d)
     329          self.assertEqual(sum(elem.hash_count for elem in d), n)
     330          s.difference(d)
     331          self.assertEqual(sum(elem.hash_count for elem in d), n)
     332          if hasattr(s, 'symmetric_difference_update'):
     333              s.symmetric_difference_update(d)
     334          self.assertEqual(sum(elem.hash_count for elem in d), n)
     335          d2 = dict.fromkeys(set(d))
     336          self.assertEqual(sum(elem.hash_count for elem in d), n)
     337          d3 = dict.fromkeys(frozenset(d))
     338          self.assertEqual(sum(elem.hash_count for elem in d), n)
     339          d3 = dict.fromkeys(frozenset(d), 123)
     340          self.assertEqual(sum(elem.hash_count for elem in d), n)
     341          self.assertEqual(d3, dict.fromkeys(d, 123))
     342  
     343      def test_container_iterator(self):
     344          # Bug #3680: tp_traverse was not implemented for set iterator object
     345          class ESC[4;38;5;81mC(ESC[4;38;5;149mobject):
     346              pass
     347          obj = C()
     348          ref = weakref.ref(obj)
     349          container = set([obj, 1])
     350          obj.x = iter(container)
     351          del obj, container
     352          gc.collect()
     353          self.assertTrue(ref() is None, "Cycle was not collected")
     354  
     355      def test_free_after_iterating(self):
     356          support.check_free_after_iterating(self, iter, self.thetype)
     357  
     358  class ESC[4;38;5;81mTestSet(ESC[4;38;5;149mTestJointOps, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     359      thetype = set
     360      basetype = set
     361  
     362      def test_init(self):
     363          s = self.thetype()
     364          s.__init__(self.word)
     365          self.assertEqual(s, set(self.word))
     366          s.__init__(self.otherword)
     367          self.assertEqual(s, set(self.otherword))
     368          self.assertRaises(TypeError, s.__init__, s, 2)
     369          self.assertRaises(TypeError, s.__init__, 1)
     370  
     371      def test_constructor_identity(self):
     372          s = self.thetype(range(3))
     373          t = self.thetype(s)
     374          self.assertNotEqual(id(s), id(t))
     375  
     376      def test_set_literal(self):
     377          s = set([1,2,3])
     378          t = {1,2,3}
     379          self.assertEqual(s, t)
     380  
     381      def test_set_literal_insertion_order(self):
     382          # SF Issue #26020 -- Expect left to right insertion
     383          s = {1, 1.0, True}
     384          self.assertEqual(len(s), 1)
     385          stored_value = s.pop()
     386          self.assertEqual(type(stored_value), int)
     387  
     388      def test_set_literal_evaluation_order(self):
     389          # Expect left to right expression evaluation
     390          events = []
     391          def record(obj):
     392              events.append(obj)
     393          s = {record(1), record(2), record(3)}
     394          self.assertEqual(events, [1, 2, 3])
     395  
     396      def test_hash(self):
     397          self.assertRaises(TypeError, hash, self.s)
     398  
     399      def test_clear(self):
     400          self.s.clear()
     401          self.assertEqual(self.s, set())
     402          self.assertEqual(len(self.s), 0)
     403  
     404      def test_copy(self):
     405          dup = self.s.copy()
     406          self.assertEqual(self.s, dup)
     407          self.assertNotEqual(id(self.s), id(dup))
     408          self.assertEqual(type(dup), self.basetype)
     409  
     410      def test_add(self):
     411          self.s.add('Q')
     412          self.assertIn('Q', self.s)
     413          dup = self.s.copy()
     414          self.s.add('Q')
     415          self.assertEqual(self.s, dup)
     416          self.assertRaises(TypeError, self.s.add, [])
     417  
     418      def test_remove(self):
     419          self.s.remove('a')
     420          self.assertNotIn('a', self.s)
     421          self.assertRaises(KeyError, self.s.remove, 'Q')
     422          self.assertRaises(TypeError, self.s.remove, [])
     423          s = self.thetype([frozenset(self.word)])
     424          self.assertIn(self.thetype(self.word), s)
     425          s.remove(self.thetype(self.word))
     426          self.assertNotIn(self.thetype(self.word), s)
     427          self.assertRaises(KeyError, self.s.remove, self.thetype(self.word))
     428  
     429      def test_remove_keyerror_unpacking(self):
     430          # bug:  www.python.org/sf/1576657
     431          for v1 in ['Q', (1,)]:
     432              try:
     433                  self.s.remove(v1)
     434              except KeyError as e:
     435                  v2 = e.args[0]
     436                  self.assertEqual(v1, v2)
     437              else:
     438                  self.fail()
     439  
     440      def test_remove_keyerror_set(self):
     441          key = self.thetype([3, 4])
     442          try:
     443              self.s.remove(key)
     444          except KeyError as e:
     445              self.assertTrue(e.args[0] is key,
     446                           "KeyError should be {0}, not {1}".format(key,
     447                                                                    e.args[0]))
     448          else:
     449              self.fail()
     450  
     451      def test_discard(self):
     452          self.s.discard('a')
     453          self.assertNotIn('a', self.s)
     454          self.s.discard('Q')
     455          self.assertRaises(TypeError, self.s.discard, [])
     456          s = self.thetype([frozenset(self.word)])
     457          self.assertIn(self.thetype(self.word), s)
     458          s.discard(self.thetype(self.word))
     459          self.assertNotIn(self.thetype(self.word), s)
     460          s.discard(self.thetype(self.word))
     461  
     462      def test_pop(self):
     463          for i in range(len(self.s)):
     464              elem = self.s.pop()
     465              self.assertNotIn(elem, self.s)
     466          self.assertRaises(KeyError, self.s.pop)
     467  
     468      def test_update(self):
     469          retval = self.s.update(self.otherword)
     470          self.assertEqual(retval, None)
     471          for c in (self.word + self.otherword):
     472              self.assertIn(c, self.s)
     473          self.assertRaises(PassThru, self.s.update, check_pass_thru())
     474          self.assertRaises(TypeError, self.s.update, [[]])
     475          for p, q in (('cdc', 'abcd'), ('efgfe', 'abcefg'), ('ccb', 'abc'), ('ef', 'abcef')):
     476              for C in set, frozenset, dict.fromkeys, str, list, tuple:
     477                  s = self.thetype('abcba')
     478                  self.assertEqual(s.update(C(p)), None)
     479                  self.assertEqual(s, set(q))
     480          for p in ('cdc', 'efgfe', 'ccb', 'ef', 'abcda'):
     481              q = 'ahi'
     482              for C in set, frozenset, dict.fromkeys, str, list, tuple:
     483                  s = self.thetype('abcba')
     484                  self.assertEqual(s.update(C(p), C(q)), None)
     485                  self.assertEqual(s, set(s) | set(p) | set(q))
     486  
     487      def test_ior(self):
     488          self.s |= set(self.otherword)
     489          for c in (self.word + self.otherword):
     490              self.assertIn(c, self.s)
     491  
     492      def test_intersection_update(self):
     493          retval = self.s.intersection_update(self.otherword)
     494          self.assertEqual(retval, None)
     495          for c in (self.word + self.otherword):
     496              if c in self.otherword and c in self.word:
     497                  self.assertIn(c, self.s)
     498              else:
     499                  self.assertNotIn(c, self.s)
     500          self.assertRaises(PassThru, self.s.intersection_update, check_pass_thru())
     501          self.assertRaises(TypeError, self.s.intersection_update, [[]])
     502          for p, q in (('cdc', 'c'), ('efgfe', ''), ('ccb', 'bc'), ('ef', '')):
     503              for C in set, frozenset, dict.fromkeys, str, list, tuple:
     504                  s = self.thetype('abcba')
     505                  self.assertEqual(s.intersection_update(C(p)), None)
     506                  self.assertEqual(s, set(q))
     507                  ss = 'abcba'
     508                  s = self.thetype(ss)
     509                  t = 'cbc'
     510                  self.assertEqual(s.intersection_update(C(p), C(t)), None)
     511                  self.assertEqual(s, set('abcba')&set(p)&set(t))
     512  
     513      def test_iand(self):
     514          self.s &= set(self.otherword)
     515          for c in (self.word + self.otherword):
     516              if c in self.otherword and c in self.word:
     517                  self.assertIn(c, self.s)
     518              else:
     519                  self.assertNotIn(c, self.s)
     520  
     521      def test_difference_update(self):
     522          retval = self.s.difference_update(self.otherword)
     523          self.assertEqual(retval, None)
     524          for c in (self.word + self.otherword):
     525              if c in self.word and c not in self.otherword:
     526                  self.assertIn(c, self.s)
     527              else:
     528                  self.assertNotIn(c, self.s)
     529          self.assertRaises(PassThru, self.s.difference_update, check_pass_thru())
     530          self.assertRaises(TypeError, self.s.difference_update, [[]])
     531          self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
     532          for p, q in (('cdc', 'ab'), ('efgfe', 'abc'), ('ccb', 'a'), ('ef', 'abc')):
     533              for C in set, frozenset, dict.fromkeys, str, list, tuple:
     534                  s = self.thetype('abcba')
     535                  self.assertEqual(s.difference_update(C(p)), None)
     536                  self.assertEqual(s, set(q))
     537  
     538                  s = self.thetype('abcdefghih')
     539                  s.difference_update()
     540                  self.assertEqual(s, self.thetype('abcdefghih'))
     541  
     542                  s = self.thetype('abcdefghih')
     543                  s.difference_update(C('aba'))
     544                  self.assertEqual(s, self.thetype('cdefghih'))
     545  
     546                  s = self.thetype('abcdefghih')
     547                  s.difference_update(C('cdc'), C('aba'))
     548                  self.assertEqual(s, self.thetype('efghih'))
     549  
     550      def test_isub(self):
     551          self.s -= set(self.otherword)
     552          for c in (self.word + self.otherword):
     553              if c in self.word and c not in self.otherword:
     554                  self.assertIn(c, self.s)
     555              else:
     556                  self.assertNotIn(c, self.s)
     557  
     558      def test_symmetric_difference_update(self):
     559          retval = self.s.symmetric_difference_update(self.otherword)
     560          self.assertEqual(retval, None)
     561          for c in (self.word + self.otherword):
     562              if (c in self.word) ^ (c in self.otherword):
     563                  self.assertIn(c, self.s)
     564              else:
     565                  self.assertNotIn(c, self.s)
     566          self.assertRaises(PassThru, self.s.symmetric_difference_update, check_pass_thru())
     567          self.assertRaises(TypeError, self.s.symmetric_difference_update, [[]])
     568          for p, q in (('cdc', 'abd'), ('efgfe', 'abcefg'), ('ccb', 'a'), ('ef', 'abcef')):
     569              for C in set, frozenset, dict.fromkeys, str, list, tuple:
     570                  s = self.thetype('abcba')
     571                  self.assertEqual(s.symmetric_difference_update(C(p)), None)
     572                  self.assertEqual(s, set(q))
     573  
     574      def test_ixor(self):
     575          self.s ^= set(self.otherword)
     576          for c in (self.word + self.otherword):
     577              if (c in self.word) ^ (c in self.otherword):
     578                  self.assertIn(c, self.s)
     579              else:
     580                  self.assertNotIn(c, self.s)
     581  
     582      def test_inplace_on_self(self):
     583          t = self.s.copy()
     584          t |= t
     585          self.assertEqual(t, self.s)
     586          t &= t
     587          self.assertEqual(t, self.s)
     588          t -= t
     589          self.assertEqual(t, self.thetype())
     590          t = self.s.copy()
     591          t ^= t
     592          self.assertEqual(t, self.thetype())
     593  
     594      def test_weakref(self):
     595          s = self.thetype('gallahad')
     596          p = weakref.proxy(s)
     597          self.assertEqual(str(p), str(s))
     598          s = None
     599          support.gc_collect()  # For PyPy or other GCs.
     600          self.assertRaises(ReferenceError, str, p)
     601  
     602      def test_rich_compare(self):
     603          class ESC[4;38;5;81mTestRichSetCompare:
     604              def __gt__(self, some_set):
     605                  self.gt_called = True
     606                  return False
     607              def __lt__(self, some_set):
     608                  self.lt_called = True
     609                  return False
     610              def __ge__(self, some_set):
     611                  self.ge_called = True
     612                  return False
     613              def __le__(self, some_set):
     614                  self.le_called = True
     615                  return False
     616  
     617          # This first tries the builtin rich set comparison, which doesn't know
     618          # how to handle the custom object. Upon returning NotImplemented, the
     619          # corresponding comparison on the right object is invoked.
     620          myset = {1, 2, 3}
     621  
     622          myobj = TestRichSetCompare()
     623          myset < myobj
     624          self.assertTrue(myobj.gt_called)
     625  
     626          myobj = TestRichSetCompare()
     627          myset > myobj
     628          self.assertTrue(myobj.lt_called)
     629  
     630          myobj = TestRichSetCompare()
     631          myset <= myobj
     632          self.assertTrue(myobj.ge_called)
     633  
     634          myobj = TestRichSetCompare()
     635          myset >= myobj
     636          self.assertTrue(myobj.le_called)
     637  
     638      @unittest.skipUnless(hasattr(set, "test_c_api"),
     639                           'C API test only available in a debug build')
     640      def test_c_api(self):
     641          self.assertEqual(set().test_c_api(), True)
     642  
     643  class ESC[4;38;5;81mSetSubclass(ESC[4;38;5;149mset):
     644      pass
     645  
     646  class ESC[4;38;5;81mTestSetSubclass(ESC[4;38;5;149mTestSet):
     647      thetype = SetSubclass
     648      basetype = set
     649  
     650      def test_keywords_in_subclass(self):
     651          class ESC[4;38;5;81msubclass(ESC[4;38;5;149mset):
     652              pass
     653          u = subclass([1, 2])
     654          self.assertIs(type(u), subclass)
     655          self.assertEqual(set(u), {1, 2})
     656          with self.assertRaises(TypeError):
     657              subclass(sequence=())
     658  
     659          class ESC[4;38;5;81msubclass_with_init(ESC[4;38;5;149mset):
     660              def __init__(self, arg, newarg=None):
     661                  super().__init__(arg)
     662                  self.newarg = newarg
     663          u = subclass_with_init([1, 2], newarg=3)
     664          self.assertIs(type(u), subclass_with_init)
     665          self.assertEqual(set(u), {1, 2})
     666          self.assertEqual(u.newarg, 3)
     667  
     668          class ESC[4;38;5;81msubclass_with_new(ESC[4;38;5;149mset):
     669              def __new__(cls, arg, newarg=None):
     670                  self = super().__new__(cls, arg)
     671                  self.newarg = newarg
     672                  return self
     673          u = subclass_with_new([1, 2])
     674          self.assertIs(type(u), subclass_with_new)
     675          self.assertEqual(set(u), {1, 2})
     676          self.assertIsNone(u.newarg)
     677          # disallow kwargs in __new__ only (https://bugs.python.org/issue43413#msg402000)
     678          with self.assertRaises(TypeError):
     679              subclass_with_new([1, 2], newarg=3)
     680  
     681  
     682  class ESC[4;38;5;81mTestFrozenSet(ESC[4;38;5;149mTestJointOps, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     683      thetype = frozenset
     684      basetype = frozenset
     685  
     686      def test_init(self):
     687          s = self.thetype(self.word)
     688          s.__init__(self.otherword)
     689          self.assertEqual(s, set(self.word))
     690  
     691      def test_constructor_identity(self):
     692          s = self.thetype(range(3))
     693          t = self.thetype(s)
     694          self.assertEqual(id(s), id(t))
     695  
     696      def test_hash(self):
     697          self.assertEqual(hash(self.thetype('abcdeb')),
     698                           hash(self.thetype('ebecda')))
     699  
     700          # make sure that all permutations give the same hash value
     701          n = 100
     702          seq = [randrange(n) for i in range(n)]
     703          results = set()
     704          for i in range(200):
     705              shuffle(seq)
     706              results.add(hash(self.thetype(seq)))
     707          self.assertEqual(len(results), 1)
     708  
     709      def test_copy(self):
     710          dup = self.s.copy()
     711          self.assertEqual(id(self.s), id(dup))
     712  
     713      def test_frozen_as_dictkey(self):
     714          seq = list(range(10)) + list('abcdefg') + ['apple']
     715          key1 = self.thetype(seq)
     716          key2 = self.thetype(reversed(seq))
     717          self.assertEqual(key1, key2)
     718          self.assertNotEqual(id(key1), id(key2))
     719          d = {}
     720          d[key1] = 42
     721          self.assertEqual(d[key2], 42)
     722  
     723      def test_hash_caching(self):
     724          f = self.thetype('abcdcda')
     725          self.assertEqual(hash(f), hash(f))
     726  
     727      def test_hash_effectiveness(self):
     728          n = 13
     729          hashvalues = set()
     730          addhashvalue = hashvalues.add
     731          elemmasks = [(i+1, 1<<i) for i in range(n)]
     732          for i in range(2**n):
     733              addhashvalue(hash(frozenset([e for e, m in elemmasks if m&i])))
     734          self.assertEqual(len(hashvalues), 2**n)
     735  
     736          def zf_range(n):
     737              # https://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers
     738              nums = [frozenset()]
     739              for i in range(n-1):
     740                  num = frozenset(nums)
     741                  nums.append(num)
     742              return nums[:n]
     743  
     744          def powerset(s):
     745              for i in range(len(s)+1):
     746                  yield from map(frozenset, itertools.combinations(s, i))
     747  
     748          for n in range(18):
     749              t = 2 ** n
     750              mask = t - 1
     751              for nums in (range, zf_range):
     752                  u = len({h & mask for h in map(hash, powerset(nums(n)))})
     753                  self.assertGreater(4*u, t)
     754  
     755  class ESC[4;38;5;81mFrozenSetSubclass(ESC[4;38;5;149mfrozenset):
     756      pass
     757  
     758  class ESC[4;38;5;81mTestFrozenSetSubclass(ESC[4;38;5;149mTestFrozenSet):
     759      thetype = FrozenSetSubclass
     760      basetype = frozenset
     761  
     762      def test_keywords_in_subclass(self):
     763          class ESC[4;38;5;81msubclass(ESC[4;38;5;149mfrozenset):
     764              pass
     765          u = subclass([1, 2])
     766          self.assertIs(type(u), subclass)
     767          self.assertEqual(set(u), {1, 2})
     768          with self.assertRaises(TypeError):
     769              subclass(sequence=())
     770  
     771          class ESC[4;38;5;81msubclass_with_init(ESC[4;38;5;149mfrozenset):
     772              def __init__(self, arg, newarg=None):
     773                  self.newarg = newarg
     774          u = subclass_with_init([1, 2], newarg=3)
     775          self.assertIs(type(u), subclass_with_init)
     776          self.assertEqual(set(u), {1, 2})
     777          self.assertEqual(u.newarg, 3)
     778  
     779          class ESC[4;38;5;81msubclass_with_new(ESC[4;38;5;149mfrozenset):
     780              def __new__(cls, arg, newarg=None):
     781                  self = super().__new__(cls, arg)
     782                  self.newarg = newarg
     783                  return self
     784          u = subclass_with_new([1, 2], newarg=3)
     785          self.assertIs(type(u), subclass_with_new)
     786          self.assertEqual(set(u), {1, 2})
     787          self.assertEqual(u.newarg, 3)
     788  
     789      def test_constructor_identity(self):
     790          s = self.thetype(range(3))
     791          t = self.thetype(s)
     792          self.assertNotEqual(id(s), id(t))
     793  
     794      def test_copy(self):
     795          dup = self.s.copy()
     796          self.assertNotEqual(id(self.s), id(dup))
     797  
     798      def test_nested_empty_constructor(self):
     799          s = self.thetype()
     800          t = self.thetype(s)
     801          self.assertEqual(s, t)
     802  
     803      def test_singleton_empty_frozenset(self):
     804          Frozenset = self.thetype
     805          f = frozenset()
     806          F = Frozenset()
     807          efs = [Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
     808                 Frozenset(), Frozenset([]), Frozenset(()), Frozenset(''),
     809                 Frozenset(range(0)), Frozenset(Frozenset()),
     810                 Frozenset(frozenset()), f, F, Frozenset(f), Frozenset(F)]
     811          # All empty frozenset subclass instances should have different ids
     812          self.assertEqual(len(set(map(id, efs))), len(efs))
     813  
     814  
     815  class ESC[4;38;5;81mSetSubclassWithSlots(ESC[4;38;5;149mset):
     816      __slots__ = ('x', 'y', '__dict__')
     817  
     818  class ESC[4;38;5;81mTestSetSubclassWithSlots(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     819      thetype = SetSubclassWithSlots
     820      setUp = TestJointOps.setUp
     821      test_pickling = TestJointOps.test_pickling
     822  
     823  class ESC[4;38;5;81mFrozenSetSubclassWithSlots(ESC[4;38;5;149mfrozenset):
     824      __slots__ = ('x', 'y', '__dict__')
     825  
     826  class ESC[4;38;5;81mTestFrozenSetSubclassWithSlots(ESC[4;38;5;149mTestSetSubclassWithSlots):
     827      thetype = FrozenSetSubclassWithSlots
     828  
     829  # Tests taken from test_sets.py =============================================
     830  
     831  empty_set = set()
     832  
     833  #==============================================================================
     834  
     835  class ESC[4;38;5;81mTestBasicOps:
     836  
     837      def test_repr(self):
     838          if self.repr is not None:
     839              self.assertEqual(repr(self.set), self.repr)
     840  
     841      def check_repr_against_values(self):
     842          text = repr(self.set)
     843          self.assertTrue(text.startswith('{'))
     844          self.assertTrue(text.endswith('}'))
     845  
     846          result = text[1:-1].split(', ')
     847          result.sort()
     848          sorted_repr_values = [repr(value) for value in self.values]
     849          sorted_repr_values.sort()
     850          self.assertEqual(result, sorted_repr_values)
     851  
     852      def test_length(self):
     853          self.assertEqual(len(self.set), self.length)
     854  
     855      def test_self_equality(self):
     856          self.assertEqual(self.set, self.set)
     857  
     858      def test_equivalent_equality(self):
     859          self.assertEqual(self.set, self.dup)
     860  
     861      def test_copy(self):
     862          self.assertEqual(self.set.copy(), self.dup)
     863  
     864      def test_self_union(self):
     865          result = self.set | self.set
     866          self.assertEqual(result, self.dup)
     867  
     868      def test_empty_union(self):
     869          result = self.set | empty_set
     870          self.assertEqual(result, self.dup)
     871  
     872      def test_union_empty(self):
     873          result = empty_set | self.set
     874          self.assertEqual(result, self.dup)
     875  
     876      def test_self_intersection(self):
     877          result = self.set & self.set
     878          self.assertEqual(result, self.dup)
     879  
     880      def test_empty_intersection(self):
     881          result = self.set & empty_set
     882          self.assertEqual(result, empty_set)
     883  
     884      def test_intersection_empty(self):
     885          result = empty_set & self.set
     886          self.assertEqual(result, empty_set)
     887  
     888      def test_self_isdisjoint(self):
     889          result = self.set.isdisjoint(self.set)
     890          self.assertEqual(result, not self.set)
     891  
     892      def test_empty_isdisjoint(self):
     893          result = self.set.isdisjoint(empty_set)
     894          self.assertEqual(result, True)
     895  
     896      def test_isdisjoint_empty(self):
     897          result = empty_set.isdisjoint(self.set)
     898          self.assertEqual(result, True)
     899  
     900      def test_self_symmetric_difference(self):
     901          result = self.set ^ self.set
     902          self.assertEqual(result, empty_set)
     903  
     904      def test_empty_symmetric_difference(self):
     905          result = self.set ^ empty_set
     906          self.assertEqual(result, self.set)
     907  
     908      def test_self_difference(self):
     909          result = self.set - self.set
     910          self.assertEqual(result, empty_set)
     911  
     912      def test_empty_difference(self):
     913          result = self.set - empty_set
     914          self.assertEqual(result, self.dup)
     915  
     916      def test_empty_difference_rev(self):
     917          result = empty_set - self.set
     918          self.assertEqual(result, empty_set)
     919  
     920      def test_iteration(self):
     921          for v in self.set:
     922              self.assertIn(v, self.values)
     923          setiter = iter(self.set)
     924          self.assertEqual(setiter.__length_hint__(), len(self.set))
     925  
     926      def test_pickling(self):
     927          for proto in range(pickle.HIGHEST_PROTOCOL + 1):
     928              p = pickle.dumps(self.set, proto)
     929              copy = pickle.loads(p)
     930              self.assertEqual(self.set, copy,
     931                               "%s != %s" % (self.set, copy))
     932  
     933      def test_issue_37219(self):
     934          with self.assertRaises(TypeError):
     935              set().difference(123)
     936          with self.assertRaises(TypeError):
     937              set().difference_update(123)
     938  
     939  #------------------------------------------------------------------------------
     940  
     941  class ESC[4;38;5;81mTestBasicOpsEmpty(ESC[4;38;5;149mTestBasicOps, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     942      def setUp(self):
     943          self.case   = "empty set"
     944          self.values = []
     945          self.set    = set(self.values)
     946          self.dup    = set(self.values)
     947          self.length = 0
     948          self.repr   = "set()"
     949  
     950  #------------------------------------------------------------------------------
     951  
     952  class ESC[4;38;5;81mTestBasicOpsSingleton(ESC[4;38;5;149mTestBasicOps, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     953      def setUp(self):
     954          self.case   = "unit set (number)"
     955          self.values = [3]
     956          self.set    = set(self.values)
     957          self.dup    = set(self.values)
     958          self.length = 1
     959          self.repr   = "{3}"
     960  
     961      def test_in(self):
     962          self.assertIn(3, self.set)
     963  
     964      def test_not_in(self):
     965          self.assertNotIn(2, self.set)
     966  
     967  #------------------------------------------------------------------------------
     968  
     969  class ESC[4;38;5;81mTestBasicOpsTuple(ESC[4;38;5;149mTestBasicOps, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     970      def setUp(self):
     971          self.case   = "unit set (tuple)"
     972          self.values = [(0, "zero")]
     973          self.set    = set(self.values)
     974          self.dup    = set(self.values)
     975          self.length = 1
     976          self.repr   = "{(0, 'zero')}"
     977  
     978      def test_in(self):
     979          self.assertIn((0, "zero"), self.set)
     980  
     981      def test_not_in(self):
     982          self.assertNotIn(9, self.set)
     983  
     984  #------------------------------------------------------------------------------
     985  
     986  class ESC[4;38;5;81mTestBasicOpsTriple(ESC[4;38;5;149mTestBasicOps, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     987      def setUp(self):
     988          self.case   = "triple set"
     989          self.values = [0, "zero", operator.add]
     990          self.set    = set(self.values)
     991          self.dup    = set(self.values)
     992          self.length = 3
     993          self.repr   = None
     994  
     995  #------------------------------------------------------------------------------
     996  
     997  class ESC[4;38;5;81mTestBasicOpsString(ESC[4;38;5;149mTestBasicOps, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
     998      def setUp(self):
     999          self.case   = "string set"
    1000          self.values = ["a", "b", "c"]
    1001          self.set    = set(self.values)
    1002          self.dup    = set(self.values)
    1003          self.length = 3
    1004  
    1005      def test_repr(self):
    1006          self.check_repr_against_values()
    1007  
    1008  #------------------------------------------------------------------------------
    1009  
    1010  class ESC[4;38;5;81mTestBasicOpsBytes(ESC[4;38;5;149mTestBasicOps, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1011      def setUp(self):
    1012          self.case   = "bytes set"
    1013          self.values = [b"a", b"b", b"c"]
    1014          self.set    = set(self.values)
    1015          self.dup    = set(self.values)
    1016          self.length = 3
    1017  
    1018      def test_repr(self):
    1019          self.check_repr_against_values()
    1020  
    1021  #------------------------------------------------------------------------------
    1022  
    1023  class ESC[4;38;5;81mTestBasicOpsMixedStringBytes(ESC[4;38;5;149mTestBasicOps, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1024      def setUp(self):
    1025          self.enterContext(warnings_helper.check_warnings())
    1026          warnings.simplefilter('ignore', BytesWarning)
    1027          self.case   = "string and bytes set"
    1028          self.values = ["a", "b", b"a", b"b"]
    1029          self.set    = set(self.values)
    1030          self.dup    = set(self.values)
    1031          self.length = 4
    1032  
    1033      def test_repr(self):
    1034          self.check_repr_against_values()
    1035  
    1036  #==============================================================================
    1037  
    1038  def baditer():
    1039      raise TypeError
    1040      yield True
    1041  
    1042  def gooditer():
    1043      yield True
    1044  
    1045  class ESC[4;38;5;81mTestExceptionPropagation(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1046      """SF 628246:  Set constructor should not trap iterator TypeErrors"""
    1047  
    1048      def test_instanceWithException(self):
    1049          self.assertRaises(TypeError, set, baditer())
    1050  
    1051      def test_instancesWithoutException(self):
    1052          # All of these iterables should load without exception.
    1053          set([1,2,3])
    1054          set((1,2,3))
    1055          set({'one':1, 'two':2, 'three':3})
    1056          set(range(3))
    1057          set('abc')
    1058          set(gooditer())
    1059  
    1060      def test_changingSizeWhileIterating(self):
    1061          s = set([1,2,3])
    1062          try:
    1063              for i in s:
    1064                  s.update([4])
    1065          except RuntimeError:
    1066              pass
    1067          else:
    1068              self.fail("no exception when changing size during iteration")
    1069  
    1070  #==============================================================================
    1071  
    1072  class ESC[4;38;5;81mTestSetOfSets(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1073      def test_constructor(self):
    1074          inner = frozenset([1])
    1075          outer = set([inner])
    1076          element = outer.pop()
    1077          self.assertEqual(type(element), frozenset)
    1078          outer.add(inner)        # Rebuild set of sets with .add method
    1079          outer.remove(inner)
    1080          self.assertEqual(outer, set())   # Verify that remove worked
    1081          outer.discard(inner)    # Absence of KeyError indicates working fine
    1082  
    1083  #==============================================================================
    1084  
    1085  class ESC[4;38;5;81mTestBinaryOps(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1086      def setUp(self):
    1087          self.set = set((2, 4, 6))
    1088  
    1089      def test_eq(self):              # SF bug 643115
    1090          self.assertEqual(self.set, set({2:1,4:3,6:5}))
    1091  
    1092      def test_union_subset(self):
    1093          result = self.set | set([2])
    1094          self.assertEqual(result, set((2, 4, 6)))
    1095  
    1096      def test_union_superset(self):
    1097          result = self.set | set([2, 4, 6, 8])
    1098          self.assertEqual(result, set([2, 4, 6, 8]))
    1099  
    1100      def test_union_overlap(self):
    1101          result = self.set | set([3, 4, 5])
    1102          self.assertEqual(result, set([2, 3, 4, 5, 6]))
    1103  
    1104      def test_union_non_overlap(self):
    1105          result = self.set | set([8])
    1106          self.assertEqual(result, set([2, 4, 6, 8]))
    1107  
    1108      def test_intersection_subset(self):
    1109          result = self.set & set((2, 4))
    1110          self.assertEqual(result, set((2, 4)))
    1111  
    1112      def test_intersection_superset(self):
    1113          result = self.set & set([2, 4, 6, 8])
    1114          self.assertEqual(result, set([2, 4, 6]))
    1115  
    1116      def test_intersection_overlap(self):
    1117          result = self.set & set([3, 4, 5])
    1118          self.assertEqual(result, set([4]))
    1119  
    1120      def test_intersection_non_overlap(self):
    1121          result = self.set & set([8])
    1122          self.assertEqual(result, empty_set)
    1123  
    1124      def test_isdisjoint_subset(self):
    1125          result = self.set.isdisjoint(set((2, 4)))
    1126          self.assertEqual(result, False)
    1127  
    1128      def test_isdisjoint_superset(self):
    1129          result = self.set.isdisjoint(set([2, 4, 6, 8]))
    1130          self.assertEqual(result, False)
    1131  
    1132      def test_isdisjoint_overlap(self):
    1133          result = self.set.isdisjoint(set([3, 4, 5]))
    1134          self.assertEqual(result, False)
    1135  
    1136      def test_isdisjoint_non_overlap(self):
    1137          result = self.set.isdisjoint(set([8]))
    1138          self.assertEqual(result, True)
    1139  
    1140      def test_sym_difference_subset(self):
    1141          result = self.set ^ set((2, 4))
    1142          self.assertEqual(result, set([6]))
    1143  
    1144      def test_sym_difference_superset(self):
    1145          result = self.set ^ set((2, 4, 6, 8))
    1146          self.assertEqual(result, set([8]))
    1147  
    1148      def test_sym_difference_overlap(self):
    1149          result = self.set ^ set((3, 4, 5))
    1150          self.assertEqual(result, set([2, 3, 5, 6]))
    1151  
    1152      def test_sym_difference_non_overlap(self):
    1153          result = self.set ^ set([8])
    1154          self.assertEqual(result, set([2, 4, 6, 8]))
    1155  
    1156  #==============================================================================
    1157  
    1158  class ESC[4;38;5;81mTestUpdateOps(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1159      def setUp(self):
    1160          self.set = set((2, 4, 6))
    1161  
    1162      def test_union_subset(self):
    1163          self.set |= set([2])
    1164          self.assertEqual(self.set, set((2, 4, 6)))
    1165  
    1166      def test_union_superset(self):
    1167          self.set |= set([2, 4, 6, 8])
    1168          self.assertEqual(self.set, set([2, 4, 6, 8]))
    1169  
    1170      def test_union_overlap(self):
    1171          self.set |= set([3, 4, 5])
    1172          self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
    1173  
    1174      def test_union_non_overlap(self):
    1175          self.set |= set([8])
    1176          self.assertEqual(self.set, set([2, 4, 6, 8]))
    1177  
    1178      def test_union_method_call(self):
    1179          self.set.update(set([3, 4, 5]))
    1180          self.assertEqual(self.set, set([2, 3, 4, 5, 6]))
    1181  
    1182      def test_intersection_subset(self):
    1183          self.set &= set((2, 4))
    1184          self.assertEqual(self.set, set((2, 4)))
    1185  
    1186      def test_intersection_superset(self):
    1187          self.set &= set([2, 4, 6, 8])
    1188          self.assertEqual(self.set, set([2, 4, 6]))
    1189  
    1190      def test_intersection_overlap(self):
    1191          self.set &= set([3, 4, 5])
    1192          self.assertEqual(self.set, set([4]))
    1193  
    1194      def test_intersection_non_overlap(self):
    1195          self.set &= set([8])
    1196          self.assertEqual(self.set, empty_set)
    1197  
    1198      def test_intersection_method_call(self):
    1199          self.set.intersection_update(set([3, 4, 5]))
    1200          self.assertEqual(self.set, set([4]))
    1201  
    1202      def test_sym_difference_subset(self):
    1203          self.set ^= set((2, 4))
    1204          self.assertEqual(self.set, set([6]))
    1205  
    1206      def test_sym_difference_superset(self):
    1207          self.set ^= set((2, 4, 6, 8))
    1208          self.assertEqual(self.set, set([8]))
    1209  
    1210      def test_sym_difference_overlap(self):
    1211          self.set ^= set((3, 4, 5))
    1212          self.assertEqual(self.set, set([2, 3, 5, 6]))
    1213  
    1214      def test_sym_difference_non_overlap(self):
    1215          self.set ^= set([8])
    1216          self.assertEqual(self.set, set([2, 4, 6, 8]))
    1217  
    1218      def test_sym_difference_method_call(self):
    1219          self.set.symmetric_difference_update(set([3, 4, 5]))
    1220          self.assertEqual(self.set, set([2, 3, 5, 6]))
    1221  
    1222      def test_difference_subset(self):
    1223          self.set -= set((2, 4))
    1224          self.assertEqual(self.set, set([6]))
    1225  
    1226      def test_difference_superset(self):
    1227          self.set -= set((2, 4, 6, 8))
    1228          self.assertEqual(self.set, set([]))
    1229  
    1230      def test_difference_overlap(self):
    1231          self.set -= set((3, 4, 5))
    1232          self.assertEqual(self.set, set([2, 6]))
    1233  
    1234      def test_difference_non_overlap(self):
    1235          self.set -= set([8])
    1236          self.assertEqual(self.set, set([2, 4, 6]))
    1237  
    1238      def test_difference_method_call(self):
    1239          self.set.difference_update(set([3, 4, 5]))
    1240          self.assertEqual(self.set, set([2, 6]))
    1241  
    1242  #==============================================================================
    1243  
    1244  class ESC[4;38;5;81mTestMutate(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1245      def setUp(self):
    1246          self.values = ["a", "b", "c"]
    1247          self.set = set(self.values)
    1248  
    1249      def test_add_present(self):
    1250          self.set.add("c")
    1251          self.assertEqual(self.set, set("abc"))
    1252  
    1253      def test_add_absent(self):
    1254          self.set.add("d")
    1255          self.assertEqual(self.set, set("abcd"))
    1256  
    1257      def test_add_until_full(self):
    1258          tmp = set()
    1259          expected_len = 0
    1260          for v in self.values:
    1261              tmp.add(v)
    1262              expected_len += 1
    1263              self.assertEqual(len(tmp), expected_len)
    1264          self.assertEqual(tmp, self.set)
    1265  
    1266      def test_remove_present(self):
    1267          self.set.remove("b")
    1268          self.assertEqual(self.set, set("ac"))
    1269  
    1270      def test_remove_absent(self):
    1271          try:
    1272              self.set.remove("d")
    1273              self.fail("Removing missing element should have raised LookupError")
    1274          except LookupError:
    1275              pass
    1276  
    1277      def test_remove_until_empty(self):
    1278          expected_len = len(self.set)
    1279          for v in self.values:
    1280              self.set.remove(v)
    1281              expected_len -= 1
    1282              self.assertEqual(len(self.set), expected_len)
    1283  
    1284      def test_discard_present(self):
    1285          self.set.discard("c")
    1286          self.assertEqual(self.set, set("ab"))
    1287  
    1288      def test_discard_absent(self):
    1289          self.set.discard("d")
    1290          self.assertEqual(self.set, set("abc"))
    1291  
    1292      def test_clear(self):
    1293          self.set.clear()
    1294          self.assertEqual(len(self.set), 0)
    1295  
    1296      def test_pop(self):
    1297          popped = {}
    1298          while self.set:
    1299              popped[self.set.pop()] = None
    1300          self.assertEqual(len(popped), len(self.values))
    1301          for v in self.values:
    1302              self.assertIn(v, popped)
    1303  
    1304      def test_update_empty_tuple(self):
    1305          self.set.update(())
    1306          self.assertEqual(self.set, set(self.values))
    1307  
    1308      def test_update_unit_tuple_overlap(self):
    1309          self.set.update(("a",))
    1310          self.assertEqual(self.set, set(self.values))
    1311  
    1312      def test_update_unit_tuple_non_overlap(self):
    1313          self.set.update(("a", "z"))
    1314          self.assertEqual(self.set, set(self.values + ["z"]))
    1315  
    1316  #==============================================================================
    1317  
    1318  class ESC[4;38;5;81mTestSubsets:
    1319  
    1320      case2method = {"<=": "issubset",
    1321                     ">=": "issuperset",
    1322                    }
    1323  
    1324      reverse = {"==": "==",
    1325                 "!=": "!=",
    1326                 "<":  ">",
    1327                 ">":  "<",
    1328                 "<=": ">=",
    1329                 ">=": "<=",
    1330                }
    1331  
    1332      def test_issubset(self):
    1333          x = self.left
    1334          y = self.right
    1335          for case in "!=", "==", "<", "<=", ">", ">=":
    1336              expected = case in self.cases
    1337              # Test the binary infix spelling.
    1338              result = eval("x" + case + "y", locals())
    1339              self.assertEqual(result, expected)
    1340              # Test the "friendly" method-name spelling, if one exists.
    1341              if case in TestSubsets.case2method:
    1342                  method = getattr(x, TestSubsets.case2method[case])
    1343                  result = method(y)
    1344                  self.assertEqual(result, expected)
    1345  
    1346              # Now do the same for the operands reversed.
    1347              rcase = TestSubsets.reverse[case]
    1348              result = eval("y" + rcase + "x", locals())
    1349              self.assertEqual(result, expected)
    1350              if rcase in TestSubsets.case2method:
    1351                  method = getattr(y, TestSubsets.case2method[rcase])
    1352                  result = method(x)
    1353                  self.assertEqual(result, expected)
    1354  #------------------------------------------------------------------------------
    1355  
    1356  class ESC[4;38;5;81mTestSubsetEqualEmpty(ESC[4;38;5;149mTestSubsets, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1357      left  = set()
    1358      right = set()
    1359      name  = "both empty"
    1360      cases = "==", "<=", ">="
    1361  
    1362  #------------------------------------------------------------------------------
    1363  
    1364  class ESC[4;38;5;81mTestSubsetEqualNonEmpty(ESC[4;38;5;149mTestSubsets, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1365      left  = set([1, 2])
    1366      right = set([1, 2])
    1367      name  = "equal pair"
    1368      cases = "==", "<=", ">="
    1369  
    1370  #------------------------------------------------------------------------------
    1371  
    1372  class ESC[4;38;5;81mTestSubsetEmptyNonEmpty(ESC[4;38;5;149mTestSubsets, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1373      left  = set()
    1374      right = set([1, 2])
    1375      name  = "one empty, one non-empty"
    1376      cases = "!=", "<", "<="
    1377  
    1378  #------------------------------------------------------------------------------
    1379  
    1380  class ESC[4;38;5;81mTestSubsetPartial(ESC[4;38;5;149mTestSubsets, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1381      left  = set([1])
    1382      right = set([1, 2])
    1383      name  = "one a non-empty proper subset of other"
    1384      cases = "!=", "<", "<="
    1385  
    1386  #------------------------------------------------------------------------------
    1387  
    1388  class ESC[4;38;5;81mTestSubsetNonOverlap(ESC[4;38;5;149mTestSubsets, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1389      left  = set([1])
    1390      right = set([2])
    1391      name  = "neither empty, neither contains"
    1392      cases = "!="
    1393  
    1394  #==============================================================================
    1395  
    1396  class ESC[4;38;5;81mTestOnlySetsInBinaryOps:
    1397  
    1398      def test_eq_ne(self):
    1399          # Unlike the others, this is testing that == and != *are* allowed.
    1400          self.assertEqual(self.other == self.set, False)
    1401          self.assertEqual(self.set == self.other, False)
    1402          self.assertEqual(self.other != self.set, True)
    1403          self.assertEqual(self.set != self.other, True)
    1404  
    1405      def test_ge_gt_le_lt(self):
    1406          self.assertRaises(TypeError, lambda: self.set < self.other)
    1407          self.assertRaises(TypeError, lambda: self.set <= self.other)
    1408          self.assertRaises(TypeError, lambda: self.set > self.other)
    1409          self.assertRaises(TypeError, lambda: self.set >= self.other)
    1410  
    1411          self.assertRaises(TypeError, lambda: self.other < self.set)
    1412          self.assertRaises(TypeError, lambda: self.other <= self.set)
    1413          self.assertRaises(TypeError, lambda: self.other > self.set)
    1414          self.assertRaises(TypeError, lambda: self.other >= self.set)
    1415  
    1416      def test_update_operator(self):
    1417          try:
    1418              self.set |= self.other
    1419          except TypeError:
    1420              pass
    1421          else:
    1422              self.fail("expected TypeError")
    1423  
    1424      def test_update(self):
    1425          if self.otherIsIterable:
    1426              self.set.update(self.other)
    1427          else:
    1428              self.assertRaises(TypeError, self.set.update, self.other)
    1429  
    1430      def test_union(self):
    1431          self.assertRaises(TypeError, lambda: self.set | self.other)
    1432          self.assertRaises(TypeError, lambda: self.other | self.set)
    1433          if self.otherIsIterable:
    1434              self.set.union(self.other)
    1435          else:
    1436              self.assertRaises(TypeError, self.set.union, self.other)
    1437  
    1438      def test_intersection_update_operator(self):
    1439          try:
    1440              self.set &= self.other
    1441          except TypeError:
    1442              pass
    1443          else:
    1444              self.fail("expected TypeError")
    1445  
    1446      def test_intersection_update(self):
    1447          if self.otherIsIterable:
    1448              self.set.intersection_update(self.other)
    1449          else:
    1450              self.assertRaises(TypeError,
    1451                                self.set.intersection_update,
    1452                                self.other)
    1453  
    1454      def test_intersection(self):
    1455          self.assertRaises(TypeError, lambda: self.set & self.other)
    1456          self.assertRaises(TypeError, lambda: self.other & self.set)
    1457          if self.otherIsIterable:
    1458              self.set.intersection(self.other)
    1459          else:
    1460              self.assertRaises(TypeError, self.set.intersection, self.other)
    1461  
    1462      def test_sym_difference_update_operator(self):
    1463          try:
    1464              self.set ^= self.other
    1465          except TypeError:
    1466              pass
    1467          else:
    1468              self.fail("expected TypeError")
    1469  
    1470      def test_sym_difference_update(self):
    1471          if self.otherIsIterable:
    1472              self.set.symmetric_difference_update(self.other)
    1473          else:
    1474              self.assertRaises(TypeError,
    1475                                self.set.symmetric_difference_update,
    1476                                self.other)
    1477  
    1478      def test_sym_difference(self):
    1479          self.assertRaises(TypeError, lambda: self.set ^ self.other)
    1480          self.assertRaises(TypeError, lambda: self.other ^ self.set)
    1481          if self.otherIsIterable:
    1482              self.set.symmetric_difference(self.other)
    1483          else:
    1484              self.assertRaises(TypeError, self.set.symmetric_difference, self.other)
    1485  
    1486      def test_difference_update_operator(self):
    1487          try:
    1488              self.set -= self.other
    1489          except TypeError:
    1490              pass
    1491          else:
    1492              self.fail("expected TypeError")
    1493  
    1494      def test_difference_update(self):
    1495          if self.otherIsIterable:
    1496              self.set.difference_update(self.other)
    1497          else:
    1498              self.assertRaises(TypeError,
    1499                                self.set.difference_update,
    1500                                self.other)
    1501  
    1502      def test_difference(self):
    1503          self.assertRaises(TypeError, lambda: self.set - self.other)
    1504          self.assertRaises(TypeError, lambda: self.other - self.set)
    1505          if self.otherIsIterable:
    1506              self.set.difference(self.other)
    1507          else:
    1508              self.assertRaises(TypeError, self.set.difference, self.other)
    1509  
    1510  #------------------------------------------------------------------------------
    1511  
    1512  class ESC[4;38;5;81mTestOnlySetsNumeric(ESC[4;38;5;149mTestOnlySetsInBinaryOps, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1513      def setUp(self):
    1514          self.set   = set((1, 2, 3))
    1515          self.other = 19
    1516          self.otherIsIterable = False
    1517  
    1518  #------------------------------------------------------------------------------
    1519  
    1520  class ESC[4;38;5;81mTestOnlySetsDict(ESC[4;38;5;149mTestOnlySetsInBinaryOps, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1521      def setUp(self):
    1522          self.set   = set((1, 2, 3))
    1523          self.other = {1:2, 3:4}
    1524          self.otherIsIterable = True
    1525  
    1526  #------------------------------------------------------------------------------
    1527  
    1528  class ESC[4;38;5;81mTestOnlySetsOperator(ESC[4;38;5;149mTestOnlySetsInBinaryOps, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1529      def setUp(self):
    1530          self.set   = set((1, 2, 3))
    1531          self.other = operator.add
    1532          self.otherIsIterable = False
    1533  
    1534  #------------------------------------------------------------------------------
    1535  
    1536  class ESC[4;38;5;81mTestOnlySetsTuple(ESC[4;38;5;149mTestOnlySetsInBinaryOps, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1537      def setUp(self):
    1538          self.set   = set((1, 2, 3))
    1539          self.other = (2, 4, 6)
    1540          self.otherIsIterable = True
    1541  
    1542  #------------------------------------------------------------------------------
    1543  
    1544  class ESC[4;38;5;81mTestOnlySetsString(ESC[4;38;5;149mTestOnlySetsInBinaryOps, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1545      def setUp(self):
    1546          self.set   = set((1, 2, 3))
    1547          self.other = 'abc'
    1548          self.otherIsIterable = True
    1549  
    1550  #------------------------------------------------------------------------------
    1551  
    1552  class ESC[4;38;5;81mTestOnlySetsGenerator(ESC[4;38;5;149mTestOnlySetsInBinaryOps, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1553      def setUp(self):
    1554          def gen():
    1555              for i in range(0, 10, 2):
    1556                  yield i
    1557          self.set   = set((1, 2, 3))
    1558          self.other = gen()
    1559          self.otherIsIterable = True
    1560  
    1561  #==============================================================================
    1562  
    1563  class ESC[4;38;5;81mTestCopying:
    1564  
    1565      def test_copy(self):
    1566          dup = self.set.copy()
    1567          dup_list = sorted(dup, key=repr)
    1568          set_list = sorted(self.set, key=repr)
    1569          self.assertEqual(len(dup_list), len(set_list))
    1570          for i in range(len(dup_list)):
    1571              self.assertTrue(dup_list[i] is set_list[i])
    1572  
    1573      def test_deep_copy(self):
    1574          dup = copy.deepcopy(self.set)
    1575          ##print type(dup), repr(dup)
    1576          dup_list = sorted(dup, key=repr)
    1577          set_list = sorted(self.set, key=repr)
    1578          self.assertEqual(len(dup_list), len(set_list))
    1579          for i in range(len(dup_list)):
    1580              self.assertEqual(dup_list[i], set_list[i])
    1581  
    1582  #------------------------------------------------------------------------------
    1583  
    1584  class ESC[4;38;5;81mTestCopyingEmpty(ESC[4;38;5;149mTestCopying, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1585      def setUp(self):
    1586          self.set = set()
    1587  
    1588  #------------------------------------------------------------------------------
    1589  
    1590  class ESC[4;38;5;81mTestCopyingSingleton(ESC[4;38;5;149mTestCopying, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1591      def setUp(self):
    1592          self.set = set(["hello"])
    1593  
    1594  #------------------------------------------------------------------------------
    1595  
    1596  class ESC[4;38;5;81mTestCopyingTriple(ESC[4;38;5;149mTestCopying, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1597      def setUp(self):
    1598          self.set = set(["zero", 0, None])
    1599  
    1600  #------------------------------------------------------------------------------
    1601  
    1602  class ESC[4;38;5;81mTestCopyingTuple(ESC[4;38;5;149mTestCopying, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1603      def setUp(self):
    1604          self.set = set([(1, 2)])
    1605  
    1606  #------------------------------------------------------------------------------
    1607  
    1608  class ESC[4;38;5;81mTestCopyingNested(ESC[4;38;5;149mTestCopying, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1609      def setUp(self):
    1610          self.set = set([((1, 2), (3, 4))])
    1611  
    1612  #==============================================================================
    1613  
    1614  class ESC[4;38;5;81mTestIdentities(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1615      def setUp(self):
    1616          self.a = set('abracadabra')
    1617          self.b = set('alacazam')
    1618  
    1619      def test_binopsVsSubsets(self):
    1620          a, b = self.a, self.b
    1621          self.assertTrue(a - b < a)
    1622          self.assertTrue(b - a < b)
    1623          self.assertTrue(a & b < a)
    1624          self.assertTrue(a & b < b)
    1625          self.assertTrue(a | b > a)
    1626          self.assertTrue(a | b > b)
    1627          self.assertTrue(a ^ b < a | b)
    1628  
    1629      def test_commutativity(self):
    1630          a, b = self.a, self.b
    1631          self.assertEqual(a&b, b&a)
    1632          self.assertEqual(a|b, b|a)
    1633          self.assertEqual(a^b, b^a)
    1634          if a != b:
    1635              self.assertNotEqual(a-b, b-a)
    1636  
    1637      def test_summations(self):
    1638          # check that sums of parts equal the whole
    1639          a, b = self.a, self.b
    1640          self.assertEqual((a-b)|(a&b)|(b-a), a|b)
    1641          self.assertEqual((a&b)|(a^b), a|b)
    1642          self.assertEqual(a|(b-a), a|b)
    1643          self.assertEqual((a-b)|b, a|b)
    1644          self.assertEqual((a-b)|(a&b), a)
    1645          self.assertEqual((b-a)|(a&b), b)
    1646          self.assertEqual((a-b)|(b-a), a^b)
    1647  
    1648      def test_exclusion(self):
    1649          # check that inverse operations show non-overlap
    1650          a, b, zero = self.a, self.b, set()
    1651          self.assertEqual((a-b)&b, zero)
    1652          self.assertEqual((b-a)&a, zero)
    1653          self.assertEqual((a&b)&(a^b), zero)
    1654  
    1655  # Tests derived from test_itertools.py =======================================
    1656  
    1657  def R(seqn):
    1658      'Regular generator'
    1659      for i in seqn:
    1660          yield i
    1661  
    1662  class ESC[4;38;5;81mG:
    1663      'Sequence using __getitem__'
    1664      def __init__(self, seqn):
    1665          self.seqn = seqn
    1666      def __getitem__(self, i):
    1667          return self.seqn[i]
    1668  
    1669  class ESC[4;38;5;81mI:
    1670      'Sequence using iterator protocol'
    1671      def __init__(self, seqn):
    1672          self.seqn = seqn
    1673          self.i = 0
    1674      def __iter__(self):
    1675          return self
    1676      def __next__(self):
    1677          if self.i >= len(self.seqn): raise StopIteration
    1678          v = self.seqn[self.i]
    1679          self.i += 1
    1680          return v
    1681  
    1682  class ESC[4;38;5;81mIg:
    1683      'Sequence using iterator protocol defined with a generator'
    1684      def __init__(self, seqn):
    1685          self.seqn = seqn
    1686          self.i = 0
    1687      def __iter__(self):
    1688          for val in self.seqn:
    1689              yield val
    1690  
    1691  class ESC[4;38;5;81mX:
    1692      'Missing __getitem__ and __iter__'
    1693      def __init__(self, seqn):
    1694          self.seqn = seqn
    1695          self.i = 0
    1696      def __next__(self):
    1697          if self.i >= len(self.seqn): raise StopIteration
    1698          v = self.seqn[self.i]
    1699          self.i += 1
    1700          return v
    1701  
    1702  class ESC[4;38;5;81mN:
    1703      'Iterator missing __next__()'
    1704      def __init__(self, seqn):
    1705          self.seqn = seqn
    1706          self.i = 0
    1707      def __iter__(self):
    1708          return self
    1709  
    1710  class ESC[4;38;5;81mE:
    1711      'Test propagation of exceptions'
    1712      def __init__(self, seqn):
    1713          self.seqn = seqn
    1714          self.i = 0
    1715      def __iter__(self):
    1716          return self
    1717      def __next__(self):
    1718          3 // 0
    1719  
    1720  class ESC[4;38;5;81mS:
    1721      'Test immediate stop'
    1722      def __init__(self, seqn):
    1723          pass
    1724      def __iter__(self):
    1725          return self
    1726      def __next__(self):
    1727          raise StopIteration
    1728  
    1729  from itertools import chain
    1730  def L(seqn):
    1731      'Test multiple tiers of iterators'
    1732      return chain(map(lambda x:x, R(Ig(G(seqn)))))
    1733  
    1734  class ESC[4;38;5;81mTestVariousIteratorArgs(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1735  
    1736      def test_constructor(self):
    1737          for cons in (set, frozenset):
    1738              for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
    1739                  for g in (G, I, Ig, S, L, R):
    1740                      self.assertEqual(sorted(cons(g(s)), key=repr), sorted(g(s), key=repr))
    1741                  self.assertRaises(TypeError, cons , X(s))
    1742                  self.assertRaises(TypeError, cons , N(s))
    1743                  self.assertRaises(ZeroDivisionError, cons , E(s))
    1744  
    1745      def test_inline_methods(self):
    1746          s = set('november')
    1747          for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
    1748              for meth in (s.union, s.intersection, s.difference, s.symmetric_difference, s.isdisjoint):
    1749                  for g in (G, I, Ig, L, R):
    1750                      expected = meth(data)
    1751                      actual = meth(g(data))
    1752                      if isinstance(expected, bool):
    1753                          self.assertEqual(actual, expected)
    1754                      else:
    1755                          self.assertEqual(sorted(actual, key=repr), sorted(expected, key=repr))
    1756                  self.assertRaises(TypeError, meth, X(s))
    1757                  self.assertRaises(TypeError, meth, N(s))
    1758                  self.assertRaises(ZeroDivisionError, meth, E(s))
    1759  
    1760      def test_inplace_methods(self):
    1761          for data in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5), 'december'):
    1762              for methname in ('update', 'intersection_update',
    1763                               'difference_update', 'symmetric_difference_update'):
    1764                  for g in (G, I, Ig, S, L, R):
    1765                      s = set('january')
    1766                      t = s.copy()
    1767                      getattr(s, methname)(list(g(data)))
    1768                      getattr(t, methname)(g(data))
    1769                      self.assertEqual(sorted(s, key=repr), sorted(t, key=repr))
    1770  
    1771                  self.assertRaises(TypeError, getattr(set('january'), methname), X(data))
    1772                  self.assertRaises(TypeError, getattr(set('january'), methname), N(data))
    1773                  self.assertRaises(ZeroDivisionError, getattr(set('january'), methname), E(data))
    1774  
    1775  class ESC[4;38;5;81mbad_eq:
    1776      def __eq__(self, other):
    1777          if be_bad:
    1778              set2.clear()
    1779              raise ZeroDivisionError
    1780          return self is other
    1781      def __hash__(self):
    1782          return 0
    1783  
    1784  class ESC[4;38;5;81mbad_dict_clear:
    1785      def __eq__(self, other):
    1786          if be_bad:
    1787              dict2.clear()
    1788          return self is other
    1789      def __hash__(self):
    1790          return 0
    1791  
    1792  class ESC[4;38;5;81mTestWeirdBugs(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1793      def test_8420_set_merge(self):
    1794          # This used to segfault
    1795          global be_bad, set2, dict2
    1796          be_bad = False
    1797          set1 = {bad_eq()}
    1798          set2 = {bad_eq() for i in range(75)}
    1799          be_bad = True
    1800          self.assertRaises(ZeroDivisionError, set1.update, set2)
    1801  
    1802          be_bad = False
    1803          set1 = {bad_dict_clear()}
    1804          dict2 = {bad_dict_clear(): None}
    1805          be_bad = True
    1806          set1.symmetric_difference_update(dict2)
    1807  
    1808      def test_iter_and_mutate(self):
    1809          # Issue #24581
    1810          s = set(range(100))
    1811          s.clear()
    1812          s.update(range(100))
    1813          si = iter(s)
    1814          s.clear()
    1815          a = list(range(100))
    1816          s.update(range(100))
    1817          list(si)
    1818  
    1819      def test_merge_and_mutate(self):
    1820          class ESC[4;38;5;81mX:
    1821              def __hash__(self):
    1822                  return hash(0)
    1823              def __eq__(self, o):
    1824                  other.clear()
    1825                  return False
    1826  
    1827          other = set()
    1828          other = {X() for i in range(10)}
    1829          s = {0}
    1830          s.update(other)
    1831  
    1832  
    1833  class ESC[4;38;5;81mTestOperationsMutating:
    1834      """Regression test for bpo-46615"""
    1835  
    1836      constructor1 = None
    1837      constructor2 = None
    1838  
    1839      def make_sets_of_bad_objects(self):
    1840          class ESC[4;38;5;81mBad:
    1841              def __eq__(self, other):
    1842                  if not enabled:
    1843                      return False
    1844                  if randrange(20) == 0:
    1845                      set1.clear()
    1846                  if randrange(20) == 0:
    1847                      set2.clear()
    1848                  return bool(randrange(2))
    1849              def __hash__(self):
    1850                  return randrange(2)
    1851          # Don't behave poorly during construction.
    1852          enabled = False
    1853          set1 = self.constructor1(Bad() for _ in range(randrange(50)))
    1854          set2 = self.constructor2(Bad() for _ in range(randrange(50)))
    1855          # Now start behaving poorly
    1856          enabled = True
    1857          return set1, set2
    1858  
    1859      def check_set_op_does_not_crash(self, function):
    1860          for _ in range(100):
    1861              set1, set2 = self.make_sets_of_bad_objects()
    1862              try:
    1863                  function(set1, set2)
    1864              except RuntimeError as e:
    1865                  # Just make sure we don't crash here.
    1866                  self.assertIn("changed size during iteration", str(e))
    1867  
    1868  
    1869  class ESC[4;38;5;81mTestBinaryOpsMutating(ESC[4;38;5;149mTestOperationsMutating):
    1870  
    1871      def test_eq_with_mutation(self):
    1872          self.check_set_op_does_not_crash(lambda a, b: a == b)
    1873  
    1874      def test_ne_with_mutation(self):
    1875          self.check_set_op_does_not_crash(lambda a, b: a != b)
    1876  
    1877      def test_lt_with_mutation(self):
    1878          self.check_set_op_does_not_crash(lambda a, b: a < b)
    1879  
    1880      def test_le_with_mutation(self):
    1881          self.check_set_op_does_not_crash(lambda a, b: a <= b)
    1882  
    1883      def test_gt_with_mutation(self):
    1884          self.check_set_op_does_not_crash(lambda a, b: a > b)
    1885  
    1886      def test_ge_with_mutation(self):
    1887          self.check_set_op_does_not_crash(lambda a, b: a >= b)
    1888  
    1889      def test_and_with_mutation(self):
    1890          self.check_set_op_does_not_crash(lambda a, b: a & b)
    1891  
    1892      def test_or_with_mutation(self):
    1893          self.check_set_op_does_not_crash(lambda a, b: a | b)
    1894  
    1895      def test_sub_with_mutation(self):
    1896          self.check_set_op_does_not_crash(lambda a, b: a - b)
    1897  
    1898      def test_xor_with_mutation(self):
    1899          self.check_set_op_does_not_crash(lambda a, b: a ^ b)
    1900  
    1901      def test_iadd_with_mutation(self):
    1902          def f(a, b):
    1903              a &= b
    1904          self.check_set_op_does_not_crash(f)
    1905  
    1906      def test_ior_with_mutation(self):
    1907          def f(a, b):
    1908              a |= b
    1909          self.check_set_op_does_not_crash(f)
    1910  
    1911      def test_isub_with_mutation(self):
    1912          def f(a, b):
    1913              a -= b
    1914          self.check_set_op_does_not_crash(f)
    1915  
    1916      def test_ixor_with_mutation(self):
    1917          def f(a, b):
    1918              a ^= b
    1919          self.check_set_op_does_not_crash(f)
    1920  
    1921      def test_iteration_with_mutation(self):
    1922          def f1(a, b):
    1923              for x in a:
    1924                  pass
    1925              for y in b:
    1926                  pass
    1927          def f2(a, b):
    1928              for y in b:
    1929                  pass
    1930              for x in a:
    1931                  pass
    1932          def f3(a, b):
    1933              for x, y in zip(a, b):
    1934                  pass
    1935          self.check_set_op_does_not_crash(f1)
    1936          self.check_set_op_does_not_crash(f2)
    1937          self.check_set_op_does_not_crash(f3)
    1938  
    1939  
    1940  class ESC[4;38;5;81mTestBinaryOpsMutating_Set_Set(ESC[4;38;5;149mTestBinaryOpsMutating, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1941      constructor1 = set
    1942      constructor2 = set
    1943  
    1944  class ESC[4;38;5;81mTestBinaryOpsMutating_Subclass_Subclass(ESC[4;38;5;149mTestBinaryOpsMutating, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1945      constructor1 = SetSubclass
    1946      constructor2 = SetSubclass
    1947  
    1948  class ESC[4;38;5;81mTestBinaryOpsMutating_Set_Subclass(ESC[4;38;5;149mTestBinaryOpsMutating, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1949      constructor1 = set
    1950      constructor2 = SetSubclass
    1951  
    1952  class ESC[4;38;5;81mTestBinaryOpsMutating_Subclass_Set(ESC[4;38;5;149mTestBinaryOpsMutating, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1953      constructor1 = SetSubclass
    1954      constructor2 = set
    1955  
    1956  
    1957  class ESC[4;38;5;81mTestMethodsMutating(ESC[4;38;5;149mTestOperationsMutating):
    1958  
    1959      def test_issubset_with_mutation(self):
    1960          self.check_set_op_does_not_crash(set.issubset)
    1961  
    1962      def test_issuperset_with_mutation(self):
    1963          self.check_set_op_does_not_crash(set.issuperset)
    1964  
    1965      def test_intersection_with_mutation(self):
    1966          self.check_set_op_does_not_crash(set.intersection)
    1967  
    1968      def test_union_with_mutation(self):
    1969          self.check_set_op_does_not_crash(set.union)
    1970  
    1971      def test_difference_with_mutation(self):
    1972          self.check_set_op_does_not_crash(set.difference)
    1973  
    1974      def test_symmetric_difference_with_mutation(self):
    1975          self.check_set_op_does_not_crash(set.symmetric_difference)
    1976  
    1977      def test_isdisjoint_with_mutation(self):
    1978          self.check_set_op_does_not_crash(set.isdisjoint)
    1979  
    1980      def test_difference_update_with_mutation(self):
    1981          self.check_set_op_does_not_crash(set.difference_update)
    1982  
    1983      def test_intersection_update_with_mutation(self):
    1984          self.check_set_op_does_not_crash(set.intersection_update)
    1985  
    1986      def test_symmetric_difference_update_with_mutation(self):
    1987          self.check_set_op_does_not_crash(set.symmetric_difference_update)
    1988  
    1989      def test_update_with_mutation(self):
    1990          self.check_set_op_does_not_crash(set.update)
    1991  
    1992  
    1993  class ESC[4;38;5;81mTestMethodsMutating_Set_Set(ESC[4;38;5;149mTestMethodsMutating, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1994      constructor1 = set
    1995      constructor2 = set
    1996  
    1997  class ESC[4;38;5;81mTestMethodsMutating_Subclass_Subclass(ESC[4;38;5;149mTestMethodsMutating, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    1998      constructor1 = SetSubclass
    1999      constructor2 = SetSubclass
    2000  
    2001  class ESC[4;38;5;81mTestMethodsMutating_Set_Subclass(ESC[4;38;5;149mTestMethodsMutating, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    2002      constructor1 = set
    2003      constructor2 = SetSubclass
    2004  
    2005  class ESC[4;38;5;81mTestMethodsMutating_Subclass_Set(ESC[4;38;5;149mTestMethodsMutating, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    2006      constructor1 = SetSubclass
    2007      constructor2 = set
    2008  
    2009  class ESC[4;38;5;81mTestMethodsMutating_Set_Dict(ESC[4;38;5;149mTestMethodsMutating, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    2010      constructor1 = set
    2011      constructor2 = dict.fromkeys
    2012  
    2013  class ESC[4;38;5;81mTestMethodsMutating_Set_List(ESC[4;38;5;149mTestMethodsMutating, ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    2014      constructor1 = set
    2015      constructor2 = list
    2016  
    2017  
    2018  # Application tests (based on David Eppstein's graph recipes ====================================
    2019  
    2020  def powerset(U):
    2021      """Generates all subsets of a set or sequence U."""
    2022      U = iter(U)
    2023      try:
    2024          x = frozenset([next(U)])
    2025          for S in powerset(U):
    2026              yield S
    2027              yield S | x
    2028      except StopIteration:
    2029          yield frozenset()
    2030  
    2031  def cube(n):
    2032      """Graph of n-dimensional hypercube."""
    2033      singletons = [frozenset([x]) for x in range(n)]
    2034      return dict([(x, frozenset([x^s for s in singletons]))
    2035                   for x in powerset(range(n))])
    2036  
    2037  def linegraph(G):
    2038      """Graph, the vertices of which are edges of G,
    2039      with two vertices being adjacent iff the corresponding
    2040      edges share a vertex."""
    2041      L = {}
    2042      for x in G:
    2043          for y in G[x]:
    2044              nx = [frozenset([x,z]) for z in G[x] if z != y]
    2045              ny = [frozenset([y,z]) for z in G[y] if z != x]
    2046              L[frozenset([x,y])] = frozenset(nx+ny)
    2047      return L
    2048  
    2049  def faces(G):
    2050      'Return a set of faces in G.  Where a face is a set of vertices on that face'
    2051      # currently limited to triangles,squares, and pentagons
    2052      f = set()
    2053      for v1, edges in G.items():
    2054          for v2 in edges:
    2055              for v3 in G[v2]:
    2056                  if v1 == v3:
    2057                      continue
    2058                  if v1 in G[v3]:
    2059                      f.add(frozenset([v1, v2, v3]))
    2060                  else:
    2061                      for v4 in G[v3]:
    2062                          if v4 == v2:
    2063                              continue
    2064                          if v1 in G[v4]:
    2065                              f.add(frozenset([v1, v2, v3, v4]))
    2066                          else:
    2067                              for v5 in G[v4]:
    2068                                  if v5 == v3 or v5 == v2:
    2069                                      continue
    2070                                  if v1 in G[v5]:
    2071                                      f.add(frozenset([v1, v2, v3, v4, v5]))
    2072      return f
    2073  
    2074  
    2075  class ESC[4;38;5;81mTestGraphs(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
    2076  
    2077      def test_cube(self):
    2078  
    2079          g = cube(3)                             # vert --> {v1, v2, v3}
    2080          vertices1 = set(g)
    2081          self.assertEqual(len(vertices1), 8)     # eight vertices
    2082          for edge in g.values():
    2083              self.assertEqual(len(edge), 3)      # each vertex connects to three edges
    2084          vertices2 = set(v for edges in g.values() for v in edges)
    2085          self.assertEqual(vertices1, vertices2)  # edge vertices in original set
    2086  
    2087          cubefaces = faces(g)
    2088          self.assertEqual(len(cubefaces), 6)     # six faces
    2089          for face in cubefaces:
    2090              self.assertEqual(len(face), 4)      # each face is a square
    2091  
    2092      def test_cuboctahedron(self):
    2093  
    2094          # http://en.wikipedia.org/wiki/Cuboctahedron
    2095          # 8 triangular faces and 6 square faces
    2096          # 12 identical vertices each connecting a triangle and square
    2097  
    2098          g = cube(3)
    2099          cuboctahedron = linegraph(g)            # V( --> {V1, V2, V3, V4}
    2100          self.assertEqual(len(cuboctahedron), 12)# twelve vertices
    2101  
    2102          vertices = set(cuboctahedron)
    2103          for edges in cuboctahedron.values():
    2104              self.assertEqual(len(edges), 4)     # each vertex connects to four other vertices
    2105          othervertices = set(edge for edges in cuboctahedron.values() for edge in edges)
    2106          self.assertEqual(vertices, othervertices)   # edge vertices in original set
    2107  
    2108          cubofaces = faces(cuboctahedron)
    2109          facesizes = collections.defaultdict(int)
    2110          for face in cubofaces:
    2111              facesizes[len(face)] += 1
    2112          self.assertEqual(facesizes[3], 8)       # eight triangular faces
    2113          self.assertEqual(facesizes[4], 6)       # six square faces
    2114  
    2115          for vertex in cuboctahedron:
    2116              edge = vertex                       # Cuboctahedron vertices are edges in Cube
    2117              self.assertEqual(len(edge), 2)      # Two cube vertices define an edge
    2118              for cubevert in edge:
    2119                  self.assertIn(cubevert, g)
    2120  
    2121  
    2122  #==============================================================================
    2123  
    2124  if __name__ == "__main__":
    2125      unittest.main()