def test_dict_access_and_mod(self): """ Test num dict access and modification """ # dicts for testing dict_0 = {} # Empty dictionary dict_1 = {1: 'Elephant'} # Single numeric key dict_2 = {1: 'Elephant', 2: 'Mouse'} # Multiple numeric keys # Construct NumDicts from dicts num_dict_0 = NumDict() num_dict_1 = NumDict(dict_1) num_dict_2 = NumDict(dict_2) # test __getitem__ self.assertEqual(num_dict_2[1], 'Elephant') with self.assertRaises(KeyError): _ = num_dict_1['Mouse'] # key is not numeric with self.assertRaises(KeyError): _ = num_dict_1.__getitem__('Mouse') # key is not numeric with self.assertRaises(KeyError): _ = num_dict_1[None] # key does not exist with self.assertRaises(KeyError): _ = num_dict_1.__getitem__(None) # key does not exist # Test __setitem__ num_dict_3 = NumDict(num_dict_2) self.assertEqual(num_dict_2, num_dict_3) num_dict_3[2] = 'Frog' self.assertNotEqual(num_dict_2, num_dict_3) # Check None keys and numeric key conversion num_dict_3['3'] = 'Armadillo' num_dict_3[None] = 'Cockroach' # Check long ints num_dict_3[12390809518259081208909880312] = 'Squid' num_dict_3['12390809518259081208909880312'] = 'Octopus' self.assertEqual(num_dict_3[12390809518259081208909880312], 'Octopus') with self.assertRaises(TypeError): num_dict_3.__setitem__('Gorilla', 1) # key is not numeric with self.assertRaises(TypeError): num_dict_3['Chimpanzee'] = 1 # key is not numeric with self.assertRaises(TypeError): num_dict_3[(4, 1)] = 1 # key is not numeric with self.assertRaises(TypeError): num_dict_3[[1, 3, 4]] = 1 # key is not numeric and is not hashable # Test __delitem__ del num_dict_3[3] del num_dict_3[None] with self.assertRaises(KeyError): del num_dict_3[3] # already deleted with self.assertRaises(KeyError): num_dict_3.__delitem__(3) # already deleted with self.assertRaises(KeyError): del num_dict_3[ 'Mouse'] # key would not exist, since it is not numeric # Test clear num_dict_3.clear() self.assertEqual(num_dict_3, {}) # Test copy() num_dict_2a = dict_2.copy() self.assertEqual(num_dict_2, num_dict_2a) num_dict_2b = num_dict_2.copy() self.assertEqual(num_dict_2b, num_dict_2) num_dict_2c = UserDict({1: 'Elephant', 2: 'Mouse'}) num_dict_2d = num_dict_2c.copy( ) # making a copy of a UserDict is special cased self.assertEqual(num_dict_2c, num_dict_2d) class MyNumDict(NumDict): """ subclass Numdict for testing """ def display(self): """ add a method to subclass to differentiate from superclass """ print('MyNumDict:', self) my_num_dict = MyNumDict(num_dict_2) my_num_dict_a = my_num_dict.copy() self.assertEqual(my_num_dict_a, my_num_dict) my_num_dict[1] = 'Frog' self.assertNotEqual(my_num_dict_a, my_num_dict) # Test keys, items, values self.assertEqual(sorted(six.iterkeys(num_dict_2)), sorted(six.iterkeys(dict_2))) self.assertEqual(sorted(six.iteritems(num_dict_2)), sorted(six.iteritems(dict_2))) self.assertEqual(sorted(six.itervalues(num_dict_2)), sorted(six.itervalues(dict_2))) # Test "in". for i in num_dict_2: self.assertIn(i, num_dict_2) self.assertEqual(i in num_dict_1, i in dict_1) self.assertEqual(i in num_dict_0, i in dict_0) self.assertFalse(None in num_dict_2) self.assertEqual(None in num_dict_2, None in dict_2) dict_2[None] = 'Cow' num_dict_2[None] = dict_2[None] self.assertTrue(None in num_dict_2) self.assertEqual(None in num_dict_2, None in dict_2) self.assertFalse('Penguin' in num_dict_2) # Test update test = NumDict() test.update(dict_2) self.assertEqual(test, num_dict_2) # Test get for i in num_dict_2: self.assertEqual(num_dict_2.get(i), num_dict_2[i]) self.assertEqual(num_dict_1.get(i), dict_1.get(i)) self.assertEqual(num_dict_0.get(i), dict_0.get(i)) for i in ['purple', None, 12312301924091284, 23]: self.assertEqual(num_dict_2.get(i), dict_2.get(i), i) with self.assertRaises(AssertionError): i = '1' self.assertEqual( num_dict_2.get(i), dict_2.get(i), i) # dict_2 expects string key which does not exist # Test "in" iteration. num_dict_2b = num_dict_2 for i in range(20): num_dict_2[i] = six.text_type(i) num_dict_2b[six.text_type(i)] = six.text_type(i) self.assertEqual(num_dict_2, num_dict_2b) ikeys = [] for k in num_dict_2: ikeys.append(k) self.assertEqual(set(ikeys), set(num_dict_2.keys())) # Test setdefault val = 1 test = NumDict() self.assertEqual(test.setdefault(val, 42), 42) self.assertEqual(test.setdefault(val, '42'), 42) self.assertNotEqual(test.setdefault(val, 42), '42') self.assertNotEqual(test.setdefault(val, '42'), '42') self.assertIn(val, test) self.assertEqual(test.setdefault(val, 23), 42) self.assertEqual(test.setdefault(val, '23'), 42) self.assertNotEqual(test.setdefault(val, 23), '42') self.assertNotEqual(test.setdefault(val, '23'), '42') self.assertIn(val, test) # Test pop val = 1 test = NumDict({val: 42}) self.assertEqual(test.pop(val), 42) self.assertRaises(KeyError, test.pop, val) self.assertEqual(test.pop(val, 1), 1) test[val] = 42 self.assertEqual(test.pop(val, 1), 42) # Test popitem val = 1 test = NumDict({val: 42}) self.assertEqual(test.popitem(), (val, 42)) self.assertRaises(KeyError, test.popitem)
def test_dict_access_and_mod(self): # pylint: disable=too-many-locals, too-many-statements """ Test num dict access and modification """ # dicts for testing dict_0 = {} # Empty dictionary dict_1 = {1: 'Elephant'} # Single numeric key dict_2 = {1: 'Elephant', 2: 'Mouse'} # Multiple numeric keys # Construct NumDicts from dicts num_dict_0 = NumDict() num_dict_1 = NumDict(dict_1) num_dict_2 = NumDict(dict_2) # test __getitem__ self.assertEqual(num_dict_2[1], 'Elephant') with self.assertRaises(KeyError): _ = num_dict_1['Mouse'] # key is not numeric with self.assertRaises(KeyError): _ = num_dict_1.__getitem__('Mouse') # key is not numeric with self.assertRaises(KeyError): _ = num_dict_1[None] # key does not exist with self.assertRaises(KeyError): _ = num_dict_1.__getitem__(None) # key does not exist # Test __setitem__ num_dict_3 = NumDict(num_dict_2) self.assertEqual(num_dict_2, num_dict_3) num_dict_3[2] = 'Frog' self.assertNotEqual(num_dict_2, num_dict_3) # Check None keys and numeric key conversion num_dict_3['3'] = 'Armadillo' num_dict_3[None] = 'Cockroach' # Check long ints num_dict_3[12390809518259081208909880312] = 'Squid' num_dict_3['12390809518259081208909880312'] = 'Octopus' self.assertEqual(num_dict_3[12390809518259081208909880312], 'Octopus') with self.assertRaises(TypeError): num_dict_3.__setitem__('Gorilla', 1) # key is not numeric with self.assertRaises(TypeError): num_dict_3['Chimpanzee'] = 1 # key is not numeric with self.assertRaises(TypeError): num_dict_3[(4, 1)] = 1 # key is not numeric with self.assertRaises(TypeError): num_dict_3[[1, 3, 4]] = 1 # key is not numeric and is not hashable # Test __delitem__ del num_dict_3[3] del num_dict_3[None] with self.assertRaises(KeyError): del num_dict_3[3] # already deleted with self.assertRaises(KeyError): num_dict_3.__delitem__(3) # already deleted with self.assertRaises(KeyError): del num_dict_3['Mouse'] # key would not exist, since it is not numeric # Test clear num_dict_3.clear() self.assertEqual(num_dict_3, {}) # Test copy() num_dict_2a = dict_2.copy() self.assertEqual(num_dict_2, num_dict_2a) num_dict_2b = num_dict_2.copy() self.assertEqual(num_dict_2b, num_dict_2) num_dict_2c = UserDict({1: 'Elephant', 2: 'Mouse'}) num_dict_2d = num_dict_2c.copy() # making a copy of a UserDict is special cased self.assertEqual(num_dict_2c, num_dict_2d) class MyNumDict(NumDict): """ subclass Numdict for testing """ def display(self): """ add a method to subclass to differentiate from superclass """ print('MyNumDict:', self) my_num_dict = MyNumDict(num_dict_2) my_num_dict_a = my_num_dict.copy() self.assertEqual(my_num_dict_a, my_num_dict) my_num_dict[1] = 'Frog' self.assertNotEqual(my_num_dict_a, my_num_dict) # Test keys, items, values self.assertEqual(sorted(six.iterkeys(num_dict_2)), sorted(six.iterkeys(dict_2))) self.assertEqual(sorted(six.iteritems(num_dict_2)), sorted(six.iteritems(dict_2))) self.assertEqual(sorted(six.itervalues(num_dict_2)), sorted(six.itervalues(dict_2))) # Test "in". for i in num_dict_2: self.assertIn(i, num_dict_2) self.assertEqual(i in num_dict_1, i in dict_1) self.assertEqual(i in num_dict_0, i in dict_0) self.assertFalse(None in num_dict_2) self.assertEqual(None in num_dict_2, None in dict_2) dict_2[None] = 'Cow' num_dict_2[None] = dict_2[None] self.assertTrue(None in num_dict_2) self.assertEqual(None in num_dict_2, None in dict_2) self.assertFalse('Penguin' in num_dict_2) # Test update test = NumDict() test.update(dict_2) self.assertEqual(test, num_dict_2) # Test get for i in num_dict_2: self.assertEqual(num_dict_2.get(i), num_dict_2[i]) self.assertEqual(num_dict_1.get(i), dict_1.get(i)) self.assertEqual(num_dict_0.get(i), dict_0.get(i)) for i in ['purple', None, 12312301924091284, 23]: self.assertEqual(num_dict_2.get(i), dict_2.get(i), i) with self.assertRaises(AssertionError): i = '1' self.assertEqual(num_dict_2.get(i), dict_2.get(i), i) # dict_2 expects string key which does not exist # Test "in" iteration. num_dict_2b = num_dict_2 for i in range(20): num_dict_2[i] = six.text_type(i) num_dict_2b[six.text_type(i)] = six.text_type(i) self.assertEqual(num_dict_2, num_dict_2b) ikeys = [] for k in num_dict_2: ikeys.append(k) self.assertEqual(set(ikeys), set(num_dict_2.keys())) # Test setdefault val = 1 test = NumDict() self.assertEqual(test.setdefault(val, 42), 42) self.assertEqual(test.setdefault(val, '42'), 42) self.assertNotEqual(test.setdefault(val, 42), '42') self.assertNotEqual(test.setdefault(val, '42'), '42') self.assertIn(val, test) self.assertEqual(test.setdefault(val, 23), 42) self.assertEqual(test.setdefault(val, '23'), 42) self.assertNotEqual(test.setdefault(val, 23), '42') self.assertNotEqual(test.setdefault(val, '23'), '42') self.assertIn(val, test) # Test pop val = 1 test = NumDict({val: 42}) self.assertEqual(test.pop(val), 42) self.assertRaises(KeyError, test.pop, val) self.assertEqual(test.pop(val, 1), 1) test[val] = 42 self.assertEqual(test.pop(val, 1), 42) # Test popitem val = 1 test = NumDict({val: 42}) self.assertEqual(test.popitem(), (val, 42)) self.assertRaises(KeyError, test.popitem)
def copy(self): c = UserDict.copy(self) c._lazy_keys = self._lazy_keys[:] return c