tchtmlparser.pas 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. unit tchtmlparser;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes,
  6. SysUtils,
  7. fpcunit,
  8. testregistry,
  9. fpReportHTMLParser;
  10. type
  11. TTestHTMLParser = class(TTestCase)
  12. private
  13. FParser: THTMLParser;
  14. FTags: TStringList;
  15. FText: TStringList;
  16. procedure InitParser(const AText: string);
  17. procedure CaptureTagsFound(NoCaseTag, ActualTag: string);
  18. procedure CaptureTextFound(Text: string);
  19. protected
  20. procedure SetUp; override;
  21. procedure TearDown; override;
  22. public
  23. published
  24. procedure TestOneTagPair;
  25. procedure TestNoTags;
  26. procedure TestTagAndRemainingText;
  27. procedure TestRegularTextAndTag;
  28. procedure TestTagNoText;
  29. procedure TestGetTagName;
  30. procedure TestGetNameValPair;
  31. procedure TestGetValFromNameVal;
  32. procedure TestGetVal;
  33. end;
  34. implementation
  35. { TTestHTMLParser }
  36. procedure TTestHTMLParser.InitParser(const AText: string);
  37. begin
  38. FParser := THTMLParser.Create(AText);
  39. FParser.OnFoundTag := @CaptureTagsFound;
  40. FParser.OnFoundText := @CaptureTextFound;
  41. FParser.Exec;
  42. end;
  43. procedure TTestHTMLParser.CaptureTagsFound(NoCaseTag, ActualTag: string);
  44. begin
  45. FTags.Add(NoCaseTag);
  46. end;
  47. procedure TTestHTMLParser.CaptureTextFound(Text: string);
  48. begin
  49. FText.Add(Text);
  50. end;
  51. procedure TTestHTMLParser.SetUp;
  52. begin
  53. inherited SetUp;
  54. FParser := nil;
  55. FTags := TStringList.Create;
  56. FText := TStringList.Create;
  57. end;
  58. procedure TTestHTMLParser.TearDown;
  59. begin
  60. FParser.Free;
  61. FTags.Free;
  62. FText.Free;
  63. inherited TearDown;
  64. end;
  65. procedure TTestHTMLParser.TestOneTagPair;
  66. begin
  67. InitParser('<i>italics</i>');
  68. AssertEquals('Failed on 1', FTags[0], '<I>');
  69. AssertEquals('Failed on 2', FTags[1], '</I>');
  70. AssertEquals('Failed on 3', FText[0], 'italics');
  71. end;
  72. procedure TTestHTMLParser.TestNoTags;
  73. begin
  74. InitParser('italics');
  75. AssertEquals('Failed on 1', FTags.Text, '');
  76. AssertEquals('Failed on 2', FText[0], 'italics');
  77. end;
  78. procedure TTestHTMLParser.TestTagAndRemainingText;
  79. begin
  80. InitParser('<i>italics</i> regular text');
  81. AssertEquals('Failed on 1', FTags[0], '<I>');
  82. AssertEquals('Failed on 2', FTags[1], '</I>');
  83. AssertEquals('Failed on 3', FText[0], 'italics');
  84. AssertEquals('Failed on 4', FText[1], ' regular text');
  85. end;
  86. procedure TTestHTMLParser.TestRegularTextAndTag;
  87. begin
  88. InitParser('regular text <i>italics</i>');
  89. AssertEquals('Failed on 1', FTags[0], '<I>');
  90. AssertEquals('Failed on 2', FTags[1], '</I>');
  91. AssertEquals('Failed on 3', FText[0], 'regular text ');
  92. AssertEquals('Failed on 4', FText[1], 'italics');
  93. end;
  94. procedure TTestHTMLParser.TestTagNoText;
  95. begin
  96. InitParser('<i></i>');
  97. AssertEquals('Failed on 1', FTags[0], '<I>');
  98. AssertEquals('Failed on 2', FTags[1], '</I>');
  99. AssertEquals('Failed on 3', FText.Text, '');
  100. end;
  101. procedure TTestHTMLParser.TestGetTagName;
  102. begin
  103. AssertEquals('failed on 1', 'I', FParser.GetTagName('<I>'));
  104. AssertTrue('failed on 2 - case preserved', FParser.GetTagName('<I>') <> 'i');
  105. AssertEquals('failed on 3', '/I', FParser.GetTagName('</I>'));
  106. AssertEquals('failed on 4', 'i', FParser.GetTagName('<i>'));
  107. AssertEquals('failed on 5', 'a', FParser.GetTagName('<a href="#hello">'));
  108. AssertEquals('failed on 6', 'a', FParser.GetTagName('<a href="http://www.freepascal.org">'));
  109. AssertEquals('failed on 7 - multi character tag', 'table', FParser.GetTagName('<table cellpadding=5 cellspacing=10 class="main">'));
  110. end;
  111. procedure TTestHTMLParser.TestGetNameValPair;
  112. begin
  113. AssertEquals('failed on 1', '', FParser.GetNameValPair('<I>', ''));
  114. AssertEquals('failed on 2', '', FParser.GetNameValPair('</I>', 'href'));
  115. AssertEquals('failed on 3', '', FParser.GetNameValPair('<i>', ''));
  116. AssertEquals('failed on 4', 'href="#hello"', FParser.GetNameValPair('<a href="#hello">', 'href'));
  117. AssertEquals('failed on 5', 'href="http://www.freepascal.org"', FParser.GetNameValPair('<a href="http://www.freepascal.org">', 'href'));
  118. AssertEquals('failed on 6', 'cellpadding=5', FParser.GetNameValPair('<table cellpadding=5 cellspacing=10 class="main">', 'cellpadding'));
  119. AssertEquals('failed on 7', 'cellspacing=10', FParser.GetNameValPair('<table cellpadding=5 cellspacing=10 class="main">', 'cellspacing'));
  120. AssertEquals('failed on 8', 'class="main"', FParser.GetNameValPair('<table cellpadding=5 cellspacing=10 class="main">', 'class'));
  121. end;
  122. procedure TTestHTMLParser.TestGetValFromNameVal;
  123. begin
  124. AssertEquals('failed on 1', '#hello', FParser.GetValFromNameVal('href="#hello"'));
  125. AssertEquals('failed on 2', 'http://www.freepascal.org', FParser.GetValFromNameVal('href="http://www.freepascal.org"'));
  126. AssertEquals('failed on 3', '5', FParser.GetValFromNameVal('cellpadding=5'));
  127. AssertEquals('failed on 4', 'black', FParser.GetValFromNameVal('bgcolor=black'));
  128. AssertEquals('failed on 5', 'main', FParser.GetValFromNameVal('class="main"'));
  129. 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"'));
  130. end;
  131. procedure TTestHTMLParser.TestGetVal;
  132. begin
  133. AssertEquals('failed on 1', '', FParser.GetVal('<I>', ''));
  134. AssertEquals('failed on 2', '', FParser.GetVal('</I>', 'href'));
  135. AssertEquals('failed on 3', '', FParser.GetVal('<i>', ''));
  136. AssertEquals('failed on 4', '#hello', FParser.GetVal('<a href="#hello">', 'href'));
  137. AssertEquals('failed on 5', 'http://www.freepascal.org', FParser.GetVal('<a href="http://www.freepascal.org">', 'href'));
  138. AssertEquals('failed on 6', '5', FParser.GetVal('<table cellpadding=5 cellspacing=10 class="main">', 'cellpadding'));
  139. AssertEquals('failed on 7', '10', FParser.GetVal('<table cellpadding=5 cellspacing=10 class="main">', 'cellspacing'));
  140. AssertEquals('failed on 8', 'main', FParser.GetVal('<table cellpadding=5 cellspacing=10 class="main">', 'class'));
  141. 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'));
  142. end;
  143. initialization
  144. RegisterTests([TTestHTMLParser]);
  145. end.
  146. end.