summaryrefslogtreecommitdiffstats
path: root/yql/essentials/core/langver/feature_ut.cpp
blob: 5faf560ec4fb208d6c9141fd7f2f1e171cbbc2ab (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
80
81
82
83
84
85
86
87
88
89
#include "feature.h"

#include <library/cpp/testing/unittest/registar.h>

using namespace NYql;

TFeature MakeFeature(TLangVersion min, TLangVersion max = UnknownLangVersion) {
    return TFeature{
        .Name = "feat",
        .Description = "Feature",
        .MinLangVer = min,
        .MaxLangVer = max,
    };
}

Y_UNIT_TEST_SUITE(FeatureTests) {

using EBackportCompatibleFeaturesMode::All;
using EBackportCompatibleFeaturesMode::None;
using EBackportCompatibleFeaturesMode::Released;

Y_UNIT_TEST(IsAvailableOn_Unknown_MinMatchesAnyMode) {
    const auto f = MakeFeature(UnknownLangVersion);
    UNIT_ASSERT(IsAvailableOn(MinLangVersion, None, f));
    UNIT_ASSERT(IsAvailableOn(MinLangVersion, Released, f));
    UNIT_ASSERT(IsAvailableOn(MinLangVersion, All, f));
}

Y_UNIT_TEST(IsAvailableOn_Mode_None) {
    const auto f = MakeFeature(MakeLangVersion(2025, 3));
    UNIT_ASSERT(!IsAvailableOn(MakeLangVersion(2025, 2), None, f));
    UNIT_ASSERT(IsAvailableOn(MakeLangVersion(2025, 3), None, f));
    UNIT_ASSERT(IsAvailableOn(MakeLangVersion(2025, 4), None, f));
}

Y_UNIT_TEST(IsAvailableOn_Mode_All) {
    const auto f = MakeFeature(GetMaxLangVersion());
    UNIT_ASSERT(IsAvailableOn(MinLangVersion, All, f));
}

Y_UNIT_TEST(IsAvailableOn_MaxUnknownNeverExpires) {
    const auto f = MakeFeature(MinLangVersion, UnknownLangVersion);
    UNIT_ASSERT(IsAvailableOn(MinLangVersion, None, f));
    UNIT_ASSERT(IsAvailableOn(MakeLangVersion(2025, 4), None, f));
    UNIT_ASSERT(IsAvailableOn(GetMaxLangVersion(), None, f));
}

Y_UNIT_TEST(IsAvailableOn_Max) {
    const auto f = MakeFeature(MinLangVersion, MakeLangVersion(2025, 4));
    UNIT_ASSERT(IsAvailableOn(MakeLangVersion(2025, 3), None, f));
    UNIT_ASSERT(IsAvailableOn(MakeLangVersion(2025, 4), None, f));
    UNIT_ASSERT(!IsAvailableOn(MakeLangVersion(2025, 5), None, f));
}

Y_UNIT_TEST(IsAvailableOn_FailsOnMax) {
    const auto f = MakeFeature(MinLangVersion, MakeLangVersion(2025, 3));
    UNIT_ASSERT(IsAvailableOn(MakeLangVersion(2025, 3), All, f));
    UNIT_ASSERT(!IsAvailableOn(MakeLangVersion(2025, 4), All, f));
}

Y_UNIT_TEST(EnsureIsAvailableOn_Ok) {
    const auto f = MakeFeature(MinLangVersion, MakeLangVersion(2026, 1));
    const auto r = EnsureIsAvailableOn(MakeLangVersion(2025, 3), None, f);
    UNIT_ASSERT(r.has_value());
}

Y_UNIT_TEST(EnsureIsAvailableOn_MinError) {
    const auto f = MakeFeature(MakeLangVersion(2025, 3));
    const auto r = EnsureIsAvailableOn(MakeLangVersion(2025, 2), None, f);
    UNIT_ASSERT(!r.has_value());
    UNIT_ASSERT_STRING_CONTAINS(r.error(), "not available before");
    UNIT_ASSERT_STRING_CONTAINS(r.error(), "2025.03");
}

Y_UNIT_TEST(EnsureIsAvailableOn_MaxError) {
    const auto f = MakeFeature(MinLangVersion, MakeLangVersion(2025, 3));
    const auto r = EnsureIsAvailableOn(MakeLangVersion(2025, 4), None, f);
    UNIT_ASSERT(!r.has_value());
    UNIT_ASSERT_STRING_CONTAINS(r.error(), "not available after");
    UNIT_ASSERT_STRING_CONTAINS(r.error(), "2025.03");
}

Y_UNIT_TEST(EnsureIsAvailableOn_AllModeBypassesMin) {
    const auto f = MakeFeature(GetMaxLangVersion());
    const auto r = EnsureIsAvailableOn(MinLangVersion, All, f);
    UNIT_ASSERT_C(r.has_value(), r.error());
}

} // Y_UNIT_TEST_SUITE(FeatureTests)