Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Lx9FNLG2CqeBbVGGd9bFsP
52 lines
986 B
Go
52 lines
986 B
Go
package cliout
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
type failAfter struct {
|
|
n int
|
|
buf bytes.Buffer
|
|
}
|
|
|
|
var errFull = errors.New("disk full")
|
|
|
|
func (f *failAfter) Write(p []byte) (int, error) {
|
|
if f.n <= 0 {
|
|
return 0, errFull
|
|
}
|
|
f.n--
|
|
return f.buf.Write(p)
|
|
}
|
|
|
|
func TestWriterPrintsAndReportsNoError(t *testing.T) {
|
|
var b bytes.Buffer
|
|
w := New(&b)
|
|
w.Printf("a=%d\n", 1)
|
|
w.Println("b", 2)
|
|
if _, err := w.Write([]byte("c\n")); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if w.Err() != nil || b.String() != "a=1\nb 2\nc\n" {
|
|
t.Fatalf("err=%v out=%q", w.Err(), b.String())
|
|
}
|
|
}
|
|
|
|
func TestWriterKeepsFirstErrorAndStopsWriting(t *testing.T) {
|
|
f := &failAfter{n: 1}
|
|
w := New(f)
|
|
w.Println("kept")
|
|
w.Printf("lost %s\n", "x")
|
|
w.Println("lost")
|
|
_, _ = w.Write([]byte("lost"))
|
|
if !errors.Is(w.Err(), errFull) {
|
|
t.Fatalf("err = %v", w.Err())
|
|
}
|
|
if got := f.buf.String(); !strings.HasPrefix(got, "kept") || strings.Contains(got, "lost") {
|
|
t.Fatalf("out = %q", got)
|
|
}
|
|
}
|