py_resource_ut.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include "ut3/py_test_engine.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. using namespace NPython;
  4. extern const char SimpleDataTag[] = "SimpleData";
  5. extern const char PythonTestTag[] = PYTHON_TEST_TAG;
  6. struct TSimpleData {
  7. TString Name;
  8. ui32 Age;
  9. TSimpleData(const TString& name, ui32 age)
  10. : Name(name)
  11. , Age(age)
  12. {}
  13. };
  14. using TSimpleDataResource = NUdf::TBoxedResource<TSimpleData, SimpleDataTag>;
  15. Y_UNIT_TEST_SUITE(TPyResourceTest) {
  16. Y_UNIT_TEST(MkqlObject) {
  17. TPythonTestEngine engine;
  18. TPyObjectPtr pyValue = engine.ToPython<NUdf::TResource<SimpleDataTag>>(
  19. [](const TType* type, const NUdf::IValueBuilder& vb) {
  20. Y_UNUSED(type); Y_UNUSED(vb);
  21. return NUdf::TUnboxedValuePod(new TSimpleDataResource("Jamel", 99));
  22. },
  23. "import yql\n"
  24. "\n"
  25. "def Test(value):\n"
  26. " assert str(value).startswith('<capsule object \"YqlResourceCapsule\" at ')\n"
  27. " assert repr(value).startswith('<capsule object \"YqlResourceCapsule\" at ')\n"
  28. " assert type(value).__name__ == 'PyCapsule'\n"
  29. " return value\n");
  30. UNIT_ASSERT(!!pyValue);
  31. engine.ToMiniKQLWithArg<NUdf::TResource<SimpleDataTag>>(
  32. pyValue.Get(),
  33. "import yql\n"
  34. "\n"
  35. "def Test(value):\n"
  36. " return value\n",
  37. [](const NUdf::TUnboxedValuePod& value) {
  38. UNIT_ASSERT(value);;
  39. UNIT_ASSERT(value.IsBoxed());
  40. UNIT_ASSERT_STRINGS_EQUAL(value.GetResourceTag(), SimpleDataTag);
  41. auto simpleData =
  42. reinterpret_cast<TSimpleData*>(value.GetResource());
  43. UNIT_ASSERT_EQUAL(simpleData->Age, 99);
  44. UNIT_ASSERT_STRINGS_EQUAL(simpleData->Name, "Jamel");
  45. });
  46. }
  47. Y_UNIT_TEST(PythonObject) {
  48. TPythonTestEngine engine;
  49. NUdf::TUnboxedValue mkqlValue = engine.FromPython<NUdf::TResource<PythonTestTag>>(
  50. "class CustomStruct:\n"
  51. " def __init__(self, name, age):\n"
  52. " self.name = name\n"
  53. " self.age = age\n"
  54. "\n"
  55. "def Test():\n"
  56. " return CustomStruct('Jamel', 97)\n");
  57. UNIT_ASSERT(mkqlValue);
  58. UNIT_ASSERT_STRINGS_EQUAL(mkqlValue.GetResourceTag(), PythonTestTag);
  59. TPyObjectPtr pyValue = engine.ToPython<NUdf::TResource<PythonTestTag>>(
  60. [mkqlValue](const TType* type, const NUdf::IValueBuilder& vb) {
  61. Y_UNUSED(type); Y_UNUSED(vb);
  62. return mkqlValue;
  63. },
  64. "def Test(value):\n"
  65. " assert isinstance(value, CustomStruct)\n"
  66. " assert value.age, 97\n"
  67. " assert value.name, 'Jamel'\n");
  68. UNIT_ASSERT(!!pyValue);
  69. }
  70. }