test_stl_binders.py revision 12037
112037Sandreas.sandberg@arm.comimport pytest
212037Sandreas.sandberg@arm.comimport sys
312037Sandreas.sandberg@arm.com
412037Sandreas.sandberg@arm.comwith pytest.suppress(ImportError):
512037Sandreas.sandberg@arm.com    import numpy as np
612037Sandreas.sandberg@arm.com
712037Sandreas.sandberg@arm.com
811986Sandreas.sandberg@arm.comdef test_vector_int():
911986Sandreas.sandberg@arm.com    from pybind11_tests import VectorInt
1011986Sandreas.sandberg@arm.com
1111986Sandreas.sandberg@arm.com    v_int = VectorInt([0, 0])
1211986Sandreas.sandberg@arm.com    assert len(v_int) == 2
1311986Sandreas.sandberg@arm.com    assert bool(v_int) is True
1411986Sandreas.sandberg@arm.com
1511986Sandreas.sandberg@arm.com    v_int2 = VectorInt([0, 0])
1611986Sandreas.sandberg@arm.com    assert v_int == v_int2
1711986Sandreas.sandberg@arm.com    v_int2[1] = 1
1811986Sandreas.sandberg@arm.com    assert v_int != v_int2
1911986Sandreas.sandberg@arm.com
2011986Sandreas.sandberg@arm.com    v_int2.append(2)
2111986Sandreas.sandberg@arm.com    v_int2.append(3)
2211986Sandreas.sandberg@arm.com    v_int2.insert(0, 1)
2311986Sandreas.sandberg@arm.com    v_int2.insert(0, 2)
2411986Sandreas.sandberg@arm.com    v_int2.insert(0, 3)
2511986Sandreas.sandberg@arm.com    assert str(v_int2) == "VectorInt[3, 2, 1, 0, 1, 2, 3]"
2611986Sandreas.sandberg@arm.com
2711986Sandreas.sandberg@arm.com    v_int.append(99)
2811986Sandreas.sandberg@arm.com    v_int2[2:-2] = v_int
2911986Sandreas.sandberg@arm.com    assert v_int2 == VectorInt([3, 2, 0, 0, 99, 2, 3])
3011986Sandreas.sandberg@arm.com    del v_int2[1:3]
3111986Sandreas.sandberg@arm.com    assert v_int2 == VectorInt([3, 0, 99, 2, 3])
3211986Sandreas.sandberg@arm.com    del v_int2[0]
3311986Sandreas.sandberg@arm.com    assert v_int2 == VectorInt([0, 99, 2, 3])
3411986Sandreas.sandberg@arm.com
3511986Sandreas.sandberg@arm.com
3612037Sandreas.sandberg@arm.com@pytest.unsupported_on_pypy
3712037Sandreas.sandberg@arm.comdef test_vector_buffer():
3812037Sandreas.sandberg@arm.com    from pybind11_tests import VectorUChar, create_undeclstruct
3912037Sandreas.sandberg@arm.com    b = bytearray([1, 2, 3, 4])
4012037Sandreas.sandberg@arm.com    v = VectorUChar(b)
4112037Sandreas.sandberg@arm.com    assert v[1] == 2
4212037Sandreas.sandberg@arm.com    v[2] = 5
4312037Sandreas.sandberg@arm.com    m = memoryview(v)  # We expose the buffer interface
4412037Sandreas.sandberg@arm.com    if sys.version_info.major > 2:
4512037Sandreas.sandberg@arm.com        assert m[2] == 5
4612037Sandreas.sandberg@arm.com        m[2] = 6
4712037Sandreas.sandberg@arm.com    else:
4812037Sandreas.sandberg@arm.com        assert m[2] == '\x05'
4912037Sandreas.sandberg@arm.com        m[2] = '\x06'
5012037Sandreas.sandberg@arm.com    assert v[2] == 6
5112037Sandreas.sandberg@arm.com
5212037Sandreas.sandberg@arm.com    with pytest.raises(RuntimeError):
5312037Sandreas.sandberg@arm.com        create_undeclstruct()  # Undeclared struct contents, no buffer interface
5412037Sandreas.sandberg@arm.com
5512037Sandreas.sandberg@arm.com
5612037Sandreas.sandberg@arm.com@pytest.requires_numpy
5712037Sandreas.sandberg@arm.comdef test_vector_buffer_numpy():
5812037Sandreas.sandberg@arm.com    from pybind11_tests import VectorInt, VectorStruct, get_vectorstruct
5912037Sandreas.sandberg@arm.com
6012037Sandreas.sandberg@arm.com    a = np.array([1, 2, 3, 4], dtype=np.int32)
6112037Sandreas.sandberg@arm.com    with pytest.raises(TypeError):
6212037Sandreas.sandberg@arm.com        VectorInt(a)
6312037Sandreas.sandberg@arm.com
6412037Sandreas.sandberg@arm.com    a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], dtype=np.uintc)
6512037Sandreas.sandberg@arm.com    v = VectorInt(a[0, :])
6612037Sandreas.sandberg@arm.com    assert len(v) == 4
6712037Sandreas.sandberg@arm.com    assert v[2] == 3
6812037Sandreas.sandberg@arm.com    m = np.asarray(v)
6912037Sandreas.sandberg@arm.com    m[2] = 5
7012037Sandreas.sandberg@arm.com    assert v[2] == 5
7112037Sandreas.sandberg@arm.com
7212037Sandreas.sandberg@arm.com    v = VectorInt(a[:, 1])
7312037Sandreas.sandberg@arm.com    assert len(v) == 3
7412037Sandreas.sandberg@arm.com    assert v[2] == 10
7512037Sandreas.sandberg@arm.com
7612037Sandreas.sandberg@arm.com    v = get_vectorstruct()
7712037Sandreas.sandberg@arm.com    assert v[0].x == 5
7812037Sandreas.sandberg@arm.com    m = np.asarray(v)
7912037Sandreas.sandberg@arm.com    m[1]['x'] = 99
8012037Sandreas.sandberg@arm.com    assert v[1].x == 99
8112037Sandreas.sandberg@arm.com
8212037Sandreas.sandberg@arm.com    v = VectorStruct(np.zeros(3, dtype=np.dtype([('w', 'bool'), ('x', 'I'),
8312037Sandreas.sandberg@arm.com                                                 ('y', 'float64'), ('z', 'bool')], align=True)))
8412037Sandreas.sandberg@arm.com    assert len(v) == 3
8512037Sandreas.sandberg@arm.com
8612037Sandreas.sandberg@arm.com
8711986Sandreas.sandberg@arm.comdef test_vector_custom():
8811986Sandreas.sandberg@arm.com    from pybind11_tests import El, VectorEl, VectorVectorEl
8911986Sandreas.sandberg@arm.com
9011986Sandreas.sandberg@arm.com    v_a = VectorEl()
9111986Sandreas.sandberg@arm.com    v_a.append(El(1))
9211986Sandreas.sandberg@arm.com    v_a.append(El(2))
9311986Sandreas.sandberg@arm.com    assert str(v_a) == "VectorEl[El{1}, El{2}]"
9411986Sandreas.sandberg@arm.com
9511986Sandreas.sandberg@arm.com    vv_a = VectorVectorEl()
9611986Sandreas.sandberg@arm.com    vv_a.append(v_a)
9711986Sandreas.sandberg@arm.com    vv_b = vv_a[0]
9811986Sandreas.sandberg@arm.com    assert str(vv_b) == "VectorEl[El{1}, El{2}]"
9911986Sandreas.sandberg@arm.com
10011986Sandreas.sandberg@arm.com
10111986Sandreas.sandberg@arm.comdef test_vector_bool():
10211986Sandreas.sandberg@arm.com    from pybind11_tests import VectorBool
10311986Sandreas.sandberg@arm.com
10411986Sandreas.sandberg@arm.com    vv_c = VectorBool()
10511986Sandreas.sandberg@arm.com    for i in range(10):
10611986Sandreas.sandberg@arm.com        vv_c.append(i % 2 == 0)
10711986Sandreas.sandberg@arm.com    for i in range(10):
10811986Sandreas.sandberg@arm.com        assert vv_c[i] == (i % 2 == 0)
10911986Sandreas.sandberg@arm.com    assert str(vv_c) == "VectorBool[1, 0, 1, 0, 1, 0, 1, 0, 1, 0]"
11011986Sandreas.sandberg@arm.com
11111986Sandreas.sandberg@arm.com
11211986Sandreas.sandberg@arm.comdef test_map_string_double():
11311986Sandreas.sandberg@arm.com    from pybind11_tests import MapStringDouble, UnorderedMapStringDouble
11411986Sandreas.sandberg@arm.com
11511986Sandreas.sandberg@arm.com    m = MapStringDouble()
11611986Sandreas.sandberg@arm.com    m['a'] = 1
11711986Sandreas.sandberg@arm.com    m['b'] = 2.5
11811986Sandreas.sandberg@arm.com
11911986Sandreas.sandberg@arm.com    assert list(m) == ['a', 'b']
12011986Sandreas.sandberg@arm.com    assert list(m.items()) == [('a', 1), ('b', 2.5)]
12111986Sandreas.sandberg@arm.com    assert str(m) == "MapStringDouble{a: 1, b: 2.5}"
12211986Sandreas.sandberg@arm.com
12311986Sandreas.sandberg@arm.com    um = UnorderedMapStringDouble()
12411986Sandreas.sandberg@arm.com    um['ua'] = 1.1
12511986Sandreas.sandberg@arm.com    um['ub'] = 2.6
12611986Sandreas.sandberg@arm.com
12711986Sandreas.sandberg@arm.com    assert sorted(list(um)) == ['ua', 'ub']
12811986Sandreas.sandberg@arm.com    assert sorted(list(um.items())) == [('ua', 1.1), ('ub', 2.6)]
12911986Sandreas.sandberg@arm.com    assert "UnorderedMapStringDouble" in str(um)
13011986Sandreas.sandberg@arm.com
13111986Sandreas.sandberg@arm.com
13211986Sandreas.sandberg@arm.comdef test_map_string_double_const():
13311986Sandreas.sandberg@arm.com    from pybind11_tests import MapStringDoubleConst, UnorderedMapStringDoubleConst
13411986Sandreas.sandberg@arm.com
13511986Sandreas.sandberg@arm.com    mc = MapStringDoubleConst()
13611986Sandreas.sandberg@arm.com    mc['a'] = 10
13711986Sandreas.sandberg@arm.com    mc['b'] = 20.5
13811986Sandreas.sandberg@arm.com    assert str(mc) == "MapStringDoubleConst{a: 10, b: 20.5}"
13911986Sandreas.sandberg@arm.com
14011986Sandreas.sandberg@arm.com    umc = UnorderedMapStringDoubleConst()
14111986Sandreas.sandberg@arm.com    umc['a'] = 11
14211986Sandreas.sandberg@arm.com    umc['b'] = 21.5
14311986Sandreas.sandberg@arm.com
14411986Sandreas.sandberg@arm.com    str(umc)
14511986Sandreas.sandberg@arm.com
14611986Sandreas.sandberg@arm.com
14711986Sandreas.sandberg@arm.comdef test_noncopyable_vector():
14811986Sandreas.sandberg@arm.com    from pybind11_tests import get_vnc
14911986Sandreas.sandberg@arm.com
15011986Sandreas.sandberg@arm.com    vnc = get_vnc(5)
15111986Sandreas.sandberg@arm.com    for i in range(0, 5):
15211986Sandreas.sandberg@arm.com        assert vnc[i].value == i + 1
15311986Sandreas.sandberg@arm.com
15411986Sandreas.sandberg@arm.com    for i, j in enumerate(vnc, start=1):
15511986Sandreas.sandberg@arm.com        assert j.value == i
15611986Sandreas.sandberg@arm.com
15711986Sandreas.sandberg@arm.com
15811986Sandreas.sandberg@arm.comdef test_noncopyable_deque():
15911986Sandreas.sandberg@arm.com    from pybind11_tests import get_dnc
16011986Sandreas.sandberg@arm.com
16111986Sandreas.sandberg@arm.com    dnc = get_dnc(5)
16211986Sandreas.sandberg@arm.com    for i in range(0, 5):
16311986Sandreas.sandberg@arm.com        assert dnc[i].value == i + 1
16411986Sandreas.sandberg@arm.com
16511986Sandreas.sandberg@arm.com    i = 1
16611986Sandreas.sandberg@arm.com    for j in dnc:
16711986Sandreas.sandberg@arm.com        assert(j.value == i)
16811986Sandreas.sandberg@arm.com        i += 1
16911986Sandreas.sandberg@arm.com
17011986Sandreas.sandberg@arm.com
17111986Sandreas.sandberg@arm.comdef test_noncopyable_map():
17211986Sandreas.sandberg@arm.com    from pybind11_tests import get_mnc
17311986Sandreas.sandberg@arm.com
17411986Sandreas.sandberg@arm.com    mnc = get_mnc(5)
17511986Sandreas.sandberg@arm.com    for i in range(1, 6):
17611986Sandreas.sandberg@arm.com        assert mnc[i].value == 10 * i
17711986Sandreas.sandberg@arm.com
17811986Sandreas.sandberg@arm.com    vsum = 0
17911986Sandreas.sandberg@arm.com    for k, v in mnc.items():
18011986Sandreas.sandberg@arm.com        assert v.value == 10 * k
18111986Sandreas.sandberg@arm.com        vsum += v.value
18211986Sandreas.sandberg@arm.com
18311986Sandreas.sandberg@arm.com    assert vsum == 150
18411986Sandreas.sandberg@arm.com
18511986Sandreas.sandberg@arm.com
18611986Sandreas.sandberg@arm.comdef test_noncopyable_unordered_map():
18711986Sandreas.sandberg@arm.com    from pybind11_tests import get_umnc
18811986Sandreas.sandberg@arm.com
18911986Sandreas.sandberg@arm.com    mnc = get_umnc(5)
19011986Sandreas.sandberg@arm.com    for i in range(1, 6):
19111986Sandreas.sandberg@arm.com        assert mnc[i].value == 10 * i
19211986Sandreas.sandberg@arm.com
19311986Sandreas.sandberg@arm.com    vsum = 0
19411986Sandreas.sandberg@arm.com    for k, v in mnc.items():
19511986Sandreas.sandberg@arm.com        assert v.value == 10 * k
19611986Sandreas.sandberg@arm.com        vsum += v.value
19711986Sandreas.sandberg@arm.com
19811986Sandreas.sandberg@arm.com    assert vsum == 150
199