PythonEntryTest.cc 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include <gtest/gtest.h>
  2. #include <gflags/gflags.h>
  3. #include <glog/logging.h>
  4. #include "Python/PythonEntry.h"
  5. namespace Egametang {
  6. class PythonEntryTest: public testing::Test
  7. {
  8. protected:
  9. PythonEntry python_entry_;
  10. public:
  11. PythonEntryTest(): python_entry_()
  12. {}
  13. };
  14. class PersonTest
  15. {
  16. private:
  17. int guid_;
  18. std::string name_;
  19. public:
  20. PersonTest(): guid_(0)
  21. {
  22. }
  23. void SetGuid(int guid)
  24. {
  25. guid_ = guid;
  26. }
  27. int Guid() const
  28. {
  29. return guid_;
  30. }
  31. void SetName(const std::string& name)
  32. {
  33. name_ = name;
  34. }
  35. std::string Name() const
  36. {
  37. return name_;
  38. }
  39. };
  40. typedef boost::shared_ptr<PersonTest> PersonTestPtr;
  41. BOOST_PYTHON_MODULE(PersonTest)
  42. {
  43. boost::python::class_<PersonTest>("Person")
  44. .def("SetGuid", &PersonTest::SetGuid)
  45. .def("Guid", &PersonTest::Guid)
  46. .def("SetName", &PersonTest::SetName)
  47. .def("Name", &PersonTest::Name)
  48. ;
  49. boost::python::register_ptr_to_python<PersonTestPtr>();
  50. }
  51. TEST_F(PythonEntryTest, EnterPythonScript)
  52. {
  53. try
  54. {
  55. initPersonTest();
  56. python_entry_.ImportPath("../../../Src/Egametang/Python/");
  57. python_entry_.ImportModule("PythonEntryTest");
  58. PersonTestPtr person(new PersonTest);
  59. python_entry_.RegisterObjectPtr("person", person);
  60. ASSERT_EQ(0, person->Guid());
  61. // 进到python脚本层设置person的值为2
  62. python_entry_.Execute("PythonEntryTest.fun(person)");
  63. ASSERT_EQ(2, person->Guid());
  64. ASSERT_EQ(std::string("tanghai"), person->Name());
  65. }
  66. catch (boost::python::error_already_set& err)
  67. {
  68. python_init.PrintError();
  69. throw err;
  70. }
  71. }
  72. } // namespace Egametang
  73. int main(int argc, char* argv[])
  74. {
  75. FLAGS_logtostderr = true;
  76. testing::InitGoogleTest(&argc, argv);
  77. google::ParseCommandLineFlags(&argc, &argv, true);
  78. google::InitGoogleLogging(argv[0]);
  79. return RUN_ALL_TESTS();
  80. }