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.

highlight_test.go 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package highlight
  4. import (
  5. "strings"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. func lines(s string) []string {
  10. return strings.Split(strings.ReplaceAll(strings.TrimSpace(s), `\n`, "\n"), "\n")
  11. }
  12. func TestFile(t *testing.T) {
  13. tests := []struct {
  14. name string
  15. code string
  16. want []string
  17. lexerName string
  18. }{
  19. {
  20. name: "empty.py",
  21. code: "",
  22. want: lines(""),
  23. lexerName: "Python",
  24. },
  25. {
  26. name: "empty.js",
  27. code: "",
  28. want: lines(""),
  29. lexerName: "JavaScript",
  30. },
  31. {
  32. name: "empty.yaml",
  33. code: "",
  34. want: lines(""),
  35. lexerName: "YAML",
  36. },
  37. {
  38. name: "tags.txt",
  39. code: "<>",
  40. want: lines("&lt;&gt;"),
  41. lexerName: "Plaintext",
  42. },
  43. {
  44. name: "tags.py",
  45. code: "<>",
  46. want: lines(`<span class="o">&lt;</span><span class="o">&gt;</span>`),
  47. lexerName: "Python",
  48. },
  49. {
  50. name: "eol-no.py",
  51. code: "a=1",
  52. want: lines(`<span class="n">a</span><span class="o">=</span><span class="mi">1</span>`),
  53. lexerName: "Python",
  54. },
  55. {
  56. name: "eol-newline1.py",
  57. code: "a=1\n",
  58. want: lines(`<span class="n">a</span><span class="o">=</span><span class="mi">1</span>\n`),
  59. lexerName: "Python",
  60. },
  61. {
  62. name: "eol-newline2.py",
  63. code: "a=1\n\n",
  64. want: lines(`
  65. <span class="n">a</span><span class="o">=</span><span class="mi">1</span>\n
  66. \n
  67. `,
  68. ),
  69. lexerName: "Python",
  70. },
  71. {
  72. name: "empty-line-with-space.py",
  73. code: strings.ReplaceAll(strings.TrimSpace(`
  74. def:
  75. a=1
  76. b=''
  77. {space}
  78. c=2
  79. `), "{space}", " "),
  80. want: lines(`
  81. <span class="n">def</span><span class="p">:</span>\n
  82. <span class="n">a</span><span class="o">=</span><span class="mi">1</span>\n
  83. \n
  84. <span class="n">b</span><span class="o">=</span><span class="sa"></span><span class="s1">&#39;</span><span class="s1">&#39;</span>\n
  85. \n
  86. <span class="n">c</span><span class="o">=</span><span class="mi">2</span>`,
  87. ),
  88. lexerName: "Python",
  89. },
  90. }
  91. for _, tt := range tests {
  92. t.Run(tt.name, func(t *testing.T) {
  93. out, lexerName, err := File(tt.name, "", []byte(tt.code))
  94. assert.NoError(t, err)
  95. expected := strings.Join(tt.want, "\n")
  96. actual := strings.Join(out, "\n")
  97. assert.Equal(t, strings.Count(actual, "<span"), strings.Count(actual, "</span>"))
  98. assert.EqualValues(t, expected, actual)
  99. assert.Equal(t, tt.lexerName, lexerName)
  100. })
  101. }
  102. }
  103. func TestPlainText(t *testing.T) {
  104. tests := []struct {
  105. name string
  106. code string
  107. want []string
  108. }{
  109. {
  110. name: "empty.py",
  111. code: "",
  112. want: lines(""),
  113. },
  114. {
  115. name: "tags.py",
  116. code: "<>",
  117. want: lines("&lt;&gt;"),
  118. },
  119. {
  120. name: "eol-no.py",
  121. code: "a=1",
  122. want: lines(`a=1`),
  123. },
  124. {
  125. name: "eol-newline1.py",
  126. code: "a=1\n",
  127. want: lines(`a=1\n`),
  128. },
  129. {
  130. name: "eol-newline2.py",
  131. code: "a=1\n\n",
  132. want: lines(`
  133. a=1\n
  134. \n
  135. `),
  136. },
  137. {
  138. name: "empty-line-with-space.py",
  139. code: strings.ReplaceAll(strings.TrimSpace(`
  140. def:
  141. a=1
  142. b=''
  143. {space}
  144. c=2
  145. `), "{space}", " "),
  146. want: lines(`
  147. def:\n
  148. a=1\n
  149. \n
  150. b=&#39;&#39;\n
  151. \n
  152. c=2`),
  153. },
  154. }
  155. for _, tt := range tests {
  156. t.Run(tt.name, func(t *testing.T) {
  157. out := PlainText([]byte(tt.code))
  158. expected := strings.Join(tt.want, "\n")
  159. actual := strings.Join(out, "\n")
  160. assert.EqualValues(t, expected, actual)
  161. })
  162. }
  163. }