aboutsummaryrefslogtreecommitdiff
path: root/tests/test_stl_binders.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_stl_binders.py')
-rw-r--r--tests/test_stl_binders.py104
1 files changed, 84 insertions, 20 deletions
diff --git a/tests/test_stl_binders.py b/tests/test_stl_binders.py
index 84132a2b..e002f5b6 100644
--- a/tests/test_stl_binders.py
+++ b/tests/test_stl_binders.py
@@ -1,8 +1,5 @@
-# -*- coding: utf-8 -*-
import pytest
-import env # noqa: F401
-
from pybind11_tests import stl_binders as m
@@ -75,18 +72,13 @@ def test_vector_buffer():
assert v[1] == 2
v[2] = 5
mv = memoryview(v) # We expose the buffer interface
- if not env.PY2:
- assert mv[2] == 5
- mv[2] = 6
- else:
- assert mv[2] == "\x05"
- mv[2] = "\x06"
+ assert mv[2] == 5
+ mv[2] = 6
assert v[2] == 6
- if not env.PY2:
- mv = memoryview(b)
- v = m.VectorUChar(mv[::2])
- assert v[1] == 3
+ mv = memoryview(b)
+ v = m.VectorUChar(mv[::2])
+ assert v[1] == 3
with pytest.raises(RuntimeError) as excinfo:
m.create_undeclstruct() # Undeclared struct contents, no buffer interface
@@ -161,15 +153,43 @@ def test_map_string_double():
mm["b"] = 2.5
assert list(mm) == ["a", "b"]
- assert list(mm.items()) == [("a", 1), ("b", 2.5)]
assert str(mm) == "MapStringDouble{a: 1, b: 2.5}"
+ assert "b" in mm
+ assert "c" not in mm
+ assert 123 not in mm
+
+ # Check that keys, values, items are views, not merely iterable
+ keys = mm.keys()
+ values = mm.values()
+ items = mm.items()
+ assert list(keys) == ["a", "b"]
+ assert len(keys) == 2
+ assert "a" in keys
+ assert "c" not in keys
+ assert 123 not in keys
+ assert list(items) == [("a", 1), ("b", 2.5)]
+ assert len(items) == 2
+ assert ("b", 2.5) in items
+ assert "hello" not in items
+ assert ("b", 2.5, None) not in items
+ assert list(values) == [1, 2.5]
+ assert len(values) == 2
+ assert 1 in values
+ assert 2 not in values
+ # Check that views update when the map is updated
+ mm["c"] = -1
+ assert list(keys) == ["a", "b", "c"]
+ assert list(values) == [1, 2.5, -1]
+ assert list(items) == [("a", 1), ("b", 2.5), ("c", -1)]
um = m.UnorderedMapStringDouble()
um["ua"] = 1.1
um["ub"] = 2.6
- assert sorted(list(um)) == ["ua", "ub"]
- assert sorted(list(um.items())) == [("ua", 1.1), ("ub", 2.6)]
+ assert sorted(um) == ["ua", "ub"]
+ assert list(um.keys()) == list(um)
+ assert sorted(um.items()) == [("ua", 1.1), ("ub", 2.6)]
+ assert list(zip(um.keys(), um.values())) == list(um.items())
assert "UnorderedMapStringDouble" in str(um)
@@ -284,8 +304,52 @@ def test_map_delitem():
um["ua"] = 1.1
um["ub"] = 2.6
- assert sorted(list(um)) == ["ua", "ub"]
- assert sorted(list(um.items())) == [("ua", 1.1), ("ub", 2.6)]
+ assert sorted(um) == ["ua", "ub"]
+ assert sorted(um.items()) == [("ua", 1.1), ("ub", 2.6)]
del um["ua"]
- assert sorted(list(um)) == ["ub"]
- assert sorted(list(um.items())) == [("ub", 2.6)]
+ assert sorted(um) == ["ub"]
+ assert sorted(um.items()) == [("ub", 2.6)]
+
+
+def test_map_view_types():
+ map_string_double = m.MapStringDouble()
+ unordered_map_string_double = m.UnorderedMapStringDouble()
+ map_string_double_const = m.MapStringDoubleConst()
+ unordered_map_string_double_const = m.UnorderedMapStringDoubleConst()
+
+ assert map_string_double.keys().__class__.__name__ == "KeysView[str]"
+ assert map_string_double.values().__class__.__name__ == "ValuesView[float]"
+ assert map_string_double.items().__class__.__name__ == "ItemsView[str, float]"
+
+ keys_type = type(map_string_double.keys())
+ assert type(unordered_map_string_double.keys()) is keys_type
+ assert type(map_string_double_const.keys()) is keys_type
+ assert type(unordered_map_string_double_const.keys()) is keys_type
+
+ values_type = type(map_string_double.values())
+ assert type(unordered_map_string_double.values()) is values_type
+ assert type(map_string_double_const.values()) is values_type
+ assert type(unordered_map_string_double_const.values()) is values_type
+
+ items_type = type(map_string_double.items())
+ assert type(unordered_map_string_double.items()) is items_type
+ assert type(map_string_double_const.items()) is items_type
+ assert type(unordered_map_string_double_const.items()) is items_type
+
+
+def test_recursive_vector():
+ recursive_vector = m.RecursiveVector()
+ recursive_vector.append(m.RecursiveVector())
+ recursive_vector[0].append(m.RecursiveVector())
+ recursive_vector[0].append(m.RecursiveVector())
+ # Can't use len() since test_stl_binders.cpp does not include stl.h,
+ # so the necessary conversion is missing
+ assert recursive_vector[0].count(m.RecursiveVector()) == 2
+
+
+def test_recursive_map():
+ recursive_map = m.RecursiveMap()
+ recursive_map[100] = m.RecursiveMap()
+ recursive_map[100][101] = m.RecursiveMap()
+ recursive_map[100][102] = m.RecursiveMap()
+ assert list(recursive_map[100].keys()) == [101, 102]