py_callable_ut.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include "ut3/py_test_engine.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. using namespace NPython;
  4. Y_UNIT_TEST_SUITE(TPyCallableTest) {
  5. struct TTestCallable: public NUdf::TBoxedValue {
  6. NUdf::TUnboxedValue Run(
  7. const NUdf::IValueBuilder* valueBuilder,
  8. const NUdf::TUnboxedValuePod* args) const override
  9. {
  10. Y_UNUSED(valueBuilder);
  11. return NUdf::TUnboxedValuePod(args[0].Get<ui32>() + 42);
  12. }
  13. };
  14. Y_UNIT_TEST(FromPyFunction) {
  15. TPythonTestEngine engine;
  16. const NUdf::IValueBuilder* vb = &engine.GetValueBuilder();
  17. engine.ToMiniKQL<char* (*)(char*, ui32)>(
  18. "def Test():\n"
  19. " def test(str, count):\n"
  20. " return str * count\n"
  21. " return test",
  22. [vb](const NUdf::TUnboxedValuePod& value) {
  23. UNIT_ASSERT(value);
  24. UNIT_ASSERT(value.IsBoxed());
  25. NUdf::TUnboxedValue args[2];
  26. args[0] = vb->NewString("j");
  27. args[1] = NUdf::TUnboxedValuePod((ui32) 5);
  28. auto result = value.Run(vb, args);
  29. UNIT_ASSERT(result);
  30. UNIT_ASSERT(5 == result.AsStringRef().Size());
  31. UNIT_ASSERT_STRINGS_EQUAL(result.AsStringRef(), "jjjjj");
  32. });
  33. }
  34. Y_UNIT_TEST(ToPython) {
  35. TPythonTestEngine engine;
  36. engine.ToPython<i32 (*)(i32)>(
  37. [](const TType* type, const NUdf::IValueBuilder& vb) {
  38. Y_UNUSED(type); Y_UNUSED(vb);
  39. return NUdf::TUnboxedValuePod(new TTestCallable);
  40. },
  41. "def Test(value):\n"
  42. " assert type(value).__name__ == 'TCallable'\n"
  43. " assert value.__call__ != None\n"
  44. " assert value(-2) == 40\n"
  45. " assert value(-1) == 41\n"
  46. " assert value(0) == 42\n"
  47. " assert value(1) == 43\n"
  48. " assert value(2) == 44\n");
  49. }
  50. Y_UNIT_TEST(ToPythonAndBack) {
  51. struct TTestCallable: public NUdf::TBoxedValue {
  52. NUdf::TUnboxedValue Run(
  53. const NUdf::IValueBuilder* valueBuilder,
  54. const NUdf::TUnboxedValuePod* args) const override
  55. {
  56. Y_UNUSED(valueBuilder);
  57. return NUdf::TUnboxedValuePod(args[0].Get<ui32>() + 42);
  58. }
  59. };
  60. TPythonTestEngine engine;
  61. engine.ToPythonAndBack<i32 (*)(i32)>(
  62. [](const TType* type, const NUdf::IValueBuilder& vb) {
  63. Y_UNUSED(type); Y_UNUSED(vb);
  64. return NUdf::TUnboxedValuePod(new TTestCallable);
  65. },
  66. "def Test(value): return value",
  67. [](const NUdf::TUnboxedValuePod& value) {
  68. UNIT_ASSERT(value);
  69. UNIT_ASSERT(value.IsBoxed());
  70. NUdf::TUnboxedValue arg = NUdf::TUnboxedValuePod((ui32) 5);
  71. const auto result = value.Run(nullptr, &arg);
  72. UNIT_ASSERT(result);
  73. UNIT_ASSERT_VALUES_EQUAL(47, result.Get<ui32>());
  74. });
  75. }
  76. }