Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
cxfa_fmlexer_unittest.cpp
Go to the documentation of this file.
1
// Copyright 2016 The PDFium Authors
2
// Use of this source code is governed by a BSD-style license that can be
3
// found in the LICENSE file.
4
5
6
#
include
"xfa/fxfa/formcalc/cxfa_fmlexer.h"
7
8
#
include
<
vector
>
9
10
#
include
"testing/gtest/include/gtest/gtest.h"
11
12
TEST
(
CXFA_FMLexerTest
,
NullString
) {
13
WideStringView
null_string;
14
CXFA_FMLexer
lexer(null_string);
15
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
16
EXPECT_EQ(
TOKeof
, token
.
GetType
(
)
);
17
EXPECT_TRUE(lexer
.
IsComplete
(
)
);
18
}
19
20
TEST
(
CXFA_FMLexerTest
,
EmptyString
) {
21
CXFA_FMLexer
lexer(L"");
22
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
23
EXPECT_EQ(
TOKeof
, token
.
GetType
(
)
);
24
EXPECT_TRUE(lexer
.
IsComplete
(
)
);
25
}
26
27
TEST
(
CXFA_FMLexerTest
,
Numbers
) {
28
{
29
CXFA_FMLexer
lexer(L"-12");
30
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
31
// TODO(dsinclair): Should this return -12 instead of two tokens?
32
EXPECT_EQ(
TOKminus
, token
.
GetType
(
)
);
33
token = lexer
.
NextToken
(
)
;
34
EXPECT_EQ(L"12", token.GetString());
35
token = lexer
.
NextToken
(
)
;
36
EXPECT_EQ(
TOKeof
, token
.
GetType
(
)
);
37
}
38
{
39
CXFA_FMLexer
lexer(L"1.5362");
40
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
41
EXPECT_EQ(
TOKnumber
, token
.
GetType
(
)
);
42
EXPECT_EQ(L"1.5362", token.GetString());
43
}
44
{
45
CXFA_FMLexer
lexer(L"0.875");
46
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
47
EXPECT_EQ(
TOKnumber
, token
.
GetType
(
)
);
48
EXPECT_EQ(L"0.875", token.GetString());
49
}
50
{
51
CXFA_FMLexer
lexer(L"5.56e-2");
52
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
53
EXPECT_EQ(
TOKnumber
, token
.
GetType
(
)
);
54
EXPECT_EQ(L"5.56e-2", token.GetString());
55
}
56
{
57
CXFA_FMLexer
lexer(L"1.234E10");
58
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
59
EXPECT_EQ(
TOKnumber
, token
.
GetType
(
)
);
60
EXPECT_EQ(L"1.234E10", token.GetString());
61
}
62
{
63
CXFA_FMLexer
lexer(L"123456789.012345678");
64
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
65
EXPECT_EQ(
TOKnumber
, token
.
GetType
(
)
);
66
// TODO(dsinclair): This should round as per IEEE 64-bit values.
67
// EXPECT_EQ(L"123456789.01234567", token.GetString());
68
EXPECT_EQ(L"123456789.012345678", token.GetString());
69
}
70
{
71
CXFA_FMLexer
lexer(L"99999999999999999");
72
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
73
EXPECT_EQ(
TOKnumber
, token
.
GetType
(
)
);
74
// TODO(dsinclair): This is spec'd as rounding when > 16 significant digits
75
// prior to the exponent.
76
// EXPECT_EQ(L"100000000000000000", token.GetString());
77
EXPECT_EQ(L"99999999999999999", token.GetString());
78
EXPECT_TRUE(lexer
.
IsComplete
(
)
);
79
}
80
}
81
82
// The quotes are stripped in CXFA_FMStringExpression::ToJavaScript.
83
TEST
(
CXFA_FMLexerTest
,
Strings
) {
84
{
85
CXFA_FMLexer
lexer(L"\"The cat jumped over the fence.\"");
86
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
87
EXPECT_EQ(
TOKstring
, token
.
GetType
(
)
);
88
EXPECT_EQ(L"\"The cat jumped over the fence.\"", token.GetString());
89
90
token = lexer
.
NextToken
(
)
;
91
EXPECT_EQ(
TOKeof
, token
.
GetType
(
)
);
92
}
93
{
94
CXFA_FMLexer
lexer(L"\"\"");
95
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
96
EXPECT_EQ(
TOKstring
, token
.
GetType
(
)
);
97
EXPECT_EQ(L"\"\"", token.GetString());
98
}
99
{
100
CXFA_FMLexer
lexer(
101
L"\"The message reads: \"\"Warning: Insufficient Memory\"\"\"");
102
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
103
EXPECT_EQ(
TOKstring
, token
.
GetType
(
)
);
104
EXPECT_EQ(L"\"The message reads: \"\"Warning: Insufficient Memory\"\"\"",
105
token.GetString());
106
}
107
{
108
CXFA_FMLexer
lexer(
109
L"\"\\u0047\\u006f\\u0066\\u0069\\u0073\\u0068\\u0021\\u000d\\u000a\"");
110
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
111
EXPECT_EQ(
TOKstring
, token
.
GetType
(
)
);
112
EXPECT_EQ(
113
L"\"\\u0047\\u006f\\u0066\\u0069\\u0073\\u0068\\u0021\\u000d\\u000a\"",
114
token.GetString());
115
EXPECT_TRUE(lexer
.
IsComplete
(
)
);
116
}
117
}
118
119
// Note, 'this' is a keyword but is not matched by the lexer.
120
TEST
(
CXFA_FMLexerTest
,
OperatorsAndKeywords
) {
121
static
const
struct
{
122
const
wchar_t
* op;
123
XFA_FM_TOKEN
token;
124
} kOps[] = {{L"+",
TOKplus
},
125
{L"/",
TOKdiv
},
126
{L"-",
TOKminus
},
127
{L"&",
TOKand
},
128
{L"|",
TOKor
},
129
{L"*",
TOKmul
},
130
{L"<",
TOKlt
},
131
{L">",
TOKgt
},
132
{L"==",
TOKeq
},
133
{L"<>",
TOKne
},
134
{L"<=",
TOKle
},
135
{L">=",
TOKge
},
136
{L"and",
TOKksand
},
137
{L"break",
TOKbreak
},
138
{L"continue",
TOKcontinue
},
139
{L"do",
TOKdo
},
140
{L"downto",
TOKdownto
},
141
{L"else",
TOKelse
},
142
{L"elseif",
TOKelseif
},
143
{L"end",
TOKend
},
144
{L"endfor",
TOKendfor
},
145
{L"endfunc",
TOKendfunc
},
146
{L"endif",
TOKendif
},
147
{L"endwhile",
TOKendwhile
},
148
{L"eq",
TOKkseq
},
149
{L"exit",
TOKexit
},
150
{L"for",
TOKfor
},
151
{L"foreach",
TOKforeach
},
152
{L"func",
TOKfunc
},
153
{L"ge",
TOKksge
},
154
{L"gt",
TOKksgt
},
155
{L"if",
TOKif
},
156
{L"in",
TOKin
},
157
{L"infinity",
TOKinfinity
},
158
{L"le",
TOKksle
},
159
{L"lt",
TOKkslt
},
160
{L"nan",
TOKnan
},
161
{L"ne",
TOKksne
},
162
{L"not",
TOKksnot
},
163
{L"null",
TOKnull
},
164
{L"or",
TOKksor
},
165
{L"return",
TOKreturn
},
166
{L"step",
TOKstep
},
167
{L"then",
TOKthen
},
168
{L"throw",
TOKthrow
},
169
{L"upto",
TOKupto
},
170
{L"var",
TOKvar
},
171
{L"while",
TOKwhile
},
172
173
// The following are defined but aren't in the spec.
174
{L"(",
TOKlparen
},
175
{L")",
TOKrparen
},
176
{L",",
TOKcomma
},
177
{L".",
TOKdot
},
178
{L"[",
TOKlbracket
},
179
{L"]",
TOKrbracket
},
180
{L"..",
TOKdotdot
},
181
{L".#",
TOKdotscream
},
182
{L".*",
TOKdotstar
}};
183
184
for
(
const
auto
& op : kOps) {
185
CXFA_FMLexer
lexer(op.op);
186
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
187
EXPECT_EQ(op.token, token
.
GetType
(
)
);
188
EXPECT_TRUE(lexer
.
IsComplete
(
)
);
189
}
190
}
191
192
TEST
(
CXFA_FMLexerTest
,
Comments
) {
193
{
194
CXFA_FMLexer
lexer(L"// Empty.");
195
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
196
EXPECT_EQ(
TOKeof
, token
.
GetType
(
)
);
197
}
198
{
199
CXFA_FMLexer
lexer(L"//");
200
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
201
EXPECT_EQ(
TOKeof
, token
.
GetType
(
)
);
202
}
203
{
204
CXFA_FMLexer
lexer(L"123 // Empty.\n\"str\"");
205
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
206
EXPECT_EQ(
TOKnumber
, token
.
GetType
(
)
);
207
EXPECT_EQ(L"123", token.GetString());
208
209
token = lexer
.
NextToken
(
)
;
210
EXPECT_EQ(
TOKstring
, token
.
GetType
(
)
);
211
EXPECT_EQ(L"\"str\"", token.GetString());
212
213
token = lexer
.
NextToken
(
)
;
214
EXPECT_EQ(
TOKeof
, token
.
GetType
(
)
);
215
}
216
{
217
CXFA_FMLexer
lexer(L";");
218
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
219
EXPECT_EQ(
TOKeof
, token
.
GetType
(
)
);
220
}
221
{
222
CXFA_FMLexer
lexer(L"; Empty.");
223
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
224
EXPECT_EQ(
TOKeof
, token
.
GetType
(
)
);
225
}
226
{
227
CXFA_FMLexer
lexer(L"123 ;Empty.\n\"str\"");
228
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
229
EXPECT_EQ(
TOKnumber
, token
.
GetType
(
)
);
230
EXPECT_EQ(L"123", token.GetString());
231
232
token = lexer
.
NextToken
(
)
;
233
EXPECT_EQ(
TOKstring
, token
.
GetType
(
)
);
234
EXPECT_EQ(L"\"str\"", token.GetString());
235
236
token = lexer
.
NextToken
(
)
;
237
EXPECT_EQ(
TOKeof
, token
.
GetType
(
)
);
238
EXPECT_TRUE(lexer
.
IsComplete
(
)
);
239
}
240
}
241
242
TEST
(
CXFA_FMLexerTest
,
ValidIdentifiers
) {
243
std::vector<
const
wchar_t
*> identifiers = {
244
L"a", L"an_identifier", L"_ident", L"$ident", L"!ident", L"GetAddr"};
245
for
(
const
auto
* ident : identifiers) {
246
CXFA_FMLexer lexer(ident);
247
CXFA_FMLexer::Token token = lexer.NextToken();
248
EXPECT_EQ(TOKidentifier, token.GetType());
249
EXPECT_EQ(ident, token.GetString());
250
EXPECT_TRUE(lexer.IsComplete());
251
}
252
}
253
254
TEST
(
CXFA_FMLexerTest
,
InvalidIdentifiers
) {
255
{
256
CXFA_FMLexer
lexer(L"#a");
257
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
258
EXPECT_EQ(
TOKreserver
, token
.
GetType
(
)
);
259
}
260
{
261
CXFA_FMLexer
lexer(L"1a");
262
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
263
EXPECT_EQ(
TOKreserver
, token
.
GetType
(
)
);
264
}
265
{
266
CXFA_FMLexer
lexer(L"an@identifier");
267
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
268
EXPECT_NE(
TOKreserver
, token
.
GetType
(
)
);
269
token = lexer
.
NextToken
(
)
;
270
EXPECT_EQ(
TOKreserver
, token
.
GetType
(
)
);
271
token = lexer
.
NextToken
(
)
;
272
EXPECT_EQ(
TOKreserver
, token
.
GetType
(
)
);
273
}
274
{
275
CXFA_FMLexer
lexer(L"_ident@");
276
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
277
EXPECT_NE(
TOKreserver
, token
.
GetType
(
)
);
278
token = lexer
.
NextToken
(
)
;
279
EXPECT_EQ(
TOKreserver
, token
.
GetType
(
)
);
280
EXPECT_FALSE(lexer
.
IsComplete
(
)
);
281
}
282
}
283
284
TEST
(
CXFA_FMLexerTest
,
Whitespace
) {
285
{
286
CXFA_FMLexer
lexer(L" \t\xc\x9\xb");
287
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
288
EXPECT_EQ(
TOKeof
, token
.
GetType
(
)
);
289
}
290
{
291
CXFA_FMLexer
lexer(L"123 \t\xc\x9\xb 456");
292
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
293
EXPECT_EQ(
TOKnumber
, token
.
GetType
(
)
);
294
EXPECT_EQ(L"123", token.GetString());
295
296
token = lexer
.
NextToken
(
)
;
297
EXPECT_EQ(
TOKnumber
, token
.
GetType
(
)
);
298
EXPECT_EQ(L"456", token.GetString());
299
300
token = lexer
.
NextToken
(
)
;
301
EXPECT_EQ(
TOKeof
, token
.
GetType
(
)
);
302
EXPECT_TRUE(lexer
.
IsComplete
(
)
);
303
}
304
}
305
306
TEST
(
CXFA_FMLexerTest
,
NullData
) {
307
CXFA_FMLexer
lexer(
308
// SAFETY: required for test, manual length computation for fixed string.
309
UNSAFE_BUFFERS
(WideStringView(L"\x2d\x32\x00\x2d\x32", 5)));
310
CXFA_FMLexer
::
Token
token = lexer
.
NextToken
(
)
;
311
EXPECT_EQ(
TOKminus
, token
.
GetType
(
)
);
312
313
token = lexer
.
NextToken
(
)
;
314
EXPECT_EQ(
TOKnumber
, token
.
GetType
(
)
);
315
EXPECT_EQ(L"2", token.GetString());
316
317
token = lexer
.
NextToken
(
)
;
318
EXPECT_EQ(
TOKeof
, token
.
GetType
(
)
);
319
EXPECT_FALSE(lexer
.
IsComplete
(
)
);
320
}
CXFA_FMLexer::Token
Definition
cxfa_fmlexer.h:89
CXFA_FMLexer::Token::GetType
XFA_FM_TOKEN GetType() const
Definition
cxfa_fmlexer.h:97
CXFA_FMLexer
Definition
cxfa_fmlexer.h:85
CXFA_FMLexer::NextToken
Token NextToken()
Definition
cxfa_fmlexer.cpp:147
CXFA_FMLexer::IsComplete
bool IsComplete() const
Definition
cxfa_fmlexer.h:112
UNSAFE_BUFFERS
#define UNSAFE_BUFFERS(...)
Definition
compiler_specific.h:95
XFA_FM_TOKEN
XFA_FM_TOKEN
Definition
cxfa_fmlexer.h:14
TOKdotstar
@ TOKdotstar
Definition
cxfa_fmlexer.h:31
TOKnan
@ TOKnan
Definition
cxfa_fmlexer.h:53
TOKeof
@ TOKeof
Definition
cxfa_fmlexer.h:51
TOKge
@ TOKge
Definition
cxfa_fmlexer.h:36
TOKbreak
@ TOKbreak
Definition
cxfa_fmlexer.h:48
TOKreserver
@ TOKreserver
Definition
cxfa_fmlexer.h:82
TOKminus
@ TOKminus
Definition
cxfa_fmlexer.h:21
TOKnumber
@ TOKnumber
Definition
cxfa_fmlexer.h:81
TOKendfor
@ TOKendfor
Definition
cxfa_fmlexer.h:67
TOKor
@ TOKor
Definition
cxfa_fmlexer.h:29
TOKeq
@ TOKeq
Definition
cxfa_fmlexer.h:35
TOKksle
@ TOKksle
Definition
cxfa_fmlexer.h:43
TOKfor
@ TOKfor
Definition
cxfa_fmlexer.h:52
TOKdo
@ TOKdo
Definition
cxfa_fmlexer.h:37
TOKupto
@ TOKupto
Definition
cxfa_fmlexer.h:70
TOKlbracket
@ TOKlbracket
Definition
cxfa_fmlexer.h:27
TOKexit
@ TOKexit
Definition
cxfa_fmlexer.h:58
TOKplus
@ TOKplus
Definition
cxfa_fmlexer.h:19
TOKkslt
@ TOKkslt
Definition
cxfa_fmlexer.h:44
TOKnull
@ TOKnull
Definition
cxfa_fmlexer.h:47
TOKthrow
@ TOKthrow
Definition
cxfa_fmlexer.h:68
TOKksgt
@ TOKksgt
Definition
cxfa_fmlexer.h:40
TOKendif
@ TOKendif
Definition
cxfa_fmlexer.h:73
TOKgt
@ TOKgt
Definition
cxfa_fmlexer.h:26
TOKcontinue
@ TOKcontinue
Definition
cxfa_fmlexer.h:71
TOKcomma
@ TOKcomma
Definition
cxfa_fmlexer.h:20
TOKle
@ TOKle
Definition
cxfa_fmlexer.h:33
TOKksnot
@ TOKksnot
Definition
cxfa_fmlexer.h:54
TOKrparen
@ TOKrparen
Definition
cxfa_fmlexer.h:17
TOKlparen
@ TOKlparen
Definition
cxfa_fmlexer.h:16
TOKksand
@ TOKksand
Definition
cxfa_fmlexer.h:49
TOKksor
@ TOKksor
Definition
cxfa_fmlexer.h:46
TOKelseif
@ TOKelseif
Definition
cxfa_fmlexer.h:65
TOKendfunc
@ TOKendfunc
Definition
cxfa_fmlexer.h:64
TOKelse
@ TOKelse
Definition
cxfa_fmlexer.h:57
TOKksge
@ TOKksge
Definition
cxfa_fmlexer.h:39
TOKkseq
@ TOKkseq
Definition
cxfa_fmlexer.h:38
TOKvar
@ TOKvar
Definition
cxfa_fmlexer.h:55
TOKendwhile
@ TOKendwhile
Definition
cxfa_fmlexer.h:62
TOKstring
@ TOKstring
Definition
cxfa_fmlexer.h:80
TOKfunc
@ TOKfunc
Definition
cxfa_fmlexer.h:72
TOKksne
@ TOKksne
Definition
cxfa_fmlexer.h:45
TOKreturn
@ TOKreturn
Definition
cxfa_fmlexer.h:60
TOKforeach
@ TOKforeach
Definition
cxfa_fmlexer.h:63
TOKif
@ TOKif
Definition
cxfa_fmlexer.h:41
TOKinfinity
@ TOKinfinity
Definition
cxfa_fmlexer.h:61
TOKin
@ TOKin
Definition
cxfa_fmlexer.h:42
TOKdotscream
@ TOKdotscream
Definition
cxfa_fmlexer.h:30
TOKdiv
@ TOKdiv
Definition
cxfa_fmlexer.h:23
TOKne
@ TOKne
Definition
cxfa_fmlexer.h:34
TOKrbracket
@ TOKrbracket
Definition
cxfa_fmlexer.h:28
TOKmul
@ TOKmul
Definition
cxfa_fmlexer.h:18
TOKlt
@ TOKlt
Definition
cxfa_fmlexer.h:24
TOKdownto
@ TOKdownto
Definition
cxfa_fmlexer.h:59
TOKthen
@ TOKthen
Definition
cxfa_fmlexer.h:56
TOKdotdot
@ TOKdotdot
Definition
cxfa_fmlexer.h:32
TOKstep
@ TOKstep
Definition
cxfa_fmlexer.h:69
TOKand
@ TOKand
Definition
cxfa_fmlexer.h:15
TOKdot
@ TOKdot
Definition
cxfa_fmlexer.h:22
TOKend
@ TOKend
Definition
cxfa_fmlexer.h:50
TOKwhile
@ TOKwhile
Definition
cxfa_fmlexer.h:66
TEST
TEST(FXCRYPT, MD5GenerateEmtpyData)
Definition
fx_crypt_unittest.cpp:50
WideStringView
fxcrt::WideStringView WideStringView
Definition
string_view_template.h:326
qtwebengine
src
3rdparty
chromium
third_party
pdfium
xfa
fxfa
formcalc
cxfa_fmlexer_unittest.cpp
Generated on
for Qt by
1.18.0