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

424 lines
11 KiB
Go

package evaluate
import (
"os"
"reflect"
"testing"
"time"
"github.com/kashav/fsql/tokenizer"
)
func TestCmpAlpha(t *testing.T) {
type Input struct {
o Opts
a, b interface{}
}
type Expected struct {
result bool
err error
}
type Case struct {
input Input
expected Expected
}
// TODO: Test for errors.
cases := []Case{
{
input: Input{o: Opts{Operator: tokenizer.Equals}, a: "a", b: "a"},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.Equals}, a: "a", b: "b"},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.Equals}, a: "a", b: "A"},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.NotEquals}, a: "a", b: "a"},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.NotEquals}, a: "a", b: "b"},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.NotEquals}, a: "a", b: "A"},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.Like}, a: "abc", b: "%a%"},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.Like}, a: "aaa", b: "%b%"},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.Like}, a: "aaa", b: "%a"},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.Like}, a: "abc", b: "%a"},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.Like}, a: "abc", b: "a%"},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.Like}, a: "cba", b: "a%"},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.Like}, a: "a", b: "a"},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.Like}, a: "a", b: "b"},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.RLike}, a: "a", b: ".*a.*"},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.RLike}, a: "a", b: "^$"},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.RLike}, a: "", b: "^$"},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.RLike}, a: "...", b: "[\\.]{3}"},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.RLike}, a: "aaa", b: "\\s+"},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.In}, a: "a", b: map[interface{}]bool{"a": true}},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.In}, a: "a", b: map[interface{}]bool{"a": false}},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.In}, a: "a", b: map[interface{}]bool{"b": true}},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.In}, a: "a", b: map[interface{}]bool{}},
expected: Expected{result: false, err: nil},
},
}
for _, c := range cases {
actual, err := cmpAlpha(&c.input.o, c.input.a, c.input.b)
if c.expected.err == nil {
if err != nil {
t.Fatalf("\nExpected no error\n Got %v", err)
}
if !reflect.DeepEqual(c.expected.result, actual) {
t.Fatalf("%v, %v, %v\nExpected: %v\n Got: %v",
c.input.o.Operator, c.input.a, c.input.b, c.expected.result, actual)
}
} else if !reflect.DeepEqual(c.expected.err, err) {
t.Fatalf("\nExpected %v\n Got %v", c.expected.err, err)
}
}
}
func TestCmpNumeric(t *testing.T) {
type Input struct {
o Opts
a, b interface{}
}
type Expected struct {
result bool
err error
}
type Case struct {
input Input
expected Expected
}
// TODO: Test for errors.
cases := []Case{
{
input: Input{o: Opts{Operator: tokenizer.Equals}, a: int64(1), b: int64(1)},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.Equals}, a: int64(1), b: int64(2)},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.NotEquals}, a: int64(1), b: int64(1)},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.NotEquals}, a: int64(1), b: int64(2)},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.GreaterThanEquals}, a: int64(1), b: int64(1)},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.GreaterThanEquals}, a: int64(2), b: int64(1)},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.GreaterThanEquals}, a: int64(1), b: int64(2)},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.GreaterThan}, a: int64(1), b: int64(1)},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.GreaterThan}, a: int64(2), b: int64(1)},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.GreaterThan}, a: int64(1), b: int64(2)},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.LessThanEquals}, a: int64(1), b: int64(1)},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.LessThanEquals}, a: int64(2), b: int64(1)},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.LessThanEquals}, a: int64(1), b: int64(2)},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.LessThan}, a: int64(1), b: int64(1)},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.LessThan}, a: int64(2), b: int64(1)},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.LessThan}, a: int64(1), b: int64(2)},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.In}, a: int64(1), b: map[interface{}]bool{int64(1): true}},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.In}, a: int64(1), b: map[interface{}]bool{int64(1): false}},
expected: Expected{result: true, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.In}, a: int64(1), b: map[interface{}]bool{int64(2): true}},
expected: Expected{result: false, err: nil},
},
{
input: Input{o: Opts{Operator: tokenizer.In}, a: int64(1), b: map[interface{}]bool{}},
expected: Expected{result: false, err: nil},
},
}
for _, c := range cases {
actual, err := cmpNumeric(&c.input.o, c.input.a, c.input.b)
if c.expected.err == nil {
if err != nil {
t.Fatalf("\nExpected no error\n Got %v", err)
}
if !reflect.DeepEqual(c.expected.result, actual) {
t.Fatalf("%v, %v, %v\nExpected: %v\n Got: %v",
c.input.o.Operator, c.input.a, c.input.b, c.expected.result, actual)
}
} else if !reflect.DeepEqual(c.expected.err, err) {
t.Fatalf("\nExpected %v\n Got %v", c.expected.err, err)
}
}
}
func TestCmpTime(t *testing.T) {
type Input struct {
o Opts
a, b interface{}
}
type Expected struct {
result bool
err error
}
type Case struct {
input Input
expected Expected
}
// TODO: Test for errors.
cases := []Case{
{
input: Input{
o: Opts{Operator: tokenizer.Equals},
a: time.Now().Round(time.Minute),
b: time.Now().Round(time.Minute),
},
expected: Expected{result: true, err: nil},
},
{
input: Input{
o: Opts{Operator: tokenizer.Equals},
a: time.Now().Add(time.Hour),
b: time.Now().Add(-1 * time.Hour),
},
expected: Expected{result: false, err: nil},
},
{
input: Input{
o: Opts{Operator: tokenizer.NotEquals},
a: time.Now().Round(time.Minute),
b: time.Now().Round(time.Minute),
},
expected: Expected{result: false, err: nil},
},
{
input: Input{
o: Opts{Operator: tokenizer.NotEquals},
a: time.Now().Add(time.Hour),
b: time.Now().Add(-1 * time.Hour),
},
expected: Expected{result: true, err: nil},
},
{
input: Input{
o: Opts{Operator: tokenizer.In},
a: time.Now().Round(time.Minute),
b: map[interface{}]bool{time.Now().Round(time.Minute): true},
},
expected: Expected{result: true, err: nil},
},
{
input: Input{
o: Opts{Operator: tokenizer.In},
a: time.Now().Round(time.Minute),
b: map[interface{}]bool{time.Now().Add(time.Hour): true},
},
expected: Expected{result: false, err: nil},
},
}
for _, c := range cases {
actual, err := cmpTime(&c.input.o, c.input.a, c.input.b)
if c.expected.err == nil {
if err != nil {
t.Fatalf("\nExpected no error\n Got %v", err)
}
if !reflect.DeepEqual(c.expected.result, actual) {
t.Fatalf("%v, %v, %v\nExpected: %v\n Got: %v",
c.input.o.Operator, c.input.a, c.input.b, c.expected.result, actual)
}
} else if !reflect.DeepEqual(c.expected.err, err) {
t.Fatalf("\nExpected %v\n Got %v", c.expected.err, err)
}
}
}
func TestCmpMode(t *testing.T) {
type Input struct {
o Opts
file os.FileInfo
typ interface{}
}
type Expected struct {
result bool
err error
}
type Case struct {
input Input
expected Expected
}
// TODO: Complete these cases.
cases := []Case{}
for _, c := range cases {
actual, err := cmpMode(&c.input.o)
if c.expected.err == nil {
if err != nil {
t.Fatalf("\nExpected no error\n Got %v", err)
}
if !reflect.DeepEqual(c.expected.result, actual) {
t.Fatalf("%v, %v, %v\nExpected: %v\n Got: %v",
c.input.o.Operator, c.input.file, c.input.typ, c.expected.result, actual)
}
} else if !reflect.DeepEqual(c.expected.err, err) {
t.Fatalf("\nExpected %v\n Got %v", c.expected.err, err)
}
}
}
func TestCmpHash(t *testing.T) {
type Input struct {
o Opts
file os.FileInfo
typ interface{}
}
type Expected struct {
result bool
err error
}
type Case struct {
input Input
expected Expected
}
// TODO: Complete these cases.
cases := []Case{}
for _, c := range cases {
actual, err := cmpHash(&c.input.o)
if c.expected.err == nil {
if err != nil {
t.Fatalf("\nExpected no error\n Got %v", err)
}
if !reflect.DeepEqual(c.expected.result, actual) {
t.Fatalf("%v, %v, %v\nExpected: %v\n Got: %v",
c.input.o.Operator, c.input.file, c.input.typ, c.expected.result, actual)
}
} else if !reflect.DeepEqual(c.expected.err, err) {
t.Fatalf("\nExpected %v\n Got %v", c.expected.err, err)
}
}
}