py_variant_ut.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include "py_variant.h"
  2. #include "ut3/py_test_engine.h"
  3. #include <library/cpp/testing/unittest/registar.h>
  4. using namespace NPython;
  5. Y_UNIT_TEST_SUITE(TPyVariantTest) {
  6. Y_UNIT_TEST(FromPyWithIndex) {
  7. TPythonTestEngine engine;
  8. engine.ToMiniKQL<NUdf::TVariant<float, ui32, char*>>(
  9. "def Test():\n"
  10. " return (2, 'hello')\n",
  11. [](const NUdf::TUnboxedValuePod& value) {
  12. UNIT_ASSERT(value);
  13. UNIT_ASSERT_EQUAL(value.GetVariantIndex(), 2);
  14. auto item = value.GetVariantItem();
  15. UNIT_ASSERT_STRINGS_EQUAL(item.AsStringRef(), "hello");
  16. });
  17. }
  18. Y_UNIT_TEST(FromPyWithName) {
  19. TPythonTestEngine engine;
  20. ui32 ageIdx = 0, nameIdx = 0;
  21. NUdf::TType* personType = engine.GetTypeBuilder().Struct()->
  22. AddField<ui32>("age", &ageIdx)
  23. .AddField<char*>("name", &nameIdx)
  24. .Build();
  25. NUdf::TType* variantType = engine.GetTypeBuilder()
  26. .Variant()->Over(personType).Build();
  27. engine.ToMiniKQL(
  28. variantType,
  29. "def Test():\n"
  30. " return ('age', 99)\n",
  31. [ageIdx](const NUdf::TUnboxedValuePod& value) {
  32. UNIT_ASSERT(value);
  33. UNIT_ASSERT_EQUAL(value.GetVariantIndex(), ageIdx);
  34. auto item = value.GetVariantItem();
  35. UNIT_ASSERT_EQUAL(item.Get<ui32>(), 99);
  36. });
  37. engine.ToMiniKQL(
  38. variantType,
  39. "def Test():\n"
  40. " return ('name', 'Jamel')\n",
  41. [nameIdx](const NUdf::TUnboxedValuePod& value) {
  42. UNIT_ASSERT(value);
  43. UNIT_ASSERT_EQUAL(value.GetVariantIndex(), nameIdx);
  44. auto item = value.GetVariantItem();
  45. UNIT_ASSERT_STRINGS_EQUAL(item.AsStringRef(), "Jamel");
  46. });
  47. }
  48. Y_UNIT_TEST(ToPyWithIndex) {
  49. TPythonTestEngine engine;
  50. engine.ToPython<NUdf::TVariant<float, ui32, char*>>(
  51. [](const TType* /*type*/, const NUdf::IValueBuilder& vb) {
  52. return vb.NewVariant(1, NUdf::TUnboxedValuePod((ui32) 42));
  53. },
  54. "def Test(value):\n"
  55. " assert isinstance(value, tuple)\n"
  56. " assert value == (1, 42)\n");
  57. }
  58. Y_UNIT_TEST(ToPyWithName) {
  59. TPythonTestEngine engine;
  60. ui32 ageIdx = 0, nameIdx = 0;
  61. NUdf::TType* personType = engine.GetTypeBuilder().Struct()->
  62. AddField<ui32>("age", &ageIdx)
  63. .AddField<NUdf::TUtf8>("name", &nameIdx)
  64. .Build();
  65. NUdf::TType* variantType = engine.GetTypeBuilder()
  66. .Variant()->Over(personType).Build();
  67. engine.ToPython(
  68. variantType,
  69. [ageIdx](const TType* /*type*/, const NUdf::IValueBuilder& vb) {
  70. return vb.NewVariant(ageIdx, NUdf::TUnboxedValuePod((ui32) 99));
  71. },
  72. "def Test(value):\n"
  73. " assert isinstance(value, tuple)\n"
  74. " assert value == ('age', 99)\n"
  75. );
  76. engine.ToPython(
  77. variantType,
  78. [nameIdx](const TType* /*type*/, const NUdf::IValueBuilder& vb) {
  79. return vb.NewVariant(nameIdx, vb.NewString("Jamel"));
  80. },
  81. "def Test(value):\n"
  82. " assert isinstance(value, tuple)\n"
  83. " assert value == ('name', 'Jamel')\n"
  84. );
  85. }
  86. }