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.6KB

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