#include #include #include namespace NKikimr::NMiniKQL { using namespace NTest; namespace { template void TestBlockGuess(const TVector& data, const TVector& expected, ui32 tupleIndex) { TBlockHelper().TestKernelFuzzied(data, expected, [tupleIndex](TSetup& setup, TRuntimeNode variantValue) { return setup.PgmBuilder->BlockGuess(variantValue, tupleIndex); }); } } // namespace Y_UNIT_TEST_SUITE(TMiniKQLBlockGuessTest) { Y_UNIT_TEST(TupleVariant_Ui32Ui64_Index0) { using TVariant = std::variant; TVector data = {TVariant{ui32{1}}, TVariant{ui64{2}}, TVariant{ui32{3}}}; TVector> expected = {ui32{1}, Nothing(), ui32{3}}; TestBlockGuess(data, expected, 0u); } Y_UNIT_TEST(TupleVariant_Ui32Ui64_Index1) { using TVariant = std::variant; TVector data = {TVariant{ui32{1}}, TVariant{ui64{2}}, TVariant{ui32{3}}}; TVector> expected = {Nothing(), ui64{2}, Nothing()}; TestBlockGuess(data, expected, 1u); } Y_UNIT_TEST(TupleVariant_AllSameAlternative) { using TVariant = std::variant; TVector data = {TVariant{ui32{10}}, TVariant{ui32{20}}, TVariant{ui32{30}}}; TVector> expected = {ui32{10}, ui32{20}, ui32{30}}; TestBlockGuess(data, expected, 0u); } Y_UNIT_TEST(TupleVariant_NoneMatchAlternative) { using TVariant = std::variant; TVector data = {TVariant{ui32{1}}, TVariant{ui32{2}}, TVariant{ui32{3}}}; TVector> expected = {Nothing(), Nothing(), Nothing()}; TestBlockGuess(data, expected, 1u); } Y_UNIT_TEST(TupleVariant_StringAlternative) { using TVariant = std::variant; TVector data = {TVariant{ui32{42}}, TVariant{TString{"hello"}}, TVariant{ui32{7}}}; TVector> expected = {Nothing(), TMaybe{"hello"}, Nothing()}; TestBlockGuess(data, expected, 1u); } Y_UNIT_TEST(TupleVariant_TupleAlternative) { using TTupleAlternative = std::tuple; using TVariant = std::variant; TVector data = { TVariant{TTupleAlternative{ui32{1}, TString{"a"}}}, TVariant{ui64{2}}, TVariant{TTupleAlternative{ui32{3}, TString{"b"}}}, }; TVector> expected = { TMaybe{TTupleAlternative{ui32{1}, TString{"a"}}}, Nothing(), TMaybe{TTupleAlternative{ui32{3}, TString{"b"}}}, }; TestBlockGuess(data, expected, 0u); } Y_UNIT_TEST(TupleVariant_PgIntAlternative) { using TVariant = std::variant; TVector data = {TVariant{TPgInt{10}}, TVariant{ui64{20}}, TVariant{TPgInt{30}}}; TVector> expected = {TMaybe{TPgInt{10}}, Nothing(), TMaybe{TPgInt{30}}}; TestBlockGuess(data, expected, 0u); } Y_UNIT_TEST(TupleVariant_OptionalAlternative_DoubleOptional) { using TVariant = std::variant, ui64>; TVector data = { TVariant{TMaybe{10u}}, TVariant{ui64{20u}}, TVariant{TMaybe{}}, }; TVector>> expected = { TMaybe>{TMaybe{10u}}, TMaybe>{}, TMaybe>{TMaybe{}}, }; TestBlockGuess(data, expected, 0u); } Y_UNIT_TEST(OptionalTupleVariant_NullRows) { using TVariant = std::variant; TVector> data = { TMaybe{TVariant{ui32{1}}}, TMaybe{}, TMaybe{TVariant{ui32{3}}}, }; TVector> expected = {ui32{1}, Nothing(), ui32{3}}; TestBlockGuess(data, expected, 0u); } Y_UNIT_TEST(OptionalTupleVariant_AllNull) { using TVariant = std::variant; TVector> data = {TMaybe{}, TMaybe{}, TMaybe{}}; TVector> expected = {Nothing(), Nothing(), Nothing()}; TestBlockGuess(data, expected, 0u); } Y_UNIT_TEST(OptionalTupleVariant_NoNull) { using TVariant = std::variant; TVector> data = { TMaybe{TVariant{ui32{1}}}, TMaybe{TVariant{ui64{2}}}, TMaybe{TVariant{ui32{3}}}, }; TVector> expected = {ui32{1}, Nothing(), ui32{3}}; TestBlockGuess(data, expected, 0u); } Y_UNIT_TEST(OptionalTupleVariant_MixedNull) { using TVariant = std::variant; TVector> data = { TMaybe{TVariant{ui64{10}}}, TMaybe{}, TMaybe{TVariant{ui64{20}}}, }; TVector> expected = {ui64{10}, Nothing(), ui64{20}}; TestBlockGuess(data, expected, 1u); } Y_UNIT_TEST(OptionalTupleVariant_SomeFieldsSet_StringAlternative) { using TVariant = std::variant; TVector> data = { TMaybe{TVariant{TString{"hello"}}}, TMaybe{}, TMaybe{TVariant{ui64{42}}}, TMaybe{TVariant{TString{"world"}}}, }; TVector> expected = { TMaybe{"hello"}, Nothing(), Nothing(), TMaybe{"world"}, }; TestBlockGuess(data, expected, 0u); } Y_UNIT_TEST(OptionalTupleVariant_AllFieldsSet_StringAlternative) { using TVariant = std::variant; TVector> data = { TMaybe{TVariant{TString{"foo"}}}, TMaybe{TVariant{TString{"bar"}}}, TMaybe{TVariant{TString{"baz"}}}, }; TVector> expected = { TMaybe{"foo"}, TMaybe{"bar"}, TMaybe{"baz"}, }; TestBlockGuess(data, expected, 0u); } Y_UNIT_TEST(TupleVariant_OptionalString_AllStringsSet) { using TVariant = std::variant, ui64>; TVector data = { TVariant{TMaybe{"foo"}}, TVariant{TMaybe{"bar"}}, TVariant{TMaybe{"baz"}}, }; TVector>> expected = { TMaybe>{TMaybe{"foo"}}, TMaybe>{TMaybe{"bar"}}, TMaybe>{TMaybe{"baz"}}, }; TestBlockGuess(data, expected, 0u); } Y_UNIT_TEST(TupleVariant_OptionalDouble_AllDoublesSet) { using TVariant = std::variant, ui64>; TVector data = { TVariant{TMaybe{1.5}}, TVariant{TMaybe{2.5}}, TVariant{TMaybe{3.5}}, }; TVector>> expected = { TMaybe>{TMaybe{1.5}}, TMaybe>{TMaybe{2.5}}, TMaybe>{TMaybe{3.5}}, }; TestBlockGuess(data, expected, 0u); } Y_UNIT_TEST(OptionalTupleVariant_AllVariantsOmitted_StringAlternative) { using TVariant = std::variant; TVector> data = { TMaybe{}, TMaybe{}, TMaybe{}, }; TVector> expected = {Nothing(), Nothing(), Nothing()}; TestBlockGuess(data, expected, 0u); } Y_UNIT_TEST(TupleVariant_OptionalString_AllStringsOmitted) { using TVariant = std::variant, ui64>; TVector data = { TVariant{TMaybe{}}, TVariant{TMaybe{}}, TVariant{TMaybe{}}, }; TVector>> expected = { TMaybe>{TMaybe{}}, TMaybe>{TMaybe{}}, TMaybe>{TMaybe{}}, }; TestBlockGuess(data, expected, 0u); } } // Y_UNIT_TEST_SUITE(TMiniKQLBlockGuessTest) } // namespace NKikimr::NMiniKQL