-
Notifications
You must be signed in to change notification settings - Fork 38
Expand file tree
/
Copy patherror_test.go
More file actions
103 lines (91 loc) · 2.33 KB
/
Copy patherror_test.go
File metadata and controls
103 lines (91 loc) · 2.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package form
import (
"errors"
"strings"
"testing"
)
func TestErrorIsTypedOnDecode(t *testing.T) {
var dst struct{ A int }
err := DecodeString(&dst, "B=1")
if err == nil {
t.Fatal("expected an error")
}
var fe *Error
if !errors.As(err, &fe) {
t.Fatalf("expected *form.Error, got %T", err)
}
if fe.Op != OpDecode {
t.Errorf("Op = %q, want decode", fe.Op)
}
if !strings.Contains(err.Error(), "doesn't exist") {
t.Errorf("message not preserved: %q", err.Error())
}
}
func TestErrorIsTypedOnEncode(t *testing.T) {
s := make([]interface{}, 1)
s[0] = s
if _, err := EncodeToString(s); err == nil {
t.Fatal("expected an error")
} else {
var fe *Error
if !errors.As(err, &fe) {
t.Fatalf("expected *form.Error, got %T", err)
}
if fe.Op != OpEncode {
t.Errorf("Op = %q, want encode", fe.Op)
}
}
}
type textFailer struct{}
var errTextFail = errors.New("text failer boom")
func (*textFailer) UnmarshalText([]byte) error { return errTextFail }
func TestErrorUnwrapReachesCause(t *testing.T) {
var dst struct{ F textFailer }
err := DecodeString(&dst, "F=x")
if err == nil {
t.Fatal("expected an error")
}
if !errors.Is(err, errTextFail) {
t.Fatalf("errors.Is could not reach cause; err=%v", err)
}
var fe *Error
if !errors.As(err, &fe) || fe.Err != errTextFail {
t.Fatalf("expected wrapped cause; got %#v", fe)
}
}
func TestErrorParseFailureIsTyped(t *testing.T) {
var dst struct{ A string }
err := DecodeString(&dst, "a=%zz") // url.ParseQuery fails
if err == nil {
t.Fatal("expected an error")
}
var fe *Error
if !errors.As(err, &fe) {
t.Fatalf("expected *form.Error, got %T", err)
}
if fe.Op != OpDecode {
t.Errorf("Op = %q, want decode", fe.Op)
}
if fe.Err == nil {
t.Errorf("underlying parse error not preserved (Err is nil)")
}
}
type failWriter struct{}
var errWriteFail = errors.New("write failed")
func (failWriter) Write([]byte) (int, error) { return 0, errWriteFail }
func TestErrorEncodeWriteFailureIsTyped(t *testing.T) {
err := NewEncoder(failWriter{}).Encode(struct{ A int }{1})
if err == nil {
t.Fatal("expected an error")
}
var fe *Error
if !errors.As(err, &fe) {
t.Fatalf("expected *form.Error, got %T", err)
}
if fe.Op != OpEncode {
t.Errorf("Op = %q, want encode", fe.Op)
}
if !errors.Is(err, errWriteFail) {
t.Errorf("underlying write error not reachable via errors.Is")
}
}