mirror of
https://github.com/aljazceru/opencode.git
synced 2025-12-22 10:14:22 +01:00
195 lines
4.7 KiB
Go
195 lines
4.7 KiB
Go
package decoders
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestUnboundedDecoder_SmallEvent(t *testing.T) {
|
|
data := "event: test\ndata: hello world\n\n"
|
|
rc := io.NopCloser(strings.NewReader(data))
|
|
decoder := NewUnboundedDecoder(rc)
|
|
|
|
if !decoder.Next() {
|
|
t.Fatal("Expected Next() to return true")
|
|
}
|
|
|
|
evt := decoder.Event()
|
|
if evt.Type != "test" {
|
|
t.Errorf("Expected event type 'test', got '%s'", evt.Type)
|
|
}
|
|
if string(evt.Data) != "hello world\n" {
|
|
t.Errorf("Expected data 'hello world\\n', got '%s'", string(evt.Data))
|
|
}
|
|
|
|
if decoder.Next() {
|
|
t.Error("Expected Next() to return false at end of stream")
|
|
}
|
|
|
|
if err := decoder.Err(); err != nil {
|
|
t.Errorf("Expected no error, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestUnboundedDecoder_LargeEvent(t *testing.T) {
|
|
// Create a large event (50MB)
|
|
size := 50 * 1024 * 1024
|
|
largeData := strings.Repeat("x", size)
|
|
|
|
var buf bytes.Buffer
|
|
buf.WriteString("event: large\n")
|
|
buf.WriteString("data: ")
|
|
buf.WriteString(largeData)
|
|
buf.WriteString("\n\n")
|
|
|
|
rc := io.NopCloser(&buf)
|
|
decoder := NewUnboundedDecoder(rc)
|
|
|
|
if !decoder.Next() {
|
|
t.Fatal("Expected Next() to return true")
|
|
}
|
|
|
|
evt := decoder.Event()
|
|
if evt.Type != "large" {
|
|
t.Errorf("Expected event type 'large', got '%s'", evt.Type)
|
|
}
|
|
|
|
expectedData := largeData + "\n"
|
|
if string(evt.Data) != expectedData {
|
|
t.Errorf("Data size mismatch: expected %d, got %d", len(expectedData), len(evt.Data))
|
|
}
|
|
|
|
if decoder.Next() {
|
|
t.Error("Expected Next() to return false at end of stream")
|
|
}
|
|
|
|
if err := decoder.Err(); err != nil {
|
|
t.Errorf("Expected no error, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestUnboundedDecoder_MultipleEvents(t *testing.T) {
|
|
data := "event: first\ndata: data1\n\nevent: second\ndata: data2\n\n"
|
|
rc := io.NopCloser(strings.NewReader(data))
|
|
decoder := NewUnboundedDecoder(rc)
|
|
|
|
// First event
|
|
if !decoder.Next() {
|
|
t.Fatal("Expected Next() to return true for first event")
|
|
}
|
|
evt := decoder.Event()
|
|
if evt.Type != "first" {
|
|
t.Errorf("Expected event type 'first', got '%s'", evt.Type)
|
|
}
|
|
if string(evt.Data) != "data1\n" {
|
|
t.Errorf("Expected data 'data1\\n', got '%s'", string(evt.Data))
|
|
}
|
|
|
|
// Second event
|
|
if !decoder.Next() {
|
|
t.Fatal("Expected Next() to return true for second event")
|
|
}
|
|
evt = decoder.Event()
|
|
if evt.Type != "second" {
|
|
t.Errorf("Expected event type 'second', got '%s'", evt.Type)
|
|
}
|
|
if string(evt.Data) != "data2\n" {
|
|
t.Errorf("Expected data 'data2\\n', got '%s'", string(evt.Data))
|
|
}
|
|
|
|
// No more events
|
|
if decoder.Next() {
|
|
t.Error("Expected Next() to return false at end of stream")
|
|
}
|
|
|
|
if err := decoder.Err(); err != nil {
|
|
t.Errorf("Expected no error, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestUnboundedDecoder_MultilineData(t *testing.T) {
|
|
data := "event: multiline\ndata: line1\ndata: line2\ndata: line3\n\n"
|
|
rc := io.NopCloser(strings.NewReader(data))
|
|
decoder := NewUnboundedDecoder(rc)
|
|
|
|
if !decoder.Next() {
|
|
t.Fatal("Expected Next() to return true")
|
|
}
|
|
|
|
evt := decoder.Event()
|
|
if evt.Type != "multiline" {
|
|
t.Errorf("Expected event type 'multiline', got '%s'", evt.Type)
|
|
}
|
|
|
|
expectedData := "line1\nline2\nline3\n"
|
|
if string(evt.Data) != expectedData {
|
|
t.Errorf("Expected data '%s', got '%s'", expectedData, string(evt.Data))
|
|
}
|
|
}
|
|
|
|
func TestUnboundedDecoder_Comments(t *testing.T) {
|
|
data := ": this is a comment\nevent: test\n: another comment\ndata: hello\n\n"
|
|
rc := io.NopCloser(strings.NewReader(data))
|
|
decoder := NewUnboundedDecoder(rc)
|
|
|
|
if !decoder.Next() {
|
|
t.Fatal("Expected Next() to return true")
|
|
}
|
|
|
|
evt := decoder.Event()
|
|
if evt.Type != "test" {
|
|
t.Errorf("Expected event type 'test', got '%s'", evt.Type)
|
|
}
|
|
if string(evt.Data) != "hello\n" {
|
|
t.Errorf("Expected data 'hello\\n', got '%s'", string(evt.Data))
|
|
}
|
|
}
|
|
|
|
func TestUnboundedDecoder_NoEventType(t *testing.T) {
|
|
data := "data: hello\n\n"
|
|
rc := io.NopCloser(strings.NewReader(data))
|
|
decoder := NewUnboundedDecoder(rc)
|
|
|
|
if !decoder.Next() {
|
|
t.Fatal("Expected Next() to return true")
|
|
}
|
|
|
|
evt := decoder.Event()
|
|
if evt.Type != "" {
|
|
t.Errorf("Expected empty event type, got '%s'", evt.Type)
|
|
}
|
|
if string(evt.Data) != "hello\n" {
|
|
t.Errorf("Expected data 'hello\\n', got '%s'", string(evt.Data))
|
|
}
|
|
}
|
|
|
|
func BenchmarkUnboundedDecoder_LargeEvent(b *testing.B) {
|
|
// Create a 10MB event for benchmarking
|
|
size := 10 * 1024 * 1024
|
|
largeData := strings.Repeat("x", size)
|
|
|
|
var buf bytes.Buffer
|
|
buf.WriteString("event: bench\n")
|
|
buf.WriteString("data: ")
|
|
buf.WriteString(largeData)
|
|
buf.WriteString("\n\n")
|
|
|
|
data := buf.Bytes()
|
|
|
|
b.ResetTimer()
|
|
b.SetBytes(int64(len(data)))
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
rc := io.NopCloser(bytes.NewReader(data))
|
|
decoder := NewUnboundedDecoder(rc)
|
|
|
|
if !decoder.Next() {
|
|
b.Fatal("Expected Next() to return true")
|
|
}
|
|
|
|
_ = decoder.Event()
|
|
}
|
|
}
|