56 lines
1.3 KiB
Go
56 lines
1.3 KiB
Go
package claude
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"strings"
|
||
|
|
"testing"
|
||
|
|
"time"
|
||
|
|
)
|
||
|
|
|
||
|
|
func TestBadLines(t *testing.T) {
|
||
|
|
bad := []string{}
|
||
|
|
s := &Session{
|
||
|
|
events: make(chan Event, 16),
|
||
|
|
done: make(chan struct{}),
|
||
|
|
onBadLine: func(line []byte, reason string) {
|
||
|
|
bad = append(bad, string(line)+" | "+reason)
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
input := strings.Join([]string{
|
||
|
|
`{"type":"assistant","message":{"content":[]}}`,
|
||
|
|
``,
|
||
|
|
`warning: something on stdout`,
|
||
|
|
`{"type":"assistant",`,
|
||
|
|
`{"type":"mystery","x":1}`,
|
||
|
|
`{"type":"keep_alive"}`,
|
||
|
|
`{"type":"tool_progress","heartbeat":true}`,
|
||
|
|
}, "\n")
|
||
|
|
|
||
|
|
before := time.Now()
|
||
|
|
s.readLoop(strings.NewReader(input))
|
||
|
|
|
||
|
|
want := []string{
|
||
|
|
`warning: something on stdout | not a JSON object`,
|
||
|
|
`{"type":"assistant", | unexpected end of JSON input`,
|
||
|
|
`{"type":"mystery","x":1} | unrecognised type "mystery"`,
|
||
|
|
}
|
||
|
|
if strings.Join(bad, "\n") != strings.Join(want, "\n") {
|
||
|
|
t.Errorf("bad lines:\n%s\nwant:\n%s", strings.Join(bad, "\n"), strings.Join(want, "\n"))
|
||
|
|
}
|
||
|
|
|
||
|
|
types := []string{}
|
||
|
|
for ev := range s.events {
|
||
|
|
types = append(types, ev.Type)
|
||
|
|
}
|
||
|
|
if strings.Join(types, ",") != "assistant,mystery,tool_progress" {
|
||
|
|
t.Errorf("events = %v", types)
|
||
|
|
}
|
||
|
|
|
||
|
|
if s.LastLine().Before(before) {
|
||
|
|
t.Errorf("last line time %v not updated", s.LastLine())
|
||
|
|
}
|
||
|
|
if !s.Exited() {
|
||
|
|
t.Errorf("session not exited after stdout closed")
|
||
|
|
}
|
||
|
|
}
|