@@ -21,66 +21,92 @@ import (
21
21
"golang.org/x/net/html/atom"
22
22
)
23
23
24
+ type testAttrs struct {
25
+ text , want , context string
26
+ scripting bool
27
+ }
28
+
24
29
// readParseTest reads a single test case from r.
25
- func readParseTest (r * bufio.Reader ) (text , want , context string , err error ) {
30
+ func readParseTest (r * bufio.Reader ) (* testAttrs , error ) {
31
+ ta := & testAttrs {scripting : true }
26
32
line , err := r .ReadSlice ('\n' )
27
33
if err != nil {
28
- return "" , "" , "" , err
34
+ return nil , err
29
35
}
30
36
var b []byte
31
37
32
38
// Read the HTML.
33
39
if string (line ) != "#data\n " {
34
- return "" , "" , "" , fmt .Errorf (`got %q want "#data\n"` , line )
40
+ return nil , fmt .Errorf (`got %q want "#data\n"` , line )
35
41
}
36
42
for {
37
43
line , err = r .ReadSlice ('\n' )
38
44
if err != nil {
39
- return "" , "" , "" , err
45
+ return nil , err
40
46
}
41
47
if line [0 ] == '#' {
42
48
break
43
49
}
44
50
b = append (b , line ... )
45
51
}
46
- text = strings .TrimSuffix (string (b ), "\n " )
52
+ ta . text = strings .TrimSuffix (string (b ), "\n " )
47
53
b = b [:0 ]
48
54
49
55
// Skip the error list.
50
56
if string (line ) != "#errors\n " {
51
- return "" , "" , "" , fmt .Errorf (`got %q want "#errors\n"` , line )
57
+ return nil , fmt .Errorf (`got %q want "#errors\n"` , line )
52
58
}
53
59
for {
54
60
line , err = r .ReadSlice ('\n' )
55
61
if err != nil {
56
- return "" , "" , "" , err
62
+ return nil , err
57
63
}
58
64
if line [0 ] == '#' {
59
65
break
60
66
}
61
67
}
62
68
69
+ if ls := string (line ); strings .HasPrefix (ls , "#script-" ) {
70
+ switch {
71
+ case strings .HasSuffix (ls , "-on\n " ):
72
+ ta .scripting = true
73
+ case strings .HasSuffix (ls , "-off\n " ):
74
+ ta .scripting = false
75
+ default :
76
+ return nil , fmt .Errorf (`got %q, want "#script-on" or "#script-off"` , line )
77
+ }
78
+ for {
79
+ line , err = r .ReadSlice ('\n' )
80
+ if err != nil {
81
+ return nil , err
82
+ }
83
+ if line [0 ] == '#' {
84
+ break
85
+ }
86
+ }
87
+ }
88
+
63
89
if string (line ) == "#document-fragment\n " {
64
90
line , err = r .ReadSlice ('\n' )
65
91
if err != nil {
66
- return "" , "" , "" , err
92
+ return nil , err
67
93
}
68
- context = strings .TrimSpace (string (line ))
94
+ ta . context = strings .TrimSpace (string (line ))
69
95
line , err = r .ReadSlice ('\n' )
70
96
if err != nil {
71
- return "" , "" , "" , err
97
+ return nil , err
72
98
}
73
99
}
74
100
75
101
// Read the dump of what the parse tree should be.
76
102
if string (line ) != "#document\n " {
77
- return "" , "" , "" , fmt .Errorf (`got %q want "#document\n"` , line )
103
+ return nil , fmt .Errorf (`got %q want "#document\n"` , line )
78
104
}
79
105
inQuote := false
80
106
for {
81
107
line , err = r .ReadSlice ('\n' )
82
108
if err != nil && err != io .EOF {
83
- return "" , "" , "" , err
109
+ return nil , err
84
110
}
85
111
trimmed := bytes .Trim (line , "| \n " )
86
112
if len (trimmed ) > 0 {
@@ -96,7 +122,8 @@ func readParseTest(r *bufio.Reader) (text, want, context string, err error) {
96
122
}
97
123
b = append (b , line ... )
98
124
}
99
- return text , string (b ), context , nil
125
+ ta .want = string (b )
126
+ return ta , nil
100
127
}
101
128
102
129
func dumpIndent (w io.Writer , level int ) {
@@ -220,18 +247,18 @@ func TestParser(t *testing.T) {
220
247
r := bufio .NewReader (f )
221
248
222
249
for i := 0 ; ; i ++ {
223
- text , want , context , err := readParseTest (r )
250
+ ta , err := readParseTest (r )
224
251
if err == io .EOF {
225
252
break
226
253
}
227
254
if err != nil {
228
255
t .Fatal (err )
229
256
}
230
257
231
- err = testParseCase (text , want , context )
258
+ err = testParseCase (ta . text , ta . want , ta . context , ParseOptionEnableScripting ( ta . scripting ) )
232
259
233
260
if err != nil {
234
- t .Errorf ("%s test #%d %q, %s" , tf , i , text , err )
261
+ t .Errorf ("%s test #%d %q, %s" , tf , i , ta . text , err )
235
262
}
236
263
}
237
264
}
@@ -319,7 +346,7 @@ func testParseCase(text, want, context string, opts ...ParseOption) (err error)
319
346
go func () {
320
347
pw .CloseWithError (Render (pw , doc ))
321
348
}()
322
- doc1 , err := Parse (pr )
349
+ doc1 , err := ParseWithOptions (pr , opts ... )
323
350
if err != nil {
324
351
return err
325
352
}
0 commit comments