test_cpp_conduit.py
Go to the documentation of this file.
1 # Copyright (c) 2024 The pybind Community.
2 
3 from __future__ import annotations
4 
5 import exo_planet_c_api
6 import exo_planet_pybind11
7 import home_planet_very_lonely_traveler
8 import pytest
9 
10 from pybind11_tests import cpp_conduit as home_planet
11 
12 
14  t_h = home_planet.Traveler("home")
15  assert t_h.any_name == "Traveler GetAttr: any_name luggage: home"
16 
17 
19  t_h = home_planet.PremiumTraveler("home", 7)
20  assert t_h.secret_name == "PremiumTraveler GetAttr: secret_name points: 7"
21 
22 
24  t_h = home_planet.Traveler("home")
25  cap = t_h._pybind11_conduit_v1_(
26  home_planet.PYBIND11_PLATFORM_ABI_ID,
27  home_planet.cpp_type_info_capsule_Traveler,
28  b"raw_pointer_ephemeral",
29  )
30  assert cap.__class__.__name__ == "PyCapsule"
31 
32 
34  t_h = home_planet.Traveler("home")
35  cap = t_h._pybind11_conduit_v1_(
36  home_planet.PYBIND11_PLATFORM_ABI_ID + b"MISMATCH",
37  home_planet.cpp_type_info_capsule_Traveler,
38  b"raw_pointer_ephemeral",
39  )
40  assert cap is None
41 
42 
44  t_h = home_planet.Traveler("home")
45  cap = t_h._pybind11_conduit_v1_(
46  home_planet.PYBIND11_PLATFORM_ABI_ID,
47  home_planet.cpp_type_info_capsule_int,
48  b"raw_pointer_ephemeral",
49  )
50  assert cap is None
51 
52 
54  t_h = home_planet.Traveler("home")
55  with pytest.raises(
56  RuntimeError, match='^Invalid pointer_kind: "raw_pointer_ephemreal"$'
57  ):
58  t_h._pybind11_conduit_v1_(
59  home_planet.PYBIND11_PLATFORM_ABI_ID,
60  home_planet.cpp_type_info_capsule_Traveler,
61  b"raw_pointer_ephemreal",
62  )
63 
64 
66  t_h = home_planet.Traveler("home")
67  assert t_h.luggage == "home"
68  assert home_planet.get_luggage(t_h) == "home"
69 
70 
72  p_h = home_planet.PremiumTraveler("home", 2)
73  assert p_h.luggage == "home"
74  assert home_planet.get_luggage(p_h) == "home"
75  assert home_planet.get_points(p_h) == 2
76 
77 
79  t_e = exo_planet_pybind11.Traveler("exo")
80  assert t_e.luggage == "exo"
81  assert exo_planet_pybind11.get_luggage(t_e) == "exo"
82 
83 
85  p_e = exo_planet_pybind11.PremiumTraveler("exo", 3)
86  assert p_e.luggage == "exo"
87  assert exo_planet_pybind11.get_luggage(p_e) == "exo"
88  assert exo_planet_pybind11.get_points(p_e) == 3
89 
90 
92  t_h = home_planet.Traveler("home")
93  assert exo_planet_pybind11.get_luggage(t_h) == "home"
94 
95 
97  t_e = exo_planet_pybind11.Traveler("exo")
98  assert home_planet.get_luggage(t_e) == "exo"
99 
100 
102  p_h = home_planet.PremiumTraveler("home", 2)
103  assert exo_planet_pybind11.get_luggage(p_h) == "home"
104  assert exo_planet_pybind11.get_points(p_h) == 2
105 
106 
108  p_e = exo_planet_pybind11.PremiumTraveler("exo", 3)
109  assert home_planet.get_luggage(p_e) == "exo"
110  assert home_planet.get_points(p_e) == 3
111 
112 
113 @pytest.mark.parametrize(
114  "traveler_type", [home_planet.Traveler, exo_planet_pybind11.Traveler]
115 )
117  t = traveler_type("socks")
118  assert exo_planet_c_api.GetLuggage(t) == "socks"
119 
120 
121 @pytest.mark.parametrize(
122  "premium_traveler_type",
123  [home_planet.PremiumTraveler, exo_planet_pybind11.PremiumTraveler],
124 )
125 def test_exo_planet_c_api_premium_traveler(premium_traveler_type):
126  pt = premium_traveler_type("gucci", 5)
127  assert exo_planet_c_api.GetLuggage(pt) == "gucci"
128  assert exo_planet_c_api.GetPoints(pt) == 5
129 
130 
132  # This does not exercise the cpp_conduit feature, but is here to
133  # demonstrate that the cpp_conduit feature does not solve all
134  # cross-extension interoperability issues.
135  # Here is the proof that the following works for extensions with
136  # matching `PYBIND11_INTERNALS_ID`s:
137  # test_cpp_conduit.cpp:
138  # py::class_<LonelyTraveler>
139  # home_planet_very_lonely_traveler.cpp:
140  # py::class_<VeryLonelyTraveler, LonelyTraveler>
141  # See test_exo_planet_pybind11_wrap_very_lonely_traveler() for the negative
142  # test.
143  assert home_planet.LonelyTraveler is not None # Verify that the base class exists.
144  home_planet_very_lonely_traveler.wrap_very_lonely_traveler()
145  # Ensure that the derived class exists.
146  assert home_planet_very_lonely_traveler.VeryLonelyTraveler is not None
147 
148 
150  # See comment under test_home_planet_wrap_very_lonely_traveler() first.
151  # Here the `PYBIND11_INTERNALS_ID`s don't match between:
152  # test_cpp_conduit.cpp:
153  # py::class_<LonelyTraveler>
154  # exo_planet_pybind11.cpp:
155  # py::class_<VeryLonelyTraveler, LonelyTraveler>
156  assert home_planet.LonelyTraveler is not None # Verify that the base class exists.
157  with pytest.raises(
158  RuntimeError,
159  match='^generic_type: type "VeryLonelyTraveler" referenced unknown base type '
160  '"pybind11_tests::test_cpp_conduit::LonelyTraveler"$',
161  ):
162  exo_planet_pybind11.wrap_very_lonely_traveler()
test_cpp_conduit.test_home_only_basic
def test_home_only_basic()
Definition: test_cpp_conduit.py:65
test_cpp_conduit.test_exo_only_premium
def test_exo_only_premium()
Definition: test_cpp_conduit.py:84
test_cpp_conduit.test_exo_only_basic
def test_exo_only_basic()
Definition: test_cpp_conduit.py:78
test_cpp_conduit.test_call_cpp_conduit_pointer_kind_invalid
def test_call_cpp_conduit_pointer_kind_invalid()
Definition: test_cpp_conduit.py:53
test_cpp_conduit.test_call_cpp_conduit_platform_abi_id_mismatch
def test_call_cpp_conduit_platform_abi_id_mismatch()
Definition: test_cpp_conduit.py:33
test_cpp_conduit.test_call_cpp_conduit_cpp_type_info_capsule_mismatch
def test_call_cpp_conduit_cpp_type_info_capsule_mismatch()
Definition: test_cpp_conduit.py:43
test_cpp_conduit.test_exo_planet_c_api_premium_traveler
def test_exo_planet_c_api_premium_traveler(premium_traveler_type)
Definition: test_cpp_conduit.py:125
test_cpp_conduit.test_home_passed_to_exo_basic
def test_home_passed_to_exo_basic()
Definition: test_cpp_conduit.py:91
test_cpp_conduit.test_exo_planet_c_api_traveler
def test_exo_planet_c_api_traveler(traveler_type)
Definition: test_cpp_conduit.py:116
test_cpp_conduit.test_exo_passed_to_home_premium
def test_exo_passed_to_home_premium()
Definition: test_cpp_conduit.py:107
test_cpp_conduit.test_home_passed_to_exo_premium
def test_home_passed_to_exo_premium()
Definition: test_cpp_conduit.py:101
test_cpp_conduit.test_call_cpp_conduit_success
def test_call_cpp_conduit_success()
Definition: test_cpp_conduit.py:23
test_cpp_conduit.test_traveler_getattr_actually_exists
def test_traveler_getattr_actually_exists()
Definition: test_cpp_conduit.py:13
test_cpp_conduit.test_premium_traveler_getattr_actually_exists
def test_premium_traveler_getattr_actually_exists()
Definition: test_cpp_conduit.py:18
test_cpp_conduit.test_home_planet_wrap_very_lonely_traveler
def test_home_planet_wrap_very_lonely_traveler()
Definition: test_cpp_conduit.py:131
test_cpp_conduit.test_exo_planet_pybind11_wrap_very_lonely_traveler
def test_exo_planet_pybind11_wrap_very_lonely_traveler()
Definition: test_cpp_conduit.py:149
test_cpp_conduit.test_home_only_premium
def test_home_only_premium()
Definition: test_cpp_conduit.py:71
test_cpp_conduit.test_exo_passed_to_home_basic
def test_exo_passed_to_home_basic()
Definition: test_cpp_conduit.py:96


gtsam
Author(s):
autogenerated on Wed Mar 19 2025 03:06:17