123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- // Copyright 2021 The Gitea Authors. All rights reserved.
- // SPDX-License-Identifier: MIT
-
- package highlight
-
- import (
- "html/template"
- "strings"
- "testing"
-
- "github.com/stretchr/testify/assert"
- )
-
- func lines(s string) (out []template.HTML) {
- // "" => [], "a" => ["a"], "a\n" => ["a\n"], "a\nb" => ["a\n", "b"] (each line always includes EOL "\n" if it exists)
- out = make([]template.HTML, 0)
- s = strings.ReplaceAll(strings.ReplaceAll(strings.TrimSpace(s), "\n", ""), `\n`, "\n")
- for {
- if p := strings.IndexByte(s, '\n'); p != -1 {
- out = append(out, template.HTML(s[:p+1]))
- s = s[p+1:]
- } else {
- break
- }
- }
- if s != "" {
- out = append(out, template.HTML(s))
- }
- return out
- }
-
- func TestFile(t *testing.T) {
- tests := []struct {
- name string
- code string
- want []template.HTML
- lexerName string
- }{
- {
- name: "empty.py",
- code: "",
- want: lines(""),
- lexerName: "Python",
- },
- {
- name: "empty.js",
- code: "",
- want: lines(""),
- lexerName: "JavaScript",
- },
- {
- name: "empty.yaml",
- code: "",
- want: lines(""),
- lexerName: "YAML",
- },
- {
- name: "tags.txt",
- code: "<>",
- want: lines("<>"),
- lexerName: "Plaintext",
- },
- {
- name: "tags.py",
- code: "<>",
- want: lines(`<span class="o"><</span><span class="o">></span>`),
- lexerName: "Python",
- },
- {
- name: "eol-no.py",
- code: "a=1",
- want: lines(`<span class="n">a</span><span class="o">=</span><span class="mi">1</span>`),
- lexerName: "Python",
- },
- {
- name: "eol-newline1.py",
- code: "a=1\n",
- want: lines(`<span class="n">a</span><span class="o">=</span><span class="mi">1</span>\n`),
- lexerName: "Python",
- },
- {
- name: "eol-newline2.py",
- code: "a=1\n\n",
- want: lines(`
- <span class="n">a</span><span class="o">=</span><span class="mi">1</span>\n
- \n
- `,
- ),
- lexerName: "Python",
- },
- {
- name: "empty-line-with-space.py",
- code: strings.ReplaceAll(strings.TrimSpace(`
- def:
- a=1
-
- b=''
- {space}
- c=2
- `), "{space}", " "),
- want: lines(`
- <span class="n">def</span><span class="p">:</span>\n
- <span class="n">a</span><span class="o">=</span><span class="mi">1</span>\n
- \n
- <span class="n">b</span><span class="o">=</span><span class="sa"></span><span class="s1">'</span><span class="s1">'</span>\n
- \n
- <span class="n">c</span><span class="o">=</span><span class="mi">2</span>`,
- ),
- lexerName: "Python",
- },
- }
-
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- out, lexerName, err := File(tt.name, "", []byte(tt.code))
- assert.NoError(t, err)
- assert.EqualValues(t, tt.want, out)
- assert.Equal(t, tt.lexerName, lexerName)
- })
- }
- }
-
- func TestPlainText(t *testing.T) {
- tests := []struct {
- name string
- code string
- want []template.HTML
- }{
- {
- name: "empty.py",
- code: "",
- want: lines(""),
- },
- {
- name: "tags.py",
- code: "<>",
- want: lines("<>"),
- },
- {
- name: "eol-no.py",
- code: "a=1",
- want: lines(`a=1`),
- },
- {
- name: "eol-newline1.py",
- code: "a=1\n",
- want: lines(`a=1\n`),
- },
- {
- name: "eol-newline2.py",
- code: "a=1\n\n",
- want: lines(`
- a=1\n
- \n
- `),
- },
- {
- name: "empty-line-with-space.py",
- code: strings.ReplaceAll(strings.TrimSpace(`
- def:
- a=1
-
- b=''
- {space}
- c=2
- `), "{space}", " "),
- want: lines(`
- def:\n
- a=1\n
- \n
- b=''\n
- \n
- c=2`),
- },
- }
-
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- out := PlainText([]byte(tt.code))
- assert.EqualValues(t, tt.want, out)
- })
- }
- }
|