Files
streamsql/functions/expr_bridge_test.go
T
2025-06-14 21:47:46 +08:00

149 lines
4.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package functions
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestExprBridge(t *testing.T) {
bridge := NewExprBridge()
t.Run("StreamSQL Functions Available", func(t *testing.T) {
// 测试StreamSQL函数是否可用
data := map[string]interface{}{
"temperature": 25.5,
"humidity": 60,
}
// 测试数学函数
result, err := bridge.EvaluateExpression("abs(-5)", data)
assert.NoError(t, err)
assert.Equal(t, float64(5), result)
// 测试字符串函数
result, err = bridge.EvaluateExpression("length(\"hello\")", data)
assert.NoError(t, err)
assert.Equal(t, int64(5), result)
})
t.Run("Expr-Lang Functions Available", func(t *testing.T) {
data := map[string]interface{}{
"numbers": []int{1, 2, 3, 4, 5},
"text": "Hello World",
}
// 测试expr-lang数组函数
result, err := bridge.EvaluateExpression("len(numbers)", data)
assert.NoError(t, err)
assert.Equal(t, 5, result)
// 测试expr-lang字符串函数
result, err = bridge.EvaluateExpression("trim(\" hello \")", data)
assert.NoError(t, err)
assert.Equal(t, "hello", result)
})
t.Run("Mixed Functions", func(t *testing.T) {
data := map[string]interface{}{
"values": []float64{-3.5, 2.1, -1.8, 4.2},
}
// 使用StreamSQL的abs函数和expr-lang的filter函数
// 注意:这个测试可能需要根据实际实现调整
env := bridge.CreateEnhancedExprEnvironment(data)
// 验证环境中包含所有预期的函数
assert.Contains(t, env, "abs")
assert.Contains(t, env, "length")
assert.Contains(t, env, "values")
})
t.Run("Function Resolution", func(t *testing.T) {
// 测试函数解析优先级
_, exists, source := bridge.ResolveFunction("abs")
assert.True(t, exists)
assert.Equal(t, "streamsql", source) // StreamSQL优先
_, exists, source = bridge.ResolveFunction("encode")
assert.True(t, exists)
assert.Equal(t, "streamsql", source) // StreamSQL独有
_, exists, _ = bridge.ResolveFunction("nonexistent")
assert.False(t, exists)
})
t.Run("Function Information", func(t *testing.T) {
info := bridge.GetFunctionInfo()
// 验证包含StreamSQL函数信息
streamSQLFuncs, ok := info["streamsql"].(map[string]interface{})
assert.True(t, ok)
assert.Contains(t, streamSQLFuncs, "abs")
assert.Contains(t, streamSQLFuncs, "encode")
// 验证包含expr-lang函数信息
exprLangFuncs, ok := info["expr-lang"].(map[string]interface{})
assert.True(t, ok)
assert.Contains(t, exprLangFuncs, "trim")
assert.Contains(t, exprLangFuncs, "filter")
})
}
func TestEvaluateWithBridge(t *testing.T) {
data := map[string]interface{}{
"x": 3.5,
"y": -2.1,
}
// 测试简单表达式
result, err := EvaluateWithBridge("abs(y)", data)
assert.NoError(t, err)
assert.Equal(t, 2.1, result)
// 测试复合表达式
result, err = EvaluateWithBridge("x + abs(y)", data)
assert.NoError(t, err)
assert.Equal(t, 5.6, result)
}
func TestGetAllAvailableFunctions(t *testing.T) {
info := GetAllAvailableFunctions()
// 验证返回的信息结构
assert.Contains(t, info, "streamsql")
assert.Contains(t, info, "expr-lang")
// 验证函数数量合理
streamSQLFuncs := info["streamsql"].(map[string]interface{})
t.Logf("StreamSQL functions count: %d", len(streamSQLFuncs))
// for name := range streamSQLFuncs {
// t.Logf("StreamSQL function: %s", name)
// }
assert.GreaterOrEqual(t, len(streamSQLFuncs), 1) // 至少应该有一个函数
exprLangFuncs := info["expr-lang"].(map[string]interface{})
t.Logf("Expr-lang functions count: %d", len(exprLangFuncs))
assert.GreaterOrEqual(t, len(exprLangFuncs), 1) // 至少应该有一个函数
}
func TestFunctionConflictResolution(t *testing.T) {
bridge := NewExprBridge()
data := map[string]interface{}{
"value": -5.5,
}
// 测试冲突函数的解析abs函数在两个系统中都存在
// 应该优先使用expr-lang的版本
env := bridge.CreateEnhancedExprEnvironment(data)
// 验证StreamSQL函数可以通过别名访问
assert.Contains(t, env, "streamsql_abs")
assert.Contains(t, env, "abs")
// 测试两个版本都能正常工作
result, err := bridge.EvaluateExpression("abs(value)", data)
assert.NoError(t, err)
assert.Equal(t, 5.5, result)
}