17db96d56Sopenharmony_ci# Check every path through every method of UserDict 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_cifrom test import mapping_tests 47db96d56Sopenharmony_ciimport unittest 57db96d56Sopenharmony_ciimport collections 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_cid0 = {} 87db96d56Sopenharmony_cid1 = {"one": 1} 97db96d56Sopenharmony_cid2 = {"one": 1, "two": 2} 107db96d56Sopenharmony_cid3 = {"one": 1, "two": 3, "three": 5} 117db96d56Sopenharmony_cid4 = {"one": None, "two": None} 127db96d56Sopenharmony_cid5 = {"one": 1, "two": 1} 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ciclass UserDictTest(mapping_tests.TestHashMappingProtocol): 157db96d56Sopenharmony_ci type2test = collections.UserDict 167db96d56Sopenharmony_ci 177db96d56Sopenharmony_ci def test_all(self): 187db96d56Sopenharmony_ci # Test constructors 197db96d56Sopenharmony_ci u = collections.UserDict() 207db96d56Sopenharmony_ci u0 = collections.UserDict(d0) 217db96d56Sopenharmony_ci u1 = collections.UserDict(d1) 227db96d56Sopenharmony_ci u2 = collections.UserDict(d2) 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_ci uu = collections.UserDict(u) 257db96d56Sopenharmony_ci uu0 = collections.UserDict(u0) 267db96d56Sopenharmony_ci uu1 = collections.UserDict(u1) 277db96d56Sopenharmony_ci uu2 = collections.UserDict(u2) 287db96d56Sopenharmony_ci 297db96d56Sopenharmony_ci # keyword arg constructor 307db96d56Sopenharmony_ci self.assertEqual(collections.UserDict(one=1, two=2), d2) 317db96d56Sopenharmony_ci # item sequence constructor 327db96d56Sopenharmony_ci self.assertEqual(collections.UserDict([('one',1), ('two',2)]), d2) 337db96d56Sopenharmony_ci self.assertEqual(collections.UserDict(dict=[('one',1), ('two',2)]), 347db96d56Sopenharmony_ci {'dict': [('one', 1), ('two', 2)]}) 357db96d56Sopenharmony_ci # both together 367db96d56Sopenharmony_ci self.assertEqual(collections.UserDict([('one',1), ('two',2)], two=3, three=5), d3) 377db96d56Sopenharmony_ci 387db96d56Sopenharmony_ci # alternate constructor 397db96d56Sopenharmony_ci self.assertEqual(collections.UserDict.fromkeys('one two'.split()), d4) 407db96d56Sopenharmony_ci self.assertEqual(collections.UserDict().fromkeys('one two'.split()), d4) 417db96d56Sopenharmony_ci self.assertEqual(collections.UserDict.fromkeys('one two'.split(), 1), d5) 427db96d56Sopenharmony_ci self.assertEqual(collections.UserDict().fromkeys('one two'.split(), 1), d5) 437db96d56Sopenharmony_ci self.assertTrue(u1.fromkeys('one two'.split()) is not u1) 447db96d56Sopenharmony_ci self.assertIsInstance(u1.fromkeys('one two'.split()), collections.UserDict) 457db96d56Sopenharmony_ci self.assertIsInstance(u2.fromkeys('one two'.split()), collections.UserDict) 467db96d56Sopenharmony_ci 477db96d56Sopenharmony_ci # Test __repr__ 487db96d56Sopenharmony_ci self.assertEqual(str(u0), str(d0)) 497db96d56Sopenharmony_ci self.assertEqual(repr(u1), repr(d1)) 507db96d56Sopenharmony_ci self.assertIn(repr(u2), ("{'one': 1, 'two': 2}", 517db96d56Sopenharmony_ci "{'two': 2, 'one': 1}")) 527db96d56Sopenharmony_ci 537db96d56Sopenharmony_ci # Test rich comparison and __len__ 547db96d56Sopenharmony_ci all = [d0, d1, d2, u, u0, u1, u2, uu, uu0, uu1, uu2] 557db96d56Sopenharmony_ci for a in all: 567db96d56Sopenharmony_ci for b in all: 577db96d56Sopenharmony_ci self.assertEqual(a == b, len(a) == len(b)) 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ci # Test __getitem__ 607db96d56Sopenharmony_ci self.assertEqual(u2["one"], 1) 617db96d56Sopenharmony_ci self.assertRaises(KeyError, u1.__getitem__, "two") 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ci # Test __setitem__ 647db96d56Sopenharmony_ci u3 = collections.UserDict(u2) 657db96d56Sopenharmony_ci u3["two"] = 2 667db96d56Sopenharmony_ci u3["three"] = 3 677db96d56Sopenharmony_ci 687db96d56Sopenharmony_ci # Test __delitem__ 697db96d56Sopenharmony_ci del u3["three"] 707db96d56Sopenharmony_ci self.assertRaises(KeyError, u3.__delitem__, "three") 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_ci # Test clear 737db96d56Sopenharmony_ci u3.clear() 747db96d56Sopenharmony_ci self.assertEqual(u3, {}) 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci # Test copy() 777db96d56Sopenharmony_ci u2a = u2.copy() 787db96d56Sopenharmony_ci self.assertEqual(u2a, u2) 797db96d56Sopenharmony_ci u2b = collections.UserDict(x=42, y=23) 807db96d56Sopenharmony_ci u2c = u2b.copy() # making a copy of a UserDict is special cased 817db96d56Sopenharmony_ci self.assertEqual(u2b, u2c) 827db96d56Sopenharmony_ci 837db96d56Sopenharmony_ci class MyUserDict(collections.UserDict): 847db96d56Sopenharmony_ci def display(self): print(self) 857db96d56Sopenharmony_ci 867db96d56Sopenharmony_ci m2 = MyUserDict(u2) 877db96d56Sopenharmony_ci m2a = m2.copy() 887db96d56Sopenharmony_ci self.assertEqual(m2a, m2) 897db96d56Sopenharmony_ci 907db96d56Sopenharmony_ci # SF bug #476616 -- copy() of UserDict subclass shared data 917db96d56Sopenharmony_ci m2['foo'] = 'bar' 927db96d56Sopenharmony_ci self.assertNotEqual(m2a, m2) 937db96d56Sopenharmony_ci 947db96d56Sopenharmony_ci # Test keys, items, values 957db96d56Sopenharmony_ci self.assertEqual(sorted(u2.keys()), sorted(d2.keys())) 967db96d56Sopenharmony_ci self.assertEqual(sorted(u2.items()), sorted(d2.items())) 977db96d56Sopenharmony_ci self.assertEqual(sorted(u2.values()), sorted(d2.values())) 987db96d56Sopenharmony_ci 997db96d56Sopenharmony_ci # Test "in". 1007db96d56Sopenharmony_ci for i in u2.keys(): 1017db96d56Sopenharmony_ci self.assertIn(i, u2) 1027db96d56Sopenharmony_ci self.assertEqual(i in u1, i in d1) 1037db96d56Sopenharmony_ci self.assertEqual(i in u0, i in d0) 1047db96d56Sopenharmony_ci 1057db96d56Sopenharmony_ci # Test update 1067db96d56Sopenharmony_ci t = collections.UserDict() 1077db96d56Sopenharmony_ci t.update(u2) 1087db96d56Sopenharmony_ci self.assertEqual(t, u2) 1097db96d56Sopenharmony_ci 1107db96d56Sopenharmony_ci # Test get 1117db96d56Sopenharmony_ci for i in u2.keys(): 1127db96d56Sopenharmony_ci self.assertEqual(u2.get(i), u2[i]) 1137db96d56Sopenharmony_ci self.assertEqual(u1.get(i), d1.get(i)) 1147db96d56Sopenharmony_ci self.assertEqual(u0.get(i), d0.get(i)) 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci # Test "in" iteration. 1177db96d56Sopenharmony_ci for i in range(20): 1187db96d56Sopenharmony_ci u2[i] = str(i) 1197db96d56Sopenharmony_ci ikeys = [] 1207db96d56Sopenharmony_ci for k in u2: 1217db96d56Sopenharmony_ci ikeys.append(k) 1227db96d56Sopenharmony_ci keys = u2.keys() 1237db96d56Sopenharmony_ci self.assertEqual(set(ikeys), set(keys)) 1247db96d56Sopenharmony_ci 1257db96d56Sopenharmony_ci # Test setdefault 1267db96d56Sopenharmony_ci t = collections.UserDict() 1277db96d56Sopenharmony_ci self.assertEqual(t.setdefault("x", 42), 42) 1287db96d56Sopenharmony_ci self.assertIn("x", t) 1297db96d56Sopenharmony_ci self.assertEqual(t.setdefault("x", 23), 42) 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci # Test pop 1327db96d56Sopenharmony_ci t = collections.UserDict(x=42) 1337db96d56Sopenharmony_ci self.assertEqual(t.pop("x"), 42) 1347db96d56Sopenharmony_ci self.assertRaises(KeyError, t.pop, "x") 1357db96d56Sopenharmony_ci self.assertEqual(t.pop("x", 1), 1) 1367db96d56Sopenharmony_ci t["x"] = 42 1377db96d56Sopenharmony_ci self.assertEqual(t.pop("x", 1), 42) 1387db96d56Sopenharmony_ci 1397db96d56Sopenharmony_ci # Test popitem 1407db96d56Sopenharmony_ci t = collections.UserDict(x=42) 1417db96d56Sopenharmony_ci self.assertEqual(t.popitem(), ("x", 42)) 1427db96d56Sopenharmony_ci self.assertRaises(KeyError, t.popitem) 1437db96d56Sopenharmony_ci 1447db96d56Sopenharmony_ci def test_init(self): 1457db96d56Sopenharmony_ci for kw in 'self', 'other', 'iterable': 1467db96d56Sopenharmony_ci self.assertEqual(list(collections.UserDict(**{kw: 42}).items()), 1477db96d56Sopenharmony_ci [(kw, 42)]) 1487db96d56Sopenharmony_ci self.assertEqual(list(collections.UserDict({}, dict=42).items()), 1497db96d56Sopenharmony_ci [('dict', 42)]) 1507db96d56Sopenharmony_ci self.assertEqual(list(collections.UserDict({}, dict=None).items()), 1517db96d56Sopenharmony_ci [('dict', None)]) 1527db96d56Sopenharmony_ci self.assertEqual(list(collections.UserDict(dict={'a': 42}).items()), 1537db96d56Sopenharmony_ci [('dict', {'a': 42})]) 1547db96d56Sopenharmony_ci self.assertRaises(TypeError, collections.UserDict, 42) 1557db96d56Sopenharmony_ci self.assertRaises(TypeError, collections.UserDict, (), ()) 1567db96d56Sopenharmony_ci self.assertRaises(TypeError, collections.UserDict.__init__) 1577db96d56Sopenharmony_ci 1587db96d56Sopenharmony_ci def test_update(self): 1597db96d56Sopenharmony_ci for kw in 'self', 'dict', 'other', 'iterable': 1607db96d56Sopenharmony_ci d = collections.UserDict() 1617db96d56Sopenharmony_ci d.update(**{kw: 42}) 1627db96d56Sopenharmony_ci self.assertEqual(list(d.items()), [(kw, 42)]) 1637db96d56Sopenharmony_ci self.assertRaises(TypeError, collections.UserDict().update, 42) 1647db96d56Sopenharmony_ci self.assertRaises(TypeError, collections.UserDict().update, {}, {}) 1657db96d56Sopenharmony_ci self.assertRaises(TypeError, collections.UserDict.update) 1667db96d56Sopenharmony_ci 1677db96d56Sopenharmony_ci def test_missing(self): 1687db96d56Sopenharmony_ci # Make sure UserDict doesn't have a __missing__ method 1697db96d56Sopenharmony_ci self.assertEqual(hasattr(collections.UserDict, "__missing__"), False) 1707db96d56Sopenharmony_ci # Test several cases: 1717db96d56Sopenharmony_ci # (D) subclass defines __missing__ method returning a value 1727db96d56Sopenharmony_ci # (E) subclass defines __missing__ method raising RuntimeError 1737db96d56Sopenharmony_ci # (F) subclass sets __missing__ instance variable (no effect) 1747db96d56Sopenharmony_ci # (G) subclass doesn't define __missing__ at all 1757db96d56Sopenharmony_ci class D(collections.UserDict): 1767db96d56Sopenharmony_ci def __missing__(self, key): 1777db96d56Sopenharmony_ci return 42 1787db96d56Sopenharmony_ci d = D({1: 2, 3: 4}) 1797db96d56Sopenharmony_ci self.assertEqual(d[1], 2) 1807db96d56Sopenharmony_ci self.assertEqual(d[3], 4) 1817db96d56Sopenharmony_ci self.assertNotIn(2, d) 1827db96d56Sopenharmony_ci self.assertNotIn(2, d.keys()) 1837db96d56Sopenharmony_ci self.assertEqual(d[2], 42) 1847db96d56Sopenharmony_ci class E(collections.UserDict): 1857db96d56Sopenharmony_ci def __missing__(self, key): 1867db96d56Sopenharmony_ci raise RuntimeError(key) 1877db96d56Sopenharmony_ci e = E() 1887db96d56Sopenharmony_ci try: 1897db96d56Sopenharmony_ci e[42] 1907db96d56Sopenharmony_ci except RuntimeError as err: 1917db96d56Sopenharmony_ci self.assertEqual(err.args, (42,)) 1927db96d56Sopenharmony_ci else: 1937db96d56Sopenharmony_ci self.fail("e[42] didn't raise RuntimeError") 1947db96d56Sopenharmony_ci class F(collections.UserDict): 1957db96d56Sopenharmony_ci def __init__(self): 1967db96d56Sopenharmony_ci # An instance variable __missing__ should have no effect 1977db96d56Sopenharmony_ci self.__missing__ = lambda key: None 1987db96d56Sopenharmony_ci collections.UserDict.__init__(self) 1997db96d56Sopenharmony_ci f = F() 2007db96d56Sopenharmony_ci try: 2017db96d56Sopenharmony_ci f[42] 2027db96d56Sopenharmony_ci except KeyError as err: 2037db96d56Sopenharmony_ci self.assertEqual(err.args, (42,)) 2047db96d56Sopenharmony_ci else: 2057db96d56Sopenharmony_ci self.fail("f[42] didn't raise KeyError") 2067db96d56Sopenharmony_ci class G(collections.UserDict): 2077db96d56Sopenharmony_ci pass 2087db96d56Sopenharmony_ci g = G() 2097db96d56Sopenharmony_ci try: 2107db96d56Sopenharmony_ci g[42] 2117db96d56Sopenharmony_ci except KeyError as err: 2127db96d56Sopenharmony_ci self.assertEqual(err.args, (42,)) 2137db96d56Sopenharmony_ci else: 2147db96d56Sopenharmony_ci self.fail("g[42] didn't raise KeyError") 2157db96d56Sopenharmony_ci 2167db96d56Sopenharmony_ci 2177db96d56Sopenharmony_ci 2187db96d56Sopenharmony_ciif __name__ == "__main__": 2197db96d56Sopenharmony_ci unittest.main() 220