1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
|
# -*- coding: utf-8 -*-
"""
Tests for the backported class:`list` class.
"""
from __future__ import absolute_import, unicode_literals, print_function
from future.builtins import *
from future import utils
from future.tests.base import unittest, expectedFailurePY2
class TestList(unittest.TestCase):
def test_isinstance_list(self):
self.assertTrue(isinstance([], list))
self.assertEqual([1, 2, 3], list([1, 2, 3]))
def test_isinstance_list_subclass(self):
"""
Issue #89
"""
value = list([1, 2, 3])
class Magic(list):
pass
self.assertTrue(isinstance(value, list))
self.assertFalse(isinstance(value, Magic))
def test_list_empty(self):
"""
list() -> []
"""
self.assertEqual(list(), [])
def test_list_clear(self):
l = list()
l.append(1)
l.clear()
self.assertEqual(len(l), 0)
l.extend([2, 3])
l.clear()
self.assertEqual(len(l), 0)
def test_list_list(self):
self.assertEqual(list(list()), [])
self.assertTrue(isinstance(list(list()), list))
def test_list_list2(self):
"""
Issue #50
"""
l = list([1, 2, 3])
l2 = list(l)
self.assertEqual(len(l2), 3)
self.assertEqual(l2, [1, 2, 3])
def test_list_equal(self):
l = [1, 3, 5]
self.assertEqual(list(l), l)
def test_list_getitem(self):
l = list('ABCD')
self.assertEqual(l, ['A', 'B', 'C', 'D'])
self.assertEqual(l[0], 'A')
self.assertEqual(l[-1], 'D')
self.assertEqual(l[0:1], ['A'])
self.assertEqual(l[0:2], ['A', 'B'])
self.assertEqual(''.join(l[:]), 'ABCD')
def test_list_setitem(self):
l = list('ABCD')
l[1] = b'B'
self.assertEqual(l, ['A', b'B', 'C', 'D'])
def test_list_iteration(self):
l = list('ABCD')
for item in l:
self.assertTrue(isinstance(item, str))
def test_list_plus_list(self):
l1 = list('ABCD')
l2 = ['E', 'F', 'G', 'H']
self.assertEqual(l1 + l2, ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'])
self.assertEqual(type(l1 + l2), list)
self.assertEqual(l2 + l1, ['E', 'F', 'G', 'H', 'A', 'B', 'C', 'D'])
self.assertEqual(l2 + l1, list('EFGHABCD'))
self.assertEqual(type(l2 + l1), list)
self.assertTrue(isinstance(l2 + l1, list))
def test_list_contains_something(self):
l = list('ABCD')
self.assertTrue('A' in l)
self.assertFalse(['A', 'B'] in l)
def test_list_index(self):
l = list('ABCD')
self.assertEqual(l.index('B'), 1)
with self.assertRaises(ValueError):
l.index('')
def test_copy(self):
l = list('ABCD')
l2 = l.copy()
self.assertEqual(l, l2)
l2.pop()
self.assertNotEqual(l, l2)
# @unittest.skip('Fails on Python <= 2.7.6 due to list subclass slicing bug')
def test_slice(self):
"""
Do slices return newlist objects?
"""
l = list(u'abcd')
self.assertEqual(l[:2], [u'a', u'b'])
# Fails due to bug on Py2:
# self.assertEqual(type(l[:2]), list)
self.assertEqual(l[-2:], [u'c', u'd'])
# Fails due to bug on Py2:
# self.assertEqual(type(l[-2:]), list)
# @unittest.skip('Fails on Python <= 2.7.6 due to list subclass slicing bug')
def test_subclassing(self):
"""
Can newlist be subclassed and do list methods then return instances of
the same class? (This is the Py3 behaviour).
"""
class SubClass(list):
pass
l = SubClass(u'abcd')
l2 = SubClass(str(u'abcd'))
self.assertEqual(type(l), SubClass)
self.assertTrue(isinstance(l, list))
# Fails on Py2.7 but passes on Py3.3:
# self.assertEqual(type(l + l), list)
self.assertTrue(isinstance(l[0], str))
self.assertEqual(type(l2[0]), str)
# This is not true on Py3.3:
# self.assertEqual(type(l[:2]), SubClass)
self.assertTrue(isinstance(l[:2], list))
def test_subclassing_2(self):
"""
Tests __new__ method in subclasses. Fails in versions <= 0.11.4
"""
class SubClass(list):
def __new__(cls, *args, **kwargs):
self = list.__new__(cls, *args, **kwargs)
assert type(self) == SubClass
return self
l = SubClass(u'abcd')
self.assertEqual(type(l), SubClass)
self.assertEqual(l, [u'a', u'b', u'c', u'd'])
def test_bool(self):
l = list([])
l2 = list([1, 3, 5])
self.assertFalse(bool(l))
self.assertTrue(bool(l2))
l2.clear()
self.assertFalse(bool(l2))
@expectedFailurePY2
def test_multiple_inheritance(self):
"""
Issue #96 (for newdict instead of newobject)
"""
if utils.PY2:
from collections import Container
else:
from collections.abc import Container
class Base(list):
pass
class Foo(Base, Container):
def __contains__(self, item):
return False
@expectedFailurePY2
def test_with_metaclass_and_list(self):
"""
Issue #91 (for newdict instead of newobject)
"""
from future.utils import with_metaclass
class MetaClass(type):
pass
class TestClass(with_metaclass(MetaClass, list)):
pass
if __name__ == '__main__':
unittest.main()
|