types.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #include "test.h"
  2. TEST_F(PYBIND11_TEST, int) {
  3. py::object obj = py::int_(123);
  4. py::object obj2 = py::eval("123");
  5. EXPECT_EQ(obj, obj2);
  6. EXPECT_EQ(obj.cast<int>(), 123);
  7. EXPECT_EQ(obj.cast<long>(), 123);
  8. EXPECT_EQ(obj.cast<long long>(), 123);
  9. }
  10. TEST_F(PYBIND11_TEST, float) {
  11. py::object obj = py::float_(123.0);
  12. py::object obj2 = py::eval("123.0");
  13. EXPECT_EQ(obj, obj2);
  14. EXPECT_EQ(obj.cast<float>(), 123.0);
  15. EXPECT_EQ(obj.cast<double>(), 123.0);
  16. }
  17. TEST_F(PYBIND11_TEST, str) {
  18. py::object obj = py::str("123");
  19. py::object obj2 = py::eval("'123'");
  20. EXPECT_EQ(obj, obj2);
  21. EXPECT_STREQ(obj.cast<const char*>(), "123");
  22. EXPECT_EQ(obj.cast<std::string>(), "123");
  23. EXPECT_EQ(obj.cast<std::string_view>(), "123");
  24. auto s = py::str("Hello, {}");
  25. EXPECT_EQ(s.format("world").cast<std::string>(), "Hello, world");
  26. }
  27. TEST_F(PYBIND11_TEST, tuple) {
  28. py::tuple tuple = py::tuple{
  29. py::int_(1),
  30. py::str("123"),
  31. py::int_(3),
  32. };
  33. EXPECT_EQ(tuple, py::eval("(1, '123', 3)"));
  34. EXPECT_EQ(tuple.size(), 3);
  35. EXPECT_FALSE(tuple.empty());
  36. tuple[0] = py::int_(3);
  37. tuple[2] = py::int_(1);
  38. EXPECT_EQ(tuple, py::eval("(3, '123', 1)"));
  39. // iterators.
  40. int index = 0;
  41. for(auto item: tuple) {
  42. if(index == 0) {
  43. EXPECT_EQ(item, py::int_(3));
  44. } else if(index == 1) {
  45. EXPECT_EQ(item, py::str("123"));
  46. } else if(index == 2) {
  47. EXPECT_EQ(item, py::int_(1));
  48. }
  49. index++;
  50. }
  51. }
  52. TEST_F(PYBIND11_TEST, list) {
  53. // constructors
  54. py::list list = py::list();
  55. EXPECT_EQ(list, py::eval("[]"));
  56. EXPECT_EQ(list.size(), 0);
  57. EXPECT_TRUE(list.empty());
  58. list = py::list{
  59. py::int_(1),
  60. py::int_(2),
  61. py::int_(3),
  62. };
  63. EXPECT_EQ(list, py::eval("[1, 2, 3]"));
  64. EXPECT_EQ(list.size(), 3);
  65. EXPECT_FALSE(list.empty());
  66. // accessor
  67. list[0] = py::int_(3);
  68. list[2] = py::int_(1);
  69. EXPECT_EQ(list, py::eval("[3, 2, 1]"));
  70. // iterators
  71. int index = 0;
  72. for(auto item: list) {
  73. if(index == 0) {
  74. EXPECT_EQ(item, py::int_(3));
  75. } else if(index == 1) {
  76. EXPECT_EQ(item, py::int_(2));
  77. } else if(index == 2) {
  78. EXPECT_EQ(item, py::int_(1));
  79. }
  80. index++;
  81. }
  82. // others
  83. list.append(py::int_(4));
  84. EXPECT_EQ(list, py::eval("[3, 2, 1, 4]"));
  85. list.insert(0, py::int_(7));
  86. EXPECT_EQ(list, py::eval("[7, 3, 2, 1, 4]"));
  87. }
  88. TEST_F(PYBIND11_TEST, dict) {
  89. // constructors
  90. py::dict dict = py::dict();
  91. EXPECT_EQ(dict, py::eval("{}"));
  92. EXPECT_EQ(dict.size(), 0);
  93. EXPECT_TRUE(dict.empty());
  94. // accessor
  95. dict["a"] = py::int_(1);
  96. dict["b"] = py::int_(2);
  97. dict["c"] = py::int_(3);
  98. EXPECT_EQ(dict, py::eval("{'a': 1, 'b': 2, 'c': 3}"));
  99. EXPECT_EQ(dict,
  100. py::dict({
  101. {"a", py::int_(1)},
  102. {"b", py::int_(2)},
  103. {"c", py::int_(3)},
  104. }));
  105. // iterators
  106. int index = 0;
  107. for(auto item: dict) {
  108. if(index == 0) {
  109. EXPECT_EQ(item.first.cast<std::string>(), "a");
  110. EXPECT_EQ(item.second, py::int_(1));
  111. } else if(index == 1) {
  112. EXPECT_EQ(item.first.cast<std::string>(), "b");
  113. EXPECT_EQ(item.second, py::int_(2));
  114. } else if(index == 2) {
  115. EXPECT_EQ(item.first.cast<std::string>(), "c");
  116. EXPECT_EQ(item.second, py::int_(3));
  117. }
  118. index++;
  119. }
  120. }
  121. TEST_F(PYBIND11_TEST, capsule) {
  122. static int times = 0;
  123. struct NotTrivial {
  124. ~NotTrivial() { times++; }
  125. };
  126. py::handle x = py::capsule(new NotTrivial(), [](void* ptr) {
  127. delete static_cast<NotTrivial*>(ptr);
  128. });
  129. auto m = py::module_::__main__();
  130. m.def("foo", [](int x) {
  131. return py::capsule(new int(x));
  132. });
  133. m.def("bar", [](py::capsule x, int y) {
  134. EXPECT_EQ(x.cast<int>(), y);
  135. delete (int*)x.data();
  136. });
  137. py::exec("bar(foo(123), 123)");
  138. py::finalize(true);
  139. EXPECT_EQ(times, 1);
  140. }