源码索引 / CURRENT IMPLEMENTATION
learning/go-patterns/patterns/ownership/resource_test.go
43 行 · 点击行号可定位;函数链接随声明位置更新,不手填行号。
跳到函数 / 声明
package ownership
import (
"errors"
"io"
"strings"
"testing"
)
type ownedReader struct {
io.Reader
closed bool
closeErr error
}
func (r *ownedReader) Close() error { r.closed = true; return r.closeErr }
type failedReader struct{ err error }
func (r failedReader) Read([]byte) (int, error) { return 0, r.err }
func TestReadOwned(t *testing.T) {
r := &ownedReader{Reader: strings.NewReader("book")}
data, err := ReadOwned(func() (io.ReadCloser, error) { return r, nil })
if err != nil || string(data) != "book" || !r.closed {
t.Fatalf("data=%q err=%v closed=%v", data, err, r.closed)
}
}
func TestReadOwnedPreservesReadAndCloseErrors(t *testing.T) {
readErr, closeErr := errors.New("read"), errors.New("close")
r := &ownedReader{Reader: failedReader{readErr}, closeErr: closeErr}
_, err := ReadOwned(func() (io.ReadCloser, error) { return r, nil })
if !r.closed || !errors.Is(err, readErr) || !errors.Is(err, closeErr) {
t.Fatalf("closed=%v err=%v", r.closed, err)
}
}
func TestReadOwnedOpenError(t *testing.T) {
want := errors.New("open")
_, err := ReadOwned(func() (io.ReadCloser, error) { return nil, want })
if !errors.Is(err, want) {
t.Fatal(err)
}
}