1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 #include <sal/types.h>
11 #include "cppunit/TestAssert.h"
12 #include "cppunit/TestFixture.h"
13 #include "cppunit/extensions/HelperMacros.h"
14 #include "cppunit/plugin/TestPlugIn.h"
16 #include "osl/file.hxx"
17 #include "osl/process.h"
18 #include <rtl/math.hxx>
20 #include "scanner.hxx"
35 * Perform tests on Scanner.
37 class ScannerTest
: public CppUnit::TestFixture
40 void testBlankLines();
45 void testGotoCompatible();
46 void testExclamation();
51 // Adds code needed to register the test suite
52 CPPUNIT_TEST_SUITE(ScannerTest
);
54 // Declares the method as a test to call
55 CPPUNIT_TEST(testBlankLines
);
56 CPPUNIT_TEST(testOperators
);
57 CPPUNIT_TEST(testAlphanum
);
58 CPPUNIT_TEST(testComments
);
59 CPPUNIT_TEST(testGoto
);
60 CPPUNIT_TEST(testGotoCompatible
);
61 CPPUNIT_TEST(testExclamation
);
62 CPPUNIT_TEST(testNumbers
);
63 CPPUNIT_TEST(testDataType
);
64 CPPUNIT_TEST(testHexOctal
);
66 // End of test suite definition
67 CPPUNIT_TEST_SUITE_END();
70 const static OUString
cr("\n");
71 const static OUString
rem("REM");
72 const static OUString
asdf("asdf");
73 const static OUString
dot(".");
74 const static OUString
goto_("goto");
75 const static OUString
excl("!");
77 std::vector
<Symbol
> getSymbols(const OUString
& source
, sal_Int32
& errors
, bool bCompatible
= false)
79 std::vector
<Symbol
> symbols
;
80 SbiScanner
scanner(source
);
81 scanner
.EnableErrors();
82 scanner
.SetCompatible(bCompatible
);
83 while(scanner
.NextSym())
86 symbol
.line
= scanner
.GetLine();
87 symbol
.col1
= scanner
.GetCol1();
88 symbol
.col2
= scanner
.GetCol2();
89 symbol
.text
= scanner
.GetSym();
90 symbol
.number
= scanner
.GetDbl();
91 symbol
.type
= scanner
.GetType();
92 symbols
.push_back(symbol
);
94 errors
= scanner
.GetErrors();
98 std::vector
<Symbol
> getSymbols(const OUString
& source
, bool bCompatible
= false)
101 return getSymbols(source
, i
, bCompatible
);
104 void ScannerTest::testBlankLines()
106 const OUString
source1("");
107 const OUString
source2("\r\n");
108 const OUString
source3("\n");
109 const OUString
source4("\r");
110 const OUString
source5("\r\n\r\n");
111 const OUString
source6("\n\r");
112 const OUString
source7("\n\r\n");
113 const OUString
source8("\r\n\r");
114 const OUString
source9(" ");
116 std::vector
<Symbol
> symbols
;
117 symbols
= getSymbols(source1
);
118 CPPUNIT_ASSERT(symbols
.empty());
120 symbols
= getSymbols(source2
);
121 CPPUNIT_ASSERT(symbols
.size() == 1);
122 CPPUNIT_ASSERT(symbols
[0].text
== cr
);
123 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
125 symbols
= getSymbols(source3
);
126 CPPUNIT_ASSERT(symbols
.size() == 1);
127 CPPUNIT_ASSERT(symbols
[0].text
== cr
);
128 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
130 symbols
= getSymbols(source4
);
131 CPPUNIT_ASSERT(symbols
.size() == 1);
132 CPPUNIT_ASSERT(symbols
[0].text
== cr
);
133 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
135 symbols
= getSymbols(source5
);
136 CPPUNIT_ASSERT(symbols
.size() == 2);
137 CPPUNIT_ASSERT(symbols
[0].text
== cr
);
138 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
139 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
140 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
142 symbols
= getSymbols(source6
);
143 CPPUNIT_ASSERT(symbols
.size() == 2);
144 CPPUNIT_ASSERT(symbols
[0].text
== cr
);
145 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
146 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
147 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
149 symbols
= getSymbols(source7
);
150 CPPUNIT_ASSERT(symbols
.size() == 2);
151 CPPUNIT_ASSERT(symbols
[0].text
== cr
);
152 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
153 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
154 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
156 symbols
= getSymbols(source8
);
157 CPPUNIT_ASSERT(symbols
.size() == 2);
158 CPPUNIT_ASSERT(symbols
[0].text
== cr
);
159 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
160 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
161 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
163 symbols
= getSymbols(source9
);
164 CPPUNIT_ASSERT(symbols
.size() == 1);
165 CPPUNIT_ASSERT(symbols
[0].text
== cr
);
166 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
169 void ScannerTest::testOperators()
171 const OUString
sourceE("=");
172 const OUString
sourceLT("<");
173 const OUString
sourceGT(">");
174 const OUString
sourceLTE("<=");
175 const OUString
sourceGTE(">=");
176 const OUString
sourceEE("==");
177 const OUString
sourceNE("<>");
178 const OUString
sourceA(":=");
180 std::vector
<Symbol
> symbols
;
182 symbols
= getSymbols(sourceE
);
183 CPPUNIT_ASSERT(symbols
.size() == 2);
184 CPPUNIT_ASSERT(symbols
[0].text
== sourceE
);
185 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
186 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
187 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
189 symbols
= getSymbols(sourceLT
);
190 CPPUNIT_ASSERT(symbols
.size() == 2);
191 CPPUNIT_ASSERT(symbols
[0].text
== sourceLT
);
192 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
193 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
194 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
196 symbols
= getSymbols(sourceGT
);
197 CPPUNIT_ASSERT(symbols
.size() == 2);
198 CPPUNIT_ASSERT(symbols
[0].text
== sourceGT
);
199 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
200 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
201 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
203 symbols
= getSymbols(sourceLTE
);
204 CPPUNIT_ASSERT(symbols
.size() == 2);
205 CPPUNIT_ASSERT(symbols
[0].text
== sourceLTE
);
206 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
207 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
208 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
210 symbols
= getSymbols(sourceGTE
);
211 CPPUNIT_ASSERT(symbols
.size() == 2);
212 CPPUNIT_ASSERT(symbols
[0].text
== sourceGTE
);
213 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
214 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
215 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
217 symbols
= getSymbols(sourceEE
);
218 CPPUNIT_ASSERT(symbols
.size() == 3);
219 CPPUNIT_ASSERT(symbols
[0].text
== sourceE
);
220 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
221 CPPUNIT_ASSERT(symbols
[1].text
== sourceE
);
222 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
223 CPPUNIT_ASSERT(symbols
[2].text
== cr
);
224 CPPUNIT_ASSERT(symbols
[2].type
== SbxVARIANT
);
226 symbols
= getSymbols(sourceNE
);
227 CPPUNIT_ASSERT(symbols
.size() == 2);
228 CPPUNIT_ASSERT(symbols
[0].text
== sourceNE
);
229 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
230 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
231 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
233 symbols
= getSymbols(sourceA
);
234 CPPUNIT_ASSERT(symbols
.size() == 2);
235 CPPUNIT_ASSERT(symbols
[0].text
== sourceA
);
236 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
237 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
238 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
241 void ScannerTest::testAlphanum()
243 const OUString
source1("asdfghefg");
244 const OUString
source2("1asfdasfd");
245 const OUString
source3("AdfsaAUdsl10987");
246 const OUString
source4("asdfa_mnvcnm");
247 const OUString
source5("_asdf1");
248 const OUString
source6("_6");
249 const OUString
source7("joxclk_");
250 const OUString
source8(" asdf ");
251 const OUString
source9(" 19395 asdfa ");
252 const OUString
source10("\n1\n2\na sdf");
253 const OUString
source11("asdf.asdf");
254 const OUString
source12("..");
256 std::vector
<Symbol
> symbols
;
258 symbols
= getSymbols(source1
);
259 CPPUNIT_ASSERT(symbols
.size() == 2);
260 CPPUNIT_ASSERT(symbols
[0].text
== source1
);
261 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
262 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
263 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
265 symbols
= getSymbols(source2
);
266 CPPUNIT_ASSERT(symbols
.size() == 3);
267 CPPUNIT_ASSERT(symbols
[0].text
.isEmpty()); // Can't start symbol with a digit
268 CPPUNIT_ASSERT(symbols
[0].number
== 1);
269 CPPUNIT_ASSERT(symbols
[0].type
== SbxINTEGER
);
270 CPPUNIT_ASSERT(symbols
[1].text
== OUString("asfdasfd"));
271 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
272 CPPUNIT_ASSERT(symbols
[2].text
== cr
);
273 CPPUNIT_ASSERT(symbols
[2].type
== SbxVARIANT
);
275 symbols
= getSymbols(source3
);
276 CPPUNIT_ASSERT(symbols
.size() == 2);
277 CPPUNIT_ASSERT(symbols
[0].text
== source3
);
278 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
279 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
280 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
282 symbols
= getSymbols(source4
);
283 CPPUNIT_ASSERT(symbols
.size() == 2);
284 CPPUNIT_ASSERT(symbols
[0].text
== source4
);
285 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
286 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
287 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
289 symbols
= getSymbols(source5
);
290 CPPUNIT_ASSERT(symbols
.size() == 2);
291 CPPUNIT_ASSERT(symbols
[0].text
== source5
);
292 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
293 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
294 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
296 symbols
= getSymbols(source6
);
297 CPPUNIT_ASSERT(symbols
.size() == 2);
298 CPPUNIT_ASSERT(symbols
[0].text
== source6
);
299 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
300 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
301 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
303 symbols
= getSymbols(source7
);
304 CPPUNIT_ASSERT(symbols
.size() == 2);
305 CPPUNIT_ASSERT(symbols
[0].text
== OUString("joxclk_"));
306 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
307 CPPUNIT_ASSERT(source7
== OUString("joxclk ")); // Change the trailing '_' to a ' '
308 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
309 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
311 symbols
= getSymbols(source8
);
312 CPPUNIT_ASSERT(symbols
.size() == 2);
313 CPPUNIT_ASSERT(symbols
[0].text
== OUString("asdf"));
314 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
315 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
316 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
318 symbols
= getSymbols(source9
);
319 CPPUNIT_ASSERT(symbols
.size() == 3);
320 CPPUNIT_ASSERT(symbols
[0].text
.isEmpty());
321 CPPUNIT_ASSERT(symbols
[0].number
== 19395);
322 CPPUNIT_ASSERT(symbols
[0].type
== SbxINTEGER
);
323 CPPUNIT_ASSERT(symbols
[1].text
== OUString("asdfa"));
324 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
325 CPPUNIT_ASSERT(symbols
[2].text
== cr
);
326 CPPUNIT_ASSERT(symbols
[2].type
== SbxVARIANT
);
328 symbols
= getSymbols(source10
);
329 CPPUNIT_ASSERT(symbols
.size() == 8);
330 CPPUNIT_ASSERT(symbols
[0].text
== cr
);
331 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
332 CPPUNIT_ASSERT(symbols
[1].text
.isEmpty());
333 CPPUNIT_ASSERT(symbols
[1].number
== 1);
334 CPPUNIT_ASSERT(symbols
[1].type
== SbxINTEGER
);
335 CPPUNIT_ASSERT(symbols
[2].text
== cr
);
336 CPPUNIT_ASSERT(symbols
[2].type
== SbxVARIANT
);
337 CPPUNIT_ASSERT(symbols
[3].text
.isEmpty());
338 CPPUNIT_ASSERT(symbols
[3].number
== 2);
339 CPPUNIT_ASSERT(symbols
[3].type
== SbxINTEGER
);
340 CPPUNIT_ASSERT(symbols
[4].text
== cr
);
341 CPPUNIT_ASSERT(symbols
[4].type
== SbxVARIANT
);
342 CPPUNIT_ASSERT(symbols
[5].text
.getLength() == 1);
343 CPPUNIT_ASSERT(symbols
[5].text
[0] == 'a');
344 CPPUNIT_ASSERT(symbols
[5].type
== SbxVARIANT
);
345 CPPUNIT_ASSERT(symbols
[6].text
== OUString("sdf"));
346 CPPUNIT_ASSERT(symbols
[6].type
== SbxVARIANT
);
347 CPPUNIT_ASSERT(symbols
[7].text
== cr
);
348 CPPUNIT_ASSERT(symbols
[7].type
== SbxVARIANT
);
350 symbols
= getSymbols(source11
);
351 CPPUNIT_ASSERT(symbols
.size() == 4);
352 CPPUNIT_ASSERT(symbols
[0].text
== asdf
);
353 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
354 CPPUNIT_ASSERT(symbols
[1].text
== dot
);
355 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
356 CPPUNIT_ASSERT(symbols
[2].text
== asdf
);
357 CPPUNIT_ASSERT(symbols
[2].type
== SbxVARIANT
);
358 CPPUNIT_ASSERT(symbols
[3].text
== cr
);
359 CPPUNIT_ASSERT(symbols
[3].type
== SbxVARIANT
);
361 symbols
= getSymbols(source12
);
362 CPPUNIT_ASSERT(symbols
.size() == 3);
363 CPPUNIT_ASSERT(symbols
[0].text
== dot
);
364 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
365 CPPUNIT_ASSERT(symbols
[1].text
== dot
);
366 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
367 CPPUNIT_ASSERT(symbols
[2].text
== cr
);
368 CPPUNIT_ASSERT(symbols
[2].type
== SbxVARIANT
);
371 void ScannerTest::testComments()
373 const OUString
source1("REM asdf");
374 const OUString
source2("REMasdf");
375 const OUString
source3("'asdf");
376 const OUString
source4("asdf _\n'100");
377 const OUString
source5("'asdf _\n100");
378 const OUString
source6("'asdf _\n'100");
379 const OUString
source7("'asdf _\n 1234 _\n asdf'");
381 std::vector
<Symbol
> symbols
;
383 symbols
= getSymbols(source1
);
384 CPPUNIT_ASSERT(symbols
.size() == 1);
385 CPPUNIT_ASSERT(symbols
[0].text
== rem
);
386 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
388 symbols
= getSymbols(source2
);
389 CPPUNIT_ASSERT(symbols
.size() == 2);
390 CPPUNIT_ASSERT(symbols
[0].text
== OUString("REMasdf"));
391 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
392 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
393 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
395 symbols
= getSymbols(source3
);
396 CPPUNIT_ASSERT(symbols
.size() == 1);
397 CPPUNIT_ASSERT(symbols
[0].text
== rem
);
398 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
400 symbols
= getSymbols(source4
);
401 CPPUNIT_ASSERT(symbols
.size() == 2);
402 CPPUNIT_ASSERT(symbols
[0].text
== asdf
);
403 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
404 CPPUNIT_ASSERT(symbols
[1].text
== rem
);
405 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
407 symbols
= getSymbols(source5
);
408 CPPUNIT_ASSERT(symbols
.size() == 3);
409 CPPUNIT_ASSERT(symbols
[0].text
== rem
);
410 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
411 CPPUNIT_ASSERT(symbols
[1].text
.isEmpty());
412 CPPUNIT_ASSERT(symbols
[1].number
== 100);
413 CPPUNIT_ASSERT(symbols
[1].type
== SbxINTEGER
);
414 CPPUNIT_ASSERT(symbols
[2].text
== cr
);
415 CPPUNIT_ASSERT(symbols
[2].type
== SbxVARIANT
);
417 symbols
= getSymbols(source6
);
418 CPPUNIT_ASSERT(symbols
.size() == 2);
419 CPPUNIT_ASSERT(symbols
[0].text
== rem
);
420 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
421 CPPUNIT_ASSERT(symbols
[1].text
== rem
);
422 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
424 symbols
= getSymbols(source7
);
425 CPPUNIT_ASSERT(symbols
.size() == 4);
426 CPPUNIT_ASSERT(symbols
[0].text
== rem
);
427 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
428 CPPUNIT_ASSERT(symbols
[1].text
.isEmpty());
429 CPPUNIT_ASSERT(symbols
[1].number
== 1234);
430 CPPUNIT_ASSERT(symbols
[1].type
== SbxINTEGER
);
431 CPPUNIT_ASSERT(symbols
[2].text
== asdf
);
432 CPPUNIT_ASSERT(symbols
[2].type
== SbxVARIANT
);
433 CPPUNIT_ASSERT(symbols
[3].text
== rem
);
434 CPPUNIT_ASSERT(symbols
[3].type
== SbxVARIANT
);
437 void ScannerTest::testGoto()
439 const OUString
source1("goto");
440 const OUString
source2("go to");
441 const OUString
source3("go\nto");
443 std::vector
<Symbol
> symbols
;
445 symbols
= getSymbols(source1
);
446 CPPUNIT_ASSERT(symbols
.size() == 2);
447 CPPUNIT_ASSERT(symbols
[0].text
== goto_
);
448 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
449 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
450 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
452 symbols
= getSymbols(source2
);
453 CPPUNIT_ASSERT(symbols
.size() == 3);
454 CPPUNIT_ASSERT(symbols
[0].text
== OUString("go"));
455 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
456 CPPUNIT_ASSERT(symbols
[1].text
== OUString("to"));
457 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
458 CPPUNIT_ASSERT(symbols
[2].text
== cr
);
459 CPPUNIT_ASSERT(symbols
[2].type
== SbxVARIANT
);
461 symbols
= getSymbols(source3
);
462 CPPUNIT_ASSERT(symbols
.size() == 4);
463 CPPUNIT_ASSERT(symbols
[0].text
== OUString("go"));
464 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
465 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
466 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
467 CPPUNIT_ASSERT(symbols
[2].text
== OUString("to"));
468 CPPUNIT_ASSERT(symbols
[2].type
== SbxVARIANT
);
469 CPPUNIT_ASSERT(symbols
[3].text
== cr
);
470 CPPUNIT_ASSERT(symbols
[3].type
== SbxVARIANT
);
473 void ScannerTest::testGotoCompatible()
475 const OUString
source1("goto");
476 const OUString
source2("go to");
477 const OUString
source3("go\nto");
479 std::vector
<Symbol
> symbols
;
481 symbols
= getSymbols(source1
, true);
482 CPPUNIT_ASSERT(symbols
.size() == 2);
483 CPPUNIT_ASSERT(symbols
[0].text
== goto_
);
484 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
486 symbols
= getSymbols(source2
, true);
487 CPPUNIT_ASSERT(symbols
.size() == 2);
488 CPPUNIT_ASSERT(symbols
[0].text
== OUString(goto_
));
489 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
491 symbols
= getSymbols(source3
, true);
492 CPPUNIT_ASSERT(symbols
.size() == 4);
493 CPPUNIT_ASSERT(symbols
[0].text
== OUString("go"));
494 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
495 CPPUNIT_ASSERT(symbols
[2].text
== OUString("to"));
496 CPPUNIT_ASSERT(symbols
[3].text
== cr
);
499 void ScannerTest::testExclamation()
501 const OUString
source1("asdf!asdf");
502 const OUString
source2("!1234");
503 const OUString
source3("!_3");
504 const OUString
source4("!$");
505 const OUString
source5("!%");
506 const OUString
source6("!\n");
508 std::vector
<Symbol
> symbols
;
510 symbols
= getSymbols(source1
);
511 CPPUNIT_ASSERT(symbols
.size() == 4);
512 CPPUNIT_ASSERT(symbols
[0].text
== asdf
);
513 CPPUNIT_ASSERT(symbols
[1].text
== excl
);
514 CPPUNIT_ASSERT(symbols
[2].text
== asdf
);
515 CPPUNIT_ASSERT(symbols
[3].text
== cr
);
517 symbols
= getSymbols(source2
);
518 CPPUNIT_ASSERT(symbols
.size() == 3);
519 CPPUNIT_ASSERT(symbols
[0].text
== excl
);
520 CPPUNIT_ASSERT(symbols
[1].text
.isEmpty());
521 CPPUNIT_ASSERT(symbols
[1].number
== 1234);
522 CPPUNIT_ASSERT(symbols
[2].text
== cr
);
524 symbols
= getSymbols(source3
);
525 CPPUNIT_ASSERT(symbols
.size() == 3);
526 CPPUNIT_ASSERT(symbols
[0].text
== excl
);
527 CPPUNIT_ASSERT(symbols
[1].text
== OUString("_3"));
528 CPPUNIT_ASSERT(symbols
[2].text
== cr
);
530 symbols
= getSymbols(source4
);
531 CPPUNIT_ASSERT(symbols
.size() == 3);
532 CPPUNIT_ASSERT(symbols
[0].text
== excl
);
533 CPPUNIT_ASSERT(symbols
[1].text
== OUString("$"));
534 CPPUNIT_ASSERT(symbols
[2].text
== cr
);
536 symbols
= getSymbols(source5
);
537 CPPUNIT_ASSERT(symbols
.size() == 3);
538 CPPUNIT_ASSERT(symbols
[0].text
== excl
);
539 CPPUNIT_ASSERT(symbols
[1].text
== OUString("%"));
540 CPPUNIT_ASSERT(symbols
[2].text
== cr
);
542 symbols
= getSymbols(source6
);
543 CPPUNIT_ASSERT(symbols
.size() == 2);
544 CPPUNIT_ASSERT(symbols
[0].text
== excl
);
545 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
548 void ScannerTest::testNumbers()
550 const OUString
source1("12345");
551 const OUString
source2("1.2.3");
552 const OUString
source3("123.4");
553 const OUString
source4("0.5");
554 const OUString
source5("5.0");
555 const OUString
source6("0.0");
556 const OUString
source7("-3");
557 const OUString
source8("-0.0");
558 const OUString
source9("12dE3");
559 const OUString
source10("12e3");
560 const OUString
source11("12D+3");
561 const OUString
source12("12e++3");
562 const OUString
source13("12e-3");
563 const OUString
source14("12e-3+");
564 const OUString
source15("1,2,3");
565 const OUString
source16("1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000");
566 const OUString
source17("10e308");
568 std::vector
<Symbol
> symbols
;
571 symbols
= getSymbols(source1
, errors
);
572 CPPUNIT_ASSERT(symbols
.size() == 2);
573 CPPUNIT_ASSERT(symbols
[0].number
== 12345);
574 CPPUNIT_ASSERT(symbols
[0].type
== SbxINTEGER
);
575 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
576 CPPUNIT_ASSERT(errors
== 0);
578 symbols
= getSymbols(source2
, errors
);
579 CPPUNIT_ASSERT(symbols
.size() == 2);
580 CPPUNIT_ASSERT(symbols
[0].number
== 1.23);
581 CPPUNIT_ASSERT(symbols
[0].type
== SbxDOUBLE
);
582 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
583 CPPUNIT_ASSERT(errors
== 1);
585 symbols
= getSymbols(source3
, errors
);
586 CPPUNIT_ASSERT(symbols
.size() == 2);
587 CPPUNIT_ASSERT(symbols
[0].number
== 123.4);
588 CPPUNIT_ASSERT(symbols
[0].type
== SbxDOUBLE
);
589 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
590 CPPUNIT_ASSERT(errors
== 0);
592 symbols
= getSymbols(source4
, errors
);
593 CPPUNIT_ASSERT(symbols
.size() == 2);
594 CPPUNIT_ASSERT(symbols
[0].number
== .5);
595 CPPUNIT_ASSERT(symbols
[0].type
== SbxDOUBLE
);
596 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
597 CPPUNIT_ASSERT(errors
== 0);
599 symbols
= getSymbols(source5
, errors
);
600 CPPUNIT_ASSERT(symbols
.size() == 2);
601 CPPUNIT_ASSERT(symbols
[0].number
== 5);
602 CPPUNIT_ASSERT(symbols
[0].type
== SbxDOUBLE
);
603 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
604 CPPUNIT_ASSERT(errors
== 0);
606 symbols
= getSymbols(source6
, errors
);
607 CPPUNIT_ASSERT(symbols
.size() == 2);
608 CPPUNIT_ASSERT(symbols
[0].number
== 0);
609 CPPUNIT_ASSERT(symbols
[0].type
== SbxDOUBLE
);
610 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
611 CPPUNIT_ASSERT(errors
== 0);
613 symbols
= getSymbols(source7
, errors
);
614 CPPUNIT_ASSERT(symbols
.size() == 3);
615 CPPUNIT_ASSERT(symbols
[0].text
== OUString("-"));
616 CPPUNIT_ASSERT(symbols
[1].number
== 3);
617 CPPUNIT_ASSERT(symbols
[1].type
== SbxINTEGER
);
618 CPPUNIT_ASSERT(symbols
[2].text
== cr
);
619 CPPUNIT_ASSERT(errors
== 0);
621 symbols
= getSymbols(source8
, errors
);
622 CPPUNIT_ASSERT(symbols
.size() == 3);
623 CPPUNIT_ASSERT(symbols
[0].text
== OUString("-"));
624 CPPUNIT_ASSERT(symbols
[1].number
== 0);
625 CPPUNIT_ASSERT(symbols
[1].type
== SbxDOUBLE
);
626 CPPUNIT_ASSERT(symbols
[2].text
== cr
);
627 CPPUNIT_ASSERT(errors
== 0);
629 symbols
= getSymbols(source9
, errors
);
630 CPPUNIT_ASSERT(symbols
.size() == 2);
631 CPPUNIT_ASSERT(symbols
[0].number
== 12000);
632 CPPUNIT_ASSERT(symbols
[0].type
== SbxDOUBLE
);
633 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
634 CPPUNIT_ASSERT(errors
== 1);
636 symbols
= getSymbols(source10
, errors
);
637 CPPUNIT_ASSERT(symbols
.size() == 2);
638 CPPUNIT_ASSERT(symbols
[0].number
== 12000);
639 CPPUNIT_ASSERT(symbols
[0].type
== SbxDOUBLE
);
640 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
641 CPPUNIT_ASSERT(errors
== 0);
643 symbols
= getSymbols(source11
, errors
);
644 CPPUNIT_ASSERT(symbols
.size() == 2);
645 CPPUNIT_ASSERT(symbols
[0].number
== 12000);
646 CPPUNIT_ASSERT(symbols
[0].type
== SbxDOUBLE
);
647 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
648 CPPUNIT_ASSERT(errors
== 0);
650 /* FIXME: SbiScanner::NextSym() is total crap, the result of scanning
651 * "12e++3" should be something different than this.. */
652 symbols
= getSymbols(source12
, errors
);
653 CPPUNIT_ASSERT(symbols
.size() == 4);
654 CPPUNIT_ASSERT(symbols
[0].number
== 12);
655 CPPUNIT_ASSERT(symbols
[0].type
== SbxDOUBLE
);
656 CPPUNIT_ASSERT(symbols
[1].text
== OUString("+"));
657 CPPUNIT_ASSERT(symbols
[2].number
== 3);
658 CPPUNIT_ASSERT(symbols
[2].type
== SbxINTEGER
);
659 CPPUNIT_ASSERT(symbols
[3].text
== cr
);
660 CPPUNIT_ASSERT(errors
== 1);
662 symbols
= getSymbols(source13
, errors
);
663 CPPUNIT_ASSERT(symbols
.size() == 2);
664 CPPUNIT_ASSERT(symbols
[0].number
== .012);
665 CPPUNIT_ASSERT(symbols
[0].type
== SbxDOUBLE
);
666 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
667 CPPUNIT_ASSERT(errors
== 0);
669 symbols
= getSymbols(source14
, errors
);
670 CPPUNIT_ASSERT(symbols
.size() == 3);
671 CPPUNIT_ASSERT(symbols
[0].number
== .012);
672 CPPUNIT_ASSERT(symbols
[0].type
== SbxDOUBLE
);
673 CPPUNIT_ASSERT(symbols
[1].text
== OUString("+"));
674 CPPUNIT_ASSERT(symbols
[2].text
== cr
);
675 CPPUNIT_ASSERT(errors
== 0);
677 symbols
= getSymbols(source15
, errors
);
678 CPPUNIT_ASSERT(symbols
.size() == 6);
679 CPPUNIT_ASSERT(symbols
[0].number
== 1);
680 CPPUNIT_ASSERT(symbols
[0].type
== SbxINTEGER
);
681 CPPUNIT_ASSERT(symbols
[1].text
== OUString(","));
682 CPPUNIT_ASSERT(symbols
[2].number
== 2);
683 CPPUNIT_ASSERT(symbols
[2].type
== SbxINTEGER
);
684 CPPUNIT_ASSERT(symbols
[3].text
== OUString(","));
685 CPPUNIT_ASSERT(symbols
[4].number
== 3);
686 CPPUNIT_ASSERT(symbols
[4].type
== SbxINTEGER
);
687 CPPUNIT_ASSERT(symbols
[5].text
== cr
);
688 CPPUNIT_ASSERT(errors
== 0);
690 symbols
= getSymbols(source16
, errors
);
691 CPPUNIT_ASSERT(symbols
.size() == 2);
692 CPPUNIT_ASSERT(symbols
[0].number
== 1);
693 CPPUNIT_ASSERT(symbols
[0].type
== SbxDOUBLE
);
694 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
695 // This error is from a "buffer overflow" which is stupid because
696 // the buffer is artificially constrained by the scanner.
697 CPPUNIT_ASSERT(errors
== 1); // HACK
700 rtl::math::setInf( &fInf
, false);
701 symbols
= getSymbols(source17
, errors
);
702 CPPUNIT_ASSERT(symbols
.size() == 2);
703 CPPUNIT_ASSERT(symbols
[0].number
== fInf
);
704 CPPUNIT_ASSERT(symbols
[0].type
== SbxDOUBLE
);
705 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
706 CPPUNIT_ASSERT(errors
== 1); // math error, overflow
709 void ScannerTest::testDataType()
711 const OUString
source1("asdf%");
712 const OUString
source2("asdf&");
713 const OUString
source3("asdf!");
714 const OUString
source4("asdf#");
715 const OUString
source5("asdf@");
716 const OUString
source6("asdf$");
717 const OUString
source7("asdf ");
719 std::vector
<Symbol
> symbols
;
721 symbols
= getSymbols(source1
);
722 CPPUNIT_ASSERT(symbols
.size() == 2);
723 CPPUNIT_ASSERT(symbols
[0].type
== SbxINTEGER
);
724 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
726 symbols
= getSymbols(source2
);
727 CPPUNIT_ASSERT(symbols
.size() == 2);
728 CPPUNIT_ASSERT(symbols
[0].type
== SbxLONG
);
729 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
731 symbols
= getSymbols(source3
);
732 CPPUNIT_ASSERT(symbols
.size() == 2);
733 CPPUNIT_ASSERT(symbols
[0].type
== SbxSINGLE
);
734 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
736 symbols
= getSymbols(source4
);
737 CPPUNIT_ASSERT(symbols
.size() == 2);
738 CPPUNIT_ASSERT(symbols
[0].type
== SbxDOUBLE
);
739 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
741 symbols
= getSymbols(source5
);
742 CPPUNIT_ASSERT(symbols
.size() == 2);
743 CPPUNIT_ASSERT(symbols
[0].type
== SbxCURRENCY
);
744 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
746 symbols
= getSymbols(source6
);
747 CPPUNIT_ASSERT(symbols
.size() == 2);
748 CPPUNIT_ASSERT(symbols
[0].type
== SbxSTRING
);
749 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
751 symbols
= getSymbols(source7
);
752 CPPUNIT_ASSERT(symbols
.size() == 2);
753 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
754 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
757 void ScannerTest::testHexOctal()
759 const OUString
source1("&HA");
760 const OUString
source2("&HASDF");
761 const OUString
source3("&H10");
762 const OUString
source4("&&H&1H1&H1");
763 const OUString
source5("&O&O12");
764 const OUString
source6("&O10");
765 const OUString
source7("&HO");
766 const OUString
source8("&O123000000000000000000000");
767 const OUString
source9("&H1.23");
769 std::vector
<Symbol
> symbols
;
771 symbols
= getSymbols(source1
);
772 CPPUNIT_ASSERT(symbols
.size() == 2);
773 CPPUNIT_ASSERT(symbols
[0].number
== 10);
774 CPPUNIT_ASSERT(symbols
[0].text
== OUString());
775 CPPUNIT_ASSERT(symbols
[0].type
== SbxINTEGER
);
776 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
778 symbols
= getSymbols(source2
);
779 CPPUNIT_ASSERT(symbols
.size() == 2);
780 CPPUNIT_ASSERT(symbols
[0].number
== 2783);
781 CPPUNIT_ASSERT(symbols
[0].text
== OUString());
782 CPPUNIT_ASSERT(symbols
[0].type
== SbxINTEGER
);
783 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
785 symbols
= getSymbols(source3
);
786 CPPUNIT_ASSERT(symbols
.size() == 2);
787 CPPUNIT_ASSERT(symbols
[0].number
== 16);
788 CPPUNIT_ASSERT(symbols
[0].text
== OUString());
789 CPPUNIT_ASSERT(symbols
[0].type
== SbxINTEGER
);
790 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
792 symbols
= getSymbols(source4
);
793 CPPUNIT_ASSERT(symbols
.size() == 6);
794 CPPUNIT_ASSERT(symbols
[0].number
== 0);
795 CPPUNIT_ASSERT(symbols
[0].text
== OUString("&"));
796 CPPUNIT_ASSERT(symbols
[0].type
== SbxVARIANT
);
797 CPPUNIT_ASSERT(symbols
[1].number
== 0);
798 CPPUNIT_ASSERT(symbols
[1].text
== OUString());
799 CPPUNIT_ASSERT(symbols
[1].type
== SbxINTEGER
);
800 CPPUNIT_ASSERT(symbols
[2].number
== 1);
801 CPPUNIT_ASSERT(symbols
[2].text
== OUString());
802 CPPUNIT_ASSERT(symbols
[2].type
== SbxINTEGER
);
803 CPPUNIT_ASSERT(symbols
[3].number
== 1);
804 CPPUNIT_ASSERT(symbols
[3].text
== OUString("H1"));
805 CPPUNIT_ASSERT(symbols
[3].type
== SbxLONG
);
806 CPPUNIT_ASSERT(symbols
[4].number
== 1);
807 CPPUNIT_ASSERT(symbols
[4].text
== OUString("H1"));
808 CPPUNIT_ASSERT(symbols
[4].type
== SbxVARIANT
);
809 CPPUNIT_ASSERT(symbols
[5].text
== cr
);
811 symbols
= getSymbols(source5
);
812 CPPUNIT_ASSERT(symbols
.size() == 3);
813 CPPUNIT_ASSERT(symbols
[0].number
== 0);
814 CPPUNIT_ASSERT(symbols
[0].text
== OUString());
815 CPPUNIT_ASSERT(symbols
[0].type
== SbxINTEGER
);
816 CPPUNIT_ASSERT(symbols
[1].number
== 0);
817 CPPUNIT_ASSERT(symbols
[1].text
== OUString("O12"));
818 CPPUNIT_ASSERT(symbols
[1].type
== SbxVARIANT
);
819 CPPUNIT_ASSERT(symbols
[2].text
== cr
);
821 symbols
= getSymbols(source6
);
822 CPPUNIT_ASSERT(symbols
.size() == 2);
823 CPPUNIT_ASSERT(symbols
[0].number
== 8);
824 CPPUNIT_ASSERT(symbols
[0].text
== OUString());
825 CPPUNIT_ASSERT(symbols
[0].type
== SbxINTEGER
);
826 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
828 symbols
= getSymbols(source7
);
829 CPPUNIT_ASSERT(symbols
.size() == 2);
830 CPPUNIT_ASSERT(symbols
[0].number
== 0);
831 CPPUNIT_ASSERT(symbols
[0].text
== OUString());
832 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
834 symbols
= getSymbols(source8
);
835 CPPUNIT_ASSERT(symbols
.size() == 2);
836 // TODO: this line fails on 64 bit systems!!!
837 // CPPUNIT_ASSERT(symbols[0].number == -1744830464);
838 CPPUNIT_ASSERT(symbols
[0].text
== OUString());
839 CPPUNIT_ASSERT(symbols
[1].text
== cr
);
841 symbols
= getSymbols(source9
);
842 CPPUNIT_ASSERT(symbols
.size() == 3);
843 CPPUNIT_ASSERT(symbols
[0].text
== OUString());
844 CPPUNIT_ASSERT(symbols
[0].number
== 1);
845 CPPUNIT_ASSERT(symbols
[0].type
== SbxINTEGER
);
846 CPPUNIT_ASSERT(symbols
[1].number
== .23);
847 CPPUNIT_ASSERT(symbols
[1].text
== OUString());
848 CPPUNIT_ASSERT(symbols
[1].type
== SbxDOUBLE
);
849 CPPUNIT_ASSERT(symbols
[2].text
== cr
);
852 // Put the test suite in the registry
853 CPPUNIT_TEST_SUITE_REGISTRATION(ScannerTest
);
855 CPPUNIT_PLUGIN_IMPLEMENT();
857 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */