A Python parser for MediaWiki wikicode https://mwparserfromhell.readthedocs.io/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

521 lines
21 KiB

  1. # -*- coding: utf-8 -*-
  2. #
  3. # Copyright (C) 2012-2016 Ben Kurtovic <ben.kurtovic@gmail.com>
  4. #
  5. # Permission is hereby granted, free of charge, to any person obtaining a copy
  6. # of this software and associated documentation files (the "Software"), to deal
  7. # in the Software without restriction, including without limitation the rights
  8. # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. # copies of the Software, and to permit persons to whom the Software is
  10. # furnished to do so, subject to the following conditions:
  11. #
  12. # The above copyright notice and this permission notice shall be included in
  13. # all copies or substantial portions of the Software.
  14. #
  15. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  21. # SOFTWARE.
  22. from __future__ import unicode_literals
  23. import unittest
  24. from mwparserfromhell.compat import py3k, range
  25. from mwparserfromhell.smart_list import SmartList
  26. from mwparserfromhell.smart_list.ListProxy import _ListProxy
  27. class TestSmartList(unittest.TestCase):
  28. """Test cases for the SmartList class and its child, _ListProxy."""
  29. def _test_get_set_del_item(self, builder, assertEqualIter):
  30. """Run tests on __get/set/delitem__ of a list built with *builder*."""
  31. def assign(L, s1, s2, s3, val):
  32. L[s1:s2:s3] = val
  33. def delete(L, s1):
  34. del L[s1]
  35. list1 = builder([0, 1, 2, 3, "one", "two"])
  36. list2 = builder(list(range(10)))
  37. self.assertEqual(1, list1[1])
  38. self.assertEqual("one", list1[-2])
  39. assertEqualIter([2, 3], list1[2:4])
  40. self.assertRaises(IndexError, lambda: list1[6])
  41. self.assertRaises(IndexError, lambda: list1[-7])
  42. assertEqualIter([0, 1, 2], list1[:3])
  43. assertEqualIter([0, 1, 2, 3, "one", "two"], list1[:])
  44. assertEqualIter([3, "one", "two"], list1[3:])
  45. assertEqualIter([3, "one", "two"], list1[3:100])
  46. assertEqualIter(["one", "two"], list1[-2:])
  47. assertEqualIter([0, 1], list1[:-4])
  48. assertEqualIter([], list1[6:])
  49. assertEqualIter([], list1[4:2])
  50. assertEqualIter([0, 2, "one"], list1[0:5:2])
  51. assertEqualIter([0, 2], list1[0:-3:2])
  52. assertEqualIter([0, 1, 2, 3, "one", "two"], list1[::])
  53. assertEqualIter([2, 3, "one", "two"], list1[2::])
  54. assertEqualIter([0, 1, 2, 3], list1[:4:])
  55. assertEqualIter([2, 3], list1[2:4:])
  56. assertEqualIter([0, 2, 4, 6, 8], list2[::2])
  57. assertEqualIter([2, 5, 8], list2[2::3])
  58. assertEqualIter([0, 3], list2[:6:3])
  59. assertEqualIter([2, 5, 8], list2[-8:9:3])
  60. assertEqualIter([], list2[100000:1000:-100])
  61. list1[3] = 100
  62. self.assertEqual(100, list1[3])
  63. list1[-3] = 101
  64. assertEqualIter([0, 1, 2, 101, "one", "two"], list1)
  65. list1[5:] = [6, 7, 8]
  66. assertEqualIter([6, 7, 8], list1[5:])
  67. assertEqualIter([0, 1, 2, 101, "one", 6, 7, 8], list1)
  68. list1[2:4] = [-1, -2, -3, -4, -5]
  69. assertEqualIter([0, 1, -1, -2, -3, -4, -5, "one", 6, 7, 8], list1)
  70. list1[0:-3] = [99]
  71. assertEqualIter([99, 6, 7, 8], list1)
  72. list2[0:6:2] = [100, 102, 104]
  73. assertEqualIter([100, 1, 102, 3, 104, 5, 6, 7, 8, 9], list2)
  74. list2[::3] = [200, 203, 206, 209]
  75. assertEqualIter([200, 1, 102, 203, 104, 5, 206, 7, 8, 209], list2)
  76. list2[::] = range(7)
  77. assertEqualIter([0, 1, 2, 3, 4, 5, 6], list2)
  78. self.assertRaises(ValueError, assign, list2, 0, 5, 2,
  79. [100, 102, 104, 106])
  80. with self.assertRaises(IndexError):
  81. list2[7] = "foo"
  82. with self.assertRaises(IndexError):
  83. list2[-8] = "foo"
  84. del list2[2]
  85. assertEqualIter([0, 1, 3, 4, 5, 6], list2)
  86. del list2[-3]
  87. assertEqualIter([0, 1, 3, 5, 6], list2)
  88. self.assertRaises(IndexError, delete, list2, 100)
  89. self.assertRaises(IndexError, delete, list2, -6)
  90. list2[:] = range(10)
  91. del list2[3:6]
  92. assertEqualIter([0, 1, 2, 6, 7, 8, 9], list2)
  93. del list2[-2:]
  94. assertEqualIter([0, 1, 2, 6, 7], list2)
  95. del list2[:2]
  96. assertEqualIter([2, 6, 7], list2)
  97. list2[:] = range(10)
  98. del list2[2:8:2]
  99. assertEqualIter([0, 1, 3, 5, 7, 8, 9], list2)
  100. def _test_add_radd_iadd(self, builder, assertEqualIter):
  101. """Run tests on __r/i/add__ of a list built with *builder*."""
  102. list1 = builder(range(5))
  103. list2 = builder(range(5, 10))
  104. assertEqualIter([0, 1, 2, 3, 4, 5, 6], list1 + [5, 6])
  105. assertEqualIter([0, 1, 2, 3, 4], list1)
  106. self.assertEqual(list(range(10)), list1 + list2)
  107. assertEqualIter([-2, -1, 0, 1, 2, 3, 4], [-2, -1] + list1)
  108. assertEqualIter([0, 1, 2, 3, 4], list1)
  109. list1 += ["foo", "bar", "baz"]
  110. assertEqualIter([0, 1, 2, 3, 4, "foo", "bar", "baz"], list1)
  111. def _test_other_magic_methods(self, builder, assertEqualIter):
  112. """Run tests on other magic methods of a list built with *builder*."""
  113. list1 = builder([0, 1, 2, 3, "one", "two"])
  114. list2 = builder([])
  115. list3 = builder([0, 2, 3, 4])
  116. list4 = builder([0, 1, 2])
  117. if py3k:
  118. self.assertEqual("[0, 1, 2, 3, 'one', 'two']", str(list1))
  119. self.assertEqual(b"\x00\x01\x02", bytes(list4))
  120. self.assertEqual("[0, 1, 2, 3, 'one', 'two']", repr(list1))
  121. else:
  122. self.assertEqual("[0, 1, 2, 3, u'one', u'two']", unicode(list1))
  123. self.assertEqual(b"[0, 1, 2, 3, u'one', u'two']", str(list1))
  124. self.assertEqual(b"[0, 1, 2, 3, u'one', u'two']", repr(list1))
  125. self.assertLess(list1, list3)
  126. self.assertLessEqual(list1, list3)
  127. self.assertNotEqual(list1, list3)
  128. self.assertNotEqual(list1, list3)
  129. self.assertLessEqual(list1, list3)
  130. self.assertLess(list1, list3)
  131. other1 = [0, 2, 3, 4]
  132. self.assertLess(list1, other1)
  133. self.assertLessEqual(list1, other1)
  134. self.assertNotEqual(list1, other1)
  135. self.assertNotEqual(list1, other1)
  136. self.assertLessEqual(list1, other1)
  137. self.assertLess(list1, other1)
  138. other2 = [0, 0, 1, 2]
  139. self.assertGreaterEqual(list1, other2)
  140. self.assertGreater(list1, other2)
  141. self.assertNotEqual(list1, other2)
  142. self.assertNotEqual(list1, other2)
  143. self.assertGreater(list1, other2)
  144. self.assertGreaterEqual(list1, other2)
  145. other3 = [0, 1, 2, 3, "one", "two"]
  146. self.assertGreaterEqual(list1, other3)
  147. self.assertLessEqual(list1, other3)
  148. assertEqualIter(list1, other3)
  149. assertEqualIter(list1, other3)
  150. self.assertLessEqual(list1, other3)
  151. self.assertGreaterEqual(list1, other3)
  152. self.assertTrue(bool(list1))
  153. self.assertFalse(bool(list2))
  154. self.assertEqual(6, len(list1))
  155. self.assertEqual(0, len(list2))
  156. out = []
  157. for obj in list1:
  158. out.append(obj)
  159. assertEqualIter([0, 1, 2, 3, "one", "two"], out)
  160. out = []
  161. for ch in list2:
  162. out.append(ch)
  163. assertEqualIter([], out)
  164. gen1 = iter(list1)
  165. out = []
  166. for i in range(len(list1)):
  167. out.append(next(gen1))
  168. self.assertRaises(StopIteration, next, gen1)
  169. assertEqualIter([0, 1, 2, 3, "one", "two"], out)
  170. gen2 = iter(list2)
  171. self.assertRaises(StopIteration, next, gen2)
  172. # TODO: might need to test an iterator rather than list
  173. assertEqualIter(["two", "one", 3, 2, 1, 0], list(reversed(list1)))
  174. assertEqualIter([], list(reversed(list2)))
  175. self.assertIn("one", list1)
  176. self.assertIn(3, list1)
  177. self.assertNotIn(10, list1)
  178. self.assertNotIn(0, list2)
  179. assertEqualIter([], list2 * 5)
  180. assertEqualIter([], 5 * list2)
  181. assertEqualIter([0, 1, 2, 0, 1, 2, 0, 1, 2], list4 * 3)
  182. assertEqualIter([0, 1, 2, 0, 1, 2, 0, 1, 2], 3 * list4)
  183. list4 *= 2
  184. assertEqualIter([0, 1, 2, 0, 1, 2], list4)
  185. def _test_list_methods(self, builder, assertEqualIter):
  186. """Run tests on the public methods of a list built with *builder*."""
  187. list1 = builder(range(5))
  188. list2 = builder(["foo"])
  189. list3 = builder([("a", 5), ("d", 2), ("b", 8), ("c", 3)])
  190. list1.append(5)
  191. list1.append(1)
  192. list1.append(2)
  193. assertEqualIter([0, 1, 2, 3, 4, 5, 1, 2], list1)
  194. self.assertEqual(0, list1.count(6))
  195. self.assertEqual(2, list1.count(1))
  196. list1.extend(range(5, 8))
  197. assertEqualIter([0, 1, 2, 3, 4, 5, 1, 2, 5, 6, 7], list1)
  198. self.assertEqual(1, list1.index(1))
  199. self.assertEqual(6, list1.index(1, 3))
  200. self.assertEqual(6, list1.index(1, 3, 7))
  201. self.assertRaises(ValueError, list1.index, 1, 3, 5)
  202. list1.insert(0, -1)
  203. assertEqualIter([-1, 0, 1, 2, 3, 4, 5, 1, 2, 5, 6, 7], list1)
  204. list1.insert(-1, 6.5)
  205. assertEqualIter([-1, 0, 1, 2, 3, 4, 5, 1, 2, 5, 6, 6.5, 7], list1)
  206. list1.insert(13, 8)
  207. assertEqualIter([-1, 0, 1, 2, 3, 4, 5, 1, 2, 5, 6, 6.5, 7, 8], list1)
  208. self.assertEqual(8, list1.pop())
  209. self.assertEqual(7, list1.pop())
  210. assertEqualIter([-1, 0, 1, 2, 3, 4, 5, 1, 2, 5, 6, 6.5], list1)
  211. self.assertEqual(-1, list1.pop(0))
  212. self.assertEqual(5, list1.pop(5))
  213. self.assertEqual(6.5, list1.pop(-1))
  214. assertEqualIter([0, 1, 2, 3, 4, 1, 2, 5, 6], list1)
  215. self.assertEqual("foo", list2.pop())
  216. self.assertRaises(IndexError, list2.pop)
  217. assertEqualIter([], list2)
  218. list1.remove(6)
  219. assertEqualIter([0, 1, 2, 3, 4, 1, 2, 5], list1)
  220. list1.remove(1)
  221. assertEqualIter([0, 2, 3, 4, 1, 2, 5], list1)
  222. list1.remove(1)
  223. assertEqualIter([0, 2, 3, 4, 2, 5], list1)
  224. self.assertRaises(ValueError, list1.remove, 1)
  225. list1.reverse()
  226. assertEqualIter([5, 2, 4, 3, 2, 0], list1)
  227. list1.sort()
  228. assertEqualIter([0, 2, 2, 3, 4, 5], list1)
  229. list1.sort(reverse=True)
  230. assertEqualIter([5, 4, 3, 2, 2, 0], list1)
  231. if not py3k:
  232. func = lambda x, y: abs(3 - x) - abs(3 - y) # Distance from 3
  233. list1.sort(cmp=func)
  234. assertEqualIter([3, 4, 2, 2, 5, 0], list1)
  235. list1.sort(cmp=func, reverse=True)
  236. assertEqualIter([0, 5, 4, 2, 2, 3], list1)
  237. list3.sort(key=lambda i: i[1])
  238. assertEqualIter([("d", 2), ("c", 3), ("a", 5), ("b", 8)], list3)
  239. list3.sort(key=lambda i: i[1], reverse=True)
  240. assertEqualIter([("b", 8), ("a", 5), ("c", 3), ("d", 2)], list3)
  241. @staticmethod
  242. def _dispatch_test_for_children(meth, assertEqualIter):
  243. """Run a test method on various different types of children."""
  244. meth(lambda L: SmartList(list(L))[:], assertEqualIter)
  245. meth(lambda L: SmartList([999] + list(L))[1:], assertEqualIter)
  246. meth(lambda L: SmartList(list(L) + [999])[:-1], assertEqualIter)
  247. meth(lambda L: SmartList([101, 102] + list(L) + [201, 202])[2:-2], assertEqualIter)
  248. def test_docs(self):
  249. """make sure the methods of SmartList/_ListProxy have docstrings"""
  250. methods = ["append", "count", "extend", "index", "insert", "pop",
  251. "remove", "reverse", "sort"]
  252. for meth in methods:
  253. expected = getattr(list, meth).__doc__
  254. smartlist_doc = getattr(SmartList, meth).__doc__
  255. listproxy_doc = getattr(_ListProxy, meth).__doc__
  256. self.assertEqual(expected, smartlist_doc)
  257. self.assertEqual(expected, listproxy_doc)
  258. def test_doctest(self):
  259. """make sure the test embedded in SmartList's docstring passes"""
  260. parent = SmartList([0, 1, 2, 3])
  261. self.assertEqual([0, 1, 2, 3], parent)
  262. child = parent[2:]
  263. self.assertEqual([2, 3], child)
  264. child.append(4)
  265. self.assertEqual([2, 3, 4], child)
  266. self.assertEqual([0, 1, 2, 3, 4], parent)
  267. def test_parent_get_set_del(self):
  268. """make sure SmartList's getitem/setitem/delitem work"""
  269. self._test_get_set_del_item(SmartList, self.assertEqual)
  270. self._test_get_set_del_item(SmartList, self.assertEqualIterator)
  271. def test_parent_add(self):
  272. """make sure SmartList's add/radd/iadd work"""
  273. self._test_add_radd_iadd(SmartList, self.assertEqual)
  274. self._test_add_radd_iadd(SmartList, self.assertEqualIterator)
  275. def test_parent_other_magics(self):
  276. """make sure SmartList's other magically implemented features work"""
  277. self._test_other_magic_methods(SmartList, self.assertEqual)
  278. self._test_other_magic_methods(SmartList, self.assertEqualIterator)
  279. def test_parent_methods(self):
  280. """make sure SmartList's non-magic methods work, like append()"""
  281. self._test_list_methods(SmartList, self.assertEqual)
  282. self._test_list_methods(SmartList, self.assertEqualIterator)
  283. def test_child_get_set_del(self):
  284. """make sure _ListProxy's getitem/setitem/delitem work"""
  285. self._dispatch_test_for_children(self._test_get_set_del_item, self.assertEqual)
  286. self._dispatch_test_for_children(self._test_get_set_del_item, self.assertEqualIterator)
  287. def test_child_add(self):
  288. """make sure _ListProxy's add/radd/iadd work"""
  289. self._dispatch_test_for_children(self._test_add_radd_iadd, self.assertEqual)
  290. self._dispatch_test_for_children(self._test_add_radd_iadd, self.assertEqualIterator)
  291. def test_child_other_magics(self):
  292. """make sure _ListProxy's other magically implemented features work"""
  293. self._dispatch_test_for_children(self._test_other_magic_methods, self.assertEqual)
  294. self._dispatch_test_for_children(self._test_other_magic_methods, self.assertEqualIterator)
  295. def test_child_methods(self):
  296. """make sure _ListProxy's non-magic methods work, like append()"""
  297. self._dispatch_test_for_children(self._test_list_methods, self.assertEqual)
  298. self._dispatch_test_for_children(self._test_list_methods, self.assertEqualIterator)
  299. def _test_influence(self, assertEqualIter):
  300. """make sure changes are propagated from parents to children"""
  301. parent = SmartList([0, 1, 2, 3, 4, 5])
  302. child1 = parent[2:]
  303. child2 = parent[2:5]
  304. assertEqualIter([0, 1, 2, 3, 4, 5], parent)
  305. assertEqualIter([2, 3, 4, 5], child1)
  306. assertEqualIter([2, 3, 4], child2)
  307. self.assertEqual(2, len(parent._children))
  308. parent.append(6)
  309. child1.append(7)
  310. child2.append(4.5)
  311. assertEqualIter([0, 1, 2, 3, 4, 4.5, 5, 6, 7], parent)
  312. assertEqualIter([2, 3, 4, 4.5, 5, 6, 7], child1)
  313. assertEqualIter([2, 3, 4, 4.5], child2)
  314. parent.insert(0, -1)
  315. parent.insert(4, 2.5)
  316. parent.insert(10, 6.5)
  317. assertEqualIter([-1, 0, 1, 2, 2.5, 3, 4, 4.5, 5, 6, 6.5, 7], parent)
  318. assertEqualIter([2, 2.5, 3, 4, 4.5, 5, 6, 6.5, 7], child1)
  319. assertEqualIter([2, 2.5, 3, 4, 4.5], child2)
  320. self.assertEqual(7, parent.pop())
  321. self.assertEqual(6.5, child1.pop())
  322. self.assertEqual(4.5, child2.pop())
  323. assertEqualIter([-1, 0, 1, 2, 2.5, 3, 4, 5, 6], parent)
  324. assertEqualIter([2, 2.5, 3, 4, 5, 6], child1)
  325. assertEqualIter([2, 2.5, 3, 4], child2)
  326. parent.remove(-1)
  327. child1.remove(2.5)
  328. assertEqualIter([0, 1, 2, 3, 4, 5, 6], parent)
  329. assertEqualIter([2, 3, 4, 5, 6], child1)
  330. assertEqualIter([2, 3, 4], child2)
  331. self.assertEqual(0, parent.pop(0))
  332. assertEqualIter([1, 2, 3, 4, 5, 6], parent)
  333. assertEqualIter([2, 3, 4, 5, 6], child1)
  334. assertEqualIter([2, 3, 4], child2)
  335. child2.reverse()
  336. assertEqualIter([1, 4, 3, 2, 5, 6], parent)
  337. assertEqualIter([4, 3, 2, 5, 6], child1)
  338. assertEqualIter([4, 3, 2], child2)
  339. parent.extend([7, 8])
  340. child1.extend([8.1, 8.2])
  341. child2.extend([1.9, 1.8])
  342. assertEqualIter([1, 4, 3, 2, 1.9, 1.8, 5, 6, 7, 8, 8.1, 8.2], parent)
  343. assertEqualIter([4, 3, 2, 1.9, 1.8, 5, 6, 7, 8, 8.1, 8.2], child1)
  344. assertEqualIter([4, 3, 2, 1.9, 1.8], child2)
  345. child3 = parent[9:]
  346. assertEqualIter([8, 8.1, 8.2], child3)
  347. del parent[8:]
  348. assertEqualIter([1, 4, 3, 2, 1.9, 1.8, 5, 6], parent)
  349. assertEqualIter([4, 3, 2, 1.9, 1.8, 5, 6], child1)
  350. assertEqualIter([4, 3, 2, 1.9, 1.8], child2)
  351. assertEqualIter([], child3)
  352. self.assertEqual(0, len(child3))
  353. del child1
  354. assertEqualIter([1, 4, 3, 2, 1.9, 1.8, 5, 6], parent)
  355. assertEqualIter([4, 3, 2, 1.9, 1.8], child2)
  356. assertEqualIter([], child3)
  357. self.assertEqual(2, len(parent._children))
  358. del child3
  359. assertEqualIter([1, 4, 3, 2, 1.9, 1.8, 5, 6], parent)
  360. assertEqualIter([4, 3, 2, 1.9, 1.8], child2)
  361. self.assertEqual(1, len(parent._children))
  362. parent.remove(1.9)
  363. parent.remove(1.8)
  364. assertEqualIter([1, 4, 3, 2, 5, 6], parent)
  365. assertEqualIter([4, 3, 2], child2)
  366. parent.reverse()
  367. assertEqualIter([6, 5, 2, 3, 4, 1], parent)
  368. assertEqualIter([4, 3, 2], child2)
  369. self.assertEqual(0, len(parent._children))
  370. def test_influence(self):
  371. self._test_influence(self.assertEqual)
  372. self._test_influence(self.assertEqualIterator)
  373. @staticmethod
  374. def _test_get_slice(builder, assertEqualIter):
  375. lst = builder([0, 1, 2])
  376. assertEqualIter(lst, [0, 1, 2])
  377. assertEqualIter(lst[:], [0, 1, 2])
  378. assertEqualIter(lst[0:0], [])
  379. assertEqualIter(lst[0:1], [0])
  380. assertEqualIter(lst[0:2], [0, 1])
  381. assertEqualIter(lst[0:3], [0, 1, 2])
  382. assertEqualIter(lst[0:4], [0, 1, 2]) # bug in iteration
  383. assertEqualIter(lst[0:], [0, 1, 2])
  384. assertEqualIter(lst[1:1], [])
  385. assertEqualIter(lst[1:2], [1])
  386. assertEqualIter(lst[1:3], [1, 2])
  387. assertEqualIter(lst[1:4], [1, 2]) # bug in iteration
  388. assertEqualIter(lst[1:], [1, 2])
  389. assertEqualIter(lst[2:], [2])
  390. assertEqualIter(lst[3:], [])
  391. assertEqualIter(lst[4:], [])
  392. assertEqualIter(lst[-1:], [2])
  393. assertEqualIter(lst[-2:], [1, 2])
  394. assertEqualIter(lst[-3:], [0, 1, 2])
  395. assertEqualIter(lst[-4:], [0, 1, 2]) # bug in list and iteration
  396. assertEqualIter(lst[:-1], [0, 1])
  397. assertEqualIter(lst[:-2], [0])
  398. assertEqualIter(lst[:-3], [])
  399. assertEqualIter(lst[:-4], []) # bug in list
  400. assertEqualIter(lst[1:-1], [1])
  401. assertEqualIter(lst[1:-2], [])
  402. assertEqualIter(lst[1:-3], [])
  403. assertEqualIter(lst[1:-4], []) # bug in list
  404. assertEqualIter(lst[-1:-1], [])
  405. assertEqualIter(lst[-2:-1], [1])
  406. assertEqualIter(lst[-3:-1], [0, 1])
  407. assertEqualIter(lst[-4:-1], [0, 1]) # bug in list and iteration
  408. assertEqualIter(lst[-3:-1], [0, 1])
  409. assertEqualIter(lst[-3:-2], [0])
  410. assertEqualIter(lst[-3:-3], [])
  411. assertEqualIter(lst[-3:-4], []) # bug in list
  412. # step == 2
  413. assertEqualIter(lst[::2], [0, 2])
  414. assertEqualIter(lst[0::2], [0, 2])
  415. assertEqualIter(lst[1::2], [1])
  416. assertEqualIter(lst[2::2], [2])
  417. assertEqualIter(lst[3::2], [])
  418. assertEqualIter(lst[4::2], [])
  419. # step < 0 -- all of these are not working correctly
  420. assertEqualIter(lst[::-1], [2, 1, 0])
  421. assertEqualIter(lst[0::-1], [0])
  422. assertEqualIter(lst[1::-1], [1, 0])
  423. assertEqualIter(lst[2::-1], [2, 1, 0])
  424. assertEqualIter(lst[3::-1], [2, 1, 0])
  425. assertEqualIter(lst[4::-1], [2, 1, 0])
  426. assertEqualIter(lst[::-2], [2, 0])
  427. assertEqualIter(lst[0::-2], [0])
  428. assertEqualIter(lst[1::-2], [1])
  429. assertEqualIter(lst[2::-2], [2, 0])
  430. assertEqualIter(lst[3::-2], [2, 0])
  431. assertEqualIter(lst[4::-2], [2, 0])
  432. def test_get_slice(self):
  433. self._test_get_slice(list, self.assertEqual) # test against built-in list
  434. self._test_get_slice(SmartList, self.assertEqual)
  435. def test_get_slice_iterator(self):
  436. self._test_get_slice(list, self.assertEqualIterator) # test against built-in list
  437. self._test_get_slice(SmartList, self.assertEqualIterator)
  438. def assertEqualIterator(self, iter1, iter2):
  439. if py3k:
  440. from itertools import zip_longest
  441. else:
  442. from itertools import izip_longest as zip_longest
  443. for a, b in zip_longest(iter1, iter2, fillvalue='__END_OF_LIST__'):
  444. self.assertEqual(a, b)
  445. if __name__ == "__main__":
  446. unittest.main(verbosity=2)