test_sequences_and_iterators.py revision 12037
111986Sandreas.sandberg@arm.comimport pytest 211986Sandreas.sandberg@arm.com 311986Sandreas.sandberg@arm.com 411986Sandreas.sandberg@arm.comdef isclose(a, b, rel_tol=1e-05, abs_tol=0.0): 511986Sandreas.sandberg@arm.com """Like math.isclose() from Python 3.5""" 611986Sandreas.sandberg@arm.com return abs(a - b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol) 711986Sandreas.sandberg@arm.com 811986Sandreas.sandberg@arm.com 911986Sandreas.sandberg@arm.comdef allclose(a_list, b_list, rel_tol=1e-05, abs_tol=0.0): 1011986Sandreas.sandberg@arm.com return all(isclose(a, b, rel_tol=rel_tol, abs_tol=abs_tol) for a, b in zip(a_list, b_list)) 1111986Sandreas.sandberg@arm.com 1211986Sandreas.sandberg@arm.com 1311986Sandreas.sandberg@arm.comdef test_generalized_iterators(): 1412037Sandreas.sandberg@arm.com from pybind11_tests.sequences_and_iterators import IntPairs 1511986Sandreas.sandberg@arm.com 1611986Sandreas.sandberg@arm.com assert list(IntPairs([(1, 2), (3, 4), (0, 5)]).nonzero()) == [(1, 2), (3, 4)] 1711986Sandreas.sandberg@arm.com assert list(IntPairs([(1, 2), (2, 0), (0, 3), (4, 5)]).nonzero()) == [(1, 2)] 1811986Sandreas.sandberg@arm.com assert list(IntPairs([(0, 3), (1, 2), (3, 4)]).nonzero()) == [] 1911986Sandreas.sandberg@arm.com 2011986Sandreas.sandberg@arm.com assert list(IntPairs([(1, 2), (3, 4), (0, 5)]).nonzero_keys()) == [1, 3] 2111986Sandreas.sandberg@arm.com assert list(IntPairs([(1, 2), (2, 0), (0, 3), (4, 5)]).nonzero_keys()) == [1] 2211986Sandreas.sandberg@arm.com assert list(IntPairs([(0, 3), (1, 2), (3, 4)]).nonzero_keys()) == [] 2311986Sandreas.sandberg@arm.com 2411986Sandreas.sandberg@arm.com 2511986Sandreas.sandberg@arm.comdef test_sequence(): 2612037Sandreas.sandberg@arm.com from pybind11_tests import ConstructorStats 2712037Sandreas.sandberg@arm.com from pybind11_tests.sequences_and_iterators import Sequence 2811986Sandreas.sandberg@arm.com 2911986Sandreas.sandberg@arm.com cstats = ConstructorStats.get(Sequence) 3011986Sandreas.sandberg@arm.com 3111986Sandreas.sandberg@arm.com s = Sequence(5) 3211986Sandreas.sandberg@arm.com assert cstats.values() == ['of size', '5'] 3311986Sandreas.sandberg@arm.com 3411986Sandreas.sandberg@arm.com assert "Sequence" in repr(s) 3511986Sandreas.sandberg@arm.com assert len(s) == 5 3611986Sandreas.sandberg@arm.com assert s[0] == 0 and s[3] == 0 3711986Sandreas.sandberg@arm.com assert 12.34 not in s 3811986Sandreas.sandberg@arm.com s[0], s[3] = 12.34, 56.78 3911986Sandreas.sandberg@arm.com assert 12.34 in s 4011986Sandreas.sandberg@arm.com assert isclose(s[0], 12.34) and isclose(s[3], 56.78) 4111986Sandreas.sandberg@arm.com 4211986Sandreas.sandberg@arm.com rev = reversed(s) 4311986Sandreas.sandberg@arm.com assert cstats.values() == ['of size', '5'] 4411986Sandreas.sandberg@arm.com 4511986Sandreas.sandberg@arm.com rev2 = s[::-1] 4611986Sandreas.sandberg@arm.com assert cstats.values() == ['of size', '5'] 4711986Sandreas.sandberg@arm.com 4811986Sandreas.sandberg@arm.com expected = [0, 56.78, 0, 0, 12.34] 4911986Sandreas.sandberg@arm.com assert allclose(rev, expected) 5011986Sandreas.sandberg@arm.com assert allclose(rev2, expected) 5111986Sandreas.sandberg@arm.com assert rev == rev2 5211986Sandreas.sandberg@arm.com 5311986Sandreas.sandberg@arm.com rev[0::2] = Sequence([2.0, 2.0, 2.0]) 5411986Sandreas.sandberg@arm.com assert cstats.values() == ['of size', '3', 'from std::vector'] 5511986Sandreas.sandberg@arm.com 5611986Sandreas.sandberg@arm.com assert allclose(rev, [2, 56.78, 2, 0, 2]) 5711986Sandreas.sandberg@arm.com 5811986Sandreas.sandberg@arm.com assert cstats.alive() == 3 5911986Sandreas.sandberg@arm.com del s 6011986Sandreas.sandberg@arm.com assert cstats.alive() == 2 6111986Sandreas.sandberg@arm.com del rev 6211986Sandreas.sandberg@arm.com assert cstats.alive() == 1 6311986Sandreas.sandberg@arm.com del rev2 6411986Sandreas.sandberg@arm.com assert cstats.alive() == 0 6511986Sandreas.sandberg@arm.com 6611986Sandreas.sandberg@arm.com assert cstats.values() == [] 6711986Sandreas.sandberg@arm.com assert cstats.default_constructions == 0 6811986Sandreas.sandberg@arm.com assert cstats.copy_constructions == 0 6911986Sandreas.sandberg@arm.com assert cstats.move_constructions >= 1 7011986Sandreas.sandberg@arm.com assert cstats.copy_assignments == 0 7111986Sandreas.sandberg@arm.com assert cstats.move_assignments == 0 7211986Sandreas.sandberg@arm.com 7311986Sandreas.sandberg@arm.com 7411986Sandreas.sandberg@arm.comdef test_map_iterator(): 7512037Sandreas.sandberg@arm.com from pybind11_tests.sequences_and_iterators import StringMap 7611986Sandreas.sandberg@arm.com 7711986Sandreas.sandberg@arm.com m = StringMap({'hi': 'bye', 'black': 'white'}) 7811986Sandreas.sandberg@arm.com assert m['hi'] == 'bye' 7911986Sandreas.sandberg@arm.com assert len(m) == 2 8011986Sandreas.sandberg@arm.com assert m['black'] == 'white' 8111986Sandreas.sandberg@arm.com 8211986Sandreas.sandberg@arm.com with pytest.raises(KeyError): 8311986Sandreas.sandberg@arm.com assert m['orange'] 8411986Sandreas.sandberg@arm.com m['orange'] = 'banana' 8511986Sandreas.sandberg@arm.com assert m['orange'] == 'banana' 8611986Sandreas.sandberg@arm.com 8711986Sandreas.sandberg@arm.com expected = {'hi': 'bye', 'black': 'white', 'orange': 'banana'} 8811986Sandreas.sandberg@arm.com for k in m: 8911986Sandreas.sandberg@arm.com assert m[k] == expected[k] 9011986Sandreas.sandberg@arm.com for k, v in m.items(): 9111986Sandreas.sandberg@arm.com assert v == expected[k] 9212037Sandreas.sandberg@arm.com 9312037Sandreas.sandberg@arm.com 9412037Sandreas.sandberg@arm.comdef test_python_iterator_in_cpp(): 9512037Sandreas.sandberg@arm.com import pybind11_tests.sequences_and_iterators as m 9612037Sandreas.sandberg@arm.com 9712037Sandreas.sandberg@arm.com t = (1, 2, 3) 9812037Sandreas.sandberg@arm.com assert m.object_to_list(t) == [1, 2, 3] 9912037Sandreas.sandberg@arm.com assert m.object_to_list(iter(t)) == [1, 2, 3] 10012037Sandreas.sandberg@arm.com assert m.iterator_to_list(iter(t)) == [1, 2, 3] 10112037Sandreas.sandberg@arm.com 10212037Sandreas.sandberg@arm.com with pytest.raises(TypeError) as excinfo: 10312037Sandreas.sandberg@arm.com m.object_to_list(1) 10412037Sandreas.sandberg@arm.com assert "object is not iterable" in str(excinfo.value) 10512037Sandreas.sandberg@arm.com 10612037Sandreas.sandberg@arm.com with pytest.raises(TypeError) as excinfo: 10712037Sandreas.sandberg@arm.com m.iterator_to_list(1) 10812037Sandreas.sandberg@arm.com assert "incompatible function arguments" in str(excinfo.value) 10912037Sandreas.sandberg@arm.com 11012037Sandreas.sandberg@arm.com def bad_next_call(): 11112037Sandreas.sandberg@arm.com raise RuntimeError("py::iterator::advance() should propagate errors") 11212037Sandreas.sandberg@arm.com 11312037Sandreas.sandberg@arm.com with pytest.raises(RuntimeError) as excinfo: 11412037Sandreas.sandberg@arm.com m.iterator_to_list(iter(bad_next_call, None)) 11512037Sandreas.sandberg@arm.com assert str(excinfo.value) == "py::iterator::advance() should propagate errors" 11612037Sandreas.sandberg@arm.com 11712037Sandreas.sandberg@arm.com l = [1, None, 0, None] 11812037Sandreas.sandberg@arm.com assert m.count_none(l) == 2 11912037Sandreas.sandberg@arm.com assert m.find_none(l) is True 12012037Sandreas.sandberg@arm.com assert m.count_nonzeros({"a": 0, "b": 1, "c": 2}) == 2 12112037Sandreas.sandberg@arm.com 12212037Sandreas.sandberg@arm.com r = range(5) 12312037Sandreas.sandberg@arm.com assert all(m.tuple_iterator(tuple(r))) 12412037Sandreas.sandberg@arm.com assert all(m.list_iterator(list(r))) 12512037Sandreas.sandberg@arm.com assert all(m.sequence_iterator(r)) 126