python-future/tests/test_future/test_list.py

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()