diff --git a/HTMLKitTests/HTMLKitNodesTests.m b/HTMLKitTests/HTMLKitNodesTests.m
index 73b0522..ccd3f10 100644
--- a/HTMLKitTests/HTMLKitNodesTests.m
+++ b/HTMLKitTests/HTMLKitNodesTests.m
@@ -622,4 +622,103 @@
XCTAssertThrows([document appendNode:doctype]);
}
+- (void)testValidDocumentFragmentReplacementIntoDocument
+{
+ HTMLDocument *document = [HTMLDocument new];
+ HTMLComment *child = [HTMLComment new];
+ HTMLDocumentFragment *replacement = [[HTMLDocumentFragment alloc] initWithDocument:document];
+
+ void (^ reset)() = ^ {
+ [replacement removeAllChildNodes];
+ [document removeAllChildNodes];
+ [document appendNode:child];
+ };
+
+ /**
+ * Replacement Fragment has a Text node child
+ */
+ [replacement appendNode:[HTMLText new]];
+ XCTAssertThrows([document replaceChildNode:child withNode:replacement]);
+
+ /**
+ * Replacement Fragment has more than one Element child
+ */
+ reset();
+ [replacement appendNode:[HTMLElement new]];
+ [replacement appendNode:[HTMLElement new]];
+ XCTAssertThrows([document replaceChildNode:child withNode:replacement]);
+
+ /**
+ * Replacement Fragment has one Element child
+ * Document has an Element child that is not the Replacement
+ */
+ reset();
+ [replacement appendNode:[HTMLElement new]];
+ [document appendNode:[HTMLElement new]];
+ XCTAssertThrows([document replaceChildNode:child withNode:replacement]);
+
+ /**
+ * Replacement Fragment has one Element child
+ * Doctype is following the child node
+ */
+ reset();
+ HTMLDocumentType *doctype = [HTMLDocumentType new];
+ [replacement appendNode:[HTMLElement new]];
+ [document appendNode:doctype];
+ XCTAssertThrows([document replaceChildNode:child withNode:replacement]);
+}
+
+- (void)testValidElementReplacementIntoDocument
+{
+ HTMLDocument *document = [HTMLDocument new];
+ HTMLComment *child = [HTMLComment new];
+ HTMLElement *replacement = [HTMLElement new];
+
+ void (^ reset)() = ^ {
+ [replacement removeAllChildNodes];
+ [document removeAllChildNodes];
+ [document appendNode:child];
+ };
+
+ /**
+ * Docment has an Element child that is not replacement
+ */
+ [document appendNode:[HTMLElement new]];
+ XCTAssertThrows([document replaceChildNode:child withNode:replacement]);
+
+ /**
+ * Doctype is following the child node
+ */
+ reset();
+ HTMLDocumentType *doctype = [HTMLDocumentType new];
+ [document appendNode:doctype];
+ XCTAssertThrows([document replaceChildNode:child withNode:replacement]);
+}
+
+- (void)testValidDoctypeReplacementIntoDocument
+{
+ HTMLDocument *document = [HTMLDocument new];
+ HTMLComment *child = [HTMLComment new];
+ HTMLDocumentType *replacement = [HTMLDocumentType new];
+
+ void (^ reset)() = ^ {
+ [replacement removeAllChildNodes];
+ [document removeAllChildNodes];
+ [document appendNode:child];
+ };
+
+ /**
+ * Docment has an Doctype child that is not replacement
+ */
+ [document appendNode:[HTMLDocumentType new]];
+ XCTAssertThrows([document replaceChildNode:child withNode:replacement]);
+
+ /**
+ * An Element is preceding the child node
+ */
+ reset();
+ [document insertNode:[HTMLElement new] beforeChildNode:child];
+ XCTAssertThrows([document replaceChildNode:child withNode:replacement]);
+}
+
@end