PPysolate SpineREAD THE CODE · UNDERSTAND THE SYSTEM
课程与章节
源码索引 / 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)
	}
}