html: support #script-(on|off) directives for tests
Those directives are now supported by html5lib-tests.
See: https://github.com/html5lib/html5lib-tests/blob/e52ff68cc7113a6ef3687747fa82691079bf9cc5/tree-construction/README.md
Also, this fixes missing opts on parsing for identical check
Change-Id: I92f2398ebda0477fd7f6bb438c54f3948063c08d
Reviewed-on: https://go-review.googlesource.com/c/net/+/206118
Run-TryBot: Kunpei Sakai <namusyaka@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Nigel Tao <nigeltao@golang.org>
diff --git a/html/parse_test.go b/html/parse_test.go
index b16d69a..0d70c9c 100644
--- a/html/parse_test.go
+++ b/html/parse_test.go
@@ -21,66 +21,92 @@
"golang.org/x/net/html/atom"
)
+type testAttrs struct {
+ text, want, context string
+ scripting bool
+}
+
// readParseTest reads a single test case from r.
-func readParseTest(r *bufio.Reader) (text, want, context string, err error) {
+func readParseTest(r *bufio.Reader) (*testAttrs, error) {
+ ta := &testAttrs{scripting: true}
line, err := r.ReadSlice('\n')
if err != nil {
- return "", "", "", err
+ return nil, err
}
var b []byte
// Read the HTML.
if string(line) != "#data\n" {
- return "", "", "", fmt.Errorf(`got %q want "#data\n"`, line)
+ return nil, fmt.Errorf(`got %q want "#data\n"`, line)
}
for {
line, err = r.ReadSlice('\n')
if err != nil {
- return "", "", "", err
+ return nil, err
}
if line[0] == '#' {
break
}
b = append(b, line...)
}
- text = strings.TrimSuffix(string(b), "\n")
+ ta.text = strings.TrimSuffix(string(b), "\n")
b = b[:0]
// Skip the error list.
if string(line) != "#errors\n" {
- return "", "", "", fmt.Errorf(`got %q want "#errors\n"`, line)
+ return nil, fmt.Errorf(`got %q want "#errors\n"`, line)
}
for {
line, err = r.ReadSlice('\n')
if err != nil {
- return "", "", "", err
+ return nil, err
}
if line[0] == '#' {
break
}
}
+ if ls := string(line); strings.HasPrefix(ls, "#script-") {
+ switch {
+ case strings.HasSuffix(ls, "-on\n"):
+ ta.scripting = true
+ case strings.HasSuffix(ls, "-off\n"):
+ ta.scripting = false
+ default:
+ return nil, fmt.Errorf(`got %q, want "#script-on" or "#script-off"`, line)
+ }
+ for {
+ line, err = r.ReadSlice('\n')
+ if err != nil {
+ return nil, err
+ }
+ if line[0] == '#' {
+ break
+ }
+ }
+ }
+
if string(line) == "#document-fragment\n" {
line, err = r.ReadSlice('\n')
if err != nil {
- return "", "", "", err
+ return nil, err
}
- context = strings.TrimSpace(string(line))
+ ta.context = strings.TrimSpace(string(line))
line, err = r.ReadSlice('\n')
if err != nil {
- return "", "", "", err
+ return nil, err
}
}
// Read the dump of what the parse tree should be.
if string(line) != "#document\n" {
- return "", "", "", fmt.Errorf(`got %q want "#document\n"`, line)
+ return nil, fmt.Errorf(`got %q want "#document\n"`, line)
}
inQuote := false
for {
line, err = r.ReadSlice('\n')
if err != nil && err != io.EOF {
- return "", "", "", err
+ return nil, err
}
trimmed := bytes.Trim(line, "| \n")
if len(trimmed) > 0 {
@@ -96,7 +122,8 @@
}
b = append(b, line...)
}
- return text, string(b), context, nil
+ ta.want = string(b)
+ return ta, nil
}
func dumpIndent(w io.Writer, level int) {
@@ -220,7 +247,7 @@
r := bufio.NewReader(f)
for i := 0; ; i++ {
- text, want, context, err := readParseTest(r)
+ ta, err := readParseTest(r)
if err == io.EOF {
break
}
@@ -228,10 +255,10 @@
t.Fatal(err)
}
- err = testParseCase(text, want, context)
+ err = testParseCase(ta.text, ta.want, ta.context, ParseOptionEnableScripting(ta.scripting))
if err != nil {
- t.Errorf("%s test #%d %q, %s", tf, i, text, err)
+ t.Errorf("%s test #%d %q, %s", tf, i, ta.text, err)
}
}
}
@@ -319,7 +346,7 @@
go func() {
pw.CloseWithError(Render(pw, doc))
}()
- doc1, err := Parse(pr)
+ doc1, err := ParseWithOptions(pr, opts...)
if err != nil {
return err
}