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