description(
"This test checks the behavior of the add() method on the select.options object.<br>" +
"It covers both the the one-argument (1.x) and two-argument (2.x) signatures of the add() method."
);
div = document.createElement("div");
sel = document.createElement("select");
sel.setAttribute("id", "select1");
div.appendChild(sel);
sel = document.createElement("select");
sel.setAttribute("id", "select2");
div.appendChild(sel);
document.body.insertBefore(div, document.getElementById("console").nextSibling);
debug("1.1 Add Option to empty Options");
var select1 = document.getElementById("select1");
var option1 = document.createElement("OPTION");
select1.options.add(option1);
option1.value = "1";
option1.textContent = "A";
shouldBe("select1.options.length", "1");
shouldBe("select1.selectedIndex", "0");
shouldBe("select1.options[0].value", "'1'");
shouldBe("select1.options[0].textContent", "'A'");
debug("");
debug("1.2 Add Option to non-empty Options");
option1 = document.createElement("OPTION");
select1.options.add(option1);
option1.value = "2";
option1.textContent = "B";
shouldBe("select1.options.length", "2");
shouldBe("select1.selectedIndex", "0");
shouldBe("select1.options[0].value", "'1'");
shouldBe("select1.options[0].textContent", "'A'");
shouldBe("select1.options[1].value", "'2'");
shouldBe("select1.options[1].textContent", "'B'");
debug("");
debug("1.3 Add Option after setting parameters");
option1 = document.createElement("OPTION");
option1.value = "3";
option1.textContent = "C";
select1.options.add(option1);
shouldBe("select1.options.length", "3");
shouldBe("select1.selectedIndex", "0");
shouldBe("select1.options[0].value", "'1'");
shouldBe("select1.options[0].textContent", "'A'");
shouldBe("select1.options[1].value", "'2'");
shouldBe("select1.options[1].textContent", "'B'");
shouldBe("select1.options[2].value", "'3'");
shouldBe("select1.options[2].textContent", "'C'");
debug("");
debug("1.4 Add a non-Option element");
option1 = document.createElement("DIV");
shouldThrow("select1.options.add(option1)");
shouldBe("select1.options.length", "3");
shouldBe("select1.selectedIndex", "0");
debug("");
debug("1.5 Add a non-element (string)");
option1 = "o";
shouldThrow("select1.options.add(option1)");
shouldBe("select1.options.length", "3");
shouldBe("select1.selectedIndex", "0");
debug("");
debug("1.6 Add a non-element (number)");
option1 = 3.14;
shouldThrow("select1.options.add(option1)");
shouldBe("select1.options.length", "3");
shouldBe("select1.selectedIndex", "0");
debug("");
debug("1.7 Add a non-element (boolean)");
option1 = true;
shouldThrow("select1.options.add(option1)");
shouldBe("select1.options.length", "3");
shouldBe("select1.selectedIndex", "0");
debug("");
debug("1.8 Add undefined");
option1 = undefined;
shouldThrow("select1.options.add(option1)");
shouldBe("select1.options.length", "3");
shouldBe("select1.selectedIndex", "0");
debug("");
debug("1.9 Add null");
option1 = null;
shouldThrow("select1.options.add(option1)");
shouldBe("select1.options.length", "3");
shouldBe("select1.selectedIndex", "0");
debug("");
debug("1.10 Add negative infinity");
option1 = -1/0;
shouldThrow("select1.options.add(option1)");
shouldBe("select1.options.length", "3");
shouldBe("select1.selectedIndex", "0");
debug("");
debug("1.11 Add NaN");
option1 = 0/0;
shouldThrow("select1.options.add(option1)");
shouldBe("select1.options.length", "3");
shouldBe("select1.selectedIndex", "0");
debug("");
debug("1.12 Add positive infinity");
option1 = 1/0;
shouldThrow("select1.options.add(option1)");
shouldBe("select1.options.length", "3");
shouldBe("select1.selectedIndex", "0");
debug("");
debug("2.1 Add Option to empty Options");
var select2 = document.getElementById("select2");
var option2 = document.createElement("OPTION");
select2.options.add(option2, 0);
option2.value = "1";
option2.textContent = "A";
shouldBe("select2.options.length", "1");
shouldBe("select2.selectedIndex", "0");
shouldBe("select2.options[0].value", "'1'");
shouldBe("select2.options[0].textContent", "'A'");
debug("");
debug("2.2 Add Option after setting parameters");
option2 = document.createElement("OPTION");
option2.value = "2";
option2.textContent = "B";
select2.options.add(option2, 1);
shouldBe("select2.options.length", "2");
shouldBe("select2.selectedIndex", "0");
shouldBe("select2.options[0].value", "'1'");
shouldBe("select2.options[0].textContent", "'A'");
shouldBe("select2.options[1].value", "'2'");
shouldBe("select2.options[1].textContent", "'B'");
debug("");
debug("2.3 Insert Option at beginning of Options");
option2 = document.createElement("OPTION");
select2.options.add(option2, 0);
option2.value = "0";
option2.textContent = "Z";
shouldBe("select2.options.length", "3");
shouldBe("select2.selectedIndex", "1");
shouldBe("select2.options[0].value", "'0'");
shouldBe("select2.options[0].textContent", "'Z'");
shouldBe("select2.options[1].value", "'1'");
shouldBe("select2.options[1].textContent", "'A'");
shouldBe("select2.options[2].value", "'2'");
shouldBe("select2.options[2].textContent", "'B'");
debug("");
debug("2.4 Insert Option in middle of Options");
option2 = document.createElement("OPTION");
select2.options.add(option2, 2);
option2.value = "1.5";
option2.textContent = "A.5";
shouldBe("select2.options.length", "4");
shouldBe("select2.selectedIndex", "1");
shouldBe("select2.options[0].value", "'0'");
shouldBe("select2.options[0].textContent", "'Z'");
shouldBe("select2.options[1].value", "'1'");
shouldBe("select2.options[1].textContent", "'A'");
shouldBe("select2.options[2].value", "'1.5'");
shouldBe("select2.options[2].textContent", "'A.5'");
shouldBe("select2.options[3].value", "'2'");
shouldBe("select2.options[3].textContent", "'B'");
debug("");
debug("2.5 Insert Option at end of Options");
option2 = document.createElement("OPTION");
select2.options.add(option2, 4);
option2.value = "3";
option2.textContent = "C";
shouldBe("select2.options.length", "5");
shouldBe("select2.selectedIndex", "1");
shouldBe("select2.options[0].value", "'0'");
shouldBe("select2.options[0].textContent", "'Z'");
shouldBe("select2.options[1].value", "'1'");
shouldBe("select2.options[1].textContent", "'A'");
shouldBe("select2.options[2].value", "'1.5'");
shouldBe("select2.options[2].textContent", "'A.5'");
shouldBe("select2.options[3].value", "'2'");
shouldBe("select2.options[3].textContent", "'B'");
shouldBe("select2.options[4].value", "'3'");
shouldBe("select2.options[4].textContent", "'C'");
debug("");
debug("2.6 Insert Option beyond the end of Options");
option2 = document.createElement("OPTION");
select2.options.add(option2, 6);
option2.value = "4";
option2.textContent = "D";
shouldBe("select2.options.length", "6");
shouldBe("select2.selectedIndex", "1");
shouldBe("select2.options[0].value", "'0'");
shouldBe("select2.options[0].textContent", "'Z'");
shouldBe("select2.options[1].value", "'1'");
shouldBe("select2.options[1].textContent", "'A'");
shouldBe("select2.options[2].value", "'1.5'");
shouldBe("select2.options[2].textContent", "'A.5'");
shouldBe("select2.options[3].value", "'2'");
shouldBe("select2.options[3].textContent", "'B'");
shouldBe("select2.options[4].value", "'3'");
shouldBe("select2.options[4].textContent", "'C'");
shouldBe("select2.options[5].value", "'4'");
shouldBe("select2.options[5].textContent", "'D'");
debug("");
debug("2.7 Add an Option at index -1");
option2 = document.createElement("OPTION");
select2.options.add(option2, -1);
option2.value = "5";
option2.textContent = "E";
shouldBe("select2.options.length", "7");
shouldBe("select2.selectedIndex", "1");
shouldBe("select2.options[0].value", "'0'");
shouldBe("select2.options[0].textContent", "'Z'");
shouldBe("select2.options[1].value", "'1'");
shouldBe("select2.options[1].textContent", "'A'");
shouldBe("select2.options[2].value", "'1.5'");
shouldBe("select2.options[2].textContent", "'A.5'");
shouldBe("select2.options[3].value", "'2'");
shouldBe("select2.options[3].textContent", "'B'");
shouldBe("select2.options[4].value", "'3'");
shouldBe("select2.options[4].textContent", "'C'");
shouldBe("select2.options[5].value", "'4'");
shouldBe("select2.options[5].textContent", "'D'");
shouldBe("select2.options[6].value", "'5'");
shouldBe("select2.options[6].textContent", "'E'");
debug("");
debug("2.8 Add an Option at index -2");
option2 = document.createElement("OPTION");
shouldNotThrow("select2.options.add(option2, -2)");
shouldBe("select2.options.length", "8");
shouldBe("select2.selectedIndex", "1");
debug("");
debug("2.9 Add an Option at index -Infinity");
option2 = document.createElement("OPTION");
shouldNotThrow("select2.options.add(option2, -1/0)");
shouldBe("select2.options.length", "9");
shouldBe("select2.selectedIndex", "2");
debug("");
debug("2.10 Add an Option at index NaN");
option2 = document.createElement("OPTION");
shouldNotThrow("select2.options.add(option2, 0/0)");
shouldBe("select2.options.length", "10");
shouldBe("select2.selectedIndex", "3");
debug("");
debug("2.11 Add an Option at index Infinity");
option2 = document.createElement("OPTION");
shouldNotThrow("select2.options.add(option2, 1/0)");
shouldBe("select2.options.length", "11");
shouldBe("select2.selectedIndex", "4");
debug("");
debug("2.12 Add a non-Option element");
option2 = document.createElement("DIV");
shouldThrow("select2.options.add(option2, 1)");
shouldBe("select2.options.length", "11");
shouldBe("select2.selectedIndex", "4");
debug("");
debug("2.13 Add a non-element (string)");
option2 = "o";
shouldThrow("select2.options.add(option2, 1)");
shouldBe("select2.options.length", "11");
shouldBe("select2.selectedIndex", "4");
debug("");
debug("2.14 Add a non-element (number)");
option2 = 3.14;
shouldThrow("select2.options.add(option2, 1)");
shouldBe("select2.options.length", "11");
shouldBe("select2.selectedIndex", "4");
debug("");
debug("2.15 Add a non-element (boolean)");
option2 = true;
shouldThrow("select2.options.add(option2, 1)");
shouldBe("select2.options.length", "11");
shouldBe("select2.selectedIndex", "4");
debug("");
debug("2.16 Add undefined");
option2 = undefined;
shouldThrow("select2.options.add(option2, 1)");
shouldBe("select2.options.length", "11");
shouldBe("select2.selectedIndex", "4");
debug("");
debug("2.17 Add null");
option2 = null;
shouldThrow("select2.options.add(option2, 1)");
shouldBe("select2.options.length", "11");
shouldBe("select2.selectedIndex", "4");
debug("");
debug("2.18 Add negative infinity");
option2 = -1/0;
shouldThrow("select2.options.add(option2, 1)");
shouldBe("select2.options.length", "11");
shouldBe("select2.selectedIndex", "4");
debug("");
debug("2.19 Add NaN");
option2 = 0/0;
shouldThrow("select2.options.add(option2, 1)");
shouldBe("select2.options.length", "11");
shouldBe("select2.selectedIndex", "4");
debug("");
debug("2.20 Add positive infinity");
option2 = 1/0;
shouldThrow("select2.options.add(option2, 1)");
shouldBe("select2.options.length", "11");
shouldBe("select2.selectedIndex", "4");
debug("");