Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
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
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
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
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.
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.
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
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
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
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
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
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}
XFA_FM_TOKEN GetType() const
bool IsComplete() const
#define UNSAFE_BUFFERS(...)
XFA_FM_TOKEN
@ TOKdotstar
@ TOKnan
@ TOKeof
@ TOKge
@ TOKbreak
@ TOKreserver
@ TOKminus
@ TOKnumber
@ TOKendfor
@ TOKor
@ TOKeq
@ TOKksle
@ TOKfor
@ TOKdo
@ TOKupto
@ TOKlbracket
@ TOKexit
@ TOKplus
@ TOKkslt
@ TOKnull
@ TOKthrow
@ TOKksgt
@ TOKendif
@ TOKgt
@ TOKcontinue
@ TOKcomma
@ TOKle
@ TOKksnot
@ TOKrparen
@ TOKlparen
@ TOKksand
@ TOKksor
@ TOKelseif
@ TOKendfunc
@ TOKelse
@ TOKksge
@ TOKkseq
@ TOKvar
@ TOKendwhile
@ TOKstring
@ TOKfunc
@ TOKksne
@ TOKreturn
@ TOKforeach
@ TOKif
@ TOKinfinity
@ TOKin
@ TOKdotscream
@ TOKdiv
@ TOKne
@ TOKrbracket
@ TOKmul
@ TOKlt
@ TOKdownto
@ TOKthen
@ TOKdotdot
@ TOKstep
@ TOKand
@ TOKdot
@ TOKend
@ TOKwhile
TEST(FXCRYPT, MD5GenerateEmtpyData)
fxcrt::WideStringView WideStringView