424 lines
11 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|