Files
storm/q/tree_test.go
Sufijen Bani e4d570e479 Added time.Time comparison for q
Added the possibility to compare `time.Time` structs.
The comparison uses the `time.Equal()` and `time.Before()`. methods to
be safe. The three cases equal,after,before are presented by a int
comprison which can be used for tokens `constant.Compare()`.

This commit closes #96 and is an alternative for #97.
2016-10-27 07:51:01 +02:00

173 lines
3.0 KiB
Go

package q
import (
"go/token"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
type A struct {
Age int
Name string
}
type B struct {
Age int
Name string
}
func TestCompare(t *testing.T) {
assert.True(t, compare(10, 10, token.EQL))
assert.True(t, compare(10, 10.0, token.EQL))
assert.True(t, compare(10, "10", token.EQL))
assert.True(t, compare(10, "10.0", token.EQL))
assert.False(t, compare(10, "hello", token.EQL))
assert.True(t, compare(10.0, 10, token.EQL))
assert.True(t, compare(10.0, 10.0, token.EQL))
assert.True(t, compare(10.0, "10", token.EQL))
assert.True(t, compare(10.0, "10.0", token.EQL))
assert.False(t, compare(10.0, "hello", token.EQL))
assert.True(t, compare("hello", "hello", token.EQL))
assert.True(t, compare(&A{Name: "John"}, &A{Name: "John"}, token.EQL))
assert.False(t, compare(&A{Name: "John"}, &A{Name: "Jack"}, token.GTR))
assert.True(t, compare(10, 5.0, token.GTR))
t1 := time.Now()
t2 := t1.Add(2 * time.Hour)
t3 := t1.Add(-2 * time.Hour)
assert.True(t, compare(t1, t1, token.EQL))
assert.True(t, compare(t1, t2, token.LSS))
assert.True(t, compare(t1, t3, token.GTR))
assert.False(t, compare(&A{Name: "John"}, t1, token.EQL))
assert.False(t, compare(&A{Name: "John"}, t1, token.LEQ))
}
func TestCmp(t *testing.T) {
a := A{
Age: 10,
}
b := A{
Age: 100,
}
q := Eq("Age", 10)
ok, err := q.Match(&a)
assert.NoError(t, err)
assert.True(t, ok)
ok, err = q.Match(&b)
assert.NoError(t, err)
assert.False(t, ok)
q = Gt("Age", 15)
ok, err = q.Match(&a)
assert.NoError(t, err)
assert.False(t, ok)
ok, err = q.Match(&b)
assert.NoError(t, err)
assert.True(t, ok)
}
func TestStrictEq(t *testing.T) {
a := A{
Age: 10,
}
type UserFloat struct {
Age float64
}
b := UserFloat{
Age: 10.0,
}
q := StrictEq("Age", 10)
ok, err := q.Match(&a)
assert.NoError(t, err)
assert.True(t, ok)
ok, err = q.Match(&b)
assert.NoError(t, err)
assert.False(t, ok)
q = StrictEq("Age", 10.0)
ok, err = q.Match(&a)
assert.NoError(t, err)
assert.False(t, ok)
ok, err = q.Match(&b)
assert.NoError(t, err)
assert.True(t, ok)
}
func TestAnd(t *testing.T) {
a := A{
Age: 10,
Name: "John",
}
b := A{
Age: 10,
Name: "Jack",
}
q := And(
Eq("Age", 10),
Eq("Name", "John"),
)
ok, err := q.Match(&a)
assert.NoError(t, err)
assert.True(t, ok)
ok, err = q.Match(&b)
assert.NoError(t, err)
assert.False(t, ok)
}
func TestOr(t *testing.T) {
a := A{
Age: 10,
Name: "John",
}
b := A{
Age: 10,
Name: "Jack",
}
q := Or(
Eq("Age", 10),
Eq("Name", "Jack"),
)
ok, err := q.Match(&a)
assert.NoError(t, err)
assert.True(t, ok)
ok, err = q.Match(&b)
assert.NoError(t, err)
assert.True(t, ok)
}
func TestAndOr(t *testing.T) {
a := A{
Age: 10,
Name: "John",
}
b := A{
Age: 100,
Name: "Jack",
}
q := And(
Eq("Age", 10),
Or(
Eq("Name", "Jack"),
Eq("Name", "John"),
),
)
ok, err := q.Match(&a)
assert.NoError(t, err)
assert.True(t, ok)
ok, err = q.Match(&b)
assert.NoError(t, err)
assert.False(t, ok)
}