Index: sky/tests/dom/document-child-mutations.sky |
diff --git a/sky/tests/dom/document-child-mutations.sky b/sky/tests/dom/document-child-mutations.sky |
new file mode 100644 |
index 0000000000000000000000000000000000000000..99e0e440982e6f0af0f504dd2d89a62b43ba7ae9 |
--- /dev/null |
+++ b/sky/tests/dom/document-child-mutations.sky |
@@ -0,0 +1,103 @@ |
+<sky> |
+<import src="../resources/chai.sky" /> |
+<import src="../resources/mocha.sky" /> |
+<import src="../resources/dom-utils.sky" as="DomUtils" /> |
+<script> |
+describe("Document", function() { |
+ var doc; |
+ |
+ var childElementCount = DomUtils.childElementCount; |
+ var childNodeCount = DomUtils.childNodeCount; |
+ |
+ beforeEach(function() { |
+ doc = new Document(); |
+ }); |
+ |
+ it("should allow replacing the document element", function() { |
+ var oldChild = doc.appendChild(doc.createElement("div")); |
+ assert.equal(childElementCount(doc), 1); |
+ var newChild = doc.createElement("div"); |
+ doc.replaceChild(newChild, oldChild); |
+ assert.equal(childElementCount(doc), 1); |
+ assert.equal(newChild.parentNode, doc); |
+ assert.isNull(oldChild.parentNode); |
+ }); |
+ |
+ it("should allow replacing a text child with an element", function() { |
+ var oldChild = doc.appendChild(new Text("text here")); |
+ assert.equal(childElementCount(doc), 0); |
+ assert.equal(childNodeCount(doc), 1); |
+ var newChild = doc.createElement("div"); |
+ doc.replaceChild(newChild, oldChild); |
+ assert.equal(childElementCount(doc), 1); |
+ assert.equal(childNodeCount(doc), 1); |
+ assert.equal(newChild.parentNode, doc); |
+ assert.isNull(oldChild.parentNode); |
+ }); |
+ |
+ it("should allow replacing the document element with text", function() { |
+ var oldChild = doc.appendChild(doc.createElement("div")); |
+ assert.equal(childElementCount(doc), 1); |
+ var newChild = new Text(" text "); |
+ doc.replaceChild(newChild, oldChild); |
+ assert.equal(childElementCount(doc), 0); |
+ assert.equal(childNodeCount(doc), 1); |
+ assert.equal(newChild.parentNode, doc); |
+ assert.isNull(oldChild.parentNode); |
+ }); |
+ |
+ it("should allow inserting text with a fragment", function() { |
+ var fragment = doc.createDocumentFragment(); |
+ fragment.appendChild(new Text(" text ")); |
+ fragment.appendChild(new Text(" text ")); |
+ assert.equal(childNodeCount(doc), 0); |
+ doc.appendChild(fragment); |
+ assert.equal(childElementCount(doc), 0); |
+ assert.equal(childNodeCount(doc), 2); |
+ }); |
+ |
+ it("should allow replacing the document element with a fragment", function() { |
+ var oldChild = doc.appendChild(doc.createElement("div")); |
+ assert.equal(childElementCount(doc), 1); |
+ var fragment = doc.createDocumentFragment(); |
+ fragment.appendChild(new Text(" text ")); |
+ var newChild = fragment.appendChild(doc.createElement("div")); |
+ fragment.appendChild(new Text(" ")); |
+ doc.replaceChild(fragment, oldChild); |
+ assert.equal(childElementCount(doc), 1); |
+ assert.equal(childNodeCount(doc), 3); |
+ assert.equal(newChild.parentNode, doc); |
+ assert.isNull(oldChild.parentNode); |
+ }); |
+ |
+ it("should throw when inserting multiple elements", function() { |
+ doc.appendChild(doc.createElement("div")); |
+ var oldChild = doc.appendChild(new Text(" text ")); |
+ assert.equal(childElementCount(doc), 1); |
+ var newChild = doc.createElement("div"); |
+ assert.throws(function() { |
+ doc.replaceChild(newChild, 0); |
+ }); |
+ assert.throws(function() { |
+ doc.insertBefore(newChild, oldChild); |
+ }); |
+ }); |
+ |
+ it("should throw when inserting multiple elements with a fragment", function() { |
+ var oldChild = doc.appendChild(doc.createElement("div")); |
+ assert.equal(childElementCount(doc), 1); |
+ var fragment = doc.createDocumentFragment(); |
+ fragment.appendChild(new Text(" text ")); |
+ fragment.appendChild(doc.createElement("div")); |
+ fragment.appendChild(doc.createElement("div")); |
+ fragment.appendChild(new Text(" ")); |
+ assert.throws(function() { |
+ doc.replaceChild(fragment, 0); |
+ }); |
+ assert.throws(function() { |
+ doc.insertBefore(fragment, oldChild); |
+ }); |
+ }); |
+}); |
+</script> |
+</sky> |