mirror of
https://gitee.com/rulego/streamsql.git
synced 2025-07-08 17:00:14 +00:00
239 lines
5.4 KiB
Go
239 lines
5.4 KiB
Go
package functions
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestDateTimeFunctions(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
function Function
|
|
args []interface{}
|
|
expected interface{}
|
|
wantErr bool
|
|
}{
|
|
// DateFormatFunction 测试
|
|
{
|
|
name: "date_format basic",
|
|
function: NewDateFormatFunction(),
|
|
args: []interface{}{"2023-12-25 15:30:45", "YYYY-MM-DD HH:MI:SS"},
|
|
expected: "2023-12-25 15:30:45",
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "date_format custom",
|
|
function: NewDateFormatFunction(),
|
|
args: []interface{}{"2023-12-25 15:30:45", "YYYY/MM/DD"},
|
|
expected: "2023/12/25",
|
|
wantErr: false,
|
|
},
|
|
// DateAddFunction 测试
|
|
{
|
|
name: "date_add days",
|
|
function: NewDateAddFunction(),
|
|
args: []interface{}{"2023-12-25", 7, "days"},
|
|
expected: "2024-01-01 00:00:00",
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "date_add months",
|
|
function: NewDateAddFunction(),
|
|
args: []interface{}{"2023-12-25", 1, "months"},
|
|
expected: "2024-01-25 00:00:00",
|
|
wantErr: false,
|
|
},
|
|
// DateSubFunction 测试
|
|
{
|
|
name: "date_sub days",
|
|
function: NewDateSubFunction(),
|
|
args: []interface{}{"2024-01-01", 7, "days"},
|
|
expected: "2023-12-25 00:00:00",
|
|
wantErr: false,
|
|
},
|
|
// DateDiffFunction 测试
|
|
{
|
|
name: "date_diff days",
|
|
function: NewDateDiffFunction(),
|
|
args: []interface{}{"2024-01-01", "2023-12-25", "days"},
|
|
expected: int64(7),
|
|
wantErr: false,
|
|
},
|
|
// YearFunction 测试
|
|
{
|
|
name: "year extraction",
|
|
function: NewYearFunction(),
|
|
args: []interface{}{"2023-12-25 15:30:45"},
|
|
expected: float64(2023),
|
|
wantErr: false,
|
|
},
|
|
// MonthFunction 测试
|
|
{
|
|
name: "month extraction",
|
|
function: NewMonthFunction(),
|
|
args: []interface{}{"2023-12-25 15:30:45"},
|
|
expected: float64(12),
|
|
wantErr: false,
|
|
},
|
|
// DayFunction 测试
|
|
{
|
|
name: "day extraction",
|
|
function: NewDayFunction(),
|
|
args: []interface{}{"2023-12-25 15:30:45"},
|
|
expected: 25,
|
|
wantErr: false,
|
|
},
|
|
// HourFunction 测试
|
|
{
|
|
name: "hour extraction",
|
|
function: NewHourFunction(),
|
|
args: []interface{}{"2023-12-25 15:30:45"},
|
|
expected: 15,
|
|
wantErr: false,
|
|
},
|
|
// MinuteFunction 测试
|
|
{
|
|
name: "minute extraction",
|
|
function: NewMinuteFunction(),
|
|
args: []interface{}{"2023-12-25 15:30:45"},
|
|
expected: 30,
|
|
wantErr: false,
|
|
},
|
|
// SecondFunction 测试
|
|
{
|
|
name: "second extraction",
|
|
function: NewSecondFunction(),
|
|
args: []interface{}{"2023-12-25 15:30:45"},
|
|
expected: 45,
|
|
wantErr: false,
|
|
},
|
|
// UnixTimestampFunction 测试
|
|
{
|
|
name: "unix_timestamp",
|
|
function: NewUnixTimestampFunction(),
|
|
args: []interface{}{"2023-01-01 00:00:00"},
|
|
expected: int64(1672531200),
|
|
wantErr: false,
|
|
},
|
|
// FromUnixtimeFunction 测试
|
|
{
|
|
name: "from_unixtime",
|
|
function: NewFromUnixtimeFunction(),
|
|
args: []interface{}{1672531200},
|
|
expected: "2023-01-01 00:00:00",
|
|
wantErr: false,
|
|
},
|
|
// ExtractFunction 测试
|
|
{
|
|
name: "extract year",
|
|
function: NewExtractFunction(),
|
|
args: []interface{}{"year", "2023-12-25 15:30:45"},
|
|
expected: 2023,
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "extract month",
|
|
function: NewExtractFunction(),
|
|
args: []interface{}{"month", "2023-12-25 15:30:45"},
|
|
expected: 12,
|
|
wantErr: false,
|
|
},
|
|
// DayOfWeekFunction 测试
|
|
{
|
|
name: "dayofweek",
|
|
function: NewDayOfWeekFunction(),
|
|
args: []interface{}{"2023-12-25"},
|
|
expected: 1, // Monday
|
|
wantErr: false,
|
|
},
|
|
// DateParseFunction 测试
|
|
{
|
|
name: "date_parse",
|
|
function: NewDateParseFunction(),
|
|
args: []interface{}{"2023/12/25", "YYYY/MM/DD"},
|
|
expected: "2023-12-25 00:00:00",
|
|
wantErr: false,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
// 验证参数
|
|
if err := tt.function.Validate(tt.args); err != nil {
|
|
if !tt.wantErr {
|
|
t.Errorf("Validate() error = %v, wantErr %v", err, tt.wantErr)
|
|
}
|
|
return
|
|
}
|
|
|
|
// 执行函数
|
|
result, err := tt.function.Execute(nil, tt.args)
|
|
if (err != nil) != tt.wantErr {
|
|
t.Errorf("Execute() error = %v, wantErr %v", err, tt.wantErr)
|
|
return
|
|
}
|
|
|
|
if !tt.wantErr && result != tt.expected {
|
|
t.Errorf("Execute() = %v, want %v", result, tt.expected)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestDateTimeRegistration(t *testing.T) {
|
|
// 测试函数是否正确注册
|
|
dateTimeFunctions := []string{
|
|
"date_format",
|
|
"date_add",
|
|
"date_sub",
|
|
"date_diff",
|
|
"date_parse",
|
|
"extract",
|
|
"unix_timestamp",
|
|
"from_unixtime",
|
|
"year",
|
|
"month",
|
|
"day",
|
|
"hour",
|
|
"minute",
|
|
"second",
|
|
"dayofweek",
|
|
"dayofyear",
|
|
"weekofyear",
|
|
}
|
|
|
|
for _, funcName := range dateTimeFunctions {
|
|
t.Run("register_"+funcName, func(t *testing.T) {
|
|
func_, exists := Get(funcName)
|
|
if !exists {
|
|
t.Errorf("Function %s not registered", funcName)
|
|
return
|
|
}
|
|
if func_ == nil {
|
|
t.Errorf("Function %s is nil", funcName)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestDateFormatConversion(t *testing.T) {
|
|
tests := []struct {
|
|
input string
|
|
expected string
|
|
}{
|
|
{"YYYY-MM-DD", "2006-01-02"},
|
|
{"yyyy/mm/dd", "2006/01/02"},
|
|
{"DD/MM/YYYY", "02/01/2006"},
|
|
{"HH:MI:SS", "15:04:05"},
|
|
{"YYYY-MM-DD HH:MI:SS", "2006-01-02 15:04:05"},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.input, func(t *testing.T) {
|
|
result := convertToGoFormat(tt.input)
|
|
if result != tt.expected {
|
|
t.Errorf("convertToGoFormat(%s) = %s, want %s", tt.input, result, tt.expected)
|
|
}
|
|
})
|
|
}
|
|
}
|