def test_mixed_insert_delete(self): # This is list of the numbers 0-255 randomized but in a reproducible # fashion. numbers = range(256) numbers.sort(key=lambda x: ( str(pi ** x).replace(".", "")[x % 5:x % 5 + 4])) x = RedBlackTree() for i in numbers: x[i] = i for i in xrange(256): self.assertEqual(x[i], i) # Make sure we get proper sublists. self.assertEquals(x.keys(start=250), [250, 251, 252, 253, 254, 255]) self.assertEquals(x.keys(start=3, reverse=True), [3, 2, 1, 0]) # Delete in a different random order numbers.sort(key=lambda x: ( str(e ** x).replace(".", "")[x % 5:x % 5 + 4])) for i in numbers: self.assertTrue(i in x) del x[i] self.assertFalse(i in x) return
def test_even_insert(self): x = RedBlackTree() keys = [0] values = [0] items = [(0, 0)] x[0] = 0 for key in xrange(1, 200): x[key] = key x[-key] = -key keys = [-key] + keys + [key] values = [-key] + values + [key] items = [(-key, -key)] + items + [(key, key)] self.assertEqual(x.keys(), keys) self.assertEqual(x.values(), values) self.assertEqual(x.items(), items) self.assertEqual(x.root.key, 0) # Replace some of the keys. for key in xrange(1, 200): x[key] = key + 1 self.assertEqual(x[key], key + 1) self.assertTrue(key in x) self.assertFalse(key + 1000 in x)
def test_update_items(self): class Dictish(object): def items(self): for x in ((0, 0), (1, 1), (2, 2)): yield x d = Dictish() x = RedBlackTree() x.update(d) self.assertTrue(0 in x) self.assertEqual(x[0], 0) self.assertTrue(1 in x) self.assertEqual(x[1], 1) self.assertTrue(2 in x) self.assertEqual(x[2], 2) self.assertEqual(repr(x), "{0: 0, 1: 1, 2: 2}")
def test_descending_insert(self): x = RedBlackTree() keys = [] values = [] items = [] root_keys = ([317] * 2 + [316] * 5 + [314] * 10 + [310] * 20 + [302] * 40 + [286] * 80 + [254] * 160) for key, root_key in zip(xrange(317, 0, -1), root_keys): value = -key x[key] = value keys = [key] + keys values = [value] + values items = [(key, value)] + items self.assertEqual(x.keys(), keys) self.assertEqual(x.values(), values) self.assertEqual(x.items(), items) self.assertEqual(x.root.key, root_key)
def test_ascending_insert(self): x = RedBlackTree() keys = [] values = [] items = [] root_keys = ([1] * 2 + [2] * 5 + [4] * 10 + [8] * 20 + [16] * 40 + [32] * 80 + [64] * 160) for key, root_key in zip(xrange(1, 318), root_keys): value = -key x[key] = value keys.append(key) values.append(value) items.append((key, value)) self.assertEqual(x.keys(), keys) self.assertEqual(x.values(), values) self.assertEqual(x.items(), items) self.assertEqual(x.root.key, root_key)
def test_min_max_del(self): x = RedBlackTree() self.assertIsNone(x.min()) self.assertIsNone(x.max()) for value in xrange(0, 32, 2): x[value] = value try: ignored = x[1] self.fail("Expected KeyError") except KeyError: pass self.assertEqual(x.min(), (0, 0)) self.assertEqual(x.max(), (30, 30)) self.assertEqual(x.min(15), (14, 14)) self.assertEqual(x.max(15), (16, 16)) self.assertEqual(x.min(16), (16, 16)) self.assertEqual(x.max(16), (16, 16)) self.assertIsNone(x.min(-20)) self.assertIsNone(x.max(40)) del x[18] self.assertEqual(x.min(17), (16, 16)) self.assertEqual(x.max(17), (20, 20)) self.assertEqual(x.root.key, 6) del x[6] self.assertEqual(x.min(6), (4, 4)) self.assertEqual(x.max(6), (8, 8)) return