tchtmlparser.pas 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 1999-2022 by Michael van Canneyt and other members of the
  4. Free Pascal development team
  5. report html parser test
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. unit tchtmlparser;
  13. {$mode objfpc}{$H+}
  14. interface
  15. uses
  16. Classes,
  17. SysUtils,
  18. fpcunit,
  19. testregistry,
  20. fpReportHTMLParser;
  21. type
  22. TTestHTMLParser = class(TTestCase)
  23. private
  24. FParser: THTMLParser;
  25. FTags: TStringList;
  26. FText: TStringList;
  27. procedure InitParser(const AText: string);
  28. procedure CaptureTagsFound(NoCaseTag, ActualTag: string);
  29. procedure CaptureTextFound(Text: string);
  30. protected
  31. procedure SetUp; override;
  32. procedure TearDown; override;
  33. public
  34. published
  35. procedure TestOneTagPair;
  36. procedure TestNoTags;
  37. procedure TestTagAndRemainingText;
  38. procedure TestRegularTextAndTag;
  39. procedure TestTagNoText;
  40. procedure TestGetTagName;
  41. procedure TestGetNameValPair;
  42. procedure TestGetValFromNameVal;
  43. procedure TestGetVal;
  44. end;
  45. implementation
  46. { TTestHTMLParser }
  47. procedure TTestHTMLParser.InitParser(const AText: string);
  48. begin
  49. FParser := THTMLParser.Create(AText);
  50. FParser.OnFoundTag := @CaptureTagsFound;
  51. FParser.OnFoundText := @CaptureTextFound;
  52. FParser.Exec;
  53. end;
  54. procedure TTestHTMLParser.CaptureTagsFound(NoCaseTag, ActualTag: string);
  55. begin
  56. FTags.Add(NoCaseTag);
  57. end;
  58. procedure TTestHTMLParser.CaptureTextFound(Text: string);
  59. begin
  60. FText.Add(Text);
  61. end;
  62. procedure TTestHTMLParser.SetUp;
  63. begin
  64. inherited SetUp;
  65. FParser := nil;
  66. FTags := TStringList.Create;
  67. FText := TStringList.Create;
  68. end;
  69. procedure TTestHTMLParser.TearDown;
  70. begin
  71. FParser.Free;
  72. FTags.Free;
  73. FText.Free;
  74. inherited TearDown;
  75. end;
  76. procedure TTestHTMLParser.TestOneTagPair;
  77. begin
  78. InitParser('<i>italics</i>');
  79. AssertEquals('Failed on 1', FTags[0], '<I>');
  80. AssertEquals('Failed on 2', FTags[1], '</I>');
  81. AssertEquals('Failed on 3', FText[0], 'italics');
  82. end;
  83. procedure TTestHTMLParser.TestNoTags;
  84. begin
  85. InitParser('italics');
  86. AssertEquals('Failed on 1', FTags.Text, '');
  87. AssertEquals('Failed on 2', FText[0], 'italics');
  88. end;
  89. procedure TTestHTMLParser.TestTagAndRemainingText;
  90. begin
  91. InitParser('<i>italics</i> regular text');
  92. AssertEquals('Failed on 1', FTags[0], '<I>');
  93. AssertEquals('Failed on 2', FTags[1], '</I>');
  94. AssertEquals('Failed on 3', FText[0], 'italics');
  95. AssertEquals('Failed on 4', FText[1], ' regular text');
  96. end;
  97. procedure TTestHTMLParser.TestRegularTextAndTag;
  98. begin
  99. InitParser('regular text <i>italics</i>');
  100. AssertEquals('Failed on 1', FTags[0], '<I>');
  101. AssertEquals('Failed on 2', FTags[1], '</I>');
  102. AssertEquals('Failed on 3', FText[0], 'regular text ');
  103. AssertEquals('Failed on 4', FText[1], 'italics');
  104. end;
  105. procedure TTestHTMLParser.TestTagNoText;
  106. begin
  107. InitParser('<i></i>');
  108. AssertEquals('Failed on 1', FTags[0], '<I>');
  109. AssertEquals('Failed on 2', FTags[1], '</I>');
  110. AssertEquals('Failed on 3', FText.Text, '');
  111. end;
  112. procedure TTestHTMLParser.TestGetTagName;
  113. begin
  114. AssertEquals('failed on 1', 'I', FParser.GetTagName('<I>'));
  115. AssertTrue('failed on 2 - case preserved', FParser.GetTagName('<I>') <> 'i');
  116. AssertEquals('failed on 3', '/I', FParser.GetTagName('</I>'));
  117. AssertEquals('failed on 4', 'i', FParser.GetTagName('<i>'));
  118. AssertEquals('failed on 5', 'a', FParser.GetTagName('<a href="#hello">'));
  119. AssertEquals('failed on 6', 'a', FParser.GetTagName('<a href="http://www.freepascal.org">'));
  120. AssertEquals('failed on 7 - multi character tag', 'table', FParser.GetTagName('<table cellpadding=5 cellspacing=10 class="main">'));
  121. end;
  122. procedure TTestHTMLParser.TestGetNameValPair;
  123. begin
  124. AssertEquals('failed on 1', '', FParser.GetNameValPair('<I>', ''));
  125. AssertEquals('failed on 2', '', FParser.GetNameValPair('</I>', 'href'));
  126. AssertEquals('failed on 3', '', FParser.GetNameValPair('<i>', ''));
  127. AssertEquals('failed on 4', 'href="#hello"', FParser.GetNameValPair('<a href="#hello">', 'href'));
  128. AssertEquals('failed on 5', 'href="http://www.freepascal.org"', FParser.GetNameValPair('<a href="http://www.freepascal.org">', 'href'));
  129. AssertEquals('failed on 6', 'cellpadding=5', FParser.GetNameValPair('<table cellpadding=5 cellspacing=10 class="main">', 'cellpadding'));
  130. AssertEquals('failed on 7', 'cellspacing=10', FParser.GetNameValPair('<table cellpadding=5 cellspacing=10 class="main">', 'cellspacing'));
  131. AssertEquals('failed on 8', 'class="main"', FParser.GetNameValPair('<table cellpadding=5 cellspacing=10 class="main">', 'class'));
  132. end;
  133. procedure TTestHTMLParser.TestGetValFromNameVal;
  134. begin
  135. AssertEquals('failed on 1', '#hello', FParser.GetValFromNameVal('href="#hello"'));
  136. AssertEquals('failed on 2', 'http://www.freepascal.org', FParser.GetValFromNameVal('href="http://www.freepascal.org"'));
  137. AssertEquals('failed on 3', '5', FParser.GetValFromNameVal('cellpadding=5'));
  138. AssertEquals('failed on 4', 'black', FParser.GetValFromNameVal('bgcolor=black'));
  139. AssertEquals('failed on 5', 'main', FParser.GetValFromNameVal('class="main"'));
  140. AssertEquals('failed on 6', 'http://www.freepascal.org/docs/docs.php?num=10', FParser.GetValFromNameVal('href="http://www.freepascal.org/docs/docs.php?num=10"'));
  141. end;
  142. procedure TTestHTMLParser.TestGetVal;
  143. begin
  144. AssertEquals('failed on 1', '', FParser.GetVal('<I>', ''));
  145. AssertEquals('failed on 2', '', FParser.GetVal('</I>', 'href'));
  146. AssertEquals('failed on 3', '', FParser.GetVal('<i>', ''));
  147. AssertEquals('failed on 4', '#hello', FParser.GetVal('<a href="#hello">', 'href'));
  148. AssertEquals('failed on 5', 'http://www.freepascal.org', FParser.GetVal('<a href="http://www.freepascal.org">', 'href'));
  149. AssertEquals('failed on 6', '5', FParser.GetVal('<table cellpadding=5 cellspacing=10 class="main">', 'cellpadding'));
  150. AssertEquals('failed on 7', '10', FParser.GetVal('<table cellpadding=5 cellspacing=10 class="main">', 'cellspacing'));
  151. AssertEquals('failed on 8', 'main', FParser.GetVal('<table cellpadding=5 cellspacing=10 class="main">', 'class'));
  152. AssertEquals('failed on 9', 'http://www.freepascal.org/docs/docs.php?num=10', FParser.GetVal('<a href="http://www.freepascal.org/docs/docs.php?num=10">', 'href'));
  153. end;
  154. initialization
  155. RegisterTests([TTestHTMLParser]);
  156. end.
  157. end.