tcsqlscanner.pas 34 KB

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