Files
streamsql/window/tumbling_window_test.go
2025-04-07 17:27:58 +08:00

69 lines
1.4 KiB
Go

package window
import (
"context"
"testing"
"time"
"github.com/rulego/streamsql/model"
"github.com/stretchr/testify/require"
)
func TestTumblingWindow(t *testing.T) {
_, cancel := context.WithCancel(context.Background())
defer cancel()
tw, _ := NewTumblingWindow(model.WindowConfig{
Type: "TumblingWindow",
Params: map[string]interface{}{"size": "2s"},
})
tw.SetCallback(func(results []model.Row) {
// Process results
})
go tw.Start()
// Add data every 500ms
for i := 0; i < 5; i++ {
tw.Add(i)
time.Sleep(1100 * time.Millisecond)
}
// Check output channel
resultsChan := tw.OutputChan()
var results []model.Row
select {
case results = <-resultsChan:
case <-time.After(3 * time.Second):
t.Fatal("No results received within timeout")
}
// Verify that data is sent every 2 seconds
require.Len(t, results, 2)
require.Equal(t, []interface{}{0, 1}, results)
// Verify next batch
select {
case results = <-resultsChan:
require.Len(t, results, 2)
require.Equal(t, []interface{}{2, 3}, results)
case <-time.After(3 * time.Second):
t.Fatal("No results received within timeout")
}
//time.Sleep(1100 * time.Millisecond)
//results = <-resultsChan
// Verify reset and final batch
tw.Reset()
tw.Add(99)
cancel()
select {
case results = <-resultsChan:
require.Len(t, results, 1)
require.Equal(t, []interface{}{99}, results)
case <-time.After(3 * time.Second):
t.Fatal("No results received within timeout")
}
}