193 lines
5.5 KiB
Python
193 lines
5.5 KiB
Python
# -*- 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()
|