summaryrefslogtreecommitdiffstats
path: root/yql/essentials/minikql/comp_nodes/ut/mkql_block_variant_node_ut.cpp
blob: a43cb11850cf732b501d499f9e019cdb4cdd7754 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <yql/essentials/minikql/comp_nodes/mkql_block_variant.h>

#include <yql/essentials/minikql/comp_nodes/ut/mkql_block_test_helper.h>
#include <yql/essentials/minikql/comp_nodes/ut/mkql_computation_node_ut.h>

namespace NKikimr::NMiniKQL {

using namespace NTest;

Y_UNIT_TEST_SUITE(TMiniKQLBlockVariantNodeTest) {

Y_UNIT_TEST(TupleVariant_Ui32_IntoIndex0) {
    using TVariant = std::variant<ui32, ui64>;
    TVector<ui32> data = {1u, 2u, 3u};
    TVector<TVariant> expected = {TVariant{ui32{1u}}, TVariant{ui32{2u}}, TVariant{ui32{3u}}};
    TBlockHelper().TestKernelFuzzied(data, expected, [](TSetup<false>& setup, TRuntimeNode payloadValue) {
        auto& pb = *setup.PgmBuilder;
        return pb.BlockVariant(payloadValue, 0u, ConvertToMinikqlType<TVariant>(pb));
    });
}

Y_UNIT_TEST(TupleVariant_Ui64_IntoIndex1) {
    using TVariant = std::variant<ui32, ui64>;
    TVector<ui64> data = {10ull, 20ull, 30ull};
    TVector<TVariant> expected = {TVariant{ui64{10ull}}, TVariant{ui64{20ull}}, TVariant{ui64{30ull}}};
    TBlockHelper().TestKernelFuzzied(data, expected, [](TSetup<false>& setup, TRuntimeNode payloadValue) {
        auto& pb = *setup.PgmBuilder;
        return pb.BlockVariant(payloadValue, 1u, ConvertToMinikqlType<TVariant>(pb));
    });
}

Y_UNIT_TEST(TupleVariant_StringAlternative) {
    using TVariant = std::variant<ui32, TString>;
    TVector<TString> data = {TString{"hello"}, TString{"world"}};
    TVector<TVariant> expected = {TVariant{TString{"hello"}}, TVariant{TString{"world"}}};
    TBlockHelper().TestKernelFuzzied(data, expected, [](TSetup<false>& setup, TRuntimeNode payloadValue) {
        auto& pb = *setup.PgmBuilder;
        return pb.BlockVariant(payloadValue, 1u, ConvertToMinikqlType<TVariant>(pb));
    });
}

Y_UNIT_TEST(TupleVariant_TuplePayload) {
    using TInner = std::tuple<ui32, TString>;
    using TVariant = std::variant<TInner, ui64>;
    TVector<TInner> data = {TInner{ui32{1}, TString{"a"}}, TInner{ui32{2}, TString{"b"}}};
    TVector<TVariant> expected = {TVariant{TInner{ui32{1}, TString{"a"}}}, TVariant{TInner{ui32{2}, TString{"b"}}}};
    TBlockHelper().TestKernelFuzzied(data, expected, [](TSetup<false>& setup, TRuntimeNode payloadValue) {
        auto& pb = *setup.PgmBuilder;
        return pb.BlockVariant(payloadValue, 0u, ConvertToMinikqlType<TVariant>(pb));
    });
}

Y_UNIT_TEST(StructVariant_ByMemberName_XMember) {
    using TVariant = TStructVariant<NTest::TStructMember<"x", ui32>, NTest::TStructMember<"y", ui64>>;

    TVector<ui32> xData = {7u, 8u};
    TVector<TMaybe<ui32>> xExpected = {ui32{7u}, ui32{8u}};
    TBlockHelper().TestKernelFuzzied(xData, xExpected, [](TSetup<false>& setup, TRuntimeNode payloadValue) {
        auto& pb = *setup.PgmBuilder;
        auto varNode = pb.BlockVariant(payloadValue, NUdf::TStringRef("x"), ConvertToMinikqlType<TVariant>(pb));
        return pb.BlockGuess(varNode, NUdf::TStringRef("x"));
    });
}

Y_UNIT_TEST(StructVariant_ByMemberName_YMember) {
    using TVariant = TStructVariant<NTest::TStructMember<"x", ui32>, NTest::TStructMember<"y", ui64>>;

    TVector<ui64> yData = {100ull, 200ull};
    TVector<TMaybe<ui64>> yExpected = {ui64{100ull}, ui64{200ull}};
    TBlockHelper().TestKernelFuzzied(yData, yExpected, [](TSetup<false>& setup, TRuntimeNode payloadValue) {
        auto& pb = *setup.PgmBuilder;
        auto varNode = pb.BlockVariant(payloadValue, NUdf::TStringRef("y"), ConvertToMinikqlType<TVariant>(pb));
        return pb.BlockGuess(varNode, NUdf::TStringRef("y"));
    });
}

} // Y_UNIT_TEST_SUITE(TMiniKQLBlockVariantNodeTest)

} // namespace NKikimr::NMiniKQL