def test_iterable(): """ PDeques can be created from iterables even though they can't be len() hinted. """ assert pdeque(iter("a")) == pdeque(iter("a"))
def test_comparison(): small = pdeque([1, 2]) large = pdeque([1, 2, 3]) assert small < large assert large > small assert not small > large assert not large < small assert large != small # Not equal to other types assert small != [1, 2]
def test_remove(): assert pdeque([1, 2, 3, 4]).remove(2) == pdeque([1, 3, 4]) assert pdeque([1, 2, 3, 4]).remove(4) == pdeque([1, 2, 3]) # Right list must be reversed before removing element assert pdeque([1, 2, 3, 3, 4, 5, 4, 6]).remove(4) == pdeque([1, 2, 3, 3, 5, 4, 6])
def test_indexing(): assert pdeque([1, 2, 3])[0] == 1 assert pdeque([1, 2, 3])[1] == 2 assert pdeque([1, 2, 3])[2] == 3 assert pdeque([1, 2, 3])[-1] == 3 assert pdeque([1, 2, 3])[-2] == 2 assert pdeque([1, 2, 3])[-3] == 1
def test_indexing_out_of_range(): with pytest.raises(IndexError): pdeque([1, 2, 3])[-4] with pytest.raises(IndexError): pdeque([1, 2, 3])[3] with pytest.raises(IndexError): pdeque([2])[-2]
def test_popleft(): x = pdeque([1, 2, 3, 4]).popleft() assert x.left == 2 assert x.right == 4 x = x.popleft() assert x.left == 3 assert x.right == 4 x = x.popleft() assert x.right == 4 assert x.left == 4 x = x.popleft() assert x == pdeque() x = pdeque([1, 2]).popleft() assert x == pdeque([2]) x = x.popleft() assert x == pdeque() assert pdeque().append(1).popleft() == pdeque() assert pdeque().appendleft(1).popleft() == pdeque()
def test_remove_element_missing(): with pytest.raises(ValueError): pdeque().remove(2) with pytest.raises(ValueError): pdeque([1, 2, 3]).remove(4)
def test_count(): x = pdeque([1, 2, 3, 2, 1]) assert x.count(1) == 2 assert x.count(2) == 2
def test_extendleft(): assert pdeque([2, 1]).extendleft([3, 4]) == pdeque([4, 3, 2, 1])
def test_pop_multiple(): assert pdeque([1, 2, 3, 4]).pop(3) == pdeque([1]) assert pdeque([1, 2]).pop(3) == pdeque()
def test_hashing(): assert hash(pdeque([1, 2, 3])) == hash(pdeque().append(1).append(2).append(3))
def test_construction_with_maxlen(): assert pdeque([1, 2, 3, 4], maxlen=2) == pdeque([3, 4]) assert pdeque([1, 2, 3, 4], maxlen=4) == pdeque([1, 2, 3, 4]) assert pdeque([], maxlen=2) == pdeque()
def test_set_maxlen(): x = pdeque([], maxlen=4) assert x.maxlen == 4 with pytest.raises(AttributeError): x.maxlen = 5
def test_rotate_left(): assert pdeque([1, 2, 3, 4, 5]).rotate(-2) == pdeque([3, 4, 5, 1, 2]) assert pdeque().rotate(-2) == pdeque()
def test_construction_with_invalid_maxlen(): with pytest.raises(TypeError): pdeque([], maxlen='foo') with pytest.raises(ValueError): pdeque([], maxlen=-3)
def test_rotate_right(): assert pdeque([1, 2, 3, 4, 5]).rotate(2) == pdeque([4, 5, 1, 2, 3]) assert pdeque([1, 2]).rotate(0) == pdeque([1, 2]) assert pdeque().rotate(2) == pdeque()
def test_reverse(): assert pdeque([1, 2, 3, 4]).reverse() == pdeque([4, 3, 2, 1]) assert pdeque().reverse() == pdeque()
def test_indexing_invalid_type(): with pytest.raises(TypeError) as e: pdeque([1, 2, 3])['foo'] assert 'cannot be interpreted' in str(e)
def test_pickling(): input = pdeque([1, 2, 3], maxlen=5) output = pickle.loads(pickle.dumps(input, -1)) assert output == input assert output.maxlen == input.maxlen
def test_literalish(): assert dq(1, 2, 3) == pdeque([1, 2, 3])
def test_slicing(): assert pdeque([1, 2, 3])[1:2] == pdeque([2]) assert pdeque([1, 2, 3])[2:1] == pdeque([]) assert pdeque([1, 2, 3])[-2:-1] == pdeque([2]) assert pdeque([1, 2, 3])[::2] == pdeque([1, 3])
def test_extend_with_maxlen(): assert pdeque([1, 2], maxlen=3).extend([3, 4]) == pdeque([2, 3, 4]) assert pdeque([1, 2], maxlen=2).extend([3, 4]) == pdeque([3, 4]) assert pdeque([], maxlen=2).extend([1, 2]) == pdeque([1, 2]) assert pdeque([], maxlen=0).extend([1, 2]) == pdeque([])
def test_index(): assert pdeque([1, 2, 3]).index(3) == 2
def test_extendleft_with_maxlen(): assert pdeque([1, 2], maxlen=3).extendleft([3, 4]) == pdeque([4, 3, 1]) assert pdeque([1, 2], maxlen=2).extendleft([3, 4]) == pdeque([4, 3]) assert pdeque([], maxlen=2).extendleft([1, 2]) == pdeque([2, 1]) assert pdeque([], maxlen=0).extendleft([1, 2]) == pdeque([])
def test_extend(): assert pdeque([1, 2]).extend([3, 4]) == pdeque([1, 2, 3, 4])
def test_basic_right_and_left(): x = pdeque([1, 2]) assert x.right == 2 assert x.left == 1 assert len(x) == 2
def test_pop_with_negative_index(): assert pdeque([1, 2, 3]).pop(-1) == pdeque([1, 2, 3]).popleft(1) assert pdeque([1, 2, 3]).popleft(-1) == pdeque([1, 2, 3]).pop(1)
def test_left_on_empty_deque(): with pytest.raises(IndexError): pdeque().left
def test_right_on_empty_deque(): with pytest.raises(IndexError): pdeque().right
def test_popleft_multiple(): assert pdeque([1, 2, 3, 4]).popleft(3) == pdeque([4])