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("&lt;&gt;"),
    61  			lexerName: "Plaintext",
    62  		},
    63  		{
    64  			name:      "tags.py",
    65  			code:      "<>",
    66  			want:      lines(`<span class="o">&lt;</span><span class="o">&gt;</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">&#39;</span><span class="s1">&#39;</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("&lt;&gt;"),
   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=&#39;&#39;\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  }