aboutsummaryrefslogtreecommitdiff
path: root/src/test/DUtilUnitTest/CondUtilTest.cpp
blob: c808363d0e08f6eca06f163a360f7b2bd84ff5a7 (plain)
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.

#include "precomp.h"

namespace DutilTests
{
    using namespace System;
    using namespace Xunit;
    using namespace WixTest;

    public ref class CondUtil
    {
    public:
        [NamedFact(Skip = "condutil Not Implemented Yet.")]
        void CondEvaluateTest()
        {
            HRESULT hr = S_OK;
            VARIABLES_HANDLE pVariables = NULL;

            try
            {
                hr = VarCreate(&pVariables);
                NativeAssert::Succeeded(hr, "Failed to initialize variables.");

                // set variables
                VarSetStringHelper(pVariables, L"PROP1", L"VAL1");
                VarSetStringHelper(pVariables, L"PROP2", L"VAL2");
                VarSetStringHelper(pVariables, L"PROP3", L"VAL3");
                VarSetStringHelper(pVariables, L"PROP4", L"BEGIN MID END");
                VarSetNumericHelper(pVariables, L"PROP5", 5);
                VarSetNumericHelper(pVariables, L"PROP6", 6);
                VarSetStringHelper(pVariables, L"PROP7", L"");
                VarSetNumericHelper(pVariables, L"PROP8", 0);
                VarSetStringHelper(pVariables, L"_PROP9", L"VAL9");
                VarSetNumericHelper(pVariables, L"PROP10", -10);
                VarSetNumericHelper(pVariables, L"PROP11", 9223372036854775807ll);
                VarSetNumericHelper(pVariables, L"PROP12", -9223372036854775808ll);
                VarSetNumericHelper(pVariables, L"PROP13", 0x00010000);
                VarSetNumericHelper(pVariables, L"PROP14", 0x00000001);
                VarSetNumericHelper(pVariables, L"PROP15", 0x00010001);
                VarSetVersionHelper(pVariables, L"PROP16", MAKEQWORDVERSION(0, 0, 0, 0));
                VarSetVersionHelper(pVariables, L"PROP17", MAKEQWORDVERSION(1, 0, 0, 0));
                VarSetVersionHelper(pVariables, L"PROP18", MAKEQWORDVERSION(1, 1, 0, 0));
                VarSetVersionHelper(pVariables, L"PROP19", MAKEQWORDVERSION(1, 1, 1, 0));
                VarSetVersionHelper(pVariables, L"PROP20", MAKEQWORDVERSION(1, 1, 1, 1));
                VarSetNumericHelper(pVariables, L"vPROP21", 1);
                VarSetVersionHelper(pVariables, L"PROP22", MAKEQWORDVERSION(65535, 65535, 65535, 65535));
                VarSetStringHelper(pVariables, L"PROP23", L"1.1.1");

                // test conditions
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP1"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP5"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP7"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP8"));
                Assert::True(EvaluateConditionHelper(pVariables, L"_PROP9"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP16"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP17"));

                Assert::True(EvaluateConditionHelper(pVariables, L"PROP1 = \"VAL1\""));
                Assert::False(EvaluateConditionHelper(pVariables, L"NONE = \"NOT\""));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP1 <> \"VAL1\""));
                Assert::True(EvaluateConditionHelper(pVariables, L"NONE <> \"NOT\""));

                Assert::True(EvaluateConditionHelper(pVariables, L"PROP1 ~= \"val1\""));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP1 = \"val1\""));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP1 ~<> \"val1\""));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP1 <> \"val1\""));

                Assert::True(EvaluateConditionHelper(pVariables, L"PROP5 = 5"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP5 = 0"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP5 <> 5"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP5 <> 0"));

                Assert::True(EvaluateConditionHelper(pVariables, L"PROP10 = -10"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP10 <> -10"));

                Assert::True(EvaluateConditionHelper(pVariables, L"PROP17 = v1"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP17 = v0"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP17 <> v1"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP17 <> v0"));

                Assert::True(EvaluateConditionHelper(pVariables, L"PROP16 = v0"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP17 = v1"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP18 = v1.1"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP19 = v1.1.1"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP20 = v1.1.1.1"));
                Assert::True(EvaluateFailureConditionHelper(pVariables, L"PROP20 = v1.1.1.1.0"));
                Assert::True(EvaluateFailureConditionHelper(pVariables, L"PROP20 = v1.1.1.1.1"));
                Assert::True(EvaluateConditionHelper(pVariables, L"vPROP21 = 1"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP23 = v1.1.1"));
                Assert::True(EvaluateConditionHelper(pVariables, L"v1.1.1 = PROP23"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP1 <> v1.1.1"));
                Assert::True(EvaluateConditionHelper(pVariables, L"v1.1.1 <> PROP1"));

                Assert::False(EvaluateConditionHelper(pVariables, L"PROP11 = 9223372036854775806"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP11 = 9223372036854775807"));
                Assert::True(EvaluateFailureConditionHelper(pVariables, L"PROP11 = 9223372036854775808"));
                Assert::True(EvaluateFailureConditionHelper(pVariables, L"PROP11 = 92233720368547758070000"));

                Assert::False(EvaluateConditionHelper(pVariables, L"PROP12 = -9223372036854775807"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP12 = -9223372036854775808"));
                Assert::True(EvaluateFailureConditionHelper(pVariables, L"PROP12 = -9223372036854775809"));
                Assert::True(EvaluateFailureConditionHelper(pVariables, L"PROP12 = -92233720368547758080000"));

                Assert::True(EvaluateConditionHelper(pVariables, L"PROP22 = v65535.65535.65535.65535"));
                Assert::True(EvaluateFailureConditionHelper(pVariables, L"PROP22 = v65536.65535.65535.65535"));
                Assert::True(EvaluateFailureConditionHelper(pVariables, L"PROP22 = v65535.655350000.65535.65535"));

                Assert::True(EvaluateConditionHelper(pVariables, L"PROP5 < 6"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP5 < 5"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP5 > 4"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP5 > 5"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP5 <= 6"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP5 <= 5"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP5 <= 4"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP5 >= 4"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP5 >= 5"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP5 >= 6"));

                Assert::True(EvaluateConditionHelper(pVariables, L"PROP4 << \"BEGIN\""));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP4 << \"END\""));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP4 >> \"END\""));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP4 >> \"BEGIN\""));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP4 >< \"MID\""));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP4 >< \"NONE\""));

                Assert::True(EvaluateConditionHelper(pVariables, L"PROP16 < v1.1"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP16 < v0"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP17 > v0.12"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP17 > v1"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP18 >= v1.0"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP18 >= v1.1"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP18 >= v2.1"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP19 <= v1.1234.1"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP19 <= v1.1.1"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP19 <= v1.0.123"));

                Assert::True(EvaluateConditionHelper(pVariables, L"PROP6 = \"6\""));
                Assert::True(EvaluateConditionHelper(pVariables, L"\"6\" = PROP6"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP6 = \"ABC\""));
                Assert::False(EvaluateConditionHelper(pVariables, L"\"ABC\" = PROP6"));
                Assert::False(EvaluateConditionHelper(pVariables, L"\"ABC\" = PROP6"));

                Assert::True(EvaluateConditionHelper(pVariables, L"PROP13 << 1"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP13 << 0"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP14 >> 1"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP14 >> 0"));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP15 >< 65537"));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP15 >< 0"));

                Assert::False(EvaluateConditionHelper(pVariables, L"NOT PROP1"));
                Assert::True(EvaluateConditionHelper(pVariables, L"NOT (PROP1 <> \"VAL1\")"));

                Assert::True(EvaluateConditionHelper(pVariables, L"PROP1 = \"VAL1\" AND PROP2 = \"VAL2\""));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP1 = \"VAL1\" AND PROP2 = \"NOT\""));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP1 = \"NOT\" AND PROP2 = \"VAL2\""));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP1 = \"NOT\" AND PROP2 = \"NOT\""));

                Assert::True(EvaluateConditionHelper(pVariables, L"PROP1 = \"VAL1\" OR PROP2 = \"VAL2\""));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP1 = \"VAL1\" OR PROP2 = \"NOT\""));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP1 = \"NOT\" OR PROP2 = \"VAL2\""));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP1 = \"NOT\" OR PROP2 = \"NOT\""));

                Assert::True(EvaluateConditionHelper(pVariables, L"PROP1 = \"VAL1\" AND PROP2 = \"VAL2\" OR PROP3 = \"NOT\""));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP1 = \"VAL1\" AND PROP2 = \"NOT\" OR PROP3 = \"VAL3\""));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP1 = \"VAL1\" AND PROP2 = \"NOT\" OR PROP3 = \"NOT\""));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP1 = \"VAL1\" AND (PROP2 = \"NOT\" OR PROP3 = \"VAL3\")"));
                Assert::True(EvaluateConditionHelper(pVariables, L"(PROP1 = \"VAL1\" AND PROP2 = \"VAL2\") OR PROP3 = \"NOT\""));

                Assert::True(EvaluateConditionHelper(pVariables, L"PROP3 = \"NOT\" OR PROP1 = \"VAL1\" AND PROP2 = \"VAL2\""));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP3 = \"VAL3\" OR PROP1 = \"VAL1\" AND PROP2 = \"NOT\""));
                Assert::False(EvaluateConditionHelper(pVariables, L"PROP3 = \"NOT\" OR PROP1 = \"VAL1\" AND PROP2 = \"NOT\""));
                Assert::True(EvaluateConditionHelper(pVariables, L"(PROP3 = \"NOT\" OR PROP1 = \"VAL1\") AND PROP2 = \"VAL2\""));
                Assert::True(EvaluateConditionHelper(pVariables, L"PROP3 = \"NOT\" OR (PROP1 = \"VAL1\" AND PROP2 = \"VAL2\")"));

                Assert::True(EvaluateFailureConditionHelper(pVariables, L"="));
                Assert::True(EvaluateFailureConditionHelper(pVariables, L"(PROP1"));
                Assert::True(EvaluateFailureConditionHelper(pVariables, L"(PROP1 = \""));
                Assert::True(EvaluateFailureConditionHelper(pVariables, L"1A"));
                Assert::True(EvaluateFailureConditionHelper(pVariables, L"*"));

                Assert::True(EvaluateFailureConditionHelper(pVariables, L"1 == 1"));
            }
            finally
            {
                ReleaseVariables(pVariables);
            }
        }
    };
}