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