diff options
Diffstat (limited to 'dom/base/test/unit/test_nodelist.js')
-rw-r--r-- | dom/base/test/unit/test_nodelist.js | 345 |
1 files changed, 345 insertions, 0 deletions
diff --git a/dom/base/test/unit/test_nodelist.js b/dom/base/test/unit/test_nodelist.js new file mode 100644 index 0000000000..0ad24b9bd5 --- /dev/null +++ b/dom/base/test/unit/test_nodelist.js @@ -0,0 +1,345 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +function run_test() { + test_getElementsByTagName(); + test_getElementsByTagNameNS(); + test_getElementsByAttribute(); + test_getElementsByAttributeNS(); + + // What else should we test? + // XXXbz we need more tests here to test liveness! +} + +function test_getElementsByTagName() { + var doc = ParseFile("nodelist_data_1.xml"); + var root = doc.documentElement; + + // Check that getElementsByTagName returns an HTMLCollection. + Assert.equal( + ChromeUtils.getClassName(doc.getElementsByTagName("*")), + "HTMLCollection" + ); + Assert.ok( + ChromeUtils.getClassName(root.getElementsByTagName("*")), + "HTMLCollection" + ); + + // Check that getElementsByTagName excludes the element it's called on. + Assert.equal( + doc.getElementsByTagName("*").length, + root.getElementsByTagName("*").length + 1 + ); + Assert.equal(doc.getElementById("test2").getElementsByTagName("*").length, 8); + Assert.equal( + doc.getElementById("test2").getElementsByTagName("test").length, + 3 + ); + + // Check that the first element of getElementsByTagName on the document is + // the right thing. + Assert.equal(doc.getElementsByTagName("*").item(0), root); + + // Check that we get the right things in the right order + var numTests = doc.getElementsByTagName("test").length; + Assert.equal(numTests, 5); + + for (var i = 1; i <= numTests; ++i) { + Assert.ok(Element.isInstance(doc.getElementById("test" + i))); + Assert.equal( + doc.getElementById("test" + i), + doc.getElementsByTagName("test").item(i - 1) + ); + } + + // Check that we handle tagnames containing ':' correctly + Assert.equal( + ChromeUtils.getClassName(doc.getElementsByTagName("foo:test")), + "HTMLCollection" + ); + Assert.equal(doc.getElementsByTagName("foo:test").length, 2); + + Assert.equal( + ChromeUtils.getClassName(doc.getElementsByTagName("foo2:test")), + "HTMLCollection" + ); + Assert.equal(doc.getElementsByTagName("foo2:test").length, 3); + + Assert.equal( + ChromeUtils.getClassName(doc.getElementsByTagName("bar:test")), + "HTMLCollection" + ); + Assert.equal(doc.getElementsByTagName("bar:test").length, 4); +} + +function test_getElementsByTagNameNS() { + var doc = ParseFile("nodelist_data_1.xml"); + var root = doc.documentElement; + + // Check that getElementsByTagNameNS returns an HTMLCollection. + Assert.equal( + ChromeUtils.getClassName(doc.getElementsByTagNameNS("*", "*")), + "HTMLCollection" + ); + Assert.equal( + ChromeUtils.getClassName(root.getElementsByTagNameNS("*", "*")), + "HTMLCollection" + ); + + // Check that passing "" and null for the namespace URI gives the same result + var list1 = doc.getElementsByTagNameNS("", "test"); + var list2 = doc.getElementsByTagNameNS(null, "test"); + Assert.equal(list1.length, list2.length); + for (var i = 0; i < list1.length; ++i) { + Assert.equal(list1.item(i), list2.item(i)); + } + + // Check that getElementsByTagNameNS excludes the element it's called on. + Assert.equal( + doc.getElementsByTagNameNS("*", "*").length, + root.getElementsByTagNameNS("*", "*").length + 1 + ); + Assert.equal( + doc.getElementById("test2").getElementsByTagNameNS("*", "*").length, + 8 + ); + Assert.equal( + doc.getElementById("test2").getElementsByTagNameNS("", "test").length, + 1 + ); + Assert.equal( + doc.getElementById("test2").getElementsByTagNameNS("*", "test").length, + 7 + ); + + // Check that the first element of getElementsByTagNameNS on the document is + // the right thing. + Assert.equal(doc.getElementsByTagNameNS("*", "*").item(0), root); + Assert.equal(doc.getElementsByTagNameNS(null, "*").item(0), root); + + // Check that we get the right things in the right order + + var numTests = doc.getElementsByTagNameNS("*", "test").length; + Assert.equal(numTests, 14); + + for (i = 1; i <= numTests; ++i) { + Assert.ok(Element.isInstance(doc.getElementById("test" + i))); + Assert.equal( + doc.getElementById("test" + i), + doc.getElementsByTagNameNS("*", "test").item(i - 1) + ); + } + + // Check general proper functioning of having a non-wildcard namespace. + var test2 = doc.getElementById("test2"); + Assert.equal(doc.getElementsByTagNameNS("", "test").length, 3); + Assert.equal(test2.getElementsByTagNameNS("", "test").length, 1); + Assert.equal(doc.getElementsByTagNameNS("foo", "test").length, 7); + Assert.equal(test2.getElementsByTagNameNS("foo", "test").length, 4); + Assert.equal(doc.getElementsByTagNameNS("foo2", "test").length, 0); + Assert.equal(test2.getElementsByTagNameNS("foo2", "test").length, 0); + Assert.equal(doc.getElementsByTagNameNS("bar", "test").length, 4); + Assert.equal(test2.getElementsByTagNameNS("bar", "test").length, 2); + + // Check that we handle tagnames containing ':' correctly + Assert.equal( + ChromeUtils.getClassName(doc.getElementsByTagNameNS(null, "foo:test")), + "HTMLCollection" + ); + Assert.equal(doc.getElementsByTagNameNS(null, "foo:test").length, 0); + Assert.equal(doc.getElementsByTagNameNS("foo", "foo:test").length, 0); + Assert.equal(doc.getElementsByTagNameNS("bar", "foo:test").length, 0); + Assert.equal(doc.getElementsByTagNameNS("*", "foo:test").length, 0); + + Assert.equal( + ChromeUtils.getClassName(doc.getElementsByTagNameNS(null, "foo2:test")), + "HTMLCollection" + ); + Assert.equal(doc.getElementsByTagNameNS(null, "foo2:test").length, 0); + Assert.equal(doc.getElementsByTagNameNS("foo2", "foo2:test").length, 0); + Assert.equal(doc.getElementsByTagNameNS("bar", "foo2:test").length, 0); + Assert.equal(doc.getElementsByTagNameNS("*", "foo2:test").length, 0); + + Assert.equal( + ChromeUtils.getClassName(doc.getElementsByTagNameNS(null, "bar:test")), + "HTMLCollection" + ); + Assert.equal(doc.getElementsByTagNameNS(null, "bar:test").length, 0); + Assert.equal(doc.getElementsByTagNameNS("bar", "bar:test").length, 0); + Assert.equal(doc.getElementsByTagNameNS("*", "bar:test").length, 0); + + // Check that previously-unknown namespaces are handled right. Note that we + // can just hardcode the strings, since we're running only once in XPCshell. + // If someone wants to run these in a browser, some use of Math.random() may + // be in order. + list1 = doc.getElementsByTagNameNS("random-bogus-namespace", "foo"); + list2 = doc.documentElement.getElementsByTagNameNS( + "random-bogus-namespace2", + "foo" + ); + Assert.notEqual(list1, list2); + Assert.equal(list1.length, 0); + Assert.equal(list2.length, 0); + var newNode = doc.createElementNS("random-bogus-namespace", "foo"); + doc.documentElement.appendChild(newNode); + newNode = doc.createElementNS("random-bogus-namespace2", "foo"); + doc.documentElement.appendChild(newNode); + Assert.equal(list1.length, 1); + Assert.equal(list2.length, 1); +} + +function test_getElementsByAttribute() { + var doc = ParseFile("nodelist_data_2.xhtml"); + var root = doc.documentElement; + + Assert.equal(ChromeUtils.getClassName(root), "XULElement"); + + Assert.equal( + ChromeUtils.getClassName(root.getElementsByAttribute("foo", "foo")), + "HTMLCollection" + ); + + var master1 = doc.getElementById("master1"); + var master2 = doc.getElementById("master2"); + var master3 = doc.getElementById("master3"); + var external = doc.getElementById("external"); + + Assert.equal(ChromeUtils.getClassName(master1), "XULElement"); + Assert.equal(ChromeUtils.getClassName(master2), "XULElement"); + Assert.equal(ChromeUtils.getClassName(master3), "XULElement"); + Assert.equal(ChromeUtils.getClassName(external), "XULElement"); + + // Basic tests + Assert.equal(root.getElementsByAttribute("foo", "foo").length, 14); + Assert.equal(master1.getElementsByAttribute("foo", "foo").length, 4); + + Assert.equal(root.getElementsByAttribute("foo", "bar").length, 7); + Assert.equal(master1.getElementsByAttribute("foo", "bar").length, 2); + + Assert.equal(root.getElementsByAttribute("bar", "bar").length, 7); + Assert.equal(master1.getElementsByAttribute("bar", "bar").length, 2); + + Assert.equal(root.getElementsByAttribute("foo", "*").length, 21); + Assert.equal(master1.getElementsByAttribute("foo", "*").length, 6); + + // Test the various combinations of attributes with colons in the name + Assert.equal(root.getElementsByAttribute("foo:foo", "foo").length, 16); + Assert.equal(master1.getElementsByAttribute("foo:foo", "foo").length, 5); + Assert.equal(master2.getElementsByAttribute("foo:foo", "foo").length, 4); + Assert.equal(master3.getElementsByAttribute("foo:foo", "foo").length, 4); + Assert.equal(external.getElementsByAttribute("foo:foo", "foo").length, 2); + + Assert.equal(root.getElementsByAttribute("foo:foo", "bar").length, 9); + Assert.equal(master1.getElementsByAttribute("foo:foo", "bar").length, 2); + Assert.equal(master2.getElementsByAttribute("foo:foo", "bar").length, 3); + Assert.equal(master3.getElementsByAttribute("foo:foo", "bar").length, 2); + Assert.equal(external.getElementsByAttribute("foo:foo", "bar").length, 1); + + Assert.equal(root.getElementsByAttribute("foo:bar", "foo").length, 7); + Assert.equal(master1.getElementsByAttribute("foo:bar", "foo").length, 2); + Assert.equal(master2.getElementsByAttribute("foo:bar", "foo").length, 2); + Assert.equal(master3.getElementsByAttribute("foo:bar", "foo").length, 2); + Assert.equal(external.getElementsByAttribute("foo:bar", "foo").length, 1); + + Assert.equal(root.getElementsByAttribute("foo:bar", "bar").length, 14); + Assert.equal(master1.getElementsByAttribute("foo:bar", "bar").length, 4); + Assert.equal(master2.getElementsByAttribute("foo:bar", "bar").length, 4); + Assert.equal(master3.getElementsByAttribute("foo:bar", "bar").length, 4); + Assert.equal(external.getElementsByAttribute("foo:bar", "bar").length, 2); + + Assert.equal(root.getElementsByAttribute("foo2:foo", "foo").length, 8); + Assert.equal(master1.getElementsByAttribute("foo2:foo", "foo").length, 2); + Assert.equal(master2.getElementsByAttribute("foo2:foo", "foo").length, 2); + Assert.equal(master3.getElementsByAttribute("foo2:foo", "foo").length, 3); + Assert.equal(external.getElementsByAttribute("foo2:foo", "foo").length, 1); + + Assert.equal(root.getElementsByAttribute("foo:foo", "*").length, 25); + Assert.equal(master1.getElementsByAttribute("foo:foo", "*").length, 7); + Assert.equal(master2.getElementsByAttribute("foo:foo", "*").length, 7); + Assert.equal(master3.getElementsByAttribute("foo:foo", "*").length, 6); + Assert.equal(external.getElementsByAttribute("foo:foo", "*").length, 3); + + Assert.equal(root.getElementsByAttribute("foo2:foo", "bar").length, 0); + Assert.equal(root.getElementsByAttribute("foo:foo", "baz").length, 0); +} + +function test_getElementsByAttributeNS() { + var doc = ParseFile("nodelist_data_2.xhtml"); + var root = doc.documentElement; + + Assert.equal(ChromeUtils.getClassName(root), "XULElement"); + + // Check that getElementsByAttributeNS returns an HTMLCollection. + Assert.equal( + ChromeUtils.getClassName(root.getElementsByAttributeNS("*", "*", "*")), + "HTMLCollection" + ); + + var master1 = doc.getElementById("master1"); + var master2 = doc.getElementById("master2"); + var master3 = doc.getElementById("master3"); + var external = doc.getElementById("external"); + + Assert.equal(ChromeUtils.getClassName(master1), "XULElement"); + Assert.equal(ChromeUtils.getClassName(master2), "XULElement"); + Assert.equal(ChromeUtils.getClassName(master3), "XULElement"); + Assert.equal(ChromeUtils.getClassName(external), "XULElement"); + + // Test wildcard namespace + Assert.equal(root.getElementsByAttributeNS("*", "foo", "foo").length, 38); + Assert.equal(master1.getElementsByAttributeNS("*", "foo", "foo").length, 11); + Assert.equal(master2.getElementsByAttributeNS("*", "foo", "foo").length, 10); + Assert.equal(master3.getElementsByAttributeNS("*", "foo", "foo").length, 11); + + Assert.equal(root.getElementsByAttributeNS("*", "foo", "bar").length, 16); + Assert.equal(master1.getElementsByAttributeNS("*", "foo", "bar").length, 4); + Assert.equal(master2.getElementsByAttributeNS("*", "foo", "bar").length, 5); + Assert.equal(master3.getElementsByAttributeNS("*", "foo", "bar").length, 4); + + Assert.equal(root.getElementsByAttributeNS("*", "bar", "bar").length, 21); + Assert.equal(master1.getElementsByAttributeNS("*", "bar", "bar").length, 6); + Assert.equal(master2.getElementsByAttributeNS("*", "bar", "bar").length, 6); + Assert.equal(master3.getElementsByAttributeNS("*", "bar", "bar").length, 6); + + Assert.equal(root.getElementsByAttributeNS("*", "foo", "*").length, 54); + Assert.equal(master1.getElementsByAttributeNS("*", "foo", "*").length, 15); + Assert.equal(master2.getElementsByAttributeNS("*", "foo", "*").length, 15); + Assert.equal(master3.getElementsByAttributeNS("*", "foo", "*").length, 15); + + // Test null namespace. This should be the same as getElementsByAttribute. + Assert.equal( + root.getElementsByAttributeNS("", "foo", "foo").length, + root.getElementsByAttribute("foo", "foo").length + ); + Assert.equal( + master1.getElementsByAttributeNS("", "foo", "foo").length, + master1.getElementsByAttribute("foo", "foo").length + ); + Assert.equal( + master2.getElementsByAttributeNS("", "foo", "foo").length, + master2.getElementsByAttribute("foo", "foo").length + ); + Assert.equal( + master3.getElementsByAttributeNS("", "foo", "foo").length, + master3.getElementsByAttribute("foo", "foo").length + ); + + // Test namespace "foo" + Assert.equal(root.getElementsByAttributeNS("foo", "foo", "foo").length, 24); + Assert.equal(master1.getElementsByAttributeNS("foo", "foo", "foo").length, 7); + Assert.equal(master2.getElementsByAttributeNS("foo", "foo", "foo").length, 6); + Assert.equal(master3.getElementsByAttributeNS("foo", "foo", "foo").length, 7); + + Assert.equal(root.getElementsByAttributeNS("foo", "foo", "bar").length, 9); + Assert.equal(master1.getElementsByAttributeNS("foo", "foo", "bar").length, 2); + Assert.equal(master2.getElementsByAttributeNS("foo", "foo", "bar").length, 3); + Assert.equal(master3.getElementsByAttributeNS("foo", "foo", "bar").length, 2); + + Assert.equal(root.getElementsByAttributeNS("foo", "bar", "foo").length, 7); + Assert.equal(master1.getElementsByAttributeNS("foo", "bar", "foo").length, 2); + Assert.equal(master2.getElementsByAttributeNS("foo", "bar", "foo").length, 2); + Assert.equal(master3.getElementsByAttributeNS("foo", "bar", "foo").length, 2); + + Assert.equal(root.getElementsByAttributeNS("foo", "bar", "bar").length, 14); + Assert.equal(master1.getElementsByAttributeNS("foo", "bar", "bar").length, 4); + Assert.equal(master2.getElementsByAttributeNS("foo", "bar", "bar").length, 4); + Assert.equal(master3.getElementsByAttributeNS("foo", "bar", "bar").length, 4); +} |