1eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Blockdescription("createDocument tests modeled after mozilla's testing");
2eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block
3eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Blockfunction stringForExceptionCode(c)
4eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block{
5eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block    var exceptionName;
6eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block    switch(c) {
7eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        case DOMException.INVALID_CHARACTER_ERR:
8eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block            exceptionName = "INVALID_CHARACTER_ERR";
9eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block            break;
10eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        case DOMException.NAMESPACE_ERR:
11eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block            exceptionName = "NAMESPACE_ERR";
12eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block    }
13eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block    if (exceptionName)
14eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        return exceptionName; // + "(" + c + ")";
15eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block    return c;
16eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block}
17eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block
18eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Blockfunction assertEquals(actual, expect, m)
19eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block{
20eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block    if (actual !== expect) {
21eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        m += "; expected " + stringForExceptionCode(expect) + ", threw " + stringForExceptionCode(actual);
22eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        testFailed(m);
23eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block    } else {
24eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        m += "; threw " + stringForExceptionCode(actual);;
25eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        testPassed(m);
26eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block    }
27eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block}
28eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block
29eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Blockvar allTests = [
30eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: [undefined, undefined], code: 5  },
31eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: [null, undefined], code: 5  },
32eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: [undefined, null], code: 5 },
33eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: [undefined, undefined, null], code: 5 },
34eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: [null, null], code: 5 },
35eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: [null, null, null], code: 5 },
36eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: [null, ""], code: 5 },
37eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: ["", null], code: 5 },
38eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: ["", ""], code: 5 },
39eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: ["a:", null, null], code: 14 },
40eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: [":foo", null, null], code: 14 },
41eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: [":", null, null], code: 14 },
42eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: ["foo", null, null] },
43eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: ["foo:bar", null, null] },
44eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: ["foo::bar", null, null], code: 14 },
45eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: ["\t:bar", null, null], code: 5 },
46eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: ["foo:\t", null, null], code: 5 },
47eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: ["foo :bar", null, null], code: 5 },
48eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: ["foo: bar", null, null], code: 5 },
49eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block   { args: ["a:b:c", null, null], code: 14, message: "valid XML name, invalid QName" },
50eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block];
51eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block
52eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Blockfunction sourceify(v)
53eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block{
54eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block    switch (typeof v) {
55eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        case "undefined":
56eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block            return v;
57eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        case "string":
58eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block            return '"' + v.replace('"', '\\"') + '"';
59eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        default:
60eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block            return String(v);
61eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block    }
62eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block}
63eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block
64eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Blockfunction sourceifyArgs(args)
65eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block{
66eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block    var copy = new Array(args.length);
67eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block    for (var i = 0, sz = args.length; i < sz; i++)
68eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        copy[i] = sourceify(args[i]);
69eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block
70eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block    return copy.join(", ");
71eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block}
72eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block
73eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Blockfunction runTests(tests, createFunctionName)
74eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block{
75eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block    for (var i = 0, sz = tests.length; i < sz; i++) {
76eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        var test = tests[i];
77eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block
78eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        var code = -1;
79eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        var argStr = sourceifyArgs(test.args);
80eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        var msg = createFunctionName + "(" + argStr + ")";
81eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        if ("message" in test)
82eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block            msg += "; " + test.message;
83eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        try {
84eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block            document.implementation[createFunctionName].apply(document.implementation, test.args);
85eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block            if ('code' in test)
86eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block                testFailed(msg + " expected exception: " + test.code);
87eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block            else
88eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block                testPassed(msg);
89eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        } catch (e) {
90eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block            assertEquals(e.code, test.code || "expected no exception", msg);
91eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block        }
92eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block    }
93eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block}
94eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block
95eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block// Moz throws a "Not enough arguments" exception in these, we don't:
96eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve BlockshouldBeEqualToString("document.implementation.createDocumentType('foo').toString()", "[object DocumentType]");
97eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve BlockshouldBeEqualToString("document.implementation.createDocumentType('foo', null).toString()", "[object DocumentType]");
98eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve BlockrunTests(allTests, "createDocumentType");
99eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Block
100eff69b907ef2cd3a9af0351287a929c66f58e3f6Steve Blockvar successfullyParsed = true;
101