Files
2026-07-13 12:32:14 +08:00

150 lines
3.0 KiB
Go

package parser
import (
"errors"
"io"
"reflect"
"testing"
"github.com/kashav/fsql/tokenizer"
)
func TestSourceParser_ExpectCorrectSources(t *testing.T) {
type Expected struct {
sources map[string][]string
err error
}
type Case struct {
input string
expected Expected
}
cases := []Case{
{
input: ".",
expected: Expected{
sources: map[string][]string{"include": {"."}},
err: nil,
},
},
{
input: "., ~/foo",
expected: Expected{
sources: map[string][]string{"include": {".", "~/foo"}},
err: nil,
},
},
{
input: "., -.bar",
expected: Expected{
sources: map[string][]string{
"include": {"."},
"exclude": {".bar"},
},
err: nil,
},
},
{
input: "-.bar, ., ~/foo AS foo",
expected: Expected{
sources: map[string][]string{
"include": {".", "~/foo"},
"exclude": {".bar"},
},
err: nil,
},
},
{input: "", expected: Expected{err: io.ErrUnexpectedEOF}},
{input: "foo,", expected: Expected{err: io.ErrUnexpectedEOF}},
}
for _, c := range cases {
sources := make(map[string][]string, 0)
aliases := make(map[string]string, 0)
p := &parser{tokenizer: tokenizer.NewTokenizer(c.input)}
err := p.parseSourceList(&sources, &aliases)
if c.expected.err == nil {
if err != nil {
t.Fatalf("\nExpected no error\n Got %v", err)
}
if !reflect.DeepEqual(c.expected.sources, sources) {
t.Fatalf("\nExpected %v\n Got %v", c.expected.sources, sources)
}
} else if !reflect.DeepEqual(c.expected.err, err) {
t.Fatalf("\nExpected %v\n Got %v", c.expected.err, err)
}
}
}
func TestSourceParser_ExpectCorrectAliases(t *testing.T) {
type Expected struct {
aliases map[string]string
err error
}
type Case struct {
input string
expected Expected
}
cases := []Case{
{
input: ".",
expected: Expected{
aliases: map[string]string{},
err: nil,
},
},
{
input: ". AS cwd",
expected: Expected{
aliases: map[string]string{"cwd": "."},
err: nil,
},
},
{
input: "., -.bar, ~/foo AS foo",
expected: Expected{
aliases: map[string]string{"foo": "~/foo"},
err: nil,
},
},
{
input: "-.bar AS bar",
expected: Expected{err: errors.New("cannot alias excluded directory .bar")},
},
{
input: "",
expected: Expected{err: io.ErrUnexpectedEOF},
},
{
input: "foo AS",
expected: Expected{err: io.ErrUnexpectedEOF},
},
}
for _, c := range cases {
sources := make(map[string][]string, 0)
aliases := make(map[string]string, 0)
p := &parser{tokenizer: tokenizer.NewTokenizer(c.input)}
err := p.parseSourceList(&sources, &aliases)
if c.expected.err == nil {
if err != nil {
t.Fatalf("\nExpected no error\n Got %v", err)
}
if !reflect.DeepEqual(c.expected.aliases, aliases) {
t.Fatalf("\nExpected %v\n Got %v", c.expected.aliases, aliases)
}
} else if !reflect.DeepEqual(c.expected.err, err) {
t.Fatalf("\nExpected %v\n Got %v", c.expected.err, err)
}
}
}