function testHTMLCollection(name, hooks) { test(() => { const nodes = { root: document.createElement("div"), div1: document.createElement("div"), div2: document.createElement("div"), p: document.createElement("p") }; nodes.div1.id = "div1"; nodes.div2.id = "div2"; const list = nodes.root.getElementsByTagName("div"); hooks.initial(list, nodes); nodes.root.appendChild(nodes.div1); nodes.root.appendChild(nodes.p); nodes.root.appendChild(nodes.div2); hooks.afterInsertion(list, nodes); nodes.root.removeChild(nodes.div1); hooks.afterRemoval(list, nodes); }, `HTMLCollection live mutations: ${name}`); } testHTMLCollection("HTMLCollection.length", { initial(list) { assert_equals(list.length, 0); }, afterInsertion(list) { assert_equals(list.length, 2); }, afterRemoval(list) { assert_equals(list.length, 1); } }); testHTMLCollection("HTMLCollection.item(index)", { initial(list) { assert_equals(list.item(0), null); }, afterInsertion(list, nodes) { assert_equals(list.item(0), nodes.div1); assert_equals(list.item(1), nodes.div2); }, afterRemoval(list, nodes) { assert_equals(list.item(0), nodes.div2); } }); testHTMLCollection("HTMLCollection[index]", { initial(list) { assert_equals(list[0], undefined); }, afterInsertion(list, nodes) { assert_equals(list[0], nodes.div1); assert_equals(list[1], nodes.div2); }, afterRemoval(list, nodes) { assert_equals(list[0], nodes.div2); } }); testHTMLCollection("HTMLCollection.namedItem(index)", { initial(list) { assert_equals(list.namedItem("div1"), null); assert_equals(list.namedItem("div2"), null); }, afterInsertion(list, nodes) { assert_equals(list.namedItem("div1"), nodes.div1); assert_equals(list.namedItem("div2"), nodes.div2); }, afterRemoval(list, nodes) { assert_equals(list.namedItem("div1"), null); assert_equals(list.namedItem("div2"), nodes.div2); } }); testHTMLCollection("HTMLCollection ownPropertyNames", { initial(list) { assert_object_equals(Object.getOwnPropertyNames(list), []); }, afterInsertion(list) { assert_object_equals(Object.getOwnPropertyNames(list), ["0", "1", "div1", "div2"]); }, afterRemoval(list) { assert_object_equals(Object.getOwnPropertyNames(list), ["0", "div2"]); } });