|
|
@@ -21,18 +21,21 @@ |
|
|
|
# SOFTWARE. |
|
|
|
|
|
|
|
from __future__ import unicode_literals |
|
|
|
|
|
|
|
import unittest |
|
|
|
|
|
|
|
from mwparserfromhell.compat import py3k, range |
|
|
|
from mwparserfromhell.smart_list import SmartList, _ListProxy |
|
|
|
|
|
|
|
|
|
|
|
class TestSmartList(unittest.TestCase): |
|
|
|
"""Test cases for the SmartList class and its child, _ListProxy.""" |
|
|
|
|
|
|
|
def _test_get_set_del_item(self, builder): |
|
|
|
def _test_get_set_del_item(self, builder, assertEqualIter): |
|
|
|
"""Run tests on __get/set/delitem__ of a list built with *builder*.""" |
|
|
|
def assign(L, s1, s2, s3, val): |
|
|
|
L[s1:s2:s3] = val |
|
|
|
|
|
|
|
def delete(L, s1): |
|
|
|
del L[s1] |
|
|
|
|
|
|
@@ -41,48 +44,48 @@ class TestSmartList(unittest.TestCase): |
|
|
|
|
|
|
|
self.assertEqual(1, list1[1]) |
|
|
|
self.assertEqual("one", list1[-2]) |
|
|
|
self.assertEqual([2, 3], list1[2:4]) |
|
|
|
assertEqualIter([2, 3], list1[2:4]) |
|
|
|
self.assertRaises(IndexError, lambda: list1[6]) |
|
|
|
self.assertRaises(IndexError, lambda: list1[-7]) |
|
|
|
|
|
|
|
self.assertEqual([0, 1, 2], list1[:3]) |
|
|
|
self.assertEqual([0, 1, 2, 3, "one", "two"], list1[:]) |
|
|
|
self.assertEqual([3, "one", "two"], list1[3:]) |
|
|
|
self.assertEqual([3, "one", "two"], list1[3:100]) |
|
|
|
self.assertEqual(["one", "two"], list1[-2:]) |
|
|
|
self.assertEqual([0, 1], list1[:-4]) |
|
|
|
self.assertEqual([], list1[6:]) |
|
|
|
self.assertEqual([], list1[4:2]) |
|
|
|
|
|
|
|
self.assertEqual([0, 2, "one"], list1[0:5:2]) |
|
|
|
self.assertEqual([0, 2], list1[0:-3:2]) |
|
|
|
self.assertEqual([0, 1, 2, 3, "one", "two"], list1[::]) |
|
|
|
self.assertEqual([2, 3, "one", "two"], list1[2::]) |
|
|
|
self.assertEqual([0, 1, 2, 3], list1[:4:]) |
|
|
|
self.assertEqual([2, 3], list1[2:4:]) |
|
|
|
self.assertEqual([0, 2, 4, 6, 8], list2[::2]) |
|
|
|
self.assertEqual([2, 5, 8], list2[2::3]) |
|
|
|
self.assertEqual([0, 3], list2[:6:3]) |
|
|
|
self.assertEqual([2, 5, 8], list2[-8:9:3]) |
|
|
|
self.assertEqual([], list2[100000:1000:-100]) |
|
|
|
assertEqualIter([0, 1, 2], list1[:3]) |
|
|
|
assertEqualIter([0, 1, 2, 3, "one", "two"], list1[:]) |
|
|
|
assertEqualIter([3, "one", "two"], list1[3:]) |
|
|
|
assertEqualIter([3, "one", "two"], list1[3:100]) |
|
|
|
assertEqualIter(["one", "two"], list1[-2:]) |
|
|
|
assertEqualIter([0, 1], list1[:-4]) |
|
|
|
assertEqualIter([], list1[6:]) |
|
|
|
assertEqualIter([], list1[4:2]) |
|
|
|
|
|
|
|
assertEqualIter([0, 2, "one"], list1[0:5:2]) |
|
|
|
assertEqualIter([0, 2], list1[0:-3:2]) |
|
|
|
assertEqualIter([0, 1, 2, 3, "one", "two"], list1[::]) |
|
|
|
assertEqualIter([2, 3, "one", "two"], list1[2::]) |
|
|
|
assertEqualIter([0, 1, 2, 3], list1[:4:]) |
|
|
|
assertEqualIter([2, 3], list1[2:4:]) |
|
|
|
assertEqualIter([0, 2, 4, 6, 8], list2[::2]) |
|
|
|
assertEqualIter([2, 5, 8], list2[2::3]) |
|
|
|
assertEqualIter([0, 3], list2[:6:3]) |
|
|
|
assertEqualIter([2, 5, 8], list2[-8:9:3]) |
|
|
|
assertEqualIter([], list2[100000:1000:-100]) |
|
|
|
|
|
|
|
list1[3] = 100 |
|
|
|
self.assertEqual(100, list1[3]) |
|
|
|
list1[-3] = 101 |
|
|
|
self.assertEqual([0, 1, 2, 101, "one", "two"], list1) |
|
|
|
assertEqualIter([0, 1, 2, 101, "one", "two"], list1) |
|
|
|
list1[5:] = [6, 7, 8] |
|
|
|
self.assertEqual([6, 7, 8], list1[5:]) |
|
|
|
self.assertEqual([0, 1, 2, 101, "one", 6, 7, 8], list1) |
|
|
|
assertEqualIter([6, 7, 8], list1[5:]) |
|
|
|
assertEqualIter([0, 1, 2, 101, "one", 6, 7, 8], list1) |
|
|
|
list1[2:4] = [-1, -2, -3, -4, -5] |
|
|
|
self.assertEqual([0, 1, -1, -2, -3, -4, -5, "one", 6, 7, 8], list1) |
|
|
|
assertEqualIter([0, 1, -1, -2, -3, -4, -5, "one", 6, 7, 8], list1) |
|
|
|
list1[0:-3] = [99] |
|
|
|
self.assertEqual([99, 6, 7, 8], list1) |
|
|
|
assertEqualIter([99, 6, 7, 8], list1) |
|
|
|
list2[0:6:2] = [100, 102, 104] |
|
|
|
self.assertEqual([100, 1, 102, 3, 104, 5, 6, 7, 8, 9], list2) |
|
|
|
assertEqualIter([100, 1, 102, 3, 104, 5, 6, 7, 8, 9], list2) |
|
|
|
list2[::3] = [200, 203, 206, 209] |
|
|
|
self.assertEqual([200, 1, 102, 203, 104, 5, 206, 7, 8, 209], list2) |
|
|
|
assertEqualIter([200, 1, 102, 203, 104, 5, 206, 7, 8, 209], list2) |
|
|
|
list2[::] = range(7) |
|
|
|
self.assertEqual([0, 1, 2, 3, 4, 5, 6], list2) |
|
|
|
assertEqualIter([0, 1, 2, 3, 4, 5, 6], list2) |
|
|
|
self.assertRaises(ValueError, assign, list2, 0, 5, 2, |
|
|
|
[100, 102, 104, 106]) |
|
|
|
with self.assertRaises(IndexError): |
|
|
@@ -91,35 +94,35 @@ class TestSmartList(unittest.TestCase): |
|
|
|
list2[-8] = "foo" |
|
|
|
|
|
|
|
del list2[2] |
|
|
|
self.assertEqual([0, 1, 3, 4, 5, 6], list2) |
|
|
|
assertEqualIter([0, 1, 3, 4, 5, 6], list2) |
|
|
|
del list2[-3] |
|
|
|
self.assertEqual([0, 1, 3, 5, 6], list2) |
|
|
|
assertEqualIter([0, 1, 3, 5, 6], list2) |
|
|
|
self.assertRaises(IndexError, delete, list2, 100) |
|
|
|
self.assertRaises(IndexError, delete, list2, -6) |
|
|
|
list2[:] = range(10) |
|
|
|
del list2[3:6] |
|
|
|
self.assertEqual([0, 1, 2, 6, 7, 8, 9], list2) |
|
|
|
assertEqualIter([0, 1, 2, 6, 7, 8, 9], list2) |
|
|
|
del list2[-2:] |
|
|
|
self.assertEqual([0, 1, 2, 6, 7], list2) |
|
|
|
assertEqualIter([0, 1, 2, 6, 7], list2) |
|
|
|
del list2[:2] |
|
|
|
self.assertEqual([2, 6, 7], list2) |
|
|
|
assertEqualIter([2, 6, 7], list2) |
|
|
|
list2[:] = range(10) |
|
|
|
del list2[2:8:2] |
|
|
|
self.assertEqual([0, 1, 3, 5, 7, 8, 9], list2) |
|
|
|
assertEqualIter([0, 1, 3, 5, 7, 8, 9], list2) |
|
|
|
|
|
|
|
def _test_add_radd_iadd(self, builder): |
|
|
|
def _test_add_radd_iadd(self, builder, assertEqualIter): |
|
|
|
"""Run tests on __r/i/add__ of a list built with *builder*.""" |
|
|
|
list1 = builder(range(5)) |
|
|
|
list2 = builder(range(5, 10)) |
|
|
|
self.assertEqual([0, 1, 2, 3, 4, 5, 6], list1 + [5, 6]) |
|
|
|
self.assertEqual([0, 1, 2, 3, 4], list1) |
|
|
|
assertEqualIter([0, 1, 2, 3, 4, 5, 6], list1 + [5, 6]) |
|
|
|
assertEqualIter([0, 1, 2, 3, 4], list1) |
|
|
|
self.assertEqual(list(range(10)), list1 + list2) |
|
|
|
self.assertEqual([-2, -1, 0, 1, 2, 3, 4], [-2, -1] + list1) |
|
|
|
self.assertEqual([0, 1, 2, 3, 4], list1) |
|
|
|
assertEqualIter([-2, -1, 0, 1, 2, 3, 4], [-2, -1] + list1) |
|
|
|
assertEqualIter([0, 1, 2, 3, 4], list1) |
|
|
|
list1 += ["foo", "bar", "baz"] |
|
|
|
self.assertEqual([0, 1, 2, 3, 4, "foo", "bar", "baz"], list1) |
|
|
|
assertEqualIter([0, 1, 2, 3, 4, "foo", "bar", "baz"], list1) |
|
|
|
|
|
|
|
def _test_other_magic_methods(self, builder): |
|
|
|
def _test_other_magic_methods(self, builder, assertEqualIter): |
|
|
|
"""Run tests on other magic methods of a list built with *builder*.""" |
|
|
|
list1 = builder([0, 1, 2, 3, "one", "two"]) |
|
|
|
list2 = builder([]) |
|
|
@@ -161,8 +164,8 @@ class TestSmartList(unittest.TestCase): |
|
|
|
other3 = [0, 1, 2, 3, "one", "two"] |
|
|
|
self.assertGreaterEqual(list1, other3) |
|
|
|
self.assertLessEqual(list1, other3) |
|
|
|
self.assertEqual(list1, other3) |
|
|
|
self.assertEqual(list1, other3) |
|
|
|
assertEqualIter(list1, other3) |
|
|
|
assertEqualIter(list1, other3) |
|
|
|
self.assertLessEqual(list1, other3) |
|
|
|
self.assertGreaterEqual(list1, other3) |
|
|
|
|
|
|
@@ -175,38 +178,39 @@ class TestSmartList(unittest.TestCase): |
|
|
|
out = [] |
|
|
|
for obj in list1: |
|
|
|
out.append(obj) |
|
|
|
self.assertEqual([0, 1, 2, 3, "one", "two"], out) |
|
|
|
assertEqualIter([0, 1, 2, 3, "one", "two"], out) |
|
|
|
|
|
|
|
out = [] |
|
|
|
for ch in list2: |
|
|
|
out.append(ch) |
|
|
|
self.assertEqual([], out) |
|
|
|
assertEqualIter([], out) |
|
|
|
|
|
|
|
gen1 = iter(list1) |
|
|
|
out = [] |
|
|
|
for i in range(len(list1)): |
|
|
|
out.append(next(gen1)) |
|
|
|
self.assertRaises(StopIteration, next, gen1) |
|
|
|
self.assertEqual([0, 1, 2, 3, "one", "two"], out) |
|
|
|
assertEqualIter([0, 1, 2, 3, "one", "two"], out) |
|
|
|
gen2 = iter(list2) |
|
|
|
self.assertRaises(StopIteration, next, gen2) |
|
|
|
|
|
|
|
self.assertEqual(["two", "one", 3, 2, 1, 0], list(reversed(list1))) |
|
|
|
self.assertEqual([], list(reversed(list2))) |
|
|
|
# TODO: might need to test an iterator rather than list |
|
|
|
assertEqualIter(["two", "one", 3, 2, 1, 0], list(reversed(list1))) |
|
|
|
assertEqualIter([], list(reversed(list2))) |
|
|
|
|
|
|
|
self.assertIn("one", list1) |
|
|
|
self.assertIn(3, list1) |
|
|
|
self.assertNotIn(10, list1) |
|
|
|
self.assertNotIn(0, list2) |
|
|
|
|
|
|
|
self.assertEqual([], list2 * 5) |
|
|
|
self.assertEqual([], 5 * list2) |
|
|
|
self.assertEqual([0, 1, 2, 0, 1, 2, 0, 1, 2], list4 * 3) |
|
|
|
self.assertEqual([0, 1, 2, 0, 1, 2, 0, 1, 2], 3 * list4) |
|
|
|
assertEqualIter([], list2 * 5) |
|
|
|
assertEqualIter([], 5 * list2) |
|
|
|
assertEqualIter([0, 1, 2, 0, 1, 2, 0, 1, 2], list4 * 3) |
|
|
|
assertEqualIter([0, 1, 2, 0, 1, 2, 0, 1, 2], 3 * list4) |
|
|
|
list4 *= 2 |
|
|
|
self.assertEqual([0, 1, 2, 0, 1, 2], list4) |
|
|
|
assertEqualIter([0, 1, 2, 0, 1, 2], list4) |
|
|
|
|
|
|
|
def _test_list_methods(self, builder): |
|
|
|
def _test_list_methods(self, builder, assertEqualIter): |
|
|
|
"""Run tests on the public methods of a list built with *builder*.""" |
|
|
|
list1 = builder(range(5)) |
|
|
|
list2 = builder(["foo"]) |
|
|
@@ -215,13 +219,13 @@ class TestSmartList(unittest.TestCase): |
|
|
|
list1.append(5) |
|
|
|
list1.append(1) |
|
|
|
list1.append(2) |
|
|
|
self.assertEqual([0, 1, 2, 3, 4, 5, 1, 2], list1) |
|
|
|
assertEqualIter([0, 1, 2, 3, 4, 5, 1, 2], list1) |
|
|
|
|
|
|
|
self.assertEqual(0, list1.count(6)) |
|
|
|
self.assertEqual(2, list1.count(1)) |
|
|
|
|
|
|
|
list1.extend(range(5, 8)) |
|
|
|
self.assertEqual([0, 1, 2, 3, 4, 5, 1, 2, 5, 6, 7], list1) |
|
|
|
assertEqualIter([0, 1, 2, 3, 4, 5, 1, 2, 5, 6, 7], list1) |
|
|
|
|
|
|
|
self.assertEqual(1, list1.index(1)) |
|
|
|
self.assertEqual(6, list1.index(1, 3)) |
|
|
@@ -229,55 +233,56 @@ class TestSmartList(unittest.TestCase): |
|
|
|
self.assertRaises(ValueError, list1.index, 1, 3, 5) |
|
|
|
|
|
|
|
list1.insert(0, -1) |
|
|
|
self.assertEqual([-1, 0, 1, 2, 3, 4, 5, 1, 2, 5, 6, 7], list1) |
|
|
|
assertEqualIter([-1, 0, 1, 2, 3, 4, 5, 1, 2, 5, 6, 7], list1) |
|
|
|
list1.insert(-1, 6.5) |
|
|
|
self.assertEqual([-1, 0, 1, 2, 3, 4, 5, 1, 2, 5, 6, 6.5, 7], list1) |
|
|
|
assertEqualIter([-1, 0, 1, 2, 3, 4, 5, 1, 2, 5, 6, 6.5, 7], list1) |
|
|
|
list1.insert(13, 8) |
|
|
|
self.assertEqual([-1, 0, 1, 2, 3, 4, 5, 1, 2, 5, 6, 6.5, 7, 8], list1) |
|
|
|
assertEqualIter([-1, 0, 1, 2, 3, 4, 5, 1, 2, 5, 6, 6.5, 7, 8], list1) |
|
|
|
|
|
|
|
self.assertEqual(8, list1.pop()) |
|
|
|
self.assertEqual(7, list1.pop()) |
|
|
|
self.assertEqual([-1, 0, 1, 2, 3, 4, 5, 1, 2, 5, 6, 6.5], list1) |
|
|
|
assertEqualIter([-1, 0, 1, 2, 3, 4, 5, 1, 2, 5, 6, 6.5], list1) |
|
|
|
self.assertEqual(-1, list1.pop(0)) |
|
|
|
self.assertEqual(5, list1.pop(5)) |
|
|
|
self.assertEqual(6.5, list1.pop(-1)) |
|
|
|
self.assertEqual([0, 1, 2, 3, 4, 1, 2, 5, 6], list1) |
|
|
|
assertEqualIter([0, 1, 2, 3, 4, 1, 2, 5, 6], list1) |
|
|
|
self.assertEqual("foo", list2.pop()) |
|
|
|
self.assertRaises(IndexError, list2.pop) |
|
|
|
self.assertEqual([], list2) |
|
|
|
assertEqualIter([], list2) |
|
|
|
|
|
|
|
list1.remove(6) |
|
|
|
self.assertEqual([0, 1, 2, 3, 4, 1, 2, 5], list1) |
|
|
|
assertEqualIter([0, 1, 2, 3, 4, 1, 2, 5], list1) |
|
|
|
list1.remove(1) |
|
|
|
self.assertEqual([0, 2, 3, 4, 1, 2, 5], list1) |
|
|
|
assertEqualIter([0, 2, 3, 4, 1, 2, 5], list1) |
|
|
|
list1.remove(1) |
|
|
|
self.assertEqual([0, 2, 3, 4, 2, 5], list1) |
|
|
|
assertEqualIter([0, 2, 3, 4, 2, 5], list1) |
|
|
|
self.assertRaises(ValueError, list1.remove, 1) |
|
|
|
|
|
|
|
list1.reverse() |
|
|
|
self.assertEqual([5, 2, 4, 3, 2, 0], list1) |
|
|
|
assertEqualIter([5, 2, 4, 3, 2, 0], list1) |
|
|
|
|
|
|
|
list1.sort() |
|
|
|
self.assertEqual([0, 2, 2, 3, 4, 5], list1) |
|
|
|
assertEqualIter([0, 2, 2, 3, 4, 5], list1) |
|
|
|
list1.sort(reverse=True) |
|
|
|
self.assertEqual([5, 4, 3, 2, 2, 0], list1) |
|
|
|
assertEqualIter([5, 4, 3, 2, 2, 0], list1) |
|
|
|
if not py3k: |
|
|
|
func = lambda x, y: abs(3 - x) - abs(3 - y) # Distance from 3 |
|
|
|
list1.sort(cmp=func) |
|
|
|
self.assertEqual([3, 4, 2, 2, 5, 0], list1) |
|
|
|
assertEqualIter([3, 4, 2, 2, 5, 0], list1) |
|
|
|
list1.sort(cmp=func, reverse=True) |
|
|
|
self.assertEqual([0, 5, 4, 2, 2, 3], list1) |
|
|
|
assertEqualIter([0, 5, 4, 2, 2, 3], list1) |
|
|
|
list3.sort(key=lambda i: i[1]) |
|
|
|
self.assertEqual([("d", 2), ("c", 3), ("a", 5), ("b", 8)], list3) |
|
|
|
assertEqualIter([("d", 2), ("c", 3), ("a", 5), ("b", 8)], list3) |
|
|
|
list3.sort(key=lambda i: i[1], reverse=True) |
|
|
|
self.assertEqual([("b", 8), ("a", 5), ("c", 3), ("d", 2)], list3) |
|
|
|
assertEqualIter([("b", 8), ("a", 5), ("c", 3), ("d", 2)], list3) |
|
|
|
|
|
|
|
def _dispatch_test_for_children(self, meth): |
|
|
|
@staticmethod |
|
|
|
def _dispatch_test_for_children(meth, assertEqualIter): |
|
|
|
"""Run a test method on various different types of children.""" |
|
|
|
meth(lambda L: SmartList(list(L))[:]) |
|
|
|
meth(lambda L: SmartList([999] + list(L))[1:]) |
|
|
|
meth(lambda L: SmartList(list(L) + [999])[:-1]) |
|
|
|
meth(lambda L: SmartList([101, 102] + list(L) + [201, 202])[2:-2]) |
|
|
|
meth(lambda L: SmartList(list(L))[:], assertEqualIter) |
|
|
|
meth(lambda L: SmartList([999] + list(L))[1:], assertEqualIter) |
|
|
|
meth(lambda L: SmartList(list(L) + [999])[:-1], assertEqualIter) |
|
|
|
meth(lambda L: SmartList([101, 102] + list(L) + [201, 202])[2:-2], assertEqualIter) |
|
|
|
|
|
|
|
def test_docs(self): |
|
|
|
"""make sure the methods of SmartList/_ListProxy have docstrings""" |
|
|
@@ -302,120 +307,212 @@ class TestSmartList(unittest.TestCase): |
|
|
|
|
|
|
|
def test_parent_get_set_del(self): |
|
|
|
"""make sure SmartList's getitem/setitem/delitem work""" |
|
|
|
self._test_get_set_del_item(SmartList) |
|
|
|
self._test_get_set_del_item(SmartList, self.assertEqual) |
|
|
|
self._test_get_set_del_item(SmartList, self.assertEqualIterator) |
|
|
|
|
|
|
|
def test_parent_add(self): |
|
|
|
"""make sure SmartList's add/radd/iadd work""" |
|
|
|
self._test_add_radd_iadd(SmartList) |
|
|
|
self._test_add_radd_iadd(SmartList, self.assertEqual) |
|
|
|
self._test_add_radd_iadd(SmartList, self.assertEqualIterator) |
|
|
|
|
|
|
|
def test_parent_other_magics(self): |
|
|
|
"""make sure SmartList's other magically implemented features work""" |
|
|
|
self._test_other_magic_methods(SmartList) |
|
|
|
self._test_other_magic_methods(SmartList, self.assertEqual) |
|
|
|
self._test_other_magic_methods(SmartList, self.assertEqualIterator) |
|
|
|
|
|
|
|
def test_parent_methods(self): |
|
|
|
"""make sure SmartList's non-magic methods work, like append()""" |
|
|
|
self._test_list_methods(SmartList) |
|
|
|
self._test_list_methods(SmartList, self.assertEqual) |
|
|
|
self._test_list_methods(SmartList, self.assertEqualIterator) |
|
|
|
|
|
|
|
def test_child_get_set_del(self): |
|
|
|
"""make sure _ListProxy's getitem/setitem/delitem work""" |
|
|
|
self._dispatch_test_for_children(self._test_get_set_del_item) |
|
|
|
self._dispatch_test_for_children(self._test_get_set_del_item, self.assertEqual) |
|
|
|
self._dispatch_test_for_children(self._test_get_set_del_item, self.assertEqualIterator) |
|
|
|
|
|
|
|
def test_child_add(self): |
|
|
|
"""make sure _ListProxy's add/radd/iadd work""" |
|
|
|
self._dispatch_test_for_children(self._test_add_radd_iadd) |
|
|
|
self._dispatch_test_for_children(self._test_add_radd_iadd, self.assertEqual) |
|
|
|
self._dispatch_test_for_children(self._test_add_radd_iadd, self.assertEqualIterator) |
|
|
|
|
|
|
|
def test_child_other_magics(self): |
|
|
|
"""make sure _ListProxy's other magically implemented features work""" |
|
|
|
self._dispatch_test_for_children(self._test_other_magic_methods) |
|
|
|
self._dispatch_test_for_children(self._test_other_magic_methods, self.assertEqual) |
|
|
|
self._dispatch_test_for_children(self._test_other_magic_methods, self.assertEqualIterator) |
|
|
|
|
|
|
|
def test_child_methods(self): |
|
|
|
"""make sure _ListProxy's non-magic methods work, like append()""" |
|
|
|
self._dispatch_test_for_children(self._test_list_methods) |
|
|
|
self._dispatch_test_for_children(self._test_list_methods, self.assertEqual) |
|
|
|
self._dispatch_test_for_children(self._test_list_methods, self.assertEqualIterator) |
|
|
|
|
|
|
|
def test_influence(self): |
|
|
|
def _test_influence(self, assertEqualIter): |
|
|
|
"""make sure changes are propagated from parents to children""" |
|
|
|
parent = SmartList([0, 1, 2, 3, 4, 5]) |
|
|
|
child1 = parent[2:] |
|
|
|
child2 = parent[2:5] |
|
|
|
self.assertEqual([0, 1, 2, 3, 4, 5], parent) |
|
|
|
self.assertEqual([2, 3, 4, 5], child1) |
|
|
|
self.assertEqual([2, 3, 4], child2) |
|
|
|
assertEqualIter([0, 1, 2, 3, 4, 5], parent) |
|
|
|
assertEqualIter([2, 3, 4, 5], child1) |
|
|
|
assertEqualIter([2, 3, 4], child2) |
|
|
|
self.assertEqual(2, len(parent._children)) |
|
|
|
|
|
|
|
parent.append(6) |
|
|
|
child1.append(7) |
|
|
|
child2.append(4.5) |
|
|
|
self.assertEqual([0, 1, 2, 3, 4, 4.5, 5, 6, 7], parent) |
|
|
|
self.assertEqual([2, 3, 4, 4.5, 5, 6, 7], child1) |
|
|
|
self.assertEqual([2, 3, 4, 4.5], child2) |
|
|
|
assertEqualIter([0, 1, 2, 3, 4, 4.5, 5, 6, 7], parent) |
|
|
|
assertEqualIter([2, 3, 4, 4.5, 5, 6, 7], child1) |
|
|
|
assertEqualIter([2, 3, 4, 4.5], child2) |
|
|
|
|
|
|
|
parent.insert(0, -1) |
|
|
|
parent.insert(4, 2.5) |
|
|
|
parent.insert(10, 6.5) |
|
|
|
self.assertEqual([-1, 0, 1, 2, 2.5, 3, 4, 4.5, 5, 6, 6.5, 7], parent) |
|
|
|
self.assertEqual([2, 2.5, 3, 4, 4.5, 5, 6, 6.5, 7], child1) |
|
|
|
self.assertEqual([2, 2.5, 3, 4, 4.5], child2) |
|
|
|
assertEqualIter([-1, 0, 1, 2, 2.5, 3, 4, 4.5, 5, 6, 6.5, 7], parent) |
|
|
|
assertEqualIter([2, 2.5, 3, 4, 4.5, 5, 6, 6.5, 7], child1) |
|
|
|
assertEqualIter([2, 2.5, 3, 4, 4.5], child2) |
|
|
|
|
|
|
|
self.assertEqual(7, parent.pop()) |
|
|
|
self.assertEqual(6.5, child1.pop()) |
|
|
|
self.assertEqual(4.5, child2.pop()) |
|
|
|
self.assertEqual([-1, 0, 1, 2, 2.5, 3, 4, 5, 6], parent) |
|
|
|
self.assertEqual([2, 2.5, 3, 4, 5, 6], child1) |
|
|
|
self.assertEqual([2, 2.5, 3, 4], child2) |
|
|
|
assertEqualIter([-1, 0, 1, 2, 2.5, 3, 4, 5, 6], parent) |
|
|
|
assertEqualIter([2, 2.5, 3, 4, 5, 6], child1) |
|
|
|
assertEqualIter([2, 2.5, 3, 4], child2) |
|
|
|
|
|
|
|
parent.remove(-1) |
|
|
|
child1.remove(2.5) |
|
|
|
self.assertEqual([0, 1, 2, 3, 4, 5, 6], parent) |
|
|
|
self.assertEqual([2, 3, 4, 5, 6], child1) |
|
|
|
self.assertEqual([2, 3, 4], child2) |
|
|
|
assertEqualIter([0, 1, 2, 3, 4, 5, 6], parent) |
|
|
|
assertEqualIter([2, 3, 4, 5, 6], child1) |
|
|
|
assertEqualIter([2, 3, 4], child2) |
|
|
|
|
|
|
|
self.assertEqual(0, parent.pop(0)) |
|
|
|
self.assertEqual([1, 2, 3, 4, 5, 6], parent) |
|
|
|
self.assertEqual([2, 3, 4, 5, 6], child1) |
|
|
|
self.assertEqual([2, 3, 4], child2) |
|
|
|
assertEqualIter([1, 2, 3, 4, 5, 6], parent) |
|
|
|
assertEqualIter([2, 3, 4, 5, 6], child1) |
|
|
|
assertEqualIter([2, 3, 4], child2) |
|
|
|
|
|
|
|
child2.reverse() |
|
|
|
self.assertEqual([1, 4, 3, 2, 5, 6], parent) |
|
|
|
self.assertEqual([4, 3, 2, 5, 6], child1) |
|
|
|
self.assertEqual([4, 3, 2], child2) |
|
|
|
assertEqualIter([1, 4, 3, 2, 5, 6], parent) |
|
|
|
assertEqualIter([4, 3, 2, 5, 6], child1) |
|
|
|
assertEqualIter([4, 3, 2], child2) |
|
|
|
|
|
|
|
parent.extend([7, 8]) |
|
|
|
child1.extend([8.1, 8.2]) |
|
|
|
child2.extend([1.9, 1.8]) |
|
|
|
self.assertEqual([1, 4, 3, 2, 1.9, 1.8, 5, 6, 7, 8, 8.1, 8.2], parent) |
|
|
|
self.assertEqual([4, 3, 2, 1.9, 1.8, 5, 6, 7, 8, 8.1, 8.2], child1) |
|
|
|
self.assertEqual([4, 3, 2, 1.9, 1.8], child2) |
|
|
|
assertEqualIter([1, 4, 3, 2, 1.9, 1.8, 5, 6, 7, 8, 8.1, 8.2], parent) |
|
|
|
assertEqualIter([4, 3, 2, 1.9, 1.8, 5, 6, 7, 8, 8.1, 8.2], child1) |
|
|
|
assertEqualIter([4, 3, 2, 1.9, 1.8], child2) |
|
|
|
|
|
|
|
child3 = parent[9:] |
|
|
|
self.assertEqual([8, 8.1, 8.2], child3) |
|
|
|
assertEqualIter([8, 8.1, 8.2], child3) |
|
|
|
|
|
|
|
del parent[8:] |
|
|
|
self.assertEqual([1, 4, 3, 2, 1.9, 1.8, 5, 6], parent) |
|
|
|
self.assertEqual([4, 3, 2, 1.9, 1.8, 5, 6], child1) |
|
|
|
self.assertEqual([4, 3, 2, 1.9, 1.8], child2) |
|
|
|
self.assertEqual([], child3) |
|
|
|
assertEqualIter([1, 4, 3, 2, 1.9, 1.8, 5, 6], parent) |
|
|
|
assertEqualIter([4, 3, 2, 1.9, 1.8, 5, 6], child1) |
|
|
|
assertEqualIter([4, 3, 2, 1.9, 1.8], child2) |
|
|
|
assertEqualIter([], child3) |
|
|
|
self.assertEqual(0, len(child3)) |
|
|
|
|
|
|
|
del child1 |
|
|
|
self.assertEqual([1, 4, 3, 2, 1.9, 1.8, 5, 6], parent) |
|
|
|
self.assertEqual([4, 3, 2, 1.9, 1.8], child2) |
|
|
|
self.assertEqual([], child3) |
|
|
|
assertEqualIter([1, 4, 3, 2, 1.9, 1.8, 5, 6], parent) |
|
|
|
assertEqualIter([4, 3, 2, 1.9, 1.8], child2) |
|
|
|
assertEqualIter([], child3) |
|
|
|
self.assertEqual(2, len(parent._children)) |
|
|
|
|
|
|
|
del child3 |
|
|
|
self.assertEqual([1, 4, 3, 2, 1.9, 1.8, 5, 6], parent) |
|
|
|
self.assertEqual([4, 3, 2, 1.9, 1.8], child2) |
|
|
|
assertEqualIter([1, 4, 3, 2, 1.9, 1.8, 5, 6], parent) |
|
|
|
assertEqualIter([4, 3, 2, 1.9, 1.8], child2) |
|
|
|
self.assertEqual(1, len(parent._children)) |
|
|
|
|
|
|
|
parent.remove(1.9) |
|
|
|
parent.remove(1.8) |
|
|
|
self.assertEqual([1, 4, 3, 2, 5, 6], parent) |
|
|
|
self.assertEqual([4, 3, 2], child2) |
|
|
|
assertEqualIter([1, 4, 3, 2, 5, 6], parent) |
|
|
|
assertEqualIter([4, 3, 2], child2) |
|
|
|
|
|
|
|
parent.reverse() |
|
|
|
self.assertEqual([6, 5, 2, 3, 4, 1], parent) |
|
|
|
self.assertEqual([4, 3, 2], child2) |
|
|
|
assertEqualIter([6, 5, 2, 3, 4, 1], parent) |
|
|
|
assertEqualIter([4, 3, 2], child2) |
|
|
|
self.assertEqual(0, len(parent._children)) |
|
|
|
|
|
|
|
def test_influence(self): |
|
|
|
self._test_influence(self.assertEqual) |
|
|
|
self._test_influence(self.assertEqualIterator) |
|
|
|
|
|
|
|
@staticmethod |
|
|
|
def _test_get_slice(builder, assertEqualIter): |
|
|
|
lst = builder([0, 1, 2]) |
|
|
|
assertEqualIter(lst, [0, 1, 2]) |
|
|
|
assertEqualIter(lst[:], [0, 1, 2]) |
|
|
|
assertEqualIter(lst[0:0], []) |
|
|
|
assertEqualIter(lst[0:1], [0]) |
|
|
|
assertEqualIter(lst[0:2], [0, 1]) |
|
|
|
assertEqualIter(lst[0:3], [0, 1, 2]) |
|
|
|
assertEqualIter(lst[0:4], [0, 1, 2]) # bug in iteration |
|
|
|
assertEqualIter(lst[0:], [0, 1, 2]) |
|
|
|
assertEqualIter(lst[1:1], []) |
|
|
|
assertEqualIter(lst[1:2], [1]) |
|
|
|
assertEqualIter(lst[1:3], [1, 2]) |
|
|
|
assertEqualIter(lst[1:4], [1, 2]) # bug in iteration |
|
|
|
assertEqualIter(lst[1:], [1, 2]) |
|
|
|
assertEqualIter(lst[2:], [2]) |
|
|
|
assertEqualIter(lst[3:], []) |
|
|
|
assertEqualIter(lst[4:], []) |
|
|
|
assertEqualIter(lst[-1:], [2]) |
|
|
|
assertEqualIter(lst[-2:], [1, 2]) |
|
|
|
assertEqualIter(lst[-3:], [0, 1, 2]) |
|
|
|
assertEqualIter(lst[-4:], [0, 1, 2]) # bug in list and iteration |
|
|
|
assertEqualIter(lst[:-1], [0, 1]) |
|
|
|
assertEqualIter(lst[:-2], [0]) |
|
|
|
assertEqualIter(lst[:-3], []) |
|
|
|
assertEqualIter(lst[:-4], []) # bug in list |
|
|
|
assertEqualIter(lst[1:-1], [1]) |
|
|
|
assertEqualIter(lst[1:-2], []) |
|
|
|
assertEqualIter(lst[1:-3], []) |
|
|
|
assertEqualIter(lst[1:-4], []) # bug in list |
|
|
|
assertEqualIter(lst[-1:-1], []) |
|
|
|
assertEqualIter(lst[-2:-1], [1]) |
|
|
|
assertEqualIter(lst[-3:-1], [0, 1]) |
|
|
|
assertEqualIter(lst[-4:-1], [0, 1]) # bug in list and iteration |
|
|
|
assertEqualIter(lst[-3:-1], [0, 1]) |
|
|
|
assertEqualIter(lst[-3:-2], [0]) |
|
|
|
assertEqualIter(lst[-3:-3], []) |
|
|
|
assertEqualIter(lst[-3:-4], []) # bug in list |
|
|
|
|
|
|
|
# step == 2 |
|
|
|
assertEqualIter(lst[::2], [0, 2]) |
|
|
|
assertEqualIter(lst[0::2], [0, 2]) |
|
|
|
assertEqualIter(lst[1::2], [1]) |
|
|
|
assertEqualIter(lst[2::2], [2]) |
|
|
|
assertEqualIter(lst[3::2], []) |
|
|
|
assertEqualIter(lst[4::2], []) |
|
|
|
|
|
|
|
# step < 0 -- all of these are not working correctly |
|
|
|
assertEqualIter(lst[::-1], [2, 1, 0]) |
|
|
|
assertEqualIter(lst[0::-1], [0]) |
|
|
|
assertEqualIter(lst[1::-1], [1, 0]) |
|
|
|
assertEqualIter(lst[2::-1], [2, 1, 0]) |
|
|
|
assertEqualIter(lst[3::-1], [2, 1, 0]) |
|
|
|
assertEqualIter(lst[4::-1], [2, 1, 0]) |
|
|
|
assertEqualIter(lst[::-2], [2, 0]) |
|
|
|
assertEqualIter(lst[0::-2], [0]) |
|
|
|
assertEqualIter(lst[1::-2], [1]) |
|
|
|
assertEqualIter(lst[2::-2], [2, 0]) |
|
|
|
assertEqualIter(lst[3::-2], [2, 0]) |
|
|
|
assertEqualIter(lst[4::-2], [2, 0]) |
|
|
|
|
|
|
|
def test_get_slice(self): |
|
|
|
self._test_get_slice(list, self.assertEqual) # test against built-in list |
|
|
|
self._test_get_slice(SmartList, self.assertEqual) |
|
|
|
|
|
|
|
def test_get_slice_iterator(self): |
|
|
|
self._test_get_slice(list, self.assertEqualIterator) # test against built-in list |
|
|
|
self._test_get_slice(SmartList, self.assertEqualIterator) |
|
|
|
|
|
|
|
def assertEqualIterator(self, iter1, iter2): |
|
|
|
if py3k: |
|
|
|
from itertools import zip_longest |
|
|
|
else: |
|
|
|
from itertools import izip_longest as zip_longest |
|
|
|
|
|
|
|
for a, b in zip_longest(iter1, iter2, fillvalue='__END_OF_LIST__'): |
|
|
|
self.assertEqual(a, b) |
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
unittest.main(verbosity=2) |