PHP and Javascript implementations of a simple markdown parser
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

TokenTests.php 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <?php
  2. declare(strict_types=1);
  3. use PHPUnit\Framework\TestCase;
  4. require_once __DIR__ . '/../php/markdown.php';
  5. final class TokenTests extends TestCase {
  6. public function test_tokenizeLabel() {
  7. // Escapes are preserved
  8. $this->assertSame([ '[foo]', 'foo' ], MDToken::tokenizeLabel('[foo] bar'));
  9. $this->assertSame([ '[foo\\[]', 'foo\\[' ], MDToken::tokenizeLabel('[foo\\[] bar'));
  10. $this->assertSame([ '[foo\\]]', 'foo\\]' ], MDToken::tokenizeLabel('[foo\\]] bar'));
  11. $this->assertSame([ '[foo[]]', 'foo[]' ], MDToken::tokenizeLabel('[foo[]] bar'));
  12. $this->assertSame([ '[foo\\(]', 'foo\\(' ], MDToken::tokenizeLabel('[foo\\(] bar'));
  13. $this->assertSame([ '[foo\\)]', 'foo\\)' ], MDToken::tokenizeLabel('[foo\\)] bar'));
  14. $this->assertSame([ '[foo()]', 'foo()' ], MDToken::tokenizeLabel('[foo()] bar'));
  15. $this->assertSame(null, MDToken::tokenizeLabel('foo bar'));
  16. $this->assertSame(null, MDToken::tokenizeLabel('[foo\\] bar'));
  17. $this->assertSame(null, MDToken::tokenizeLabel('[foo bar'));
  18. $this->assertSame(null, MDToken::tokenizeLabel('[foo[] bar'));
  19. }
  20. public function test_tokenizeURL() {
  21. $this->assertSame([ '(page.html)', 'page.html', null ], MDToken::tokenizeURL('(page.html) foo'));
  22. $this->assertSame([ '(page.html "link title")', 'page.html', 'link title' ], MDToken::tokenizeURL('(page.html "link title") foo'));
  23. $this->assertSame([ '(https://example.com/path/page.html?query=foo&bar=baz#fragment)', 'https://example.com/path/page.html?query=foo&bar=baz#fragment', null ], MDToken::tokenizeURL('(https://example.com/path/page.html?query=foo&bar=baz#fragment) foo'));
  24. $this->assertSame(null, MDToken::tokenizeURL('page.html foo'));
  25. $this->assertSame(null, MDToken::tokenizeURL('(page.html foo'));
  26. $this->assertSame(null, MDToken::tokenizeURL('page.html) foo'));
  27. $this->assertSame(null, MDToken::tokenizeURL('(page.html "title) foo'));
  28. $this->assertSame(null, MDToken::tokenizeURL('(page .html) foo'));
  29. $this->assertSame(null, MDToken::tokenizeURL('(user@example.com) foo'));
  30. $this->assertSame(null, MDToken::tokenizeURL('(user@example.com "title") foo'));
  31. }
  32. public function test_tokenizeEmail() {
  33. $this->assertSame([ '(user@example.com)', 'user@example.com', null ], MDToken::tokenizeEmail('(user@example.com)'));
  34. $this->assertSame([ '(user@example.com "link title")', 'user@example.com', 'link title' ], MDToken::tokenizeEmail('(user@example.com "link title")'));
  35. $this->assertSame(null, MDToken::tokenizeEmail('(https://example.com) foo'));
  36. $this->assertSame(null, MDToken::tokenizeEmail('(https://example.com "link title") foo'));
  37. $this->assertSame(null, MDToken::tokenizeEmail('(user@example.com "link title) foo'));
  38. $this->assertSame(null, MDToken::tokenizeEmail('(user@example.com foo'));
  39. $this->assertSame(null, MDToken::tokenizeEmail('user@example.com) foo'));
  40. }
  41. public function test_findFirstTokens() {
  42. $tokens = [
  43. new MDToken('Lorem', MDTokenType::Text),
  44. new MDToken(' ', MDTokenType::Whitespace),
  45. new MDToken('_', MDTokenType::Underscore),
  46. new MDToken('ipsum', MDTokenType::Text),
  47. new MDToken('_', MDTokenType::Underscore),
  48. new MDToken(' ', MDTokenType::Whitespace),
  49. new MDToken('dolor', MDTokenType::Text),
  50. new MDToken('_', MDTokenType::Underscore),
  51. new MDToken('sit', MDTokenType::Text),
  52. new MDToken('_', MDTokenType::Underscore),
  53. ];
  54. $pattern = [
  55. MDTokenType::Underscore,
  56. ];
  57. $actual = MDToken::findFirstTokens($tokens, $pattern);
  58. $expected = new MDTokenMatch([ $tokens[2] ], 2);
  59. $this->assertEquals($expected, $actual);
  60. }
  61. public function test_findFirstTokens_optionalWhitespace1() {
  62. $tokens = [
  63. new MDToken('Lorem', MDTokenType::Text),
  64. new MDToken(' ', MDTokenType::Whitespace),
  65. new MDToken('[ipsum]', MDTokenType::Label, 'ipsum'),
  66. new MDToken('(link.html)', MDTokenType::URL, 'link.html'),
  67. new MDToken(' ', MDTokenType::Whitespace),
  68. new MDToken('dolor', MDTokenType::Text),
  69. ];
  70. $pattern = [
  71. MDTokenType::Label,
  72. MDTokenType::META_OptionalWhitespace,
  73. MDTokenType::URL,
  74. ];
  75. $actual = MDToken::findFirstTokens($tokens, $pattern);
  76. $expected = new MDTokenMatch([ $tokens[2], $tokens[3] ], 2);
  77. $this->assertEquals($expected, $actual);
  78. }
  79. public function test_findFirstTokens_optionalWhitespace2() {
  80. $tokens = [
  81. new MDToken('Lorem', MDTokenType::Text),
  82. new MDToken(' ', MDTokenType::Whitespace),
  83. new MDToken('[ipsum]', MDTokenType::Label, 'ipsum'),
  84. new MDToken(' ', MDTokenType::Whitespace),
  85. new MDToken('(link.html)', MDTokenType::URL, 'link.html'),
  86. new MDToken(' ', MDTokenType::Whitespace),
  87. new MDToken('dolor', MDTokenType::Text),
  88. ];
  89. $pattern = [
  90. MDTokenType::Label,
  91. MDTokenType::META_OptionalWhitespace,
  92. MDTokenType::URL,
  93. ];
  94. $actual = MDToken::findFirstTokens($tokens, $pattern);
  95. $expected = new MDTokenmatch([ $tokens[2], $tokens[3], $tokens[4] ], 2);
  96. $this->assertEquals($expected, $actual);
  97. }
  98. public function test_findPairedTokens() {
  99. $tokens = [
  100. new MDToken('Lorem', MDTokenType::Text),
  101. new MDToken(' ', MDTokenType::Whitespace),
  102. new MDToken('_', MDTokenType::Underscore),
  103. new MDToken('ipsum', MDTokenType::Text),
  104. new MDToken('_', MDTokenType::Underscore),
  105. new MDToken(' ', MDTokenType::Whitespace),
  106. new MDToken('dolor', MDTokenType::Text),
  107. new MDToken('_', MDTokenType::Underscore),
  108. new MDToken('sit', MDTokenType::Text),
  109. new MDToken('_', MDTokenType::Underscore),
  110. ];
  111. $pattern = [
  112. MDTokenType::Underscore,
  113. ];
  114. $actual = MDToken::findPairedTokens($tokens, $pattern, $pattern);
  115. $expected = new MDPairedTokenMatch(
  116. [ $tokens[2] ], // startTokens
  117. [ $tokens[3] ], // contentTokens
  118. [ $tokens[4] ], // endTokens
  119. 2, // startIndex
  120. 3, // contentIndex
  121. 4, // endIndex
  122. 3 // totalLength
  123. );
  124. $this->assertEquals($expected, $actual);
  125. }
  126. }
  127. ?>