mirror of
https://gitee.com/rulego/streamsql.git
synced 2025-07-06 16:08:36 +00:00
69 lines
1.4 KiB
Go
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")
|
|
}
|
|
}
|