2021-08-14 02:16:56 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-08-14 02:16:56 +03:00
package highlight
import (
2023-12-17 17:38:54 +03:00
"html/template"
2022-06-10 16:45:28 +03:00
"strings"
2021-08-14 02:16:56 +03:00
"testing"
2022-06-10 16:45:28 +03:00
"github.com/stretchr/testify/assert"
2021-08-14 02:16:56 +03:00
)
2023-12-17 17:38:54 +03:00
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
2022-07-30 22:17:43 +03:00
}
2021-08-14 02:16:56 +03:00
func TestFile ( t * testing . T ) {
tests := [ ] struct {
2022-11-19 14:08:06 +03:00
name string
code string
2023-12-17 17:38:54 +03:00
want [ ] template . HTML
2022-11-19 14:08:06 +03:00
lexerName string
2021-08-14 02:16:56 +03:00
} {
{
2022-11-19 14:08:06 +03:00
name : "empty.py" ,
code : "" ,
want : lines ( "" ) ,
lexerName : "Python" ,
2022-07-30 22:17:43 +03:00
} ,
{
2022-11-19 14:08:06 +03:00
name : "empty.js" ,
code : "" ,
want : lines ( "" ) ,
lexerName : "JavaScript" ,
2022-07-30 22:17:43 +03:00
} ,
{
2022-11-19 14:08:06 +03:00
name : "empty.yaml" ,
code : "" ,
want : lines ( "" ) ,
lexerName : "YAML" ,
2022-07-30 22:17:43 +03:00
} ,
{
2022-11-19 14:08:06 +03:00
name : "tags.txt" ,
code : "<>" ,
want : lines ( "<>" ) ,
2024-03-27 00:25:34 +03:00
lexerName : "Text" ,
2022-07-30 22:17:43 +03:00
} ,
{
2022-11-19 14:08:06 +03:00
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" ,
2022-07-30 22:17:43 +03:00
} ,
{
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
` ,
) ,
2022-11-19 14:08:06 +03:00
lexerName : "Python" ,
2022-07-30 22:17:43 +03:00
} ,
{
name : "empty-line-with-space.py" ,
code : strings . ReplaceAll ( strings . TrimSpace ( `
def :
a = 1
2021-08-14 02:16:56 +03:00
2022-07-30 22:17:43 +03:00
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" > & # 39 ; < / span > < span class = "s1" > & # 39 ; < / span > \ n
\ n
< span class = "n" > c < / span > < span class = "o" >= < / span > < span class = "mi" > 2 < / span > ` ,
) ,
2022-11-19 14:08:06 +03:00
lexerName : "Python" ,
2022-07-30 22:17:43 +03:00
} ,
}
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
2022-11-19 14:08:06 +03:00
out , lexerName , err := File ( tt . name , "" , [ ] byte ( tt . code ) )
2022-07-30 22:17:43 +03:00
assert . NoError ( t , err )
2023-12-17 17:38:54 +03:00
assert . EqualValues ( t , tt . want , out )
2022-11-19 14:08:06 +03:00
assert . Equal ( t , tt . lexerName , lexerName )
2022-07-30 22:17:43 +03:00
} )
}
}
func TestPlainText ( t * testing . T ) {
tests := [ ] struct {
name string
code string
2023-12-17 17:38:54 +03:00
want [ ] template . HTML
2022-07-30 22:17:43 +03:00
} {
{
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
2022-06-10 16:45:28 +03:00
` ) ,
2021-08-14 02:16:56 +03:00
} ,
{
2022-07-30 22:17:43 +03:00
name : "empty-line-with-space.py" ,
code : strings . ReplaceAll ( strings . TrimSpace ( `
def :
a = 1
2021-08-14 02:16:56 +03:00
2022-07-30 22:17:43 +03:00
b = ' '
{ space }
c = 2
` ) , "{space}" , " " ) ,
want : lines ( `
def : \ n
a = 1 \ n
\ n
b = & # 39 ; & # 39 ; \ n
\ n
c = 2 ` ) ,
2021-08-14 02:16:56 +03:00
} ,
}
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
2022-07-30 22:17:43 +03:00
out := PlainText ( [ ] byte ( tt . code ) )
2023-12-17 17:38:54 +03:00
assert . EqualValues ( t , tt . want , out )
2021-08-14 02:16:56 +03:00
} )
}
}