tcsqlscanner.pas 35 KB

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