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