mirror of
https://github.com/hanzoai/eval.git
synced 2026-09-30 21:47:09 +00:00
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.
193 lines
3.7 KiB
Go
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()
|
|
}
|
|
}
|