aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/scheme/tests/ut/scheme_path_ut.cpp
blob: 2980979e3b20cb2da91ebd70bc94c056e0f0b432 (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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include <library/cpp/scheme/scimpl_private.h>
#include <library/cpp/scheme/ut_utils/scheme_ut_utils.h>
#include <library/cpp/testing/unittest/registar.h>
 
#include <util/stream/null.h> 
#include <util/string/subst.h> 
#include <util/string/util.h> 
 
#include <type_traits> 
#include <library/cpp/string_utils/quote/quote.h>
 
Y_UNIT_TEST_SUITE(TSchemePathTest) { 
    void DoTestSelect(TStringBuf path, TStringBuf expected, TStringBuf delexpected) { 
        NSc::TValue v; 
        UNIT_ASSERT(!v.PathExists(path)); 
        UNIT_ASSERT(NSc::TValue::PathValid(path)); 
        UNIT_ASSERT(NSc::TValue::Same(v.TrySelect(path), NSc::Null()));
        *v.TrySelectOrAdd(path) = 1;
        NSc::NUt::AssertSchemeJson(expected, v); 
        UNIT_ASSERT(v.PathExists(path)); 
        UNIT_ASSERT(1 == v.TrySelectOrAdd(path)->GetNumber());
        UNIT_ASSERT(1 == v.TrySelect(path).GetNumber());
        UNIT_ASSERT(1 == v.TrySelectAndDelete(path).GetNumber());
        UNIT_ASSERT(NSc::TValue::Same(v.TrySelectAndDelete(path), NSc::Null()));
        NSc::NUt::AssertSchemeJson(delexpected, v); 
        UNIT_ASSERT(!v.PathExists(path)); 
        UNIT_ASSERT(NSc::TValue::Same(v.TrySelect(path), NSc::Null()));
    } 
 
    Y_UNIT_TEST(TestSelect) { 
        NSc::TValue v; 
        UNIT_ASSERT(!v.PathValid(" "));
        UNIT_ASSERT(v.PathExists("")); 
        UNIT_ASSERT(v.PathExists("//")); 
 
        UNIT_ASSERT(NSc::TValue::Same(v, *v.TrySelectOrAdd("//")));
        NSc::NUt::AssertSchemeJson("null", v);
        UNIT_ASSERT(NSc::TValue::Same(v.TrySelectAndDelete("//"), NSc::Null()));
        NSc::NUt::AssertSchemeJson("null", v);
 
        v.SetDict(); 
        UNIT_ASSERT(NSc::TValue::Same(v, *v.TrySelectOrAdd("//")));
        NSc::NUt::AssertSchemeJson("{}", v);
        UNIT_ASSERT(NSc::TValue::Same(v.TrySelectAndDelete("//"), NSc::Null()));
        NSc::NUt::AssertSchemeJson("{}", v);
 
        v.SetArray(); 
        UNIT_ASSERT(NSc::TValue::Same(v, *v.TrySelectOrAdd("//")));
        NSc::NUt::AssertSchemeJson("[]", v);
        UNIT_ASSERT(NSc::TValue::Same(v.TrySelectAndDelete("//"), NSc::Null()));
        NSc::NUt::AssertSchemeJson("[]", v);
 
        DoTestSelect("[]", "{'':1}", "{}"); 
        DoTestSelect("[ ]", "{' ':1}", "{}"); 
        DoTestSelect("[0]", "[1]", "[]"); 
        DoTestSelect("[1]", "[null,1]", "[null]"); 
        DoTestSelect("foo/[0]/bar", "{foo:[{bar:1}]}", "{foo:[{}]}"); 
        DoTestSelect("foo/1/bar", "{foo:[null,{bar:1}]}", "{foo:[null,{}]}"); 
        DoTestSelect("foo[-1]bar", "{foo:{'-1':{bar:1}}}", "{foo:{'-1':{}}}"); 
        DoTestSelect("'foo'/\"0\"/'bar'", "{foo:{'0':{bar:1}}}", "{foo:{'0':{}}}"); 
        DoTestSelect("'\\''", "{'\\'':1}", "{}"); 
    } 
 
    Y_UNIT_TEST(TestSelectAndMerge) { 
        NSc::TValue v; 
        v.TrySelectOrAdd("blender/enabled")->MergeUpdateJson("1");
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::FromJson("1").ToJson(), "1"); 
        UNIT_ASSERT_VALUES_EQUAL(v.ToJson(), "{\"blender\":{\"enabled\":1}}"); 
    } 
 
    Y_UNIT_TEST(TestPathEscapes) { 
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("a"), "a");
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath(""), R"=("")=");
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("[]"), R"=("[]")=");
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("[]ab"), R"=("[]ab")="); 
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("a[]b"), R"=("a[]b")="); 
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("ab[]"), R"=("ab[]")="); 
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("[ab]"), R"=("[ab]")="); 
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("[ab"), R"=("[ab")=");
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("a[b"), R"=("a[b")=");
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("ab["), R"=("ab[")=");
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("]ab"), R"=("]ab")=");
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("a]b"), R"=("a]b")=");
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("ab]"), R"=("ab]")=");
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath(R"=(\)="), R"=("\\")=");
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath(R"=(\\)="), R"=("\\\\")="); 
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("/"), R"=("/")=");
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("//"), R"=("//")=");
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("///"), R"=("///")=");
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("/ab"), R"=("/ab")=");
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("a/b"), R"=("a/b")=");
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("ab/"), R"=("ab/")=");
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("//ab"), R"=("//ab")="); 
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("a//b"), R"=("a//b")="); 
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("ab//"), R"=("ab//")="); 
        UNIT_ASSERT_VALUES_EQUAL(NSc::TValue::EscapeForPath("6400"), R"=("6400")="); 
 
        { 
            NSc::TValue val; 
            *val.TrySelectOrAdd("") = 100;
            const TString res = R"=(100)=";
            UNIT_ASSERT_VALUES_EQUAL(val.ToJson(), res); 
        } 
        { 
            NSc::TValue val; 
            *val.TrySelectOrAdd("a") = 100;
            const TString res = R"=({"a":100})=";
            UNIT_ASSERT_VALUES_EQUAL(val.ToJson(), res); 
        } 
        { 
            NSc::TValue val; 
            *val.TrySelectOrAdd(R"=(////)=") = 100;
            const TString res = R"=(100)=";
            UNIT_ASSERT_VALUES_EQUAL(val.ToJson(), res); 
        } 
        { 
            NSc::TValue val; 
            *val.TrySelectOrAdd(R"=()=") = 100;
            const TString res = R"=(100)=";
            UNIT_ASSERT_VALUES_EQUAL(val.ToJson(), res); 
        } 
        { 
            NSc::TValue val; 
            *val.TrySelectOrAdd(R"=("")=") = 100;
            const TString res = R"=({"":100})=";
            UNIT_ASSERT_VALUES_EQUAL(val.ToJson(), res); 
        } 
        { 
            NSc::TValue val; 
            *val.TrySelectOrAdd(R"=("[1]")=") = 100;
            const TString res = R"=({"[1]":100})=";
            UNIT_ASSERT_VALUES_EQUAL(val.ToJson(), res); 
        } 
        { 
            NSc::TValue val; 
            *val.TrySelectOrAdd(R"=("\"\"")=") = 100;
            const TString res = R"=({"\"\"":100})=";
            UNIT_ASSERT_VALUES_EQUAL(val.ToJson(), res); 
        } 
        { 
            NSc::TValue val; 
            *val.TrySelectOrAdd(R"=("/10/")=") = 100;
            const TString res = R"=({"/10/":100})=";
            UNIT_ASSERT_VALUES_EQUAL(val.ToJson(), res); 
        } 
        { 
            NSc::TValue val; 
            *val.TrySelectOrAdd(R"=(/"[10]"//""/"\"/10/\""///)=") = 100;
            const TString res = R"=({"[10]":{"":{"\"/10/\"":100}}})=";
            UNIT_ASSERT_VALUES_EQUAL(val.ToJson(), res); 
        } 
        { 
            NSc::TValue val; 
            *val.TrySelectOrAdd(R"=(/"[10]"//""/"\"/10/\""///)=") = 100;
            const TString res = R"=({"[10]":{"":{"\"/10/\"":100}}})=";
            UNIT_ASSERT_VALUES_EQUAL(val.ToJson(), res); 
        } 
    } 
};