Files
eval/readme_test.go
zeekay 011df15db5 eval: expression evaluator forked from casbin/govaluate v1.3.0
Module path renamed to github.com/hanzoai/eval and the Go package
renamed from govaluate to eval. Evaluation, parsing, lexing, and
operator behavior are unchanged; MIT license and George Lester
attribution retained. See NOTICE for lineage.
2026-07-18 00:27:32 -07:00

193 lines
3.7 KiB
Go

package eval
/*
Contains test cases for all the expression examples given in the README.
While all of the functionality for these cases should be covered in other tests,
this is really just a sanity check.
*/
import (
"testing"
)
func TestBasicEvaluation(test *testing.T) {
expression, err := NewEvaluableExpression("10 > 0")
if err != nil {
test.Log(err)
test.Fail()
}
result, err := expression.Evaluate(nil)
if err != nil {
test.Log(err)
test.Fail()
}
if result != true {
test.Logf("Expected 'true', got '%v'\n", result)
test.Fail()
}
}
func TestParameterEvaluation(test *testing.T) {
expression, err := NewEvaluableExpression("foo > 0")
if err != nil {
test.Log(err)
test.Fail()
}
parameters := make(map[string]interface{}, 8)
parameters["foo"] = -1
result, err := expression.Evaluate(parameters)
if err != nil {
test.Log(err)
test.Fail()
}
if result != false {
test.Logf("Expected 'false', got '%v'\n", result)
test.Fail()
}
}
func TestModifierEvaluation(test *testing.T) {
expression, err := NewEvaluableExpression("(requests_made * requests_succeeded / 100) >= 90")
if err != nil {
test.Log(err)
test.Fail()
}
parameters := make(map[string]interface{}, 8)
parameters["requests_made"] = 100
parameters["requests_succeeded"] = 80
result, err := expression.Evaluate(parameters)
if err != nil {
test.Log(err)
test.Fail()
}
if result != false {
test.Logf("Expected 'false', got '%v'\n", result)
test.Fail()
}
}
func TestStringEvaluation(test *testing.T) {
expression, err := NewEvaluableExpression("http_response_body == 'service is ok'")
if err != nil {
test.Log(err)
test.Fail()
}
parameters := make(map[string]interface{}, 8)
parameters["http_response_body"] = "service is ok"
result, err := expression.Evaluate(parameters)
if err != nil {
test.Log(err)
test.Fail()
}
if result != true {
test.Logf("Expected 'false', got '%v'\n", result)
test.Fail()
}
}
func TestFloatEvaluation(test *testing.T) {
expression, err := NewEvaluableExpression("(mem_used / total_mem) * 100")
if err != nil {
test.Log(err)
test.Fail()
}
parameters := make(map[string]interface{}, 8)
parameters["total_mem"] = 1024
parameters["mem_used"] = 512
result, err := expression.Evaluate(parameters)
if err != nil {
test.Log(err)
test.Fail()
}
if result != 50.0 {
test.Logf("Expected '50.0', got '%v'\n", result)
test.Fail()
}
}
func TestDateComparison(test *testing.T) {
expression, err := NewEvaluableExpression("'2014-01-02' > '2014-01-01 23:59:59'")
if err != nil {
test.Log(err)
test.Fail()
}
result, err := expression.Evaluate(nil)
if err != nil {
test.Log(err)
test.Fail()
}
if result != true {
test.Logf("Expected 'true', got '%v'\n", result)
test.Fail()
}
}
func TestMultipleEvaluation(test *testing.T) {
expression, _ := NewEvaluableExpression("response_time <= 100")
parameters := make(map[string]interface{}, 8)
for i := 0; i < 64; i++ {
parameters["response_time"] = i
result, err := expression.Evaluate(parameters)
if err != nil {
test.Log(err)
test.Fail()
}
if result != true {
test.Logf("Expected 'true', got '%v'\n", result)
test.Fail()
break
}
}
}
func TestStrlenFunction(test *testing.T) {
functions := map[string]ExpressionFunction{
"strlen": func(args ...interface{}) (interface{}, error) {
length := len(args[0].(string))
return (float64)(length), nil
},
}
expString := "strlen('someReallyLongInputString') <= 16"
expression, err := NewEvaluableExpressionWithFunctions(expString, functions)
if err != nil {
test.Log(err)
test.Fail()
}
result, err := expression.Evaluate(nil)
if err != nil {
test.Log(err)
test.Fail()
}
if result != false {
test.Logf("Expected 'false', got '%v'\n", result)
test.Fail()
}
}