@@ -33,30 +33,90 @@ func (t *toks) Token() (Token, error) {
33
33
34
34
func TestDecodeEOF (t * testing.T ) {
35
35
start := StartElement {Name : Name {Local : "test" }}
36
- t .Run ("EarlyEOF" , func (t * testing.T ) {
37
- d := NewTokenDecoder (& toks {earlyEOF : true , t : []Token {
38
- start ,
39
- start .End (),
40
- }})
41
- err := d .Decode (& struct {
42
- XMLName Name `xml:"test"`
43
- }{})
44
- if err != nil {
45
- t .Error (err )
36
+ tests := []struct {
37
+ name string
38
+ tokens []Token
39
+ ok bool
40
+ }{
41
+ {
42
+ name : "OK" ,
43
+ tokens : []Token {
44
+ start ,
45
+ start .End (),
46
+ },
47
+ ok : true ,
48
+ },
49
+ {
50
+ name : "Malformed" ,
51
+ tokens : []Token {
52
+ start ,
53
+ StartElement {Name : Name {Local : "bad" }},
54
+ start .End (),
55
+ },
56
+ ok : false ,
57
+ },
58
+ }
59
+ for _ , tc := range tests {
60
+ for _ , eof := range []bool {true , false } {
61
+ name := fmt .Sprintf ("%s/earlyEOF=%v" , tc .name , eof )
62
+ t .Run (name , func (t * testing.T ) {
63
+ d := NewTokenDecoder (& toks {
64
+ earlyEOF : eof ,
65
+ t : tc .tokens ,
66
+ })
67
+ err := d .Decode (& struct {
68
+ XMLName Name `xml:"test"`
69
+ }{})
70
+ if tc .ok && err != nil {
71
+ t .Fatalf ("d.Decode: expected nil error, got %v" , err )
72
+ }
73
+ if _ , ok := err .(* SyntaxError ); ! tc .ok && ! ok {
74
+ t .Errorf ("d.Decode: expected syntax error, got %v" , err )
75
+ }
76
+ })
46
77
}
47
- })
48
- t .Run ("LateEOF" , func (t * testing.T ) {
49
- d := NewTokenDecoder (& toks {t : []Token {
50
- start ,
51
- start .End (),
52
- }})
53
- err := d .Decode (& struct {
54
- XMLName Name `xml:"test"`
55
- }{})
56
- if err != nil {
57
- t .Error (err )
78
+ }
79
+ }
80
+
81
+ type toksNil struct {
82
+ returnEOF bool
83
+ t []Token
84
+ }
85
+
86
+ func (t * toksNil ) Token () (Token , error ) {
87
+ if len (t .t ) == 0 {
88
+ if ! t .returnEOF {
89
+ // Return nil, nil before returning an EOF. It's legal, but
90
+ // discouraged.
91
+ t .returnEOF = true
92
+ return nil , nil
58
93
}
59
- })
94
+ return nil , io .EOF
95
+ }
96
+ var tok Token
97
+ tok , t .t = t .t [0 ], t .t [1 :]
98
+ return tok , nil
99
+ }
100
+
101
+ func TestDecodeNilToken (t * testing.T ) {
102
+ for _ , strict := range []bool {true , false } {
103
+ name := fmt .Sprintf ("Strict=%v" , strict )
104
+ t .Run (name , func (t * testing.T ) {
105
+ start := StartElement {Name : Name {Local : "test" }}
106
+ bad := StartElement {Name : Name {Local : "bad" }}
107
+ d := NewTokenDecoder (& toksNil {
108
+ // Malformed
109
+ t : []Token {start , bad , start .End ()},
110
+ })
111
+ d .Strict = strict
112
+ err := d .Decode (& struct {
113
+ XMLName Name `xml:"test"`
114
+ }{})
115
+ if _ , ok := err .(* SyntaxError ); ! ok {
116
+ t .Errorf ("d.Decode: expected syntax error, got %v" , err )
117
+ }
118
+ })
119
+ }
60
120
}
61
121
62
122
const testInput = `
0 commit comments