1 Star 0 Fork 0

x-lab / yql

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
yql_test.go 19.76 KB
一键复制 编辑 原始数据 按行查看 历史
liudeen 提交于 2019-08-01 18:34 . fix bug
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153
package yql
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestHandleSyntaxErr(t *testing.T) {
var testData = []string{
"asdasdasd",
"((a=1",
"((a='foo'",
"((a='foo')",
"a=foo",
"a in (foo,bar)",
"a in (foo)",
"a ∩ (foo)",
"a != foo",
}
data := map[string]interface{}{
"a": "foo",
}
ass := assert.New(t)
for _, tc := range testData {
ok, err := Match(tc, data)
ass.False(ok)
ass.Error(err)
}
}
func TestMatch_Int(t *testing.T) {
var testData = []struct {
rawYql string
data map[string]interface{}
out bool
}{
{
rawYql: `a=10`,
data: map[string]interface{}{
"a": 9,
},
out: false,
},
{
rawYql: `a=10`,
data: map[string]interface{}{
"a": 10,
},
out: true,
},
{
rawYql: `a>10`,
data: map[string]interface{}{
"a": 10,
},
out: false,
},
{
rawYql: `a>10`,
data: map[string]interface{}{
"a": 11,
},
out: true,
},
{
rawYql: `a>=10`,
data: map[string]interface{}{
"a": 10,
},
out: true,
},
{
rawYql: `a>=10`,
data: map[string]interface{}{
"a": 11,
},
out: true,
},
{
rawYql: `a>=10`,
data: map[string]interface{}{
"a": 1,
},
out: false,
},
{
rawYql: `a<10`,
data: map[string]interface{}{
"a": 1,
},
out: true,
},
{
rawYql: `a<10`,
data: map[string]interface{}{
"a": 10,
},
out: false,
},
{
rawYql: `a<10`,
data: map[string]interface{}{
"a": 11,
},
out: false,
},
}
ass := assert.New(t)
for _, tc := range testData {
ok, err := Match(tc.rawYql, tc.data)
ass.NoError(err)
ass.Equal(tc.out, ok, "rawYql=%s||data=%+v", tc.rawYql, tc.data)
}
}
func TestMatch_Int64(t *testing.T) {
var testData = []struct {
rawYql string
data map[string]interface{}
out bool
}{
{
rawYql: `a=10`,
data: map[string]interface{}{
"a": int64(9),
},
out: false,
},
{
rawYql: `a=10`,
data: map[string]interface{}{
"a": int64(10),
},
out: true,
},
{
rawYql: `a>10`,
data: map[string]interface{}{
"a": int64(10),
},
out: false,
},
{
rawYql: `a>10`,
data: map[string]interface{}{
"a": int64(11),
},
out: true,
},
{
rawYql: `a>=10`,
data: map[string]interface{}{
"a": int64(10),
},
out: true,
},
{
rawYql: `a>=10`,
data: map[string]interface{}{
"a": int64(11),
},
out: true,
},
{
rawYql: `a>=10`,
data: map[string]interface{}{
"a": int64(1),
},
out: false,
},
{
rawYql: `a<10`,
data: map[string]interface{}{
"a": int64(1),
},
out: true,
},
{
rawYql: `a<10`,
data: map[string]interface{}{
"a": int64(10),
},
out: false,
},
{
rawYql: `a<10`,
data: map[string]interface{}{
"a": int64(11),
},
out: false,
},
}
ass := assert.New(t)
for _, tc := range testData {
ok, err := Match(tc.rawYql, tc.data)
ass.NoError(err)
ass.Equal(tc.out, ok, "rawYql=%s||data=%+v", tc.rawYql, tc.data)
}
}
func TestMatch_String(t *testing.T) {
var testData = []struct {
rawYql string
data map[string]interface{}
out bool
}{
{
rawYql: `a=10`,
data: map[string]interface{}{
"a": "10",
},
out: true,
},
{
rawYql: `a=10`,
data: map[string]interface{}{
"a": "010",
},
out: false,
},
{
rawYql: `a=10`,
data: map[string]interface{}{
"a": "",
},
out: false,
},
{
rawYql: `a>1`,
data: map[string]interface{}{
"a": "1",
},
out: false,
},
{
rawYql: `a>1`,
data: map[string]interface{}{
"a": "2",
},
out: true,
},
{
rawYql: `a>=1`,
data: map[string]interface{}{
"a": "1",
},
out: true,
},
{
rawYql: `a>=1`,
data: map[string]interface{}{
"a": "2",
},
out: true,
},
{
rawYql: `a>=1`,
data: map[string]interface{}{
"a": "",
},
out: false,
},
{
rawYql: `a>20`,
data: map[string]interface{}{
"a": "21",
},
out: true,
},
{
rawYql: `a>20`,
data: map[string]interface{}{
"a": "3",
},
out: true,
},
{
rawYql: `a>20`,
data: map[string]interface{}{
"a": "1",
},
out: false,
},
{
rawYql: `a!=20`,
data: map[string]interface{}{
"a": "3",
},
out: true,
},
{
rawYql: `a!=20`,
data: map[string]interface{}{
"a": "20",
},
out: false,
},
}
ass := assert.New(t)
for _, tc := range testData {
ok, err := Match(tc.rawYql, tc.data)
ass.NoError(err)
ass.Equal(tc.out, ok, "rawYql=%s||data=%+v", tc.rawYql, tc.data)
}
}
func TestMatch__Float(t *testing.T) {
var testData = []struct {
rawYql string
data map[string]interface{}
out bool
}{
{
rawYql: `a=10`,
data: map[string]interface{}{
"a": float64(10),
},
out: true,
},
{
rawYql: `a=10`,
data: map[string]interface{}{
"a": float64(10 - epsilon*0.1),
},
out: true,
},
{
rawYql: `a!=10`,
data: map[string]interface{}{
"a": float64(10),
},
out: false,
},
{
rawYql: `a>10`,
data: map[string]interface{}{
"a": float64(10),
},
out: false,
},
{
rawYql: `a>10`,
data: map[string]interface{}{
"a": float64(10.000000001),
},
out: true,
},
{
rawYql: `a<10`,
data: map[string]interface{}{
"a": float64(10 - epsilon*0.1),
},
out: true,
},
{
rawYql: `a>=10`,
data: map[string]interface{}{
"a": float64(10.0),
},
out: true,
},
{
rawYql: `a>=10`,
data: map[string]interface{}{
"a": float64(9.0),
},
out: false,
},
{
rawYql: `a<=10`,
data: map[string]interface{}{
"a": float64(10.0),
},
out: true,
},
{
rawYql: `a<=10`,
data: map[string]interface{}{
"a": float64(9.0),
},
out: true,
},
{
rawYql: `a<=10`,
data: map[string]interface{}{
"a": float64(11.0),
},
out: false,
},
}
ass := assert.New(t)
for _, tc := range testData {
ok, _ := Match(tc.rawYql, tc.data)
ass.Equal(tc.out, ok, "rawYql=%s||data=%+v", tc.rawYql, tc.data)
}
}
func TestMatch_Boolean(t *testing.T) {
// comparison between booleans only support =,!=
var testData = []struct {
rawYql string
data map[string]interface{}
out bool
}{
{
rawYql: `a=true`,
data: map[string]interface{}{
"a": true,
},
out: true,
},
{
rawYql: `a=true`,
data: map[string]interface{}{
"a": false,
},
out: false,
},
{
rawYql: `a=false`,
data: map[string]interface{}{
"a": true,
},
out: false,
},
{
rawYql: `a=false`,
data: map[string]interface{}{
"a": false,
},
out: true,
},
{
rawYql: `a!=false`,
data: map[string]interface{}{
"a": true,
},
out: true,
},
{
rawYql: `a>false`,
data: map[string]interface{}{
"a": true,
},
out: false,
},
{
rawYql: `a<=false`,
data: map[string]interface{}{
"a": true,
},
out: false,
},
}
ass := assert.New(t)
for _, tc := range testData {
ok, err := Match(tc.rawYql, tc.data)
ass.NoError(err)
ass.Equal(tc.out, ok, "rawYql=%s||data=%+v", tc.rawYql, tc.data)
}
}
func TestMatch_In(t *testing.T) {
var testData = []struct {
rawYql string
data map[string]interface{}
out bool
}{
{
rawYql: `a in ('swim')`,
data: map[string]interface{}{
"a": "swim",
},
out: true,
},
{
rawYql: `a in ('soccer')`,
data: map[string]interface{}{
"a": "swim",
},
out: false,
},
{
rawYql: `a !in ('swim')`,
data: map[string]interface{}{
"a": "swim",
},
out: false,
},
{
rawYql: `a !in ('soccer')`,
data: map[string]interface{}{
"a": "swim",
},
out: true,
},
{
rawYql: `a !in (1,2,3)`,
data: map[string]interface{}{
"a": 1,
},
out: false,
},
{
rawYql: `a in (1,2,3)`,
data: map[string]interface{}{
"a": 3,
},
out: true,
},
{
rawYql: `a in (1,5,9)`,
data: map[string]interface{}{
"a": 5,
},
out: true,
},
{
rawYql: `a !in (1,2, 10, 5)`,
data: map[string]interface{}{
"a": int64(9),
},
out: true,
},
{
rawYql: `a !in (1,2, 10, 5)`,
data: map[string]interface{}{
"a": 9,
},
out: true,
},
{
rawYql: `a in (1,2, 10, 5)`,
data: map[string]interface{}{
"a": 10,
},
out: true,
},
{
rawYql: `a in (1,2, 10, 5)`,
data: map[string]interface{}{
"a": []int{10, 2},
},
out: true,
},
{
rawYql: `a in (1,2, 10, 5)`,
data: map[string]interface{}{
"a": []string{"1", "5"},
},
out: true,
},
{
rawYql: `a !in (1,2, 10, 5)`,
data: map[string]interface{}{
"a": []string{"1", "5"},
},
out: false,
},
{
rawYql: `a !in (1,2, 10, 5)`,
data: map[string]interface{}{
"a": "1",
},
out: false,
},
{
rawYql: `a !in (1,2, 10, 5)`,
data: map[string]interface{}{
"a": []string{"1", "5", "3"},
},
out: true,
},
{
rawYql: `a in (1,2, 10, 5)`,
data: map[string]interface{}{
"a": []int64{1, 5},
},
out: true,
},
{
rawYql: `a in (1,2, 10.000, 5.000)`,
data: map[string]interface{}{
"a": []float64{2.000000000000001, 5.000000000000000002},
},
out: true,
},
{
rawYql: `a in (1,2,3, 10.00000000001)`,
data: map[string]interface{}{
"a": float64(10.0),
},
out: true,
},
{
rawYql: `a !in (1,2,3, 10.00001)`,
data: map[string]interface{}{
"a": float64(10.0),
},
out: true,
},
{
rawYql: `a in (1,2, 10)`,
data: map[string]interface{}{
"a": []int64{2, 3},
},
out: false,
},
{
rawYql: `a in (1,2,3, 10)`,
data: map[string]interface{}{
"a": int64(10),
},
out: true,
},
{
rawYql: `a in (1,2,3, 10)`,
data: map[string]interface{}{
"a": []int64{2, 3},
},
out: true,
},
{
rawYql: `a in (1,2, 10)`,
data: map[string]interface{}{
"a": []int64{2, 3},
},
out: false,
},
{
rawYql: `a in (1,2, 10, 5)`,
data: map[string]interface{}{
"a": []float64{2, 5},
},
out: true,
},
{
rawYql: `a in (1,2, 10, 5)`,
data: map[string]interface{}{
"a": []float64{1, 10, 2, 5},
},
out: true,
},
{
rawYql: `a in (1,2, 10, 5)`,
data: map[string]interface{}{
"a": []float64{1, 10, 2, 5, 3},
},
out: false,
},
{
rawYql: `a in (1,2, 10, 5)`,
data: map[string]interface{}{
"a": []string{"1", "5"},
},
out: true,
},
}
ass := assert.New(t)
for _, tc := range testData {
ok, _ := Match(tc.rawYql, tc.data)
ass.Equal(tc.out, ok, "rawYql=%s||data=%+v", tc.rawYql, tc.data)
}
}
func TestMatch_And(t *testing.T) {
var testData = []struct {
rawYql string
data map[string]interface{}
out bool
}{
{
rawYql: `a=10 and b>'2' and c<9 and d!=2`,
data: map[string]interface{}{
"a": int64(10),
"b": int64(3),
"c": int64(-1),
"d": int64(2),
},
out: false,
},
{
rawYql: `a=10 and b>'2' and c<9 and d!=2`,
data: map[string]interface{}{
"a": int64(10),
"b": int64(3),
"c": int64(-1),
},
out: false,
},
{
rawYql: `a=10 and b>'2'`,
data: map[string]interface{}{
"a": int64(10),
"b": int64(3),
},
out: true,
},
{
rawYql: `a=10 and b>'2'`,
data: map[string]interface{}{
"a": int64(10),
"b": int64(2),
},
out: false,
},
{
rawYql: `a=10 and b>'2'`,
data: map[string]interface{}{
"a": int64(10),
"b": int64(3),
},
out: true,
},
{
rawYql: `a=10 and b>'2' and c<9`,
data: map[string]interface{}{
"a": int64(10),
"b": int64(3),
"c": int64(-1),
},
out: true,
},
{
rawYql: `a=10 and b>'2' and c<9 and d!=2`,
data: map[string]interface{}{
"a": int64(10),
"b": int64(3),
"c": int64(-1),
"d": int64(0),
},
out: true,
},
}
ass := assert.New(t)
for _, tc := range testData {
ok, _ := Match(tc.rawYql, tc.data)
ass.Equal(tc.out, ok, "rawYql=%s||data=%+v", tc.rawYql, tc.data)
}
}
func TestMatch_Or(t *testing.T) {
var testData = []struct {
rawYql string
data map[string]interface{}
out bool
}{
{
rawYql: `a=10 or b>'2'`,
data: map[string]interface{}{
"a": int64(10),
"b": int64(1),
},
out: true,
},
{
rawYql: `a=10 or b>'2'`,
data: map[string]interface{}{
"a": int64(9),
"b": int64(2),
},
out: false,
},
{
rawYql: `a=10 or b>'2'`,
data: map[string]interface{}{
"a": int64(10),
"b": int64(3),
},
out: true,
},
{
rawYql: `a=10 or b>'2' or c<9`,
data: map[string]interface{}{
"a": int64(1),
"b": int64(3),
"c": int64(100),
},
out: true,
},
{
rawYql: `a=10 or b>'2' or c<9 or d!=2`,
data: map[string]interface{}{
"a": int64(1),
"b": int64(2),
"c": int64(10),
"d": int64(0),
},
out: true,
},
{
rawYql: `a=10 or b>'2' or c<9 or d!=2`,
data: map[string]interface{}{
"a": int64(1),
"b": int64(1),
"c": int64(10),
"d": int64(2),
},
out: false,
},
}
ass := assert.New(t)
for _, tc := range testData {
ok, err := Match(tc.rawYql, tc.data)
ass.NoError(err)
ass.Equal(tc.out, ok, "rawYql=%s||data=%+v", tc.rawYql, tc.data)
}
}
func TestMatch_Or_And(t *testing.T) {
var testData = []struct {
rawYql string
data map[string]interface{}
out bool
}{
{
rawYql: `a=9 or c=1 and b!='1'`,
data: map[string]interface{}{
"a": int64(10),
"b": int64(1),
"c": int64(1),
},
out: false,
},
{
rawYql: `a=10 and b>'2' or c=1`,
data: map[string]interface{}{
"a": int64(10),
"b": int64(1),
"c": int64(1),
},
out: true,
},
{
rawYql: `a=10 or c=1 and b!='1'`,
data: map[string]interface{}{
"a": int64(10),
"b": int64(1),
"c": int64(1),
},
out: true,
},
{
rawYql: `a=10 and (c=1 or b!='1')`,
data: map[string]interface{}{
"a": int64(10),
"b": int64(1),
"c": int64(1),
},
out: true,
},
{
rawYql: `a=10 and (c=1 or b!='1') and d='123'`,
data: map[string]interface{}{
"a": int64(10),
"b": int64(1),
"c": int64(1),
"d": "123",
},
out: true,
},
}
ass := assert.New(t)
for _, tc := range testData {
ok, err := Match(tc.rawYql, tc.data)
ass.NoError(err)
ass.Equal(tc.out, ok, "rawYql=%s||data=%+v", tc.rawYql, tc.data)
}
}
func TestMatch_Inter(t *testing.T) {
var testData = []struct {
rawYql string
data map[string]interface{}
out bool
}{
{
rawYql: `letter ∩ ('a','b','c','d','e')`,
data: map[string]interface{}{
"letter": []string{"a", "e"},
},
out: true,
},
{
rawYql: `letter !∩ (1,2,3)`,
data: map[string]interface{}{
"letter": []float64{0.5, 3.01},
},
out: true,
},
{
rawYql: `letter ∩ ('a', 'b','c','d', 'e')`,
data: map[string]interface{}{
"letter": []string{"a", "e", "f"},
},
out: true,
},
{
rawYql: `letter ∩ ('a','b','c', 'd', 'e')`,
data: map[string]interface{}{
"letter": []string{"f"},
},
out: false,
},
{
rawYql: `letter ∩ ('a','b','c','d')`,
data: map[string]interface{}{
"letter": "c",
},
out: true,
},
{
rawYql: `letter ∩ (1,2,3)`,
data: map[string]interface{}{
"letter": []float64{2.0, 3.0},
},
out: true,
},
{
rawYql: `letter ∩ (1,2,3)`,
data: map[string]interface{}{
"letter": []int64{2, 5},
},
out: true,
},
{
rawYql: `letter !∩ (1,2,3)`,
data: map[string]interface{}{
"letter": []int64{4, 5},
},
out: true,
},
}
ass := assert.New(t)
for _, tc := range testData {
ok, err := Match(tc.rawYql, tc.data)
ass.NoError(err)
ass.Equal(tc.out, ok, "rawYql=%s||data=%+v", tc.rawYql, tc.data)
}
}
func TestMatch(t *testing.T) {
var testData = []struct {
rawYql string
data map[string]interface{}
out bool
}{
{
rawYql: `age>23 and (sex in ('boy','girl') or sex='other') and score>=95 and rank !in ('b','c','d')`,
data: map[string]interface{}{
"age": int64(24),
"sex": "boy",
"score": int64(95),
"rank": "s",
},
out: true,
},
{
rawYql: `age>23 and (sex in ('boy','girl') or sex='other')`,
data: map[string]interface{}{
"age": int64(24),
"sex": "other",
},
out: true,
},
{
rawYql: `age>23 and (sex in ('boy','girl') or sex='other')`,
data: map[string]interface{}{
"age": int64(24),
"sex": "boy",
},
out: true,
},
{
rawYql: `age>23 and (sex in ('boy','girl') or some!=5) and words='hello world'`,
data: map[string]interface{}{
"age": int64(211),
"sex": "boy",
"some": int64(6),
"words": "hello world",
},
out: true,
},
{
rawYql: `age>23 and (sex in ('boy','girl') or some!=5) and words='hello world'`,
data: map[string]interface{}{
"age": int64(21),
"sex": "boy",
"some": int64(6),
"words": "hello world",
},
out: false,
},
{
rawYql: `tag in (1,3,5) and status!=0`,
data: map[string]interface{}{
"tag": []int64{1, 5},
"status": int64(3),
},
out: true,
},
}
ass := assert.New(t)
for _, tc := range testData {
ok, err := Match(tc.rawYql, tc.data)
ass.NoError(err)
ass.Equal(tc.out, ok, "rawYql=%s||data=%+v", tc.rawYql, tc.data)
}
}
func TestRule_Match(t *testing.T) {
var testData = []struct {
rawYql string
data map[string]interface{}
out bool
}{
{
rawYql: `age>23 and (sex in ('boy','girl') or sex='other') and score>=95 and rank !in ('b','c','d')`,
data: map[string]interface{}{
"age": int64(24),
"sex": "boy",
"score": int64(95),
"rank": "s",
},
out: true,
},
{
rawYql: `age>23 and (sex in ('boy','girl') or sex='other')`,
data: map[string]interface{}{
"age": int64(24),
"sex": "other",
},
out: true,
},
{
rawYql: `age>23 and (sex in ('boy','girl') or sex='other')`,
data: map[string]interface{}{
"age": int64(24),
"sex": "boy",
},
out: true,
},
{
rawYql: `age>23 and (sex in ('boy','girl') or some!=5) and words='hello world'`,
data: map[string]interface{}{
"age": int64(211),
"sex": "boy",
"some": int64(6),
"words": "hello world",
},
out: true,
},
{
rawYql: `age>23 and (sex in ('boy','girl') or some!=5) and words='hello world'`,
data: map[string]interface{}{
"age": int64(21),
"sex": "boy",
"some": int64(6),
"words": "hello world",
},
out: false,
},
{
rawYql: `tag in (1,3,5) and status!=0`,
data: map[string]interface{}{
"tag": []int64{1, 5},
"status": int64(3),
},
out: true,
},
}
ass := assert.New(t)
for _, tc := range testData {
ruler, err := Rule(tc.rawYql)
ass.NoError(err)
ok, err := ruler.Match(tc.data)
ass.NoError(err)
ass.Equal(tc.out, ok, "rawYql=%s||data=%+v", tc.rawYql, tc.data)
}
}
func TestRule_Match_Multi(t *testing.T) {
var testData = []struct {
data map[string]interface{}
out bool
}{
{
data: map[string]interface{}{
"age": int64(24),
"sex": "boy",
"score": int64(95),
"rank": "s",
},
out: true,
},
{
data: map[string]interface{}{
"age": int64(23),
"sex": "boy",
"score": int64(95),
"rank": "s",
},
out: false,
},
{
data: map[string]interface{}{
"age": int64(24),
"sex": "boy",
"score": int64(95),
"rank": "",
},
out: true,
},
{
data: map[string]interface{}{
"age": int64(24),
"sex": "boy",
"score": int64(95),
"rank": "a",
},
out: true,
},
{
data: map[string]interface{}{
"age": int64(23),
"sex": "boy",
"score": int64(92),
"rank": "s",
},
out: false,
},
{
data: map[string]interface{}{
"age": int64(23),
"sex": "other",
"score": int64(97),
"rank": "s",
},
out: false,
},
}
ass := assert.New(t)
ruler, err := Rule(`age>23 and (sex in ('boy','girl') or sex='other') and score>=95 and rank !in ('b','c','d')`)
if !ass.NoError(err) {
t.FailNow()
}
for _, tc := range testData {
ok, err := ruler.Match(tc.data)
ass.NoError(err)
ass.Equal(tc.out, ok, "data=%+v", tc.data)
}
}
1
https://gitee.com/x-lab/yql.git
git@gitee.com:x-lab/yql.git
x-lab
yql
yql
master

搜索帮助