gecko-dev/dom/base/test/unit/test_nodelist.js

346 строки
14 KiB
JavaScript

/* -*- 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);
}