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)
|