py_tuple_ut.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "ut3/py_test_engine.h"
  2. #include <library/cpp/testing/unittest/registar.h>
  3. using namespace NPython;
  4. Y_UNIT_TEST_SUITE(TPyTupleTest) {
  5. Y_UNIT_TEST(FromPyEmptyTuple) {
  6. TPythonTestEngine engine;
  7. engine.ToMiniKQL<NUdf::TTuple<>>(
  8. "def Test(): return ()",
  9. [](const NUdf::TUnboxedValuePod&) {});
  10. }
  11. Y_UNIT_TEST(FromPyList) {
  12. TPythonTestEngine engine;
  13. engine.ToMiniKQL<NUdf::TTuple<int, int, int>>(
  14. "def Test(): return [1, 2, 3]",
  15. [](const NUdf::TUnboxedValuePod& value) {
  16. UNIT_ASSERT(value);
  17. UNIT_ASSERT(value.IsBoxed());
  18. UNIT_ASSERT_EQUAL(value.GetElement(0).Get<int>(), 1);
  19. UNIT_ASSERT_EQUAL(value.GetElement(1).Get<int>(), 2);
  20. UNIT_ASSERT_EQUAL(value.GetElement(2).Get<int>(), 3);
  21. });
  22. }
  23. Y_UNIT_TEST(FromPyIter) {
  24. TPythonTestEngine engine;
  25. engine.ToMiniKQL<NUdf::TTuple<int, int, int>>(
  26. "def Test(): return iter({1, 2, 3})",
  27. [](const NUdf::TUnboxedValuePod& value) {
  28. UNIT_ASSERT(value);
  29. UNIT_ASSERT(value.IsBoxed());
  30. UNIT_ASSERT_EQUAL(value.GetElement(0).Get<int>(), 1);
  31. UNIT_ASSERT_EQUAL(value.GetElement(1).Get<int>(), 2);
  32. UNIT_ASSERT_EQUAL(value.GetElement(2).Get<int>(), 3);
  33. });
  34. }
  35. Y_UNIT_TEST(FromPyTuple) {
  36. TPythonTestEngine engine;
  37. engine.ToMiniKQL<NUdf::TTuple<int, double, char*>>(
  38. "def Test(): return (1, float(2.3), '4')",
  39. [](const NUdf::TUnboxedValuePod& value) {
  40. UNIT_ASSERT(value);
  41. UNIT_ASSERT(value.IsBoxed());
  42. UNIT_ASSERT_EQUAL(value.GetElement(0).Get<int>(), 1);
  43. auto second = value.GetElement(1);
  44. UNIT_ASSERT_DOUBLES_EQUAL(second.Get<double>(), 2.3, 0.0001);
  45. const auto third = value.GetElement(2);
  46. UNIT_ASSERT_EQUAL(third.AsStringRef(), "4");
  47. });
  48. }
  49. Y_UNIT_TEST(FromPyTupleInTuple) {
  50. TPythonTestEngine engine;
  51. engine.ToMiniKQL<NUdf::TTuple<ui32, NUdf::TTuple<ui8, float>, char*>>(
  52. "def Test(): return (1, (2, float(3.4)), '5')",
  53. [](const NUdf::TUnboxedValuePod& value) {
  54. UNIT_ASSERT(value);
  55. UNIT_ASSERT(value.IsBoxed());
  56. UNIT_ASSERT_EQUAL(value.GetElement(0).Get<ui32>(), 1);
  57. auto second = value.GetElement(1);
  58. UNIT_ASSERT(second);
  59. UNIT_ASSERT(second.IsBoxed());
  60. UNIT_ASSERT_EQUAL(second.GetElement(0).Get<ui8>(), 2);
  61. UNIT_ASSERT_DOUBLES_EQUAL(
  62. second.GetElement(1).Get<float>(), 3.4, 0.0001);
  63. const auto third = value.GetElement(2);
  64. UNIT_ASSERT_EQUAL(third.AsStringRef(), "5");
  65. });
  66. }
  67. Y_UNIT_TEST(ToPyEmptyTuple) {
  68. TPythonTestEngine engine;
  69. engine.ToPython<NUdf::TTuple<>>(
  70. [](const TType* type, const NUdf::IValueBuilder& vb) {
  71. NUdf::TUnboxedValue* items = nullptr;
  72. return vb.NewArray(static_cast<const TTupleType*>(type)->GetElementsCount(), items);
  73. },
  74. "def Test(value):\n"
  75. " assert isinstance(value, tuple)\n"
  76. " assert len(value) == 0\n"
  77. " assert value == ()\n");
  78. }
  79. Y_UNIT_TEST(ToPyTuple) {
  80. TPythonTestEngine engine;
  81. engine.ToPython<NUdf::TTuple<NUdf::TUtf8, ui64, ui8, float>>(
  82. [](const TType* type, const NUdf::IValueBuilder& vb) {
  83. NUdf::TUnboxedValue* items = nullptr;
  84. auto tuple = vb.NewArray(static_cast<const TTupleType*>(type)->GetElementsCount(), items);
  85. items[0] = vb.NewString("111");
  86. items[1] = NUdf::TUnboxedValuePod((ui64) 2);
  87. items[2] = NUdf::TUnboxedValuePod((ui8) 3);
  88. items[3] = NUdf::TUnboxedValuePod((float) 4.5);
  89. return tuple;
  90. },
  91. "def Test(value):\n"
  92. " assert isinstance(value, tuple)\n"
  93. " assert len(value) == 4\n"
  94. " assert value == ('111', 2, 3, 4.5)\n");
  95. }
  96. }