tcsqlscanner.pas 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638
  1. {
  2. This file is part of the Free Component Library
  3. Copyright (c) 2010-2014 by the Free Pascal development team
  4. SQL source lexical scanner test suite
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. unit tcsqlscanner;
  12. {$mode objfpc}{$H+}
  13. interface
  14. uses
  15. Classes, SysUtils, fpcunit, testutils, testregistry, fpsqlscanner;
  16. type
  17. { TTestSQLScanner }
  18. TTestSQLScanner= class(TTestCase)
  19. Private
  20. FStream : TStream;
  21. FLineReader : TLineReader;
  22. FScanner : TSQLScanner;
  23. FErrorSource : String;
  24. FErrorOptions : TSQLScannerOptions;
  25. procedure AssertEquals(AMessage: String; AExpected, AActual : TSQLToken); overload;
  26. procedure CheckToken(AToken: TSQLToken; ASource: String);
  27. procedure CheckTokens(ASource: String; ATokens: array of TSQLToken);
  28. procedure DoTestFloat(F: Double);
  29. procedure DoTestFloat(F: Double; S: String);
  30. procedure DoTestString(S: String; DoubleDelim : Boolean = False);
  31. procedure TestErrorSource;
  32. protected
  33. Function CreateScanner(AInput : String; AOptions : TSQLScannerOptions = []) : TSQLScanner;
  34. procedure FreeScanner;
  35. procedure SetUp; override;
  36. procedure TearDown; override;
  37. Property Scanner : TSQLScanner Read FScanner;
  38. published
  39. procedure TestAction;
  40. procedure TestAdd;
  41. procedure TestAdmin;
  42. procedure TestAfter;
  43. procedure TestALTER;
  44. procedure TestAnd;
  45. procedure TestAny;
  46. procedure TestAs;
  47. procedure TestASC;
  48. procedure TestASCENDING;
  49. Procedure TestAt;
  50. procedure TestAuto;
  51. procedure TestAVG;
  52. procedure TestAssign;
  53. procedure TestBefore;
  54. Procedure TestBegin;
  55. procedure TestBetween;
  56. procedure TestBlob;
  57. procedure TestBraceClose;
  58. procedure TestBraceOpen;
  59. procedure TestBy;
  60. Procedure TestCache;
  61. procedure TestCascade;
  62. procedure TestChar;
  63. procedure TestCharacter;
  64. procedure TestCheck;
  65. procedure TestCollate;
  66. procedure TestColon;
  67. procedure TestColumn;
  68. procedure TestComma;
  69. procedure TestCommit;
  70. procedure TestComputed;
  71. procedure TestConcatenate;
  72. Procedure TestConditional;
  73. Procedure TestConnect;
  74. procedure TestConstraint;
  75. procedure TestContaining;
  76. procedure TestCount;
  77. procedure TestCreate;
  78. procedure TestCString;
  79. Procedure TestDatabase;
  80. Procedure TestDate;
  81. Procedure TestDecimal;
  82. procedure TestDeclare;
  83. procedure TestDefault;
  84. procedure TestDelete;
  85. procedure TestDesc;
  86. procedure TestDescending;
  87. procedure TestDistinct;
  88. procedure TestDiv;
  89. procedure TestDO;
  90. procedure TestDomain;
  91. procedure TestDot;
  92. procedure TestDrop;
  93. procedure TestElse;
  94. procedure TestEmpty;
  95. procedure TestEnd;
  96. Procedure TestEntryPoint;
  97. procedure TestEq;
  98. procedure TestEscape;
  99. procedure TestException;
  100. procedure TestExists;
  101. procedure TestExit;
  102. Procedure TestExternal;
  103. Procedure TestExtract;
  104. procedure TestFile;
  105. Procedure TestFloat;
  106. procedure TestFor;
  107. procedure TestForeign;
  108. procedure TestFreeIt;
  109. procedure TestFunction;
  110. Procedure TestGDSError;
  111. procedure TestGE;
  112. procedure TestGenerator;
  113. procedure TestGrant;
  114. procedure TestGreaterThan;
  115. procedure TestGroup;
  116. Procedure TestHaving;
  117. procedure TestIf;
  118. procedure TestIn;
  119. procedure TestIndex;
  120. procedure TestInner;
  121. procedure TestInsert;
  122. procedure TestInt;
  123. procedure TestInteger;
  124. procedure TestInto;
  125. procedure TestIs;
  126. procedure TestJoin;
  127. procedure TestKey;
  128. procedure TestLeft;
  129. Procedure TestLength;
  130. procedure TestLike;
  131. procedure TestLE;
  132. procedure TestLessThan;
  133. Procedure TestManual;
  134. Procedure TestModuleName;
  135. procedure TestMax;
  136. procedure TestMerge;
  137. procedure TestMin;
  138. procedure TestMinus;
  139. procedure TestMul;
  140. procedure TestNational;
  141. procedure TestNatural;
  142. procedure TestNE;
  143. procedure TestNo;
  144. procedure TestNot;
  145. procedure TestNull;
  146. procedure TestNumeric;
  147. Procedure TestOn;
  148. Procedure TestOption;
  149. Procedure TestOr;
  150. Procedure TestOrder;
  151. Procedure TestOuter;
  152. Procedure TestPage;
  153. Procedure TestPages;
  154. Procedure TestPageSize;
  155. Procedure TestPassword;
  156. procedure TestPlus;
  157. procedure TestPosition;
  158. Procedure TestPostEvent;
  159. procedure TestPrimary;
  160. procedure TestPrivileges;
  161. procedure TestProcedure;
  162. procedure TestPublic;
  163. Procedure TestReferences;
  164. Procedure TestRelease;
  165. Procedure TestReturningValues;
  166. Procedure TestReturns;
  167. Procedure TestRetain;
  168. Procedure TestRevoke;
  169. Procedure TestRight;
  170. Procedure TestRole;
  171. Procedure TestRollback;
  172. Procedure TestSegment;
  173. Procedure TestSelect;
  174. procedure TestSemicolon;
  175. Procedure TestSet;
  176. Procedure TestSchema;
  177. Procedure TestShadow;
  178. Procedure TestSingular;
  179. Procedure TestSize;
  180. Procedure TestSkip;
  181. Procedure TestSome;
  182. Procedure TestSort;
  183. Procedure TestSnapshot;
  184. Procedure TestSQLCode;
  185. procedure TestSquareBraceClose;
  186. procedure TestSquareBraceOpen;
  187. Procedure TestStarting;
  188. procedure TestString;
  189. procedure TestSubtype;
  190. procedure TestSum;
  191. procedure TestSuspend;
  192. Procedure TestTable;
  193. Procedure TestThen;
  194. Procedure TestTime;
  195. Procedure TestTimeStamp;
  196. Procedure TestTo;
  197. Procedure TestTransaction;
  198. Procedure TestTrigger;
  199. Procedure TestType;
  200. Procedure TestUnion;
  201. Procedure TestUnique;
  202. Procedure TestUpdate;
  203. Procedure TestUpper;
  204. Procedure TestUser;
  205. procedure TestValue;
  206. procedure TestValues;
  207. procedure TestVariable;
  208. procedure TestVarChar;
  209. Procedure TestVarying;
  210. Procedure TestView;
  211. Procedure TestWhen;
  212. Procedure TestWhere;
  213. procedure TestWhile;
  214. procedure TestWith;
  215. procedure TestWork;
  216. Procedure Test2Words;
  217. procedure Test3Words;
  218. procedure TestIdentifier;
  219. procedure TestIdentifier2;
  220. procedure TestIdentifier3;
  221. procedure TestIdentifier4;
  222. procedure TestIdentifier5;
  223. procedure TestIdentifierDotIdentifier;
  224. procedure TestEOLN;
  225. procedure TestEOLN2;
  226. procedure TestEOLN3;
  227. procedure TestEOLN4;
  228. procedure TestComment1;
  229. procedure TestComment2;
  230. procedure TestComment3;
  231. procedure TestComment4;
  232. procedure TestComment5;
  233. procedure TestComment6;
  234. procedure TestFloatLiteral;
  235. procedure TestStringLiteral1;
  236. procedure TestStringLiteral2;
  237. procedure TestSymbolLiteral1;
  238. procedure TestSymbolLiteral2;
  239. procedure TestStringError;
  240. procedure TestFloatError;
  241. Procedure TestOptionsoDoubleQuoteStringLiteral;
  242. Procedure TestOptionsoSingleQuoteIdentifier;
  243. procedure TestOptionsoBackQuoteIdentifier;
  244. procedure TestOptionNosoBackQuoteIdentifier;
  245. procedure TestOptionNosoBackslashEscapes;
  246. procedure TestOptionsoBackslashEscapesTab;
  247. procedure TestOptionsoBackslashEscapesNewLine;
  248. procedure TestOptionsoBackslashEscapesBackSlash;
  249. procedure TestOptionsoBackslashEscapesBackspace;
  250. procedure TestOptionsoBackslashEscapesLineFeed;
  251. procedure TestOptionsoBackslashEscapesNewPage;
  252. procedure TestOptionsoBackslashEscapesSlash;
  253. procedure TestOptionsoBackslashEscapesQuote;
  254. procedure TestOptionsoBackslashEscapesDoubleQuote;
  255. end;
  256. implementation
  257. uses typinfo;
  258. procedure TTestSQLScanner.AssertEquals(AMessage: String; AExpected,
  259. AActual: TSQLToken);
  260. Var
  261. S,EN1,EN2 : String;
  262. begin
  263. If (AActual<>AExpected) then
  264. begin
  265. EN1:=GetEnumName(TypeINfo(TSQLToken),Ord(AExpected));
  266. EN2:=GetEnumName(TypeINfo(TSQLToken),Ord(AActual));
  267. S:=Format('%s : %s <> %s',[AMessage,EN1,EN2]);
  268. Fail(S);
  269. end;
  270. end;
  271. procedure TTestSQLScanner.CheckToken(AToken: TSQLToken; ASource: String);
  272. Var
  273. J : TSqlToken;
  274. EN2 : String;
  275. begin
  276. CreateScanner(ASource);
  277. J:=Scanner.FetchToken;
  278. EN2:=GetEnumName(TypeInfo(TSQLToken),Ord(AToken));
  279. AssertEquals(Format('Source %s should result in %s.',[ASource,EN2]),AToken,J);
  280. end;
  281. procedure TTestSQLScanner.DoTestFloat(F: Double);
  282. Var
  283. S : String;
  284. begin
  285. Str(F,S);
  286. DoTestFloat(F,S);
  287. end;
  288. procedure TTestSQLScanner.DoTestFloat(F: Double; S: String);
  289. Var
  290. J : TSQLToken;
  291. C : Double;
  292. I : integer;
  293. V : String;
  294. begin
  295. CreateScanner(S);
  296. try
  297. J:=FScanner.FetchToken;
  298. AssertEquals(S+' is a number',tsqlFloatNumber,J);
  299. V:=FScanner.CurTokenString;
  300. Val(V,C,I);
  301. If (I<>0) then
  302. Fail(FScanner.CurTokenString+' does not contain a float value');
  303. AssertEquals('Parsed float equals original float',F,C);
  304. finally
  305. FreeScanner;
  306. end;
  307. end;
  308. procedure TTestSQLScanner.DoTestString(S: String; DoubleDelim : Boolean = False);
  309. Var
  310. J : TSQLToken;
  311. C : Char;
  312. begin
  313. CreateScanner(S);
  314. try
  315. J:=FScanner.FetchToken;
  316. AssertEquals(S+' is a string',tsqlString,J);
  317. If (Length(S)>0) and (S[1] in ['"','''']) then
  318. begin
  319. C:=S[1];
  320. S:=Copy(S,2,Length(S)-2);
  321. end;
  322. If DoubleDelim then
  323. S:=StringReplace(S,C+C,C,[rfReplaceAll]);
  324. AssertEquals('Correct string is returned',S,FScanner.CurTokenString);
  325. finally
  326. FreeScanner;
  327. end;
  328. end;
  329. procedure TTestSQLScanner.TestErrorSource;
  330. begin
  331. CreateScanner(FErrorSource,FErrorOptions);
  332. While (FScanner.FetchToken<>tsqlEOF) do ;
  333. end;
  334. function TTestSQLScanner.CreateScanner(AInput: String; AOptions : TSQLScannerOptions = []): TSQLScanner;
  335. begin
  336. FStream:=TStringStream.Create(AInput);
  337. FLineReader:=TStreamLineReader.Create(Fstream);
  338. FScanner:=TSQLScanner.Create(FLineReader);
  339. FScanner.Options:=AOptions;
  340. Result:=FScanner;
  341. end;
  342. procedure TTestSQLScanner.FreeScanner;
  343. begin
  344. FreeAndNil(FScanner);
  345. FreeAndNil(FLineReader);
  346. FreeAndNil(FStream);
  347. end;
  348. procedure TTestSQLScanner.SetUp;
  349. begin
  350. inherited SetUp;
  351. FErrorSource:='';
  352. FErrorOptions:=[];
  353. end;
  354. procedure TTestSQLScanner.TearDown;
  355. begin
  356. FreeScanner;
  357. iNHERITED;
  358. end;
  359. procedure TTestSQLScanner.TestAction;
  360. begin
  361. CheckToken(tsqlAction,'ACTION');
  362. end;
  363. procedure TTestSQLScanner.TestAdd;
  364. begin
  365. CheckToken(tsqlAdd,'ADD');
  366. end;
  367. procedure TTestSQLScanner.TestAdmin;
  368. begin
  369. CheckToken(tsqlAdmin,'ADMIN');
  370. end;
  371. procedure TTestSQLScanner.TestAfter;
  372. begin
  373. CheckToken(tsqlAfter,'AFTER');
  374. end;
  375. procedure TTestSQLScanner.TestEmpty;
  376. Var
  377. J : TSQLToken;
  378. begin
  379. CreateScanner('');
  380. J:=Scanner.FetchToken;
  381. If (J<>tsqlEOF) then
  382. Fail('Empty returns EOF');
  383. end;
  384. procedure TTestSQLScanner.TestEnd;
  385. begin
  386. CheckToken(tsqlEnd,'END');
  387. end;
  388. procedure TTestSQLScanner.TestEntryPoint;
  389. begin
  390. CheckToken(tsqlEntryPoint,'ENTRY_POINT');
  391. end;
  392. procedure TTestSQLScanner.TestEscape;
  393. begin
  394. CheckToken(tsqlEscape,'ESCAPE');
  395. end;
  396. procedure TTestSQLScanner.TestException;
  397. begin
  398. CheckToken(tsqlException,'EXCEPTION');
  399. end;
  400. procedure TTestSQLScanner.TestExists;
  401. begin
  402. CheckToken(tsqlExists,'EXISTS');
  403. end;
  404. procedure TTestSQLScanner.TestExit;
  405. begin
  406. CheckToken(tsqlExit,'EXIT');
  407. end;
  408. procedure TTestSQLScanner.TestExternal;
  409. begin
  410. CheckToken(tsqlExternal,'external');
  411. end;
  412. procedure TTestSQLScanner.TestExtract;
  413. begin
  414. CheckToken(tsqlExtract,'EXTRACT');
  415. end;
  416. procedure TTestSQLScanner.TestAnd;
  417. begin
  418. CheckToken(tsqlAnd,'and');
  419. end;
  420. procedure TTestSQLScanner.TestAny;
  421. begin
  422. CheckToken(tsqlAny,'any');
  423. end;
  424. procedure TTestSQLScanner.TestAs;
  425. begin
  426. CheckToken(tsqlAs,'as');
  427. end;
  428. procedure TTestSQLScanner.TestAt;
  429. begin
  430. CheckToken(tsqlAt,'at');
  431. end;
  432. procedure TTestSQLScanner.TestAuto;
  433. begin
  434. CheckToken(tsqlAUTO,'auto');
  435. end;
  436. procedure TTestSQLScanner.TestASC;
  437. begin
  438. CheckToken(tsqlASC,'asc');
  439. end;
  440. procedure TTestSQLScanner.TestASCENDING;
  441. begin
  442. CheckToken(tsqlASCENDING,'ascending');
  443. end;
  444. procedure TTestSQLScanner.TestAVG;
  445. begin
  446. CheckToken(tsqlAVG,'avg');
  447. end;
  448. procedure TTestSQLScanner.TestALTER;
  449. begin
  450. CheckToken(tsqlALTER,'alter');
  451. end;
  452. procedure TTestSQLScanner.TestBraceOpen;
  453. begin
  454. CheckToken(tsqlBraceOpen,'(');
  455. end;
  456. procedure TTestSQLScanner.TestBraceClose;
  457. begin
  458. CheckToken(tsqlBraceClose,')');
  459. end;
  460. procedure TTestSQLScanner.TestComma;
  461. begin
  462. CheckToken(tsqlComma,',');
  463. end;
  464. procedure TTestSQLScanner.TestCommit;
  465. begin
  466. CheckToken(tsqlCommit,'COMMIT');
  467. end;
  468. procedure TTestSQLScanner.TestComputed;
  469. begin
  470. CheckToken(tsqlComputed,'COMPUTED');
  471. end;
  472. procedure TTestSQLScanner.TestConditional;
  473. begin
  474. CheckToken(tsqlConditional,'CONDITIONAL');
  475. end;
  476. procedure TTestSQLScanner.TestConnect;
  477. begin
  478. CheckToken(tsqlConnect,'CONNECT');
  479. end;
  480. procedure TTestSQLScanner.TestConstraint;
  481. begin
  482. CheckToken(tsqlConstraint,'CONSTRAINT');
  483. end;
  484. procedure TTestSQLScanner.TestColon;
  485. begin
  486. CheckToken(tsqlColon,':');
  487. end;
  488. procedure TTestSQLScanner.TestColumn;
  489. begin
  490. CheckToken(tsqlColumn,'COLUMN');
  491. end;
  492. procedure TTestSQLScanner.TestDot;
  493. begin
  494. CheckToken(tsqlDot,'.');
  495. end;
  496. procedure TTestSQLScanner.TestDrop;
  497. begin
  498. CheckToken(tsqldrop,'DROP');
  499. end;
  500. procedure TTestSQLScanner.TestSemicolon;
  501. begin
  502. CheckToken(tsqlSemicolon,';');
  503. end;
  504. procedure TTestSQLScanner.TestSet;
  505. begin
  506. CheckToken(tsqlSet,'SET');
  507. end;
  508. procedure TTestSQLScanner.TestSchema;
  509. begin
  510. CheckToken(tsqlSchema,'SCHEMA');
  511. end;
  512. procedure TTestSQLScanner.TestShadow;
  513. begin
  514. CheckToken(tsqlShadow,'SHADOW');
  515. end;
  516. procedure TTestSQLScanner.TestSingular;
  517. begin
  518. CheckToken(tsqlSINGULAR,'SINGULAR');
  519. end;
  520. procedure TTestSQLScanner.TestSize;
  521. begin
  522. CheckToken(tsqlSize,'size');
  523. end;
  524. procedure TTestSQLScanner.TestSkip;
  525. begin
  526. CheckToken(tsqlSkip,'skip');
  527. end;
  528. procedure TTestSQLScanner.TestSome;
  529. begin
  530. CheckToken(tsqlSome,'some');
  531. end;
  532. procedure TTestSQLScanner.TestSort;
  533. begin
  534. CheckToken(tsqlSort,'sort');
  535. end;
  536. procedure TTestSQLScanner.TestSnapshot;
  537. begin
  538. CheckToken(tsqlSnapshot,'snapshot');
  539. end;
  540. procedure TTestSQLScanner.TestSQLCode;
  541. begin
  542. CheckToken(tsqlSQLCOde,'SQLCODE');
  543. end;
  544. procedure TTestSQLScanner.TestSquareBraceClose;
  545. begin
  546. CheckToken(tsqlSquareBraceClose,']');
  547. end;
  548. procedure TTestSQLScanner.TestSquareBraceOpen;
  549. begin
  550. CheckToken(tsqlSquareBraceOpen,'[');
  551. end;
  552. procedure TTestSQLScanner.TestSubtype;
  553. begin
  554. CheckToken(tsqlSubtype,'sub_type');
  555. end;
  556. procedure TTestSQLScanner.TestSuspend;
  557. begin
  558. CheckToken(tsqlSuspend,'Suspend');
  559. end;
  560. procedure TTestSQLScanner.TestSymbolLiteral1;
  561. begin
  562. CheckToken(tsqlSymbolString,'%');
  563. end;
  564. procedure TTestSQLScanner.TestSymbolLiteral2;
  565. begin
  566. CheckToken(tsqlSymbolString,'%^');
  567. end;
  568. procedure TTestSQLScanner.TestStarting;
  569. begin
  570. CheckToken(tsqlStarting,'starting');
  571. end;
  572. procedure TTestSQLScanner.TestSum;
  573. begin
  574. CheckToken(tsqlSum,'sum');
  575. end;
  576. procedure TTestSQLScanner.TestString;
  577. begin
  578. DoTestString('''A string''');
  579. DoTestString('''''');
  580. DoTestString(''' " ''');
  581. DoTestString('''A string''');
  582. DoTestString(''' '''' ''',True);
  583. DoTestString('''12345'#10'67890''');
  584. DoTestString('''12345'#13'67890''');
  585. DoTestString('''12345'#13#10'67890''');
  586. end;
  587. procedure TTestSQLScanner.TestTable;
  588. begin
  589. CheckToken(tsqltable,'TABLE');
  590. end;
  591. procedure TTestSQLScanner.TestThen;
  592. begin
  593. CheckToken(tsqlThen,'THEN');
  594. end;
  595. procedure TTestSQLScanner.TestTime;
  596. begin
  597. CheckToken(tsqlTime,'TIME');
  598. end;
  599. procedure TTestSQLScanner.TestTimeStamp;
  600. begin
  601. CheckToken(tsqlTimeStamp,'TIMESTAMP');
  602. end;
  603. procedure TTestSQLScanner.TestTo;
  604. begin
  605. CheckToken(tsqlTo,'TO');
  606. end;
  607. procedure TTestSQLScanner.TestTransaction;
  608. begin
  609. CheckToken(tsqlTransaction,'TRANSACTION');
  610. end;
  611. procedure TTestSQLScanner.TestTrigger;
  612. begin
  613. CheckToken(tsqlTrigger,'TRIGGER');
  614. end;
  615. procedure TTestSQLScanner.TestType;
  616. begin
  617. CheckToken(tsqltype,'TYPE');
  618. end;
  619. procedure TTestSQLScanner.TestUnion;
  620. begin
  621. CheckToken(tsqlUnion,'UNION');
  622. end;
  623. procedure TTestSQLScanner.TestUnique;
  624. begin
  625. CheckToken(tsqlUnique,'UNIQUE');
  626. end;
  627. procedure TTestSQLScanner.TestUpdate;
  628. begin
  629. CheckToken(tsqlUPDATE,'UPDATE');
  630. end;
  631. procedure TTestSQLScanner.TestUpper;
  632. begin
  633. CheckToken(tsqlUPPER,'UPPER');
  634. end;
  635. procedure TTestSQLScanner.TestUser;
  636. begin
  637. CheckToken(tsqlUSER,'USER');
  638. end;
  639. procedure TTestSQLScanner.TestValues;
  640. begin
  641. CheckToken(tsqlVALUES,'VALUES');
  642. end;
  643. procedure TTestSQLScanner.TestValue;
  644. begin
  645. CheckToken(tsqlVALUE,'VALUE');
  646. end;
  647. procedure TTestSQLScanner.TestAssign;
  648. begin
  649. CheckToken(tsqlEq,'=');
  650. end;
  651. procedure TTestSQLScanner.TestBefore;
  652. begin
  653. CheckToken(tsqlbefore,'BEFORE');
  654. end;
  655. procedure TTestSQLScanner.TestBegin;
  656. begin
  657. CheckToken(tsqlbegin,'BEGIN');
  658. end;
  659. procedure TTestSQLScanner.TestBetween;
  660. begin
  661. CheckToken(tsqlBetween,'BETWEEN');
  662. end;
  663. procedure TTestSQLScanner.TestGreaterThan;
  664. begin
  665. CheckToken(tsqlGT,'>');
  666. end;
  667. procedure TTestSQLScanner.TestGroup;
  668. begin
  669. CheckToken(tsqlGroup,'group');
  670. end;
  671. procedure TTestSQLScanner.TestHaving;
  672. begin
  673. CheckToken(tsqlHaving,'HAVING');
  674. end;
  675. procedure TTestSQLScanner.TestLessThan;
  676. begin
  677. CheckToken(tsqlLT,'<');
  678. end;
  679. procedure TTestSQLScanner.TestManual;
  680. begin
  681. Checktoken(tsqlManual,'manual');
  682. end;
  683. procedure TTestSQLScanner.TestModuleName;
  684. begin
  685. Checktoken(tsqlModuleName,'module_name');
  686. end;
  687. procedure TTestSQLScanner.TestMax;
  688. begin
  689. Checktoken(tsqlMax,'max');
  690. end;
  691. procedure TTestSQLScanner.TestMerge;
  692. begin
  693. Checktoken(tsqlMerge,'merge');
  694. end;
  695. procedure TTestSQLScanner.TestMin;
  696. begin
  697. Checktoken(tsqlMin,'min');
  698. end;
  699. procedure TTestSQLScanner.TestPlus;
  700. begin
  701. CheckToken(tsqlPlus,'+');
  702. end;
  703. procedure TTestSQLScanner.TestPosition;
  704. begin
  705. Checktoken(tsqlposition,'position');
  706. end;
  707. procedure TTestSQLScanner.TestPostEvent;
  708. begin
  709. Checktoken(tsqlpostevent,'post_event');
  710. end;
  711. procedure TTestSQLScanner.TestPrimary;
  712. begin
  713. Checktoken(tsqlprimary,'primary');
  714. end;
  715. procedure TTestSQLScanner.TestPrivileges;
  716. begin
  717. Checktoken(tsqlprivileges,'privileges');
  718. end;
  719. procedure TTestSQLScanner.TestProcedure;
  720. begin
  721. Checktoken(tsqlprocedure,'procedure');
  722. end;
  723. procedure TTestSQLScanner.TestPublic;
  724. begin
  725. CheckToken(tsqlPublic,'PUBLIC');
  726. end;
  727. procedure TTestSQLScanner.TestReferences;
  728. begin
  729. CheckToken(tsqlReferences,'REFERENCES');
  730. end;
  731. procedure TTestSQLScanner.TestRelease;
  732. begin
  733. CheckToken(tsqlrelease,'release');
  734. end;
  735. procedure TTestSQLScanner.TestReturningValues;
  736. begin
  737. CheckToken(tsqlreturningvalues,'returning_values');
  738. end;
  739. procedure TTestSQLScanner.TestReturns;
  740. begin
  741. CheckToken(tsqlreturns,'returns');
  742. end;
  743. procedure TTestSQLScanner.TestRetain;
  744. begin
  745. Checktoken(tsqlRetain,'retain');
  746. end;
  747. procedure TTestSQLScanner.TestRevoke;
  748. begin
  749. Checktoken(tsqlRevoke,'revoke');
  750. end;
  751. procedure TTestSQLScanner.TestRight;
  752. begin
  753. Checktoken(tsqlright,'right');
  754. end;
  755. procedure TTestSQLScanner.TestRole;
  756. begin
  757. Checktoken(tsqlrole,'role');
  758. end;
  759. procedure TTestSQLScanner.TestRollback;
  760. begin
  761. Checktoken(tsqlrollback,'rollback');
  762. end;
  763. procedure TTestSQLScanner.TestSegment;
  764. begin
  765. CheckToken(tsqlSegment,'SEGMENT');
  766. end;
  767. procedure TTestSQLScanner.TestSelect;
  768. begin
  769. CheckToken(tsqlSelect,'SELECT');
  770. end;
  771. procedure TTestSQLScanner.TestMinus;
  772. begin
  773. CheckToken(tsqlMinus,'-');
  774. end;
  775. procedure TTestSQLScanner.TestMul;
  776. begin
  777. CheckToken(tsqlMul,'*');
  778. end;
  779. procedure TTestSQLScanner.TestNational;
  780. begin
  781. CheckToken(tsqlNational,'NATIONAL');
  782. end;
  783. procedure TTestSQLScanner.TestNatural;
  784. begin
  785. CheckToken(tsqlNatural,'NATURAL');
  786. end;
  787. procedure TTestSQLScanner.TestDiv;
  788. begin
  789. CheckToken(tsqlDiv,'/');
  790. end;
  791. procedure TTestSQLScanner.TestEq;
  792. begin
  793. CheckToken(tsqlEq,'==');
  794. end;
  795. procedure TTestSQLScanner.TestFloat;
  796. begin
  797. CheckToken(tsqlFloat,'FLOAT');
  798. end;
  799. procedure TTestSQLScanner.TestGE;
  800. begin
  801. CheckToken(tsqlGE,'>=');
  802. end;
  803. procedure TTestSQLScanner.TestGenerator;
  804. begin
  805. CheckToken(tsqlGenerator,'generator');
  806. end;
  807. procedure TTestSQLScanner.TestGrant;
  808. begin
  809. CheckToken(tsqlGrant,'grant');
  810. end;
  811. procedure TTestSQLScanner.TestLE;
  812. begin
  813. CheckToken(tsqlLE,'<=');
  814. end;
  815. procedure TTestSQLScanner.TestNE;
  816. begin
  817. CheckToken(tsqlNE,'<>');
  818. end;
  819. procedure TTestSQLScanner.TestNo;
  820. begin
  821. CheckToken(tsqlNo,'no');
  822. end;
  823. procedure TTestSQLScanner.TestNot;
  824. begin
  825. CheckToken(tsqlNot,'not');
  826. end;
  827. procedure TTestSQLScanner.TestNull;
  828. begin
  829. CheckToken(tsqlnull,'null');
  830. end;
  831. procedure TTestSQLScanner.TestNumeric;
  832. begin
  833. CheckToken(tsqlNumeric,'NUMERIC');
  834. end;
  835. procedure TTestSQLScanner.TestOn;
  836. begin
  837. CheckToken(tsqlON,'on');
  838. end;
  839. procedure TTestSQLScanner.TestOption;
  840. begin
  841. CheckToken(tsqlOption,'option');
  842. end;
  843. procedure TTestSQLScanner.TestOr;
  844. begin
  845. CheckToken(tsqlOR,'or');
  846. end;
  847. procedure TTestSQLScanner.TestOrder;
  848. begin
  849. CheckToken(tsqlORDER,'order');
  850. end;
  851. procedure TTestSQLScanner.TestOuter;
  852. begin
  853. CheckToken(tsqlOUTER,'outer');
  854. end;
  855. procedure TTestSQLScanner.TestPage;
  856. begin
  857. CheckToken(tsqlPage,'PAGE');
  858. end;
  859. procedure TTestSQLScanner.TestPages;
  860. begin
  861. CheckToken(tsqlPages,'PAGES');
  862. end;
  863. procedure TTestSQLScanner.TestPageSize;
  864. begin
  865. CheckToken(tsqlPageSize,'PAGE_SIZE');
  866. end;
  867. procedure TTestSQLScanner.TestPassword;
  868. begin
  869. CheckToken(tsqlPassword,'PASSWORD');
  870. end;
  871. {
  872. procedure TTestSQLScanner.TestTrue;
  873. begin
  874. CheckToken(tsqlTrue,'true');
  875. end;
  876. procedure TTestSQLScanner.TestFalse;
  877. begin
  878. CheckToken(tsqlFalse,'false');
  879. end;
  880. }
  881. procedure TTestSQLScanner.TestBy;
  882. begin
  883. CheckToken(tsqlBy,'by');
  884. end;
  885. procedure TTestSQLScanner.TestCache;
  886. begin
  887. CheckToken(tsqlCache,'CACHE');
  888. end;
  889. procedure TTestSQLScanner.TestCascade;
  890. begin
  891. CheckToken(tsqlCascade,'cascade');
  892. end;
  893. procedure TTestSQLScanner.TestBlob;
  894. begin
  895. CheckToken(tsqlBlob,'blob');
  896. end;
  897. procedure TTestSQLScanner.TestChar;
  898. begin
  899. CheckToken(tsqlChar,'char');
  900. end;
  901. procedure TTestSQLScanner.TestCharacter;
  902. begin
  903. CheckToken(tsqlCharacter,'character');
  904. end;
  905. procedure TTestSQLScanner.TestCheck;
  906. begin
  907. CheckToken(tsqlCHECK,'check');
  908. end;
  909. procedure TTestSQLScanner.TestCollate;
  910. begin
  911. CheckToken(tsqlCollate,'collate');
  912. end;
  913. procedure TTestSQLScanner.TestConcatenate;
  914. begin
  915. CheckToken(tsqlConcatenate,'||');
  916. end;
  917. procedure TTestSQLScanner.TestContaining;
  918. begin
  919. CheckToken(tsqlContaining,'containing');
  920. end;
  921. procedure TTestSQLScanner.TestCount;
  922. begin
  923. CheckToken(tsqlCount,'count');
  924. end;
  925. procedure TTestSQLScanner.TestCreate;
  926. begin
  927. CheckToken(tsqlCreate,'create');
  928. end;
  929. procedure TTestSQLScanner.TestCString;
  930. begin
  931. CheckToken(tsqlCString,'CSTRING');
  932. end;
  933. procedure TTestSQLScanner.TestDatabase;
  934. begin
  935. CheckToken(tsqlDatabase,'database');
  936. end;
  937. procedure TTestSQLScanner.TestDate;
  938. begin
  939. CheckToken(tsqlDate,'date');
  940. end;
  941. procedure TTestSQLScanner.TestDecimal;
  942. begin
  943. CheckToken(tsqlDecimal,'decimal');
  944. end;
  945. procedure TTestSQLScanner.TestDefault;
  946. begin
  947. CheckToken(tsqldefault,'default');
  948. end;
  949. procedure TTestSQLScanner.TestDelete;
  950. begin
  951. CheckToken(tsqldelete,'delete');
  952. end;
  953. procedure TTestSQLScanner.TestDeclare;
  954. begin
  955. CheckToken(tsqlDeclare,'DECLARE');
  956. end;
  957. procedure TTestSQLScanner.TestDesc;
  958. begin
  959. CheckToken(tsqlDESC,'DESC');
  960. end;
  961. procedure TTestSQLScanner.TestDescending;
  962. begin
  963. CheckToken(tsqlDescending,'DESCENDING');
  964. end;
  965. procedure TTestSQLScanner.TestDistinct;
  966. begin
  967. CheckToken(tsqlDistinct,'DISTINCT');
  968. end;
  969. procedure TTestSQLScanner.TestDO;
  970. begin
  971. CheckToken(tsqldo,'do');
  972. end;
  973. procedure TTestSQLScanner.TestDomain;
  974. begin
  975. CheckToken(tsqlDomain,'domain');
  976. end;
  977. procedure TTestSQLScanner.TestElse;
  978. begin
  979. CheckToken(tsqlelse,'else');
  980. end;
  981. procedure TTestSQLScanner.TestFor;
  982. begin
  983. CheckToken(tsqlfor,'for');
  984. end;
  985. procedure TTestSQLScanner.TestForeign;
  986. begin
  987. CheckToken(tsqlForeign,'foreign');
  988. end;
  989. procedure TTestSQLScanner.TestFreeIt;
  990. begin
  991. CheckToken(tsqlFreeIt,'FREE_IT');
  992. end;
  993. procedure TTestSQLScanner.TestFile;
  994. begin
  995. CheckToken(tsqlFile,'FILE');
  996. end;
  997. procedure TTestSQLScanner.TestFunction;
  998. begin
  999. CheckToken(tsqlfunction,'function');
  1000. end;
  1001. procedure TTestSQLScanner.TestGDSError;
  1002. begin
  1003. CheckToken(tsqlGDSCODE,'GDSCODE');
  1004. end;
  1005. procedure TTestSQLScanner.TestIf;
  1006. begin
  1007. CheckToken(tsqlif,'if');
  1008. end;
  1009. procedure TTestSQLScanner.TestIn;
  1010. begin
  1011. CheckToken(tsqlin,'in');
  1012. end;
  1013. procedure TTestSQLScanner.TestInner;
  1014. begin
  1015. CheckToken(tsqlInner,'inner');
  1016. end;
  1017. procedure TTestSQLScanner.TestInsert;
  1018. begin
  1019. CheckToken(tsqlInsert,'insert');
  1020. end;
  1021. procedure TTestSQLScanner.TestInt;
  1022. begin
  1023. CheckToken(tsqlInt,'int');
  1024. end;
  1025. procedure TTestSQLScanner.TestInteger;
  1026. begin
  1027. CheckToken(tsqlInteger,'integer');
  1028. end;
  1029. procedure TTestSQLScanner.TestInto;
  1030. begin
  1031. CheckToken(tsqlInto,'into');
  1032. end;
  1033. procedure TTestSQLScanner.TestIs;
  1034. begin
  1035. CheckToken(tsqlis,'is');
  1036. end;
  1037. procedure TTestSQLScanner.TestJoin;
  1038. begin
  1039. CheckToken(tsqlJoin,'JOIN');
  1040. end;
  1041. procedure TTestSQLScanner.TestKey;
  1042. begin
  1043. CheckToken(tsqlKey,'KEY');
  1044. end;
  1045. procedure TTestSQLScanner.TestLeft;
  1046. begin
  1047. CheckToken(tsqlLEFT,'LEFT');
  1048. end;
  1049. procedure TTestSQLScanner.TestLength;
  1050. begin
  1051. CheckToken(tsqlLength,'LENGTH');
  1052. end;
  1053. procedure TTestSQLScanner.TestLike;
  1054. begin
  1055. CheckToken(tsqlLIKE,'LIKE');
  1056. end;
  1057. procedure TTestSQLScanner.TestIndex;
  1058. begin
  1059. CheckToken(tsqlindex,'index');
  1060. end;
  1061. procedure TTestSQLScanner.TestVariable;
  1062. begin
  1063. CheckToken(tsqlvariable,'variable');
  1064. end;
  1065. procedure TTestSQLScanner.TestVarChar;
  1066. begin
  1067. CheckToken(tsqlvarchar,'varchar');
  1068. end;
  1069. procedure TTestSQLScanner.TestVarying;
  1070. begin
  1071. CheckToken(tsqlvarying,'varying');
  1072. end;
  1073. procedure TTestSQLScanner.TestView;
  1074. begin
  1075. CheckToken(tsqlview,'view');
  1076. end;
  1077. procedure TTestSQLScanner.TestWhen;
  1078. begin
  1079. CheckToken(tsqlWhen,'when');
  1080. end;
  1081. procedure TTestSQLScanner.TestWhere;
  1082. begin
  1083. CheckToken(tsqlwhere,'where');
  1084. end;
  1085. procedure TTestSQLScanner.TestWhile;
  1086. begin
  1087. CheckToken(tsqlwhile,'while');
  1088. end;
  1089. procedure TTestSQLScanner.TestWith;
  1090. begin
  1091. CheckToken(tsqlwith,'with');
  1092. end;
  1093. procedure TTestSQLScanner.TestWork;
  1094. begin
  1095. CheckToken(tsqlWork,'work');
  1096. end;
  1097. procedure TTestSQLScanner.CheckTokens(ASource : String; ATokens : Array of TSQLToken);
  1098. Var
  1099. I : Integer;
  1100. J : TSQLToken;
  1101. S : String;
  1102. begin
  1103. CreateScanner(ASource);
  1104. For I:=Low(ATokens) to High(ATokens) do
  1105. begin
  1106. J:=FScanner.FetchToken;
  1107. S:=GetEnumName(TypeINfo(TSQLToken),Ord(ATokens[i]));
  1108. S:=Format('Source "%s", token %d (%s): expected %s',[ASource,I,FScanner.CurTokenString,S]);
  1109. AssertEquals(S,ATokens[i],J);
  1110. end;
  1111. end;
  1112. procedure TTestSQLScanner.Test2Words;
  1113. begin
  1114. CheckTokens('with do',[tsqlWith,tsqlDo]);
  1115. end;
  1116. procedure TTestSQLScanner.Test3Words;
  1117. begin
  1118. CheckTokens('with do for',[tsqlWith,tsqlDo,tsqlFor]);
  1119. end;
  1120. procedure TTestSQLScanner.TestIdentifier;
  1121. begin
  1122. CheckToken(tsqlIdentifier,'something');
  1123. AssertEquals('Correct identifier','something',FScanner.CurTokenString);
  1124. end;
  1125. procedure TTestSQLScanner.TestIdentifier2;
  1126. begin
  1127. CheckToken(tsqlIdentifier,'"_something"');
  1128. AssertEquals('Correct identifier','_something',FScanner.CurTokenString);
  1129. end;
  1130. procedure TTestSQLScanner.TestIdentifier3;
  1131. begin
  1132. CheckToken(tsqlIdentifier,'RDB$');
  1133. AssertEquals('Correct identifier','RDB$',FScanner.CurTokenString);
  1134. end;
  1135. procedure TTestSQLScanner.TestIdentifier4;
  1136. begin
  1137. CheckToken(tsqlIdentifier,'A_0');
  1138. AssertEquals('Correct identifier','A_0',FScanner.CurTokenString);
  1139. end;
  1140. procedure TTestSQLScanner.TestIdentifier5;
  1141. begin
  1142. // $0 should not be parsed as an identifier but as a symbol literal
  1143. CheckToken(tsqlSymbolString,'$0');
  1144. end;
  1145. procedure TTestSQLScanner.TestIdentifierDotIdentifier;
  1146. begin
  1147. CheckTokens('something.different',[tsqlIdentifier,tsqldot,tsqlIdentifier]);
  1148. // AssertEquals('Correct identifier','something',FScanner.CurTokenString);
  1149. end;
  1150. procedure TTestSQLScanner.TestEOLN;
  1151. begin
  1152. CreateScanner('something');
  1153. FScanner.FetchToken;
  1154. AssertEquals('Got to end of line after reading single token at EOF',True,FScanner.IsEndOfLine);
  1155. // AssertEquals('Correct identifier','something',FScanner.CurTokenString);
  1156. end;
  1157. procedure TTestSQLScanner.TestEOLN2;
  1158. begin
  1159. CreateScanner('something different');
  1160. FScanner.FetchToken;
  1161. AssertEquals('Not yet end of line after reading single token at EOF',False,FScanner.IsEndOfLine);
  1162. end;
  1163. procedure TTestSQLScanner.TestEOLN3;
  1164. begin
  1165. CreateScanner('something'#13#10'different');
  1166. FScanner.FetchToken;
  1167. AssertEquals('End of line after reading single token',True,FScanner.IsEndOfLine);
  1168. end;
  1169. procedure TTestSQLScanner.TestEOLN4;
  1170. begin
  1171. CreateScanner('something'#10'different');
  1172. FScanner.FetchToken;
  1173. AssertEquals('End of line after reading first token',True,FScanner.IsEndOfLine);
  1174. FScanner.FetchToken;
  1175. AssertEquals('End of line after reading second token',True,FScanner.IsEndOfLine);
  1176. end;
  1177. procedure TTestSQLScanner.TestComment1;
  1178. begin
  1179. CreateScanner('-- some comment string');
  1180. AssertEquals('Comment line is skipped',tsqlEOF,FScanner.FetchToken);
  1181. end;
  1182. procedure TTestSQLScanner.TestComment2;
  1183. begin
  1184. CreateScanner('-- some comment string');
  1185. FScanner.Options:=[soReturnComments];
  1186. AssertEquals('Comment line is returned',tsqlComment,FScanner.FetchToken);
  1187. AssertEquals('Comment contents is returned',' some comment string',FScanner.CurTokenString);
  1188. end;
  1189. procedure TTestSQLScanner.TestComment3;
  1190. begin
  1191. CreateScanner('/* some comment string */');
  1192. AssertEquals('Comment line is skipped',tsqlEOF,FScanner.FetchToken);
  1193. end;
  1194. procedure TTestSQLScanner.TestComment4;
  1195. begin
  1196. CreateScanner('/* some comment string */');
  1197. FScanner.Options:=[soReturnComments];
  1198. AssertEquals('Comment line is returned',tsqlComment,FScanner.FetchToken);
  1199. AssertEquals('Comment contents is returned',' some comment string ',FScanner.CurTokenString);
  1200. end;
  1201. procedure TTestSQLScanner.TestComment5;
  1202. begin
  1203. CreateScanner('/* some nested comment -- string */');
  1204. FScanner.Options:=[soReturnComments];
  1205. AssertEquals('Comment line is returned',tsqlComment,FScanner.FetchToken);
  1206. AssertEquals('Comment contents is returned',' some nested comment -- string ',FScanner.CurTokenString);
  1207. end;
  1208. procedure TTestSQLScanner.TestComment6;
  1209. begin
  1210. CreateScanner('-- /* some nested comment string */');
  1211. FScanner.Options:=[soReturnComments];
  1212. AssertEquals('Comment line is returned',tsqlComment,FScanner.FetchToken);
  1213. AssertEquals('Comment contents is returned','/* some nested comment string */',FScanner.CurTokenString);
  1214. end;
  1215. procedure TTestSQLScanner.TestFloatLiteral;
  1216. begin
  1217. DoTestFloat(1.2);
  1218. DoTestFloat(-1.2);
  1219. DoTestFloat(1.2e1);
  1220. DoTestFloat(-1.2e1);
  1221. DoTestFloat(1.2,'1.2');
  1222. DoTestFloat(-1.2,'-1.2');
  1223. DoTestFloat(0,'0.0');
  1224. end;
  1225. procedure TTestSQLScanner.TestStringLiteral1;
  1226. begin
  1227. CreateScanner('''A''');
  1228. FScanner.Options:=[];
  1229. AssertEquals('String is returned',tsqlString,FScanner.FetchToken);
  1230. AssertEquals('Correct string','A',FScanner.CurTokenString);
  1231. end;
  1232. procedure TTestSQLScanner.TestStringLiteral2;
  1233. begin
  1234. CreateScanner('"A"',[soDoubleQuoteStringLiteral]);
  1235. AssertEquals('String is returned',tsqlString,FScanner.FetchToken);
  1236. AssertEquals('Correct string','A',FScanner.CurTokenString);
  1237. end;
  1238. procedure TTestSQLScanner.TestStringError;
  1239. begin
  1240. end;
  1241. procedure TTestSQLScanner.TestFloatError;
  1242. begin
  1243. FErrorSource:='1xz';
  1244. AssertException('Wrong float',ESQLScannerError,@TestErrorSource);
  1245. end;
  1246. procedure TTestSQLScanner.TestOptionsoDoubleQuoteStringLiteral;
  1247. begin
  1248. CreateScanner('"A"',[soDoubleQuoteStringLiteral]);
  1249. AssertEquals('String is returned',tsqlString,FScanner.FetchToken);
  1250. AssertEquals('Correct string','A',FScanner.CurTokenString);
  1251. end;
  1252. procedure TTestSQLScanner.TestOptionsoSingleQuoteIdentifier;
  1253. begin
  1254. CreateScanner('''A''',[soSingleQuoteIdentifier,soDoubleQuoteStringLiteral]);
  1255. If (Scanner.Options<>[soSingleQuoteIdentifier,soDoubleQuoteStringLiteral]) then
  1256. Fail('Options not correctly set');
  1257. AssertEquals('Identifier is returned',tsqlIdentifier,FScanner.FetchToken);
  1258. AssertEquals('Correct string','A',FScanner.CurTokenString);
  1259. end;
  1260. procedure TTestSQLScanner.TestOptionsoBackQuoteIdentifier;
  1261. begin
  1262. CreateScanner('`A`',[soBackQuoteIdentifier]);
  1263. AssertEquals('String is returned',tsqlIdentifier,FScanner.FetchToken);
  1264. AssertEquals('Correct string','A',FScanner.CurTokenString);
  1265. end;
  1266. procedure TTestSQLScanner.TestOptionNosoBackQuoteIdentifier;
  1267. begin
  1268. FErrorSource:='`A`';
  1269. AssertException('Wrong token',ESQLScannerError,@TestErrorSource);
  1270. end;
  1271. procedure TTestSQLScanner.TestOptionsoBackslashEscapesTab;
  1272. begin
  1273. CreateScanner('''\t''',[soBackslashEscapes]);
  1274. AssertEquals('String is returned',tsqlString,FScanner.FetchToken);
  1275. AssertEquals('Correct string',#9,FScanner.CurTokenString);
  1276. end;
  1277. procedure TTestSQLScanner.TestOptionsoBackslashEscapesNewLine;
  1278. begin
  1279. CreateScanner('''\n''',[soBackslashEscapes]);
  1280. AssertEquals('String is returned',tsqlString,FScanner.FetchToken);
  1281. AssertEquals('Correct string',#10,FScanner.CurTokenString);
  1282. end;
  1283. procedure TTestSQLScanner.TestOptionsoBackslashEscapesLineFeed;
  1284. begin
  1285. CreateScanner('''\r''',[soBackslashEscapes]);
  1286. AssertEquals('String is returned',tsqlString,FScanner.FetchToken);
  1287. AssertEquals('Correct string',#13,FScanner.CurTokenString);
  1288. end;
  1289. procedure TTestSQLScanner.TestOptionsoBackslashEscapesBackSlash;
  1290. begin
  1291. CreateScanner('''\\''',[soBackslashEscapes]);
  1292. AssertEquals('String is returned',tsqlString,FScanner.FetchToken);
  1293. AssertEquals('Correct string','\',FScanner.CurTokenString);
  1294. end;
  1295. procedure TTestSQLScanner.TestOptionsoBackslashEscapesNewPage;
  1296. begin
  1297. CreateScanner('''\f''',[soBackslashEscapes]);
  1298. AssertEquals('String is returned',tsqlString,FScanner.FetchToken);
  1299. AssertEquals('Correct string',#12,FScanner.CurTokenString);
  1300. end;
  1301. procedure TTestSQLScanner.TestOptionsoBackslashEscapesSlash;
  1302. begin
  1303. CreateScanner('''\/''',[soBackslashEscapes]);
  1304. AssertEquals('String is returned',tsqlString,FScanner.FetchToken);
  1305. AssertEquals('Correct string','/',FScanner.CurTokenString);
  1306. end;
  1307. procedure TTestSQLScanner.TestOptionsoBackslashEscapesBackspace;
  1308. begin
  1309. CreateScanner('''\f''',[soBackslashEscapes]);
  1310. AssertEquals('String is returned',tsqlString,FScanner.FetchToken);
  1311. AssertEquals('Correct string',#12,FScanner.CurTokenString);
  1312. end;
  1313. procedure TTestSQLScanner.TestOptionsoBackslashEscapesQuote;
  1314. begin
  1315. CreateScanner('''\''''',[soBackslashEscapes]);
  1316. AssertEquals('String is returned',tsqlString,FScanner.FetchToken);
  1317. AssertEquals('Correct string','''',FScanner.CurTokenString);
  1318. end;
  1319. procedure TTestSQLScanner.TestOptionsoBackslashEscapesDoubleQuote;
  1320. begin
  1321. CreateScanner('''\"''',[soBackslashEscapes]);
  1322. AssertEquals('String is returned',tsqlString,FScanner.FetchToken);
  1323. AssertEquals('Correct string','"',FScanner.CurTokenString);
  1324. end;
  1325. procedure TTestSQLScanner.TestOptionNosoBackslashEscapes;
  1326. begin
  1327. CreateScanner('''\"''',[]);
  1328. AssertEquals('String is returned',tsqlString,FScanner.FetchToken);
  1329. AssertEquals('Correct string','\"',FScanner.CurTokenString);
  1330. end;
  1331. initialization
  1332. RegisterTest(TTestSQLScanner);
  1333. end.