tccssscanner.pp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731
  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. protected
  51. Function CreateScanner(AInput : String) : TCSSScanner;
  52. procedure FreeScanner;
  53. procedure SetUp; override;
  54. procedure TearDown; override;
  55. Property Scanner : TCSSScanner Read FScanner;
  56. published
  57. procedure TestEmpty;
  58. Procedure TestEOF;
  59. Procedure TestWhiteSpace;
  60. Procedure TestComment1;
  61. Procedure TestComment2;
  62. Procedure TestComment3;
  63. Procedure TestID1;
  64. Procedure TestIDUnderscore;
  65. Procedure TestIDMinus;
  66. Procedure TestIDMinusMinus;
  67. Procedure TestIDEscape;
  68. Procedure TestIDEscapeStart;
  69. procedure TestPSEUDO;
  70. procedure TestPSEUDO2;
  71. procedure TestPSEUDOMinus;
  72. procedure TestPSEUDO2Minus;
  73. procedure TestPSEUDODisabled;
  74. procedure TestUNICODERANGE;
  75. procedure TestUNICODERANGE2;
  76. procedure TestFUNCTION;
  77. procedure TestPSEUDOFUNCTION;
  78. procedure TestPSEUDOFUNCTION2;
  79. Procedure TestSEMI;
  80. Procedure TestLPAREN;
  81. Procedure TestRPAREN;
  82. Procedure TestLBRACE;
  83. Procedure TestRBRACE;
  84. Procedure TestLBRACKET;
  85. Procedure TestRBRACKET;
  86. Procedure TestSTR;
  87. Procedure TestStrEscapeUnicode;
  88. procedure TestStrEscapeUnicode2;
  89. Procedure TestCOMMA;
  90. Procedure TestEQUALS;
  91. Procedure TestAND;
  92. Procedure TestTILDE;
  93. Procedure TestPLUS;
  94. Procedure TestCOLON;
  95. Procedure TestDOUBLECOLON;
  96. Procedure TestDOT;
  97. Procedure TestINT;
  98. Procedure TestFLOAT;
  99. Procedure TestFLOATNegDot;
  100. Procedure TestFLOATNegAndExp;
  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.TestEmpty;
  202. Var
  203. J : TCSSToken;
  204. begin
  205. CreateScanner('');
  206. J:=Scanner.FetchToken;
  207. If (J<>ctkEOF) then
  208. Fail('Empty returns EOF');
  209. end;
  210. procedure TTestCSSScanner.TestEOF;
  211. Var
  212. C : TCSSToken;
  213. begin
  214. CreateScanner('');
  215. C:=Scanner.FetchToken;
  216. If (C<>ctkEOF) then
  217. Fail('Empty returns EOF');
  218. end;
  219. procedure TTestCSSScanner.TestWhiteSpace;
  220. Var
  221. C : TCSSToken;
  222. begin
  223. FNeedWhiteSpace:=True;
  224. CreateScanner(' ');
  225. C:=Scanner.FetchToken;
  226. If (C<>ctkWHITESPACE) then
  227. Fail('Empty returns EOF');
  228. end;
  229. procedure TTestCSSScanner.TestComment1;
  230. begin
  231. CreateScanner('/* some comment string */');
  232. AssertEquals('Comment line is skipped',ctkEOF,FScanner.FetchToken);
  233. end;
  234. procedure TTestCSSScanner.TestComment2;
  235. begin
  236. CreateScanner('/* some comment string */');
  237. FScanner.ReturnComments:=True;
  238. AssertEquals('Comment line is returned',ctkComment,FScanner.FetchToken);
  239. AssertEquals('Comment contents is returned',' some comment string ',FScanner.CurTokenString);
  240. end;
  241. procedure TTestCSSScanner.TestComment3;
  242. begin
  243. CreateScanner('/* some multiline comment '#10' string */');
  244. FScanner.ReturnComments:=True;
  245. AssertEquals('Comment line is returned',ctkComment,FScanner.FetchToken);
  246. AssertEquals('Comment contents is returned',' some multiline comment '#10' string ',FScanner.CurTokenString);
  247. end;
  248. procedure TTestCSSScanner.TestID1;
  249. begin
  250. CheckToken(ctkIDENTIFIER,'anid');
  251. end;
  252. procedure TTestCSSScanner.TestIDUnderscore;
  253. begin
  254. CheckToken(ctkIDENTIFIER,'_anid');
  255. end;
  256. procedure TTestCSSScanner.TestIDMinus;
  257. begin
  258. CheckToken(ctkIDENTIFIER,'-anid');
  259. end;
  260. procedure TTestCSSScanner.TestIDMinusMinus;
  261. begin
  262. CheckToken(ctkIDENTIFIER,'--anid');
  263. end;
  264. procedure TTestCSSScanner.TestIDEscape;
  265. begin
  266. CheckToken(ctkIDENTIFIER,'an\(id');
  267. end;
  268. procedure TTestCSSScanner.TestIDEscapeStart;
  269. begin
  270. CheckToken(ctkIDENTIFIER,'\(anid');
  271. end;
  272. procedure TTestCSSScanner.TestSEMI;
  273. begin
  274. CheckToken(ctkSEMICOLON,';');
  275. end;
  276. procedure TTestCSSScanner.TestLPAREN;
  277. begin
  278. CheckToken(ctkLPARENTHESIS,'(');
  279. end;
  280. procedure TTestCSSScanner.TestRPAREN;
  281. begin
  282. CheckToken(ctkRPARENTHESIS,')');
  283. end;
  284. procedure TTestCSSScanner.TestLBRACE;
  285. begin
  286. CheckToken(ctkLBRACE,'{');
  287. end;
  288. procedure TTestCSSScanner.TestRBRACE;
  289. begin
  290. CheckToken(ctkRBRACE,'}');
  291. end;
  292. procedure TTestCSSScanner.TestLBRACKET;
  293. begin
  294. CheckToken(ctkLBRACKET,'[');
  295. end;
  296. procedure TTestCSSScanner.TestRBRACKET;
  297. begin
  298. CheckToken(ctkRBRACKET,']');
  299. end;
  300. procedure TTestCSSScanner.TestSTR;
  301. begin
  302. CheckToken(ctkSTRING,'"abc"');
  303. end;
  304. procedure TTestCSSScanner.TestStrEscapeUnicode;
  305. begin
  306. CheckToken(ctkSTRING,'"\00a0\00a0\00a0\00a0"');
  307. CheckToken(ctkSTRING,'"\2a"');
  308. end;
  309. procedure TTestCSSScanner.TestStrEscapeUnicode2;
  310. begin
  311. CheckToken(ctkSTRING,'"\2a"');
  312. end;
  313. procedure TTestCSSScanner.TestCOMMA;
  314. begin
  315. CheckToken(ctkCOMMA,',');
  316. end;
  317. procedure TTestCSSScanner.TestEQUALS;
  318. begin
  319. CheckToken(ctkEQUALS,'=');
  320. end;
  321. procedure TTestCSSScanner.TestAND;
  322. begin
  323. CheckToken(ctkAND,'&');
  324. end;
  325. procedure TTestCSSScanner.TestTILDE;
  326. begin
  327. CheckToken(ctkTILDE,'~');
  328. end;
  329. procedure TTestCSSScanner.TestPLUS;
  330. begin
  331. CheckToken(ctkPLUS,'+');
  332. end;
  333. procedure TTestCSSScanner.TestCOLON;
  334. begin
  335. CheckToken(ctkCOLON,':');
  336. end;
  337. procedure TTestCSSScanner.TestDOUBLECOLON;
  338. begin
  339. CheckToken(ctkDOUBLECOLON,'::');
  340. end;
  341. procedure TTestCSSScanner.TestDOT;
  342. begin
  343. CheckToken(ctkDOT,'.');
  344. end;
  345. procedure TTestCSSScanner.TestINT;
  346. begin
  347. CheckToken(ctkINTEGER,'123');
  348. end;
  349. procedure TTestCSSScanner.TestFLOAT;
  350. begin
  351. DoTestFloat(123.3,'123.3');
  352. end;
  353. procedure TTestCSSScanner.TestFLOATNegDot;
  354. begin
  355. DoTestFloat(-0.123,'-.123');
  356. end;
  357. procedure TTestCSSScanner.TestFLOATNegAndExp;
  358. begin
  359. DoTestFloat(-1020.0,'-10.2e+2');
  360. end;
  361. procedure TTestCSSScanner.TestDOUBLE;
  362. begin
  363. DoTestFloat(123.3,'123.3');
  364. end;
  365. procedure TTestCSSScanner.TestHASH1;
  366. begin
  367. CheckToken(ctkHASH,'#1231');
  368. end;
  369. procedure TTestCSSScanner.TestHASH2;
  370. begin
  371. CheckToken(ctkHASH,'#AFAFAF');
  372. end;
  373. procedure TTestCSSScanner.TestDIV;
  374. begin
  375. CheckToken(ctkDIV,'/');
  376. end;
  377. procedure TTestCSSScanner.TestSTATEMENT;
  378. begin
  379. CheckToken(ctkATKEYWORD,'@media');
  380. end;
  381. procedure TTestCSSScanner.TestGT;
  382. begin
  383. CheckToken(ctkGT,'>');
  384. end;
  385. procedure TTestCSSScanner.TestLT;
  386. begin
  387. CheckToken(ctkLT,'<');
  388. end;
  389. procedure TTestCSSScanner.TestPERCENTAGE;
  390. begin
  391. CheckToken(ctkPERCENTAGE,'%');
  392. end;
  393. procedure TTestCSSScanner.TestMINUS;
  394. begin
  395. CheckToken(ctkMinus,'-');
  396. end;
  397. procedure TTestCSSScanner.TestIMPORTANT;
  398. begin
  399. CheckToken(ctkIMPORTANT,'!important');
  400. end;
  401. procedure TTestCSSScanner.TestCLASSNAME;
  402. begin
  403. CheckToken(ctkCLASSNAME,'.classname');
  404. end;
  405. procedure TTestCSSScanner.TestSTAR;
  406. begin
  407. CheckToken(ctkSTAR,'*');
  408. end;
  409. procedure TTestCSSScanner.TestURL;
  410. begin
  411. CheckToken(ctkURL,'url("abc")');
  412. end;
  413. procedure TTestCSSScanner.TestURLAltQuote;
  414. begin
  415. CheckToken(ctkURL,'url(''abc'')');
  416. end;
  417. procedure TTestCSSScanner.TestURL2;
  418. begin
  419. CheckToken(ctkURL,'url(abc)');
  420. end;
  421. procedure TTestCSSScanner.TestBADURL;
  422. begin
  423. CheckToken(ctkBADURL,'url(de f)');
  424. end;
  425. procedure TTestCSSScanner.TestBADEOF;
  426. begin
  427. CheckToken(ctkEOF,'url(def');
  428. end;
  429. procedure TTestCSSScanner.TestPSEUDO;
  430. begin
  431. CheckToken(ctkPSEUDO,':name');
  432. end;
  433. procedure TTestCSSScanner.TestPSEUDO2;
  434. begin
  435. CheckTokens('::name',[ctkDOUBLECOLON,ctkIDENTIFIER]);
  436. end;
  437. procedure TTestCSSScanner.TestPSEUDOMinus;
  438. begin
  439. CheckToken(ctkPSEUDO,':-name');
  440. end;
  441. procedure TTestCSSScanner.TestPSEUDO2Minus;
  442. begin
  443. CheckTokens('::-name',[ctkDOUBLECOLON,ctkIDENTIFIER]);
  444. end;
  445. procedure TTestCSSScanner.TestPSEUDODisabled;
  446. begin
  447. FPseudoDisabled:=True;
  448. CheckTokens(':me',[ctkColon,ctkIDENTIFIER]);
  449. end;
  450. procedure TTestCSSScanner.TestUNICODERANGE;
  451. begin
  452. CheckToken(ctkUNICODERANGE,'U+124');
  453. end;
  454. procedure TTestCSSScanner.TestUNICODERANGE2;
  455. begin
  456. CheckToken(ctkUNICODERANGE,'U+124-128');
  457. end;
  458. procedure TTestCSSScanner.TestFUNCTION;
  459. begin
  460. CheckToken(ctkFUNCTION,'name(');
  461. end;
  462. procedure TTestCSSScanner.TestPSEUDOFUNCTION;
  463. begin
  464. CheckToken(ctkPSEUDOFUNCTION,':name(');
  465. end;
  466. procedure TTestCSSScanner.TestPSEUDOFUNCTION2;
  467. begin
  468. CheckTokens('::name(',[ctkDOUBLECOLON,ctkFUNCTION]);
  469. end;
  470. procedure TTestCSSScanner.TestJUNK;
  471. var
  472. HasUnknown: Boolean;
  473. begin
  474. FErrorSource:='?';
  475. HasUnknown:=false;
  476. CreateScanner(FErrorSource);
  477. try
  478. While (FScanner.FetchToken<>ctkEOF) do
  479. if FScanner.CurToken=ctkUNKNOWN then HasUnknown:=true;
  480. finally
  481. FreeScanner;
  482. end;
  483. if not HasUnknown then
  484. Fail('missing unknown');
  485. end;
  486. procedure TTestCSSScanner.TestSQUARED;
  487. begin
  488. CheckToken(ctkSQUARED,'^');
  489. end;
  490. procedure TTestCSSScanner.AssertEquals(AMessage : String; AExpected, AActual: TCSSToken);
  491. Var
  492. S,EN1,EN2 : String;
  493. begin
  494. If (AActual<>AExpected) then
  495. begin
  496. EN1:=GetEnumName(TypeINfo(TCSSToken),Ord(AExpected));
  497. EN2:=GetEnumName(TypeINfo(TCSSToken),Ord(AActual));
  498. S:=Format('%s : %s <> %s',[AMessage,EN1,EN2]);
  499. Fail(S);
  500. end;
  501. end;
  502. procedure TTestCSSScanner.CheckToken(AToken: TCSSToken; ASource: String);
  503. Var
  504. J : TCSSToken;
  505. EN2 : String;
  506. begin
  507. CreateScanner(ASource);
  508. J:=Scanner.FetchToken;
  509. EN2:=GetEnumName(TypeINfo(TCSSToken),Ord(AToken));
  510. AssertEquals(Format('Source %s should result in %s.',[ASource,EN2]),AToken,J);
  511. end;
  512. procedure TTestCSSScanner.CheckTokens(ASource: String;
  513. ATokens: array of TCSSToken);
  514. Var
  515. I : Integer;
  516. J : TCSSToken;
  517. S : String;
  518. begin
  519. CreateScanner(ASource);
  520. For I:=Low(ATokens) to High(ATokens) do
  521. begin
  522. J:=FScanner.FetchToken;
  523. S:=GetEnumName(TypeINfo(TCSSToken),Ord(ATokens[i]));
  524. S:=Format('Source "%s", token %d (%s): expected %s',[ASource,I,FScanner.CurTokenString,S]);
  525. AssertEquals(S,ATokens[i],J);
  526. end;
  527. end;
  528. { TTestLineReader }
  529. procedure TTestLineReader.CreateReader(AInput: String);
  530. begin
  531. FData:=TStringStream.Create(AInput);
  532. FReader:=TStreamLineReader.Create(FData);
  533. end;
  534. procedure TTestLineReader.TearDown;
  535. begin
  536. FreeAndNil(FReader);
  537. FreeAndNil(FData);
  538. end;
  539. procedure TTestLineReader.TestEmpty;
  540. begin
  541. CreateReader('');
  542. AssertEquals('Empty reader returns EOF',True,FReader.IsEOF);
  543. AssertEquals('Empty reader returns empty string','',FReader.ReadLine);
  544. end;
  545. procedure TTestLineReader.TestReadLine;
  546. begin
  547. CreateReader('Something');
  548. AssertEquals('Reader with 1 line returns 1 line','Something',FReader.ReadLine);
  549. AssertEquals('EOF true after reading line',True,FReader.IsEOF);
  550. end;
  551. procedure TTestLineReader.TestReadLines13;
  552. begin
  553. CreateReader('Something'#13'else');
  554. AssertEquals('Reader with 2 lines returns 1st line','Something',FReader.ReadLine);
  555. AssertEquals('Reader with 2 lines returns 2nd line','else',FReader.ReadLine);
  556. AssertEquals('EOF true after reading lines',True,FReader.IsEOF);
  557. end;
  558. procedure TTestLineReader.TestReadLines10;
  559. begin
  560. CreateReader('Something'#10'else');
  561. AssertEquals('Reader with 2 lines returns 1st line','Something',FReader.ReadLine);
  562. AssertEquals('Reader with 2 lines returns 2nd line','else',FReader.ReadLine);
  563. AssertEquals('EOF true after reading lines',True,FReader.IsEOF);
  564. end;
  565. procedure TTestLineReader.TestReadLines1310;
  566. begin
  567. CreateReader('Something'#13#10'else');
  568. AssertEquals('Reader with 2 lines returns 1st line','Something',FReader.ReadLine);
  569. AssertEquals('Reader with 2 lines returns 2nd line','else',FReader.ReadLine);
  570. AssertEquals('EOF true after reading lines',True,FReader.IsEOF);
  571. end;
  572. procedure TTestLineReader.TestReadLinesEOF13;
  573. begin
  574. CreateReader('Something'#13);
  575. AssertEquals('Reader with 2 lines + CR returns 1st line','Something',FReader.ReadLine);
  576. AssertEquals('Reader with 1 lines + CR returns empty 2nd line','',FReader.ReadLine);
  577. AssertEquals('EOF true after reading lines',True,FReader.IsEOF);
  578. end;
  579. procedure TTestLineReader.TestReadLinesEOF10;
  580. begin
  581. CreateReader('Something'#10);
  582. AssertEquals('Reader with 2 lines + LF returns 1st line','Something',FReader.ReadLine);
  583. AssertEquals('Reader with 1 lines + LF returns empty 2nd line','',FReader.ReadLine);
  584. AssertEquals('EOF true after reading lines',True,FReader.IsEOF);
  585. end;
  586. procedure TTestLineReader.TestReadLinesEOF1310;
  587. begin
  588. CreateReader('Something'#13#10);
  589. AssertEquals('Reader with 2 lines + CRLF returns 1st line','Something',FReader.ReadLine);
  590. AssertEquals('Reader with 1 lines + CRLF returns empty 2nd line','',FReader.ReadLine);
  591. AssertEquals('EOF true after reading lines',True,FReader.IsEOF);
  592. end;
  593. procedure TTestLineReader.TestReadEmptyLines101010;
  594. begin
  595. CreateReader('Something'#10#10#10);
  596. AssertEquals('Reader with 1 line + LFLFLF returns 1st line','Something',FReader.ReadLine);
  597. AssertEquals('EOF false after reading line 1',False,FReader.IsEOF);
  598. AssertEquals('Reader with 1 line + LFLFLF returns empty 2nd line','',FReader.ReadLine);
  599. AssertEquals('EOF false after reading line 2',False,FReader.IsEOF);
  600. AssertEquals('Reader with 1 line + LFLFLF returns empty 3nd line','',FReader.ReadLine);
  601. AssertEquals('EOF true after reading lines',True,FReader.IsEOF);
  602. end;
  603. initialization
  604. RegisterTests([TTestLineReader,TTestCSSScanner]);
  605. end.