mirror of
https://gitee.com/rulego/streamsql.git
synced 2026-05-06 19:05:43 +00:00
178 lines
5.1 KiB
Go
178 lines
5.1 KiB
Go
package functions
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// TestAggregatorAdapterBasic 测试聚合器适配器基本功能
|
|
func TestAggregatorAdapterBasic(t *testing.T) {
|
|
// 测试创建聚合器适配器
|
|
adapter, err := NewAggregatorAdapter("sum")
|
|
require.NoError(t, err)
|
|
require.NotNil(t, adapter)
|
|
|
|
// 测试GetFunctionName
|
|
funcName := adapter.GetFunctionName()
|
|
assert.Equal(t, "sum", funcName)
|
|
|
|
// 测试New方法
|
|
newAdapter := adapter.New()
|
|
assert.NotNil(t, newAdapter)
|
|
|
|
// 测试Add和Result方法
|
|
adapter.Add(10)
|
|
adapter.Add(20)
|
|
adapter.Add(30)
|
|
result := adapter.Result()
|
|
assert.Equal(t, 60.0, result)
|
|
|
|
// 测试创建不存在的聚合器
|
|
_, err = NewAggregatorAdapter("nonexistent")
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
// TestAggregatorAdapterWithNilFunction 测试聚合器适配器的nil函数情况
|
|
func TestAggregatorAdapterWithNilFunction(t *testing.T) {
|
|
adapter := &AggregatorAdapter{aggFunc: nil}
|
|
funcName := adapter.GetFunctionName()
|
|
assert.Equal(t, "", funcName)
|
|
}
|
|
|
|
// TestAnalyticalAdapterBasic 测试分析函数适配器基本功能
|
|
func TestAnalyticalAdapterBasic(t *testing.T) {
|
|
// 测试创建分析函数适配器
|
|
adapter, err := NewAnalyticalAdapter("latest")
|
|
require.NoError(t, err)
|
|
require.NotNil(t, adapter)
|
|
|
|
// 测试Execute方法
|
|
ctx := &FunctionContext{
|
|
Data: map[string]interface{}{"test": "value"},
|
|
}
|
|
result, err := adapter.Execute(ctx, []interface{}{"test_value"})
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, "test_value", result)
|
|
|
|
// 测试Reset方法
|
|
adapter.Reset()
|
|
|
|
// 测试Clone方法
|
|
clonedAdapter := adapter.Clone()
|
|
assert.NotNil(t, clonedAdapter)
|
|
assert.NotSame(t, adapter, clonedAdapter)
|
|
|
|
// 测试创建不存在的分析函数
|
|
_, err = NewAnalyticalAdapter("nonexistent")
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
// TestRegisterAggregatorAdapter 测试注册聚合器适配器
|
|
func TestRegisterAggregatorAdapter(t *testing.T) {
|
|
// 注册聚合器适配器
|
|
err := RegisterAggregatorAdapter("sum")
|
|
assert.NoError(t, err)
|
|
|
|
// 获取聚合器适配器
|
|
constructor, exists := GetAggregatorAdapter("sum")
|
|
assert.True(t, exists)
|
|
assert.NotNil(t, constructor)
|
|
|
|
// 使用构造函数创建实例
|
|
instance := constructor()
|
|
assert.NotNil(t, instance)
|
|
|
|
// 测试不存在的适配器
|
|
_, exists = GetAggregatorAdapter("nonexistent")
|
|
assert.False(t, exists)
|
|
}
|
|
|
|
// TestRegisterAnalyticalAdapter 测试注册分析函数适配器
|
|
func TestRegisterAnalyticalAdapter(t *testing.T) {
|
|
// 注册分析函数适配器
|
|
err := RegisterAnalyticalAdapter("latest")
|
|
assert.NoError(t, err)
|
|
|
|
// 获取分析函数适配器
|
|
constructor, exists := GetAnalyticalAdapter("latest")
|
|
assert.True(t, exists)
|
|
assert.NotNil(t, constructor)
|
|
|
|
// 使用构造函数创建实例
|
|
instance := constructor()
|
|
assert.NotNil(t, instance)
|
|
|
|
// 测试不存在的适配器
|
|
_, exists = GetAnalyticalAdapter("nonexistent")
|
|
assert.False(t, exists)
|
|
}
|
|
|
|
// TestCreateBuiltinAggregatorFromFunctions 测试从函数模块创建内置聚合器
|
|
func TestCreateBuiltinAggregatorFromFunctions(t *testing.T) {
|
|
// 先注册一个适配器
|
|
err := RegisterAggregatorAdapter("sum")
|
|
assert.NoError(t, err)
|
|
|
|
// 从注册的适配器创建
|
|
aggregator := CreateBuiltinAggregatorFromFunctions("sum")
|
|
assert.NotNil(t, aggregator)
|
|
|
|
// 从未注册的函数直接创建
|
|
aggregator2 := CreateBuiltinAggregatorFromFunctions("avg")
|
|
assert.NotNil(t, aggregator2)
|
|
|
|
// 测试不存在的聚合器
|
|
aggregator3 := CreateBuiltinAggregatorFromFunctions("nonexistent")
|
|
assert.Nil(t, aggregator3)
|
|
}
|
|
|
|
// TestCreateAnalyticalFromFunctions 测试从函数模块创建分析函数
|
|
func TestCreateAnalyticalFromFunctions(t *testing.T) {
|
|
// 先注册一个适配器
|
|
err := RegisterAnalyticalAdapter("latest")
|
|
assert.NoError(t, err)
|
|
|
|
// 从注册的适配器创建
|
|
analytical := CreateAnalyticalFromFunctions("latest")
|
|
assert.NotNil(t, analytical)
|
|
|
|
// 从未注册的函数直接创建
|
|
analytical2 := CreateAnalyticalFromFunctions("had_changed")
|
|
assert.NotNil(t, analytical2)
|
|
|
|
// 测试不存在的分析函数
|
|
analytical3 := CreateAnalyticalFromFunctions("nonexistent")
|
|
assert.Nil(t, analytical3)
|
|
}
|
|
|
|
// TestAggregatorAdapterErrorHandling 测试聚合器适配器错误处理
|
|
func TestAggregatorAdapterErrorHandling(t *testing.T) {
|
|
// 注册一个会失败的适配器(使用不存在的函数名)
|
|
err := RegisterAggregatorAdapter("invalid_function")
|
|
assert.NoError(t, err)
|
|
|
|
// 获取并尝试创建实例
|
|
constructor, exists := GetAggregatorAdapter("invalid_function")
|
|
assert.True(t, exists)
|
|
|
|
// 创建实例应该返回nil(因为函数不存在)
|
|
instance := constructor()
|
|
assert.Nil(t, instance)
|
|
}
|
|
|
|
// TestAnalyticalAdapterErrorHandling 测试分析函数适配器错误处理
|
|
func TestAnalyticalAdapterErrorHandling(t *testing.T) {
|
|
// 注册一个会失败的适配器(使用不存在的函数名)
|
|
err := RegisterAnalyticalAdapter("invalid_analytical")
|
|
assert.NoError(t, err)
|
|
|
|
// 获取并尝试创建实例
|
|
constructor, exists := GetAnalyticalAdapter("invalid_analytical")
|
|
assert.True(t, exists)
|
|
|
|
// 创建实例应该返回nil(因为函数不存在)
|
|
instance := constructor()
|
|
assert.Nil(t, instance)
|
|
} |