tccssscanner.pp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728
  1. {
  2. This file is part of the Free Pascal Run time library.
  3. Copyright (c) 2022- by Michael Van Canneyt ([email protected])
  4. This file contains the tests for the CSS Scanner
  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 tcCSSScanner;
  12. {$mode objfpc}{$H+}
  13. interface
  14. uses
  15. TypInfo, Classes, SysUtils, fpcunit, testregistry, fpcssscanner;
  16. type
  17. TTestLineReader = Class(TTestCase)
  18. Private
  19. FData: TStringStream;
  20. FReader : TStreamLineReader;
  21. protected
  22. Procedure CreateReader(AInput : String);
  23. procedure TearDown; override;
  24. published
  25. Procedure TestEmpty;
  26. Procedure TestReadLine;
  27. Procedure TestReadLines13;
  28. Procedure TestReadLines10;
  29. Procedure TestReadLines1310;
  30. procedure TestReadLinesEOF13;
  31. procedure TestReadLinesEOF10;
  32. procedure TestReadLinesEOF1310;
  33. procedure TestReadEmptyLines101010;
  34. end;
  35. { TTestCSSScanner }
  36. TTestCSSScanner = class(TTestCase)
  37. Private
  38. FPSeudoDisabled,
  39. FNeedWhiteSpace : Boolean;
  40. FStream : TStream;
  41. FLineReader : TLineReader;
  42. FScanner : TCSSScanner;
  43. FErrorSource : String;
  44. procedure AssertEquals(AMessage: String; AExpected, AActual : TCSSToken); overload;
  45. procedure CheckToken(AToken: TCSSToken; ASource: String);
  46. procedure CheckTokens(ASource: String; ATokens: array of TCSSToken);
  47. procedure DoTestFloat(F: Double);
  48. procedure DoTestFloat(F: Double; S: String);
  49. procedure DoTestString(S: String);
  50. procedure TestErrorSource;
  51. protected
  52. Function CreateScanner(AInput : String) : TCSSScanner;
  53. procedure FreeScanner;
  54. procedure SetUp; override;
  55. procedure TearDown; override;
  56. Property Scanner : TCSSScanner Read FScanner;
  57. published
  58. procedure TestEmpty;
  59. Procedure TestEOF;
  60. Procedure TestWhiteSpace;
  61. Procedure TestComment1;
  62. Procedure TestComment2;
  63. Procedure TestComment3;
  64. Procedure TestID1;
  65. Procedure TestIDUnderscore;
  66. Procedure TestIDMinus;
  67. Procedure TestIDMinusMinus;
  68. Procedure TestIDEscape;
  69. Procedure TestIDEscapeStart;
  70. procedure TestPSEUDO;
  71. procedure TestPSEUDO2;
  72. procedure TestPSEUDOMinus;
  73. procedure TestPSEUDO2Minus;
  74. procedure TestPSEUDODisabled;
  75. procedure TestUNICODERANGE;
  76. procedure TestUNICODERANGE2;
  77. procedure TestFUNCTION;
  78. procedure TestPSEUDOFUNCTION;
  79. procedure TestPSEUDOFUNCTION2;
  80. Procedure TestSEMI;
  81. Procedure TestLPAREN;
  82. Procedure TestRPAREN;
  83. Procedure TestLBRACE;
  84. Procedure TestRBRACE;
  85. Procedure TestLBRACKET;
  86. Procedure TestRBRACKET;
  87. Procedure TestSTR;
  88. Procedure TestStrEscapeUnicode;
  89. procedure TestStrEscapeUnicode2;
  90. Procedure TestCOMMA;
  91. Procedure TestEQUALS;
  92. Procedure TestAND;
  93. Procedure TestTILDE;
  94. Procedure TestPLUS;
  95. Procedure TestCOLON;
  96. Procedure TestDOUBLECOLON;
  97. Procedure TestDOT;
  98. Procedure TestINT;
  99. Procedure TestFLOAT;
  100. Procedure TestFLOATNegDot;
  101. Procedure TestDOUBLE;
  102. Procedure TestHASH1;
  103. Procedure TestHASH2;
  104. Procedure TestDIV;
  105. Procedure TestSTATEMENT;
  106. Procedure TestGT;
  107. Procedure TestLT;
  108. Procedure TestPERCENTAGE;
  109. Procedure TestMINUS;
  110. Procedure TestIMPORTANT;
  111. Procedure TestCLASSNAME;
  112. Procedure TestSTAR;
  113. Procedure TestURL;
  114. Procedure TestURLAltQuote;
  115. Procedure TestURL2;
  116. Procedure TestBADURL;
  117. Procedure TestBADEOF;
  118. Procedure TestJUNK;
  119. Procedure TestSQUARED;
  120. end;
  121. implementation
  122. function TTestCSSScanner.CreateScanner(AInput: String): TCSSScanner;
  123. begin
  124. FreeScanner;
  125. FStream:=TStringStream.Create(AInput);
  126. FLineReader:=TStreamLineReader.Create(Fstream);
  127. FScanner:=TCSSScanner.Create(FLineReader);
  128. FScanner.DisablePseudo:=FPSeudoDisabled;
  129. Result:=FScanner;
  130. if FNeedWhiteSpace then
  131. FScanner.ReturnWhiteSpace:=True;
  132. end;
  133. procedure TTestCSSScanner.FreeScanner;
  134. begin
  135. FreeAndNil(FScanner);
  136. FreeAndNil(FLineReader);
  137. FreeAndNil(FStream);
  138. end;
  139. procedure TTestCSSScanner.SetUp;
  140. begin
  141. inherited SetUp;
  142. FNeedWhiteSpace:=False;
  143. FPSeudoDisabled:=False;
  144. end;
  145. procedure TTestCSSScanner.TearDown;
  146. begin
  147. FreeScanner;
  148. Inherited;
  149. end;
  150. procedure TTestCSSScanner.DoTestFloat(F : Double);
  151. Var
  152. S : String;
  153. begin
  154. Str(F,S);
  155. DoTestFloat(F,S);
  156. end;
  157. procedure TTestCSSScanner.DoTestFloat(F : Double; S : String);
  158. Var
  159. J : TCSSToken;
  160. C : Double;
  161. I : integer;
  162. V : String;
  163. begin
  164. CreateScanner(S);
  165. try
  166. J:=FScanner.FetchToken;
  167. AssertEquals(S+' is a number',ctkFloat,J);
  168. V:=FScanner.CurTokenString;
  169. If (Copy(V,1,2)='0x') then
  170. begin
  171. Flush(output);
  172. V:='$'+Copy(V,3,Length(V)-2);
  173. C:=StrToInt(V);
  174. end
  175. else
  176. begin
  177. Val(V,C,I);
  178. If (I<>0) then
  179. Fail(FScanner.CurTokenString+' does not contain a float value');
  180. end;
  181. AssertEquals('Parsed float equals original float',F,C);
  182. finally
  183. FreeScanner;
  184. end;
  185. end;
  186. procedure TTestCSSScanner.DoTestString(S: String);
  187. Var
  188. J : TCSSToken;
  189. begin
  190. CreateScanner(S);
  191. try
  192. J:=FScanner.FetchToken;
  193. AssertEquals(S+' is a string',ctkSTRING,J);
  194. If (Length(S)>0) and (S[1] in ['"','''','`']) then
  195. S:=Copy(S,2,Length(S)-2);
  196. AssertEquals('Correct string is returned',S,FScanner.CurTokenString);
  197. finally
  198. FreeScanner;
  199. end;
  200. end;
  201. procedure TTestCSSScanner.TestErrorSource;
  202. begin
  203. CreateScanner(FErrorSource);
  204. try
  205. While (FScanner.FetchToken<>ctkEOF) do ;
  206. finally
  207. FreeScanner;
  208. end;
  209. end;
  210. procedure TTestCSSScanner.TestEmpty;
  211. Var
  212. J : TCSSToken;
  213. begin
  214. CreateScanner('');
  215. J:=Scanner.FetchToken;
  216. If (J<>ctkEOF) then
  217. Fail('Empty returns EOF');
  218. end;
  219. procedure TTestCSSScanner.TestEOF;
  220. Var
  221. C : TCSSToken;
  222. begin
  223. CreateScanner('');
  224. C:=Scanner.FetchToken;
  225. If (C<>ctkEOF) then
  226. Fail('Empty returns EOF');
  227. end;
  228. procedure TTestCSSScanner.TestWhiteSpace;
  229. Var
  230. C : TCSSToken;
  231. begin
  232. FNeedWhiteSpace:=True;
  233. CreateScanner(' ');
  234. C:=Scanner.FetchToken;
  235. If (C<>ctkWHITESPACE) then
  236. Fail('Empty returns EOF');
  237. end;
  238. procedure TTestCSSScanner.TestComment1;
  239. begin
  240. CreateScanner('/* some comment string */');
  241. AssertEquals('Comment line is skipped',ctkEOF,FScanner.FetchToken);
  242. end;
  243. procedure TTestCSSScanner.TestComment2;
  244. begin
  245. CreateScanner('/* some comment string */');
  246. FScanner.ReturnComments:=True;
  247. AssertEquals('Comment line is returned',ctkComment,FScanner.FetchToken);
  248. AssertEquals('Comment contents is returned',' some comment string ',FScanner.CurTokenString);
  249. end;
  250. procedure TTestCSSScanner.TestComment3;
  251. begin
  252. CreateScanner('/* some multiline comment '#10' string */');
  253. FScanner.ReturnComments:=True;
  254. AssertEquals('Comment line is returned',ctkComment,FScanner.FetchToken);
  255. AssertEquals('Comment contents is returned',' some multiline comment '#10' string ',FScanner.CurTokenString);
  256. end;
  257. procedure TTestCSSScanner.TestID1;
  258. begin
  259. CheckToken(ctkIDENTIFIER,'anid');
  260. end;
  261. procedure TTestCSSScanner.TestIDUnderscore;
  262. begin
  263. CheckToken(ctkIDENTIFIER,'_anid');
  264. end;
  265. procedure TTestCSSScanner.TestIDMinus;
  266. begin
  267. CheckToken(ctkIDENTIFIER,'-anid');
  268. end;
  269. procedure TTestCSSScanner.TestIDMinusMinus;
  270. begin
  271. CheckToken(ctkIDENTIFIER,'--anid');
  272. end;
  273. procedure TTestCSSScanner.TestIDEscape;
  274. begin
  275. CheckToken(ctkIDENTIFIER,'an\(id');
  276. end;
  277. procedure TTestCSSScanner.TestIDEscapeStart;
  278. begin
  279. CheckToken(ctkIDENTIFIER,'\(anid');
  280. end;
  281. procedure TTestCSSScanner.TestSEMI;
  282. begin
  283. CheckToken(ctkSEMICOLON,';');
  284. end;
  285. procedure TTestCSSScanner.TestLPAREN;
  286. begin
  287. CheckToken(ctkLPARENTHESIS,'(');
  288. end;
  289. procedure TTestCSSScanner.TestRPAREN;
  290. begin
  291. CheckToken(ctkRPARENTHESIS,')');
  292. end;
  293. procedure TTestCSSScanner.TestLBRACE;
  294. begin
  295. CheckToken(ctkLBRACE,'{');
  296. end;
  297. procedure TTestCSSScanner.TestRBRACE;
  298. begin
  299. CheckToken(ctkRBRACE,'}');
  300. end;
  301. procedure TTestCSSScanner.TestLBRACKET;
  302. begin
  303. CheckToken(ctkLBRACKET,'[');
  304. end;
  305. procedure TTestCSSScanner.TestRBRACKET;
  306. begin
  307. CheckToken(ctkRBRACKET,']');
  308. end;
  309. procedure TTestCSSScanner.TestSTR;
  310. begin
  311. CheckToken(ctkSTRING,'"abc"');
  312. end;
  313. procedure TTestCSSScanner.TestStrEscapeUnicode;
  314. begin
  315. CheckToken(ctkSTRING,'"\00a0\00a0\00a0\00a0"');
  316. CheckToken(ctkSTRING,'"\2a"');
  317. end;
  318. procedure TTestCSSScanner.TestStrEscapeUnicode2;
  319. begin
  320. CheckToken(ctkSTRING,'"\2a"');
  321. end;
  322. procedure TTestCSSScanner.TestCOMMA;
  323. begin
  324. CheckToken(ctkCOMMA,',');
  325. end;
  326. procedure TTestCSSScanner.TestEQUALS;
  327. begin
  328. CheckToken(ctkEQUALS,'=');
  329. end;
  330. procedure TTestCSSScanner.TestAND;
  331. begin
  332. CheckToken(ctkAND,'&');
  333. end;
  334. procedure TTestCSSScanner.TestTILDE;
  335. begin
  336. CheckToken(ctkTILDE,'~');
  337. end;
  338. procedure TTestCSSScanner.TestPLUS;
  339. begin
  340. CheckToken(ctkPLUS,'+');
  341. end;
  342. procedure TTestCSSScanner.TestCOLON;
  343. begin
  344. CheckToken(ctkCOLON,':');
  345. end;
  346. procedure TTestCSSScanner.TestDOUBLECOLON;
  347. begin
  348. CheckToken(ctkDOUBLECOLON,'::');
  349. end;
  350. procedure TTestCSSScanner.TestDOT;
  351. begin
  352. CheckToken(ctkDOT,'.');
  353. end;
  354. procedure TTestCSSScanner.TestINT;
  355. begin
  356. CheckToken(ctkINTEGER,'123');
  357. end;
  358. procedure TTestCSSScanner.TestFLOAT;
  359. begin
  360. DoTestFloat(123.3,'123.3');
  361. end;
  362. procedure TTestCSSScanner.TestFLOATNegDot;
  363. begin
  364. DoTestFloat(-0.123,'-.123');
  365. end;
  366. procedure TTestCSSScanner.TestDOUBLE;
  367. begin
  368. DoTestFloat(123.3,'123.3');
  369. end;
  370. procedure TTestCSSScanner.TestHASH1;
  371. begin
  372. CheckToken(ctkHASH,'#1231');
  373. end;
  374. procedure TTestCSSScanner.TestHASH2;
  375. begin
  376. CheckToken(ctkHASH,'#AFAFAF');
  377. end;
  378. procedure TTestCSSScanner.TestDIV;
  379. begin
  380. CheckToken(ctkDIV,'/');
  381. end;
  382. procedure TTestCSSScanner.TestSTATEMENT;
  383. begin
  384. CheckToken(ctkATKEYWORD,'@media');
  385. end;
  386. procedure TTestCSSScanner.TestGT;
  387. begin
  388. CheckToken(ctkGT,'>');
  389. end;
  390. procedure TTestCSSScanner.TestLT;
  391. begin
  392. CheckToken(ctkLT,'<');
  393. end;
  394. procedure TTestCSSScanner.TestPERCENTAGE;
  395. begin
  396. CheckToken(ctkPERCENTAGE,'%');
  397. end;
  398. procedure TTestCSSScanner.TestMINUS;
  399. begin
  400. CheckToken(ctkMinus,'-');
  401. end;
  402. procedure TTestCSSScanner.TestIMPORTANT;
  403. begin
  404. CheckToken(ctkIMPORTANT,'!important');
  405. end;
  406. procedure TTestCSSScanner.TestCLASSNAME;
  407. begin
  408. CheckToken(ctkCLASSNAME,'.classname');
  409. end;
  410. procedure TTestCSSScanner.TestSTAR;
  411. begin
  412. CheckToken(ctkSTAR,'*');
  413. end;
  414. procedure TTestCSSScanner.TestURL;
  415. begin
  416. CheckToken(ctkURL,'url("abc")');
  417. end;
  418. procedure TTestCSSScanner.TestURLAltQuote;
  419. begin
  420. CheckToken(ctkURL,'url(''abc'')');
  421. end;
  422. procedure TTestCSSScanner.TestURL2;
  423. begin
  424. CheckToken(ctkURL,'url(abc)');
  425. end;
  426. procedure TTestCSSScanner.TestBADURL;
  427. begin
  428. CheckToken(ctkBADURL,'url(de f)');
  429. end;
  430. procedure TTestCSSScanner.TestBADEOF;
  431. begin
  432. CheckToken(ctkEOF,'url(def');
  433. end;
  434. procedure TTestCSSScanner.TestPSEUDO;
  435. begin
  436. CheckToken(ctkPSEUDO,':name');
  437. end;
  438. procedure TTestCSSScanner.TestPSEUDO2;
  439. begin
  440. CheckToken(ctkPSEUDO,'::name');
  441. end;
  442. procedure TTestCSSScanner.TestPSEUDOMinus;
  443. begin
  444. CheckToken(ctkPSEUDO,':-name');
  445. end;
  446. procedure TTestCSSScanner.TestPSEUDO2Minus;
  447. begin
  448. CheckToken(ctkPSEUDO,'::-name');
  449. end;
  450. procedure TTestCSSScanner.TestPSEUDODisabled;
  451. begin
  452. FPseudoDisabled:=True;
  453. CheckTokens(':me',[ctkColon,ctkIDENTIFIER]);
  454. end;
  455. procedure TTestCSSScanner.TestUNICODERANGE;
  456. begin
  457. CheckToken(ctkUNICODERANGE,'U+124');
  458. end;
  459. procedure TTestCSSScanner.TestUNICODERANGE2;
  460. begin
  461. CheckToken(ctkUNICODERANGE,'U+124-128');
  462. end;
  463. procedure TTestCSSScanner.TestFUNCTION;
  464. begin
  465. CheckToken(ctkFUNCTION,'name(');
  466. end;
  467. procedure TTestCSSScanner.TestPSEUDOFUNCTION;
  468. begin
  469. CheckToken(ctkPSEUDOFUNCTION,':name(');
  470. end;
  471. procedure TTestCSSScanner.TestPSEUDOFUNCTION2;
  472. begin
  473. CheckToken(ctkPSEUDOFUNCTION,'::name(');
  474. end;
  475. procedure TTestCSSScanner.TestJUNK;
  476. begin
  477. FErrorSource:='?';
  478. AssertException('Exception',ECSSScanner, @TestErrorSource);
  479. end;
  480. procedure TTestCSSScanner.TestSQUARED;
  481. begin
  482. CheckToken(ctkSQUARED,'^');
  483. end;
  484. procedure TTestCSSScanner.AssertEquals(AMessage : String; AExpected, AActual: TCSSToken);
  485. Var
  486. S,EN1,EN2 : String;
  487. begin
  488. If (AActual<>AExpected) then
  489. begin
  490. EN1:=GetEnumName(TypeINfo(TCSSToken),Ord(AExpected));
  491. EN2:=GetEnumName(TypeINfo(TCSSToken),Ord(AActual));
  492. S:=Format('%s : %s <> %s',[AMessage,EN1,EN2]);
  493. Fail(S);
  494. end;
  495. end;
  496. procedure TTestCSSScanner.CheckToken(AToken: TCSSToken; ASource: String);
  497. Var
  498. J : TCSSToken;
  499. EN2 : String;
  500. begin
  501. CreateScanner(ASource);
  502. J:=Scanner.FetchToken;
  503. EN2:=GetEnumName(TypeINfo(TCSSToken),Ord(AToken));
  504. AssertEquals(Format('Source %s should result in %s.',[ASource,EN2]),AToken,J);
  505. end;
  506. procedure TTestCSSScanner.CheckTokens(ASource: String;
  507. ATokens: array of TCSSToken);
  508. Var
  509. I : Integer;
  510. J : TCSSToken;
  511. S : String;
  512. begin
  513. CreateScanner(ASource);
  514. For I:=Low(ATokens) to High(ATokens) do
  515. begin
  516. J:=FScanner.FetchToken;
  517. S:=GetEnumName(TypeINfo(TCSSToken),Ord(ATokens[i]));
  518. S:=Format('Source "%s", token %d (%s): expected %s',[ASource,I,FScanner.CurTokenString,S]);
  519. AssertEquals(S,ATokens[i],J);
  520. end;
  521. end;
  522. { TTestLineReader }
  523. procedure TTestLineReader.CreateReader(AInput: String);
  524. begin
  525. FData:=TStringStream.Create(AInput);
  526. FReader:=TStreamLineReader.Create(FData);
  527. end;
  528. procedure TTestLineReader.TearDown;
  529. begin
  530. FreeAndNil(FReader);
  531. FreeAndNil(FData);
  532. end;
  533. procedure TTestLineReader.TestEmpty;
  534. begin
  535. CreateReader('');
  536. AssertEquals('Empty reader returns EOF',True,FReader.IsEOF);
  537. AssertEquals('Empty reader returns empty string','',FReader.ReadLine);
  538. end;
  539. procedure TTestLineReader.TestReadLine;
  540. begin
  541. CreateReader('Something');
  542. AssertEquals('Reader with 1 line returns 1 line','Something',FReader.ReadLine);
  543. AssertEquals('EOF true after reading line',True,FReader.IsEOF);
  544. end;
  545. procedure TTestLineReader.TestReadLines13;
  546. begin
  547. CreateReader('Something'#13'else');
  548. AssertEquals('Reader with 2 lines returns 1st line','Something',FReader.ReadLine);
  549. AssertEquals('Reader with 2 lines returns 2nd line','else',FReader.ReadLine);
  550. AssertEquals('EOF true after reading lines',True,FReader.IsEOF);
  551. end;
  552. procedure TTestLineReader.TestReadLines10;
  553. begin
  554. CreateReader('Something'#10'else');
  555. AssertEquals('Reader with 2 lines returns 1st line','Something',FReader.ReadLine);
  556. AssertEquals('Reader with 2 lines returns 2nd line','else',FReader.ReadLine);
  557. AssertEquals('EOF true after reading lines',True,FReader.IsEOF);
  558. end;
  559. procedure TTestLineReader.TestReadLines1310;
  560. begin
  561. CreateReader('Something'#13#10'else');
  562. AssertEquals('Reader with 2 lines returns 1st line','Something',FReader.ReadLine);
  563. AssertEquals('Reader with 2 lines returns 2nd line','else',FReader.ReadLine);
  564. AssertEquals('EOF true after reading lines',True,FReader.IsEOF);
  565. end;
  566. procedure TTestLineReader.TestReadLinesEOF13;
  567. begin
  568. CreateReader('Something'#13);
  569. AssertEquals('Reader with 2 lines + CR returns 1st line','Something',FReader.ReadLine);
  570. AssertEquals('Reader with 1 lines + CR returns empty 2nd line','',FReader.ReadLine);
  571. AssertEquals('EOF true after reading lines',True,FReader.IsEOF);
  572. end;
  573. procedure TTestLineReader.TestReadLinesEOF10;
  574. begin
  575. CreateReader('Something'#10);
  576. AssertEquals('Reader with 2 lines + LF returns 1st line','Something',FReader.ReadLine);
  577. AssertEquals('Reader with 1 lines + LF returns empty 2nd line','',FReader.ReadLine);
  578. AssertEquals('EOF true after reading lines',True,FReader.IsEOF);
  579. end;
  580. procedure TTestLineReader.TestReadLinesEOF1310;
  581. begin
  582. CreateReader('Something'#13#10);
  583. AssertEquals('Reader with 2 lines + CRLF returns 1st line','Something',FReader.ReadLine);
  584. AssertEquals('Reader with 1 lines + CRLF returns empty 2nd line','',FReader.ReadLine);
  585. AssertEquals('EOF true after reading lines',True,FReader.IsEOF);
  586. end;
  587. procedure TTestLineReader.TestReadEmptyLines101010;
  588. begin
  589. CreateReader('Something'#10#10#10);
  590. AssertEquals('Reader with 1 line + LFLFLF returns 1st line','Something',FReader.ReadLine);
  591. AssertEquals('EOF false after reading line 1',False,FReader.IsEOF);
  592. AssertEquals('Reader with 1 line + LFLFLF returns empty 2nd line','',FReader.ReadLine);
  593. AssertEquals('EOF false after reading line 2',False,FReader.IsEOF);
  594. AssertEquals('Reader with 1 line + LFLFLF returns empty 3nd line','',FReader.ReadLine);
  595. AssertEquals('EOF true after reading lines',True,FReader.IsEOF);
  596. end;
  597. initialization
  598. RegisterTests([TTestLineReader,TTestCSSScanner]);
  599. end.