mirror of https://github.com/stashapp/stash.git
228 lines
3.1 KiB
Go
228 lines
3.1 KiB
Go
package models
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
func TestParseSearchString(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
q string
|
|
want SearchSpecs
|
|
}{
|
|
{
|
|
"basic",
|
|
"a b c",
|
|
SearchSpecs{
|
|
MustHave: []string{"a", "b", "c"},
|
|
},
|
|
},
|
|
{
|
|
"empty",
|
|
"",
|
|
SearchSpecs{},
|
|
},
|
|
{
|
|
"whitespace",
|
|
" ",
|
|
SearchSpecs{},
|
|
},
|
|
{
|
|
"single",
|
|
"a",
|
|
SearchSpecs{
|
|
MustHave: []string{"a"},
|
|
},
|
|
},
|
|
{
|
|
"quoted",
|
|
`"a b" c`,
|
|
SearchSpecs{
|
|
MustHave: []string{"a b", "c"},
|
|
},
|
|
},
|
|
{
|
|
"quoted double space",
|
|
`"a b" c`,
|
|
SearchSpecs{
|
|
MustHave: []string{"a b", "c"},
|
|
},
|
|
},
|
|
{
|
|
"quoted end space",
|
|
`"a b " c`,
|
|
SearchSpecs{
|
|
MustHave: []string{"a b ", "c"},
|
|
},
|
|
},
|
|
{
|
|
"no matching end quote",
|
|
`"a b c`,
|
|
SearchSpecs{
|
|
MustHave: []string{`"a`, "b", "c"},
|
|
},
|
|
},
|
|
{
|
|
"no matching start quote",
|
|
`a b c"`,
|
|
SearchSpecs{
|
|
MustHave: []string{"a", "b", `c"`},
|
|
},
|
|
},
|
|
{
|
|
"or",
|
|
"a OR b",
|
|
SearchSpecs{
|
|
AnySets: [][]string{
|
|
{"a", "b"},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
"multi or",
|
|
"a OR b c OR d",
|
|
SearchSpecs{
|
|
AnySets: [][]string{
|
|
{"a", "b"},
|
|
{"c", "d"},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
"lowercase or",
|
|
"a or b",
|
|
SearchSpecs{
|
|
AnySets: [][]string{
|
|
{"a", "b"},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
"or symbol",
|
|
"a | b",
|
|
SearchSpecs{
|
|
AnySets: [][]string{
|
|
{"a", "b"},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
"quoted or",
|
|
`a "OR" b`,
|
|
SearchSpecs{
|
|
MustHave: []string{"a", "OR", "b"},
|
|
},
|
|
},
|
|
{
|
|
"quoted or symbol",
|
|
`a "|" b`,
|
|
SearchSpecs{
|
|
MustHave: []string{"a", "|", "b"},
|
|
},
|
|
},
|
|
{
|
|
"or phrases",
|
|
`"a b" OR "c d"`,
|
|
SearchSpecs{
|
|
AnySets: [][]string{
|
|
{"a b", "c d"},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
"or at start",
|
|
"OR a",
|
|
SearchSpecs{
|
|
MustHave: []string{"OR", "a"},
|
|
},
|
|
},
|
|
{
|
|
"or at end",
|
|
"a OR",
|
|
SearchSpecs{
|
|
MustHave: []string{"a", "OR"},
|
|
},
|
|
},
|
|
{
|
|
"or symbol at start",
|
|
"| a",
|
|
SearchSpecs{
|
|
MustHave: []string{"|", "a"},
|
|
},
|
|
},
|
|
{
|
|
"or symbol at end",
|
|
"a |",
|
|
SearchSpecs{
|
|
MustHave: []string{"a", "|"},
|
|
},
|
|
},
|
|
{
|
|
"nots",
|
|
"-a -b",
|
|
SearchSpecs{
|
|
MustNot: []string{"a", "b"},
|
|
},
|
|
},
|
|
{
|
|
"not or",
|
|
"-a OR b",
|
|
SearchSpecs{
|
|
AnySets: [][]string{
|
|
{"-a", "b"},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
"not phrase",
|
|
`-"a b"`,
|
|
SearchSpecs{
|
|
MustNot: []string{"a b"},
|
|
},
|
|
},
|
|
{
|
|
"not in phrase",
|
|
`"-a b"`,
|
|
SearchSpecs{
|
|
MustHave: []string{"-a b"},
|
|
},
|
|
},
|
|
{
|
|
"double not",
|
|
"--a",
|
|
SearchSpecs{
|
|
MustNot: []string{"-a"},
|
|
},
|
|
},
|
|
{
|
|
"empty quote",
|
|
`"" a`,
|
|
SearchSpecs{
|
|
MustHave: []string{"a"},
|
|
},
|
|
},
|
|
{
|
|
"not empty quote",
|
|
`-"" a`,
|
|
SearchSpecs{
|
|
MustHave: []string{"a"},
|
|
},
|
|
},
|
|
{
|
|
"quote in word",
|
|
`ab"cd"`,
|
|
SearchSpecs{
|
|
MustHave: []string{`ab"cd"`},
|
|
},
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
if got := ParseSearchString(tt.q); !reflect.DeepEqual(got, tt.want) {
|
|
t.Errorf("FindFilterType.ParseSearchString() = %v, want %v", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|