A fork of potaka/bbcode to handle future maintenance
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

259 lines
7.0KB

  1. <?php
  2. use PHPUnit\Framework\TestCase;
  3. use Potaka\BbCode\Tokenizer\Tag;
  4. use Potaka\BbCode\Tokenizer\Tokenizer;
  5. /**
  6. * Description of TokenizerTest
  7. *
  8. * @author po_taka <angel.koilov@gmail.com>
  9. */
  10. class TokenizerTest extends TestCase
  11. {
  12. private function assertSameTokenized($expected, $result)
  13. {
  14. $resultStrng = print_r($result, true);
  15. $expectedString = print_r($expected, true);
  16. $this->assertSame($expectedString, $resultStrng);
  17. }
  18. public function testSimpleTokenize()
  19. {
  20. $tokenizer = new Tokenizer();
  21. $text = 'w[b]z[/b]';
  22. $tokenized = $tokenizer->tokenize($text);
  23. $expected = new Tag(null);
  24. $expected->addTag(
  25. (new Tag(null))
  26. ->setText('w')
  27. );
  28. $expected->addTag(
  29. (new Tag('b'))
  30. ->addTag(
  31. (new Tag(null))->setText('z')
  32. )
  33. );
  34. $this->assertSameTokenized($expected, $tokenized);
  35. }
  36. public function testNestedTokenize()
  37. {
  38. $tokenizer = new Tokenizer();
  39. $text = 'w[b]B[u]U[/u][/b]';
  40. $tokenized = $tokenizer->tokenize($text);
  41. $expected = new Tag(null);
  42. $expected->addTag(
  43. (new Tag(null))->setText('w')
  44. );
  45. $expected->addTag(
  46. (new Tag('b'))->addTag(
  47. (new Tag(null))->setText('B')
  48. )->addTag(
  49. (new Tag('u'))->addTag(
  50. (new Tag(null))->setText('U')
  51. )
  52. )
  53. );
  54. $this->assertSameTokenized($expected, $tokenized);
  55. }
  56. public function testNoTokenizing()
  57. {
  58. $tokenizer = new Tokenizer();
  59. $text = 'asdf';
  60. $result = $tokenizer->tokenize($text);
  61. $expected = new Tag(null);
  62. $expected->addTag(
  63. (new Tag(null))->setText('asdf')
  64. );
  65. $this->assertSameTokenized($expected, $result);
  66. }
  67. public function testEmptyTag()
  68. {
  69. $tokenizer = new Tokenizer();
  70. $text = '[]';
  71. $result = $tokenizer->tokenize($text);
  72. $expected = new Tag(null);
  73. $expected->addTag(
  74. (new Tag(null))->setText('[]')
  75. );
  76. $this->assertSameTokenized($expected, $result);
  77. }
  78. public function testNotClosedTag()
  79. {
  80. $tokenizer = new Tokenizer();
  81. $text = 'as[d]f';
  82. $result = $tokenizer->tokenize($text);
  83. $expected = new Tag(null);
  84. $expected->addTag(
  85. (new Tag(null))->setText('as[d]f')
  86. );
  87. $this->assertSameTokenized($expected, $result);
  88. }
  89. public function testNotClosedNestedTag()
  90. {
  91. $tokenizer = new Tokenizer();
  92. $text = 'as[d]f[u]r';
  93. $result = $tokenizer->tokenize($text);
  94. $expected = new Tag(null);
  95. $expected->addTag(
  96. (new Tag(null))->setText('as[d]f[u]r')
  97. );
  98. $this->assertSameTokenized($expected, $result);
  99. }
  100. public function testWrongOrderOfClosingTags()
  101. {
  102. $tokenizer = new Tokenizer();
  103. $text = '[b]B[u]U[/b][/u]';
  104. $result = $tokenizer->tokenize($text);
  105. $expected = new Tag(null);
  106. $expected->addTag(
  107. (new Tag(null))->setText('[b]')
  108. )->addTag(
  109. (new Tag(null))->setText('B')
  110. )->addTag(
  111. (new Tag('u'))->addTag(
  112. (new Tag(null))->setText('U[/b]')
  113. )
  114. );
  115. $this->assertSameTokenized($expected, $result);
  116. }
  117. public function testUnclosedTagContainingClosedTag()
  118. {
  119. $tokenizer = new Tokenizer();
  120. $text = 'as[d]f[u]r[b]B[/b]';
  121. $result = $tokenizer->tokenize($text);
  122. $expected = new Tag(null);
  123. $expected->addTag(
  124. (new Tag(null))->setText('as[d]f[u]r')
  125. )->addTag(
  126. (new Tag('b'))->addTag(
  127. (new Tag(null))->setText('B')
  128. )
  129. );
  130. $expectedFallback = new Tag(null);
  131. $expectedFallback->addTag(
  132. (new Tag(null))->setText('as[d]')
  133. )->addTag(
  134. (new Tag(null))->setText('f[u]')
  135. )->addTag(
  136. (new Tag(null))->setText('r')
  137. )->addTag(
  138. (new Tag('b'))->addTag(
  139. (new Tag(null))->setText('B')
  140. )
  141. );
  142. try {
  143. $this->assertSameTokenized($expected, $result);
  144. } catch (\Exception $e) {
  145. $this->assertSameTokenized($expectedFallback, $result);
  146. }
  147. }
  148. public function testSimpleTokenizationWithArgument()
  149. {
  150. $tokenizer = new Tokenizer();
  151. $text = 'a[url=http://google.bg]google[/url]';
  152. $result = $tokenizer->tokenize($text);
  153. $expected = new Tag(null);
  154. $expected->addTag(
  155. (new Tag(null))->setText('a')
  156. )->addTag(
  157. (new Tag('url'))->setArgumen('http://google.bg')->addTag(
  158. (new Tag(null))->setText('google')
  159. )
  160. );
  161. $this->assertSameTokenized($expected, $result);
  162. }
  163. public function testNotClosedTagWithArgument()
  164. {
  165. $tokenizer = new Tokenizer();
  166. $text = 'a[url=http://google.bg]google';
  167. $result = $tokenizer->tokenize($text);
  168. $expected = new Tag(null);
  169. $expected->addTag(
  170. (new Tag(null))->setText('a[url=http://google.bg]google')
  171. );
  172. $this->assertSameTokenized($expected, $result);
  173. }
  174. public function testTokenizerReuse()
  175. {
  176. $tokenizer = new Tokenizer();
  177. $text = 'a';
  178. $result = $tokenizer->tokenize($text);
  179. $expected = new Tag(null);
  180. $expected->addTag(
  181. (new Tag(null))->setText('a')
  182. );
  183. $this->assertSameTokenized($expected, $result);
  184. $textReuse = 'b';
  185. $resultReuse = $tokenizer->tokenize($textReuse);
  186. $expectedReuse = new Tag(null);
  187. $expectedReuse->addTag(
  188. (new Tag(null))->setText('b')
  189. );
  190. $this->assertSameTokenized($expectedReuse, $resultReuse);
  191. }
  192. public function testCyrillicChars()
  193. {
  194. $tokenizer = new Tokenizer();
  195. $text = 'удебелен текст';
  196. $result = $tokenizer->tokenize($text);
  197. $expected = new Tag(null);
  198. $expected->addTag(
  199. (new Tag(null))->setText('удебелен текст')
  200. );
  201. $this->assertSameTokenized($expected, $result);
  202. }
  203. /**
  204. * @see https://github.com/angelk/bbCode/issues/17
  205. */
  206. public function testInvalidOptions()
  207. {
  208. $tokenizer = new Tokenizer();
  209. $url = 'https://www.facebook.com/permalink.php?story_fbid=1554622461246932&id=121306641245195';
  210. $text = 'a[url=' . $url . ']fb[/url]';
  211. $result = $tokenizer->tokenize($text);
  212. $expected = new Tag(null);
  213. $urlTag = new Tag('url');
  214. $urlTag->setArgumen($url);
  215. $urlTag->addTag(
  216. (new Tag(null))->setText('fb')
  217. );
  218. $expected->addTag(
  219. (new Tag(null))->setText('a')
  220. )->addTag($urlTag);
  221. $this->assertSameTokenized($expected, $result);
  222. }
  223. }