2018-02-20 15:50:42 +03:00
// Copyright 2018 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2018-02-20 15:50:42 +03:00
package util
import (
2021-05-10 09:45:17 +03:00
"regexp"
2019-11-13 05:27:11 +03:00
"strings"
2018-02-20 15:50:42 +03:00
"testing"
2024-02-29 21:52:49 +03:00
"code.gitea.io/gitea/modules/optional"
2018-02-20 15:50:42 +03:00
"github.com/stretchr/testify/assert"
)
func TestURLJoin ( t * testing . T ) {
type test struct {
Expected string
Base string
Elements [ ] string
}
newTest := func ( expected , base string , elements ... string ) test {
return test { Expected : expected , Base : base , Elements : elements }
}
for _ , test := range [ ] test {
newTest ( "https://try.gitea.io/a/b/c" ,
"https://try.gitea.io" , "a/b" , "c" ) ,
newTest ( "https://try.gitea.io/a/b/c" ,
"https://try.gitea.io/" , "/a/b/" , "/c/" ) ,
newTest ( "https://try.gitea.io/a/c" ,
"https://try.gitea.io/" , "/a/./b/" , "../c/" ) ,
newTest ( "a/b/c" ,
"a" , "b/c/" ) ,
newTest ( "a/b/d" ,
"a/" , "b/c/" , "/../d/" ) ,
2018-05-29 06:51:42 +03:00
newTest ( "https://try.gitea.io/a/b/c#d" ,
"https://try.gitea.io" , "a/b" , "c#d" ) ,
2018-05-30 16:23:43 +03:00
newTest ( "/a/b/d" ,
"/a/" , "b/c/" , "/../d/" ) ,
newTest ( "/a/b/c" ,
"/a" , "b/c/" ) ,
newTest ( "/a/b/c#hash" ,
"/a" , "b/c#hash" ) ,
2018-02-20 15:50:42 +03:00
} {
assert . Equal ( t , test . Expected , URLJoin ( test . Base , test . Elements ... ) )
}
}
2018-06-26 17:45:18 +03:00
2019-01-21 14:45:32 +03:00
func TestIsEmptyString ( t * testing . T ) {
cases := [ ] struct {
s string
expected bool
} {
{ "" , true } ,
{ " " , true } ,
{ " " , true } ,
{ " a" , false } ,
}
for _ , v := range cases {
assert . Equal ( t , v . expected , IsEmptyString ( v . s ) )
}
}
2019-11-13 05:27:11 +03:00
func Test_NormalizeEOL ( t * testing . T ) {
data1 := [ ] string {
"" ,
"This text starts with empty lines" ,
"another" ,
"" ,
"" ,
"" ,
"Some other empty lines in the middle" ,
"more." ,
"And more." ,
"Ends with empty lines too." ,
"" ,
"" ,
"" ,
}
data2 := [ ] string {
"This text does not start with empty lines" ,
"another" ,
"" ,
"" ,
"" ,
"Some other empty lines in the middle" ,
"more." ,
"And more." ,
"Ends without EOLtoo." ,
}
buildEOLData := func ( data [ ] string , eol string ) [ ] byte {
return [ ] byte ( strings . Join ( data , eol ) )
}
dos := buildEOLData ( data1 , "\r\n" )
unix := buildEOLData ( data1 , "\n" )
mac := buildEOLData ( data1 , "\r" )
assert . Equal ( t , unix , NormalizeEOL ( dos ) )
assert . Equal ( t , unix , NormalizeEOL ( mac ) )
assert . Equal ( t , unix , NormalizeEOL ( unix ) )
dos = buildEOLData ( data2 , "\r\n" )
unix = buildEOLData ( data2 , "\n" )
mac = buildEOLData ( data2 , "\r" )
assert . Equal ( t , unix , NormalizeEOL ( dos ) )
assert . Equal ( t , unix , NormalizeEOL ( mac ) )
assert . Equal ( t , unix , NormalizeEOL ( unix ) )
assert . Equal ( t , [ ] byte ( "one liner" ) , NormalizeEOL ( [ ] byte ( "one liner" ) ) )
assert . Equal ( t , [ ] byte ( "\n" ) , NormalizeEOL ( [ ] byte ( "\n" ) ) )
assert . Equal ( t , [ ] byte ( "\ntwo liner" ) , NormalizeEOL ( [ ] byte ( "\ntwo liner" ) ) )
assert . Equal ( t , [ ] byte ( "two liner\n" ) , NormalizeEOL ( [ ] byte ( "two liner\n" ) ) )
assert . Equal ( t , [ ] byte { } , NormalizeEOL ( [ ] byte { } ) )
assert . Equal ( t , [ ] byte ( "mix\nand\nmatch\n." ) , NormalizeEOL ( [ ] byte ( "mix\r\nand\rmatch\n." ) ) )
}
2021-05-10 09:45:17 +03:00
func Test_RandomInt ( t * testing . T ) {
2024-04-22 14:48:42 +03:00
randInt , err := CryptoRandomInt ( 255 )
assert . True ( t , randInt >= 0 )
assert . True ( t , randInt <= 255 )
2021-05-10 09:45:17 +03:00
assert . NoError ( t , err )
}
func Test_RandomString ( t * testing . T ) {
2022-01-26 07:10:10 +03:00
str1 , err := CryptoRandomString ( 32 )
2021-05-10 09:45:17 +03:00
assert . NoError ( t , err )
matches , err := regexp . MatchString ( ` ^[a-zA-Z0-9] { 32}$ ` , str1 )
assert . NoError ( t , err )
assert . True ( t , matches )
2022-01-26 07:10:10 +03:00
str2 , err := CryptoRandomString ( 32 )
2021-05-10 09:45:17 +03:00
assert . NoError ( t , err )
matches , err = regexp . MatchString ( ` ^[a-zA-Z0-9] { 32}$ ` , str1 )
assert . NoError ( t , err )
assert . True ( t , matches )
assert . NotEqual ( t , str1 , str2 )
2022-01-26 07:10:10 +03:00
str3 , err := CryptoRandomString ( 256 )
2021-05-10 09:45:17 +03:00
assert . NoError ( t , err )
matches , err = regexp . MatchString ( ` ^[a-zA-Z0-9] { 256}$ ` , str3 )
assert . NoError ( t , err )
assert . True ( t , matches )
2022-01-26 07:10:10 +03:00
str4 , err := CryptoRandomString ( 256 )
2021-05-10 09:45:17 +03:00
assert . NoError ( t , err )
matches , err = regexp . MatchString ( ` ^[a-zA-Z0-9] { 256}$ ` , str4 )
assert . NoError ( t , err )
assert . True ( t , matches )
assert . NotEqual ( t , str3 , str4 )
}
2021-10-12 21:11:35 +03:00
2022-01-04 18:13:52 +03:00
func Test_RandomBytes ( t * testing . T ) {
2022-01-26 07:10:10 +03:00
bytes1 , err := CryptoRandomBytes ( 32 )
2022-01-04 18:13:52 +03:00
assert . NoError ( t , err )
2022-01-26 07:10:10 +03:00
bytes2 , err := CryptoRandomBytes ( 32 )
2022-01-04 18:13:52 +03:00
assert . NoError ( t , err )
assert . NotEqual ( t , bytes1 , bytes2 )
2022-01-26 07:10:10 +03:00
bytes3 , err := CryptoRandomBytes ( 256 )
2022-01-04 18:13:52 +03:00
assert . NoError ( t , err )
2022-01-26 07:10:10 +03:00
bytes4 , err := CryptoRandomBytes ( 256 )
2022-01-04 18:13:52 +03:00
assert . NoError ( t , err )
assert . NotEqual ( t , bytes3 , bytes4 )
}
2024-02-29 21:52:49 +03:00
func TestOptionalBoolParse ( t * testing . T ) {
assert . Equal ( t , optional . None [ bool ] ( ) , OptionalBoolParse ( "" ) )
assert . Equal ( t , optional . None [ bool ] ( ) , OptionalBoolParse ( "x" ) )
2021-10-12 21:11:35 +03:00
2024-02-29 21:52:49 +03:00
assert . Equal ( t , optional . Some ( false ) , OptionalBoolParse ( "0" ) )
assert . Equal ( t , optional . Some ( false ) , OptionalBoolParse ( "f" ) )
assert . Equal ( t , optional . Some ( false ) , OptionalBoolParse ( "False" ) )
2021-10-12 21:11:35 +03:00
2024-02-29 21:52:49 +03:00
assert . Equal ( t , optional . Some ( true ) , OptionalBoolParse ( "1" ) )
assert . Equal ( t , optional . Some ( true ) , OptionalBoolParse ( "t" ) )
assert . Equal ( t , optional . Some ( true ) , OptionalBoolParse ( "True" ) )
2021-10-12 21:11:35 +03:00
}
2022-02-01 15:59:25 +03:00
// Test case for any function which accepts and returns a single string.
type StringTest struct {
in , out string
}
var upperTests = [ ] StringTest {
{ "" , "" } ,
{ "ONLYUPPER" , "ONLYUPPER" } ,
{ "abc" , "ABC" } ,
{ "AbC123" , "ABC123" } ,
{ "azAZ09_" , "AZAZ09_" } ,
{ "longStrinGwitHmixofsmaLLandcAps" , "LONGSTRINGWITHMIXOFSMALLANDCAPS" } ,
{ "long\u0250string\u0250with\u0250nonascii\u2C6Fchars" , "LONG\u0250STRING\u0250WITH\u0250NONASCII\u2C6FCHARS" } ,
{ "\u0250\u0250\u0250\u0250\u0250" , "\u0250\u0250\u0250\u0250\u0250" } ,
{ "a\u0080\U0010FFFF" , "A\u0080\U0010FFFF" } ,
{ "lél" , "LéL" } ,
}
func TestToUpperASCII ( t * testing . T ) {
for _ , tc := range upperTests {
assert . Equal ( t , ToUpperASCII ( tc . in ) , tc . out )
}
}
func BenchmarkToUpper ( b * testing . B ) {
for _ , tc := range upperTests {
b . Run ( tc . in , func ( b * testing . B ) {
for i := 0 ; i < b . N ; i ++ {
ToUpperASCII ( tc . in )
}
} )
}
}
2022-05-11 00:55:54 +03:00
func TestToTitleCase ( t * testing . T ) {
assert . Equal ( t , ToTitleCase ( ` foo bar baz ` ) , ` Foo Bar Baz ` )
assert . Equal ( t , ToTitleCase ( ` FOO BAR BAZ ` ) , ` Foo Bar Baz ` )
}
2023-07-07 08:31:56 +03:00
func TestToPointer ( t * testing . T ) {
assert . Equal ( t , "abc" , * ToPointer ( "abc" ) )
assert . Equal ( t , 123 , * ToPointer ( 123 ) )
abc := "abc"
assert . False ( t , & abc == ToPointer ( abc ) )
val123 := 123
assert . False ( t , & val123 == ToPointer ( val123 ) )
}
2024-03-28 23:40:35 +03:00
func TestReserveLineBreakForTextarea ( t * testing . T ) {
assert . Equal ( t , ReserveLineBreakForTextarea ( "test\r\ndata" ) , "test\ndata" )
assert . Equal ( t , ReserveLineBreakForTextarea ( "test\r\ndata\r\n" ) , "test\ndata\n" )
}
2024-11-01 18:18:29 +03:00
func TestOptionalArg ( t * testing . T ) {
foo := func ( other any , optArg ... int ) int {
return OptionalArg ( optArg )
}
bar := func ( other any , optArg ... int ) int {
return OptionalArg ( optArg , 42 )
}
assert . Equal ( t , 0 , foo ( nil ) )
assert . Equal ( t , 100 , foo ( nil , 100 ) )
assert . Equal ( t , 42 , bar ( nil ) )
assert . Equal ( t , 100 , bar ( nil , 100 ) )
}