bump product version to 4.1.6.2
[LibreOffice.git] / basic / qa / cppunit / test_scanner.cxx
blobacf740fb03a1cbab398fe325b53be33a907efc62
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
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/.
8 */
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"
22 namespace
24 struct Symbol
26 sal_uInt16 line;
27 sal_uInt16 col1;
28 sal_uInt16 col2;
29 OUString text;
30 double number;
31 SbxDataType type;
34 /**
35 * Perform tests on Scanner.
37 class ScannerTest : public CppUnit::TestFixture
39 private:
40 void testBlankLines();
41 void testOperators();
42 void testAlphanum();
43 void testComments();
44 void testGoto();
45 void testGotoCompatible();
46 void testExclamation();
47 void testNumbers();
48 void testDataType();
49 void testHexOctal();
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())
85 Symbol symbol;
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();
95 return symbols;
98 std::vector<Symbol> getSymbols(const OUString& source, bool bCompatible = false)
100 sal_Int32 i;
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;
569 sal_Int32 errors;
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
699 double fInf = 0.0;
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);
854 } // namespace
855 CPPUNIT_PLUGIN_IMPLEMENT();
857 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */