diff --git a/HTMLKit.xcodeproj/project.pbxproj b/HTMLKit.xcodeproj/project.pbxproj
index 275fa04..5422c48 100644
--- a/HTMLKit.xcodeproj/project.pbxproj
+++ b/HTMLKit.xcodeproj/project.pbxproj
@@ -80,6 +80,8 @@
624B9FB31AE0313300646C4C /* HTMLKitStringCategoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624B9FB11AE0313300646C4C /* HTMLKitStringCategoryTests.m */; };
624B9FB51AE0391400646C4C /* HTMLKitOrderedDictionaryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624B9FB41AE0391400646C4C /* HTMLKitOrderedDictionaryTests.m */; };
624B9FB61AE0391400646C4C /* HTMLKitOrderedDictionaryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624B9FB41AE0391400646C4C /* HTMLKitOrderedDictionaryTests.m */; };
+ 624FC37A1AE591D80015DDF9 /* HTMLKitNodesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624FC3791AE591D80015DDF9 /* HTMLKitNodesTests.m */; };
+ 624FC37B1AE591D80015DDF9 /* HTMLKitNodesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 624FC3791AE591D80015DDF9 /* HTMLKitNodesTests.m */; };
625A14B019C7829400AD0C32 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 625A14AF19C7829400AD0C32 /* Cocoa.framework */; };
625A14BA19C7829400AD0C32 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 625A14B819C7829400AD0C32 /* InfoPlist.strings */; };
625A14BE19C7829400AD0C32 /* HTMLKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 625A14BD19C7829400AD0C32 /* HTMLKit.m */; };
@@ -214,6 +216,7 @@
624AC90D19FC702E00BD3C4A /* HTML Standard.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "HTML Standard.html"; sourceTree = ""; };
624B9FB11AE0313300646C4C /* HTMLKitStringCategoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLKitStringCategoryTests.m; sourceTree = ""; };
624B9FB41AE0391400646C4C /* HTMLKitOrderedDictionaryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLKitOrderedDictionaryTests.m; sourceTree = ""; };
+ 624FC3791AE591D80015DDF9 /* HTMLKitNodesTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLKitNodesTests.m; sourceTree = ""; };
625A14AC19C7829400AD0C32 /* HTMLKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = HTMLKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
625A14AF19C7829400AD0C32 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
625A14B219C7829400AD0C32 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
@@ -350,6 +353,7 @@
children = (
623916C61AC7209E0066B4FE /* HTMLKitNodeTreeEnumratorTests.m */,
624B9FB41AE0391400646C4C /* HTMLKitOrderedDictionaryTests.m */,
+ 624FC3791AE591D80015DDF9 /* HTMLKitNodesTests.m */,
);
name = Nodes;
sourceTree = "";
@@ -758,6 +762,7 @@
623916C81AC7209E0066B4FE /* HTMLKitNodeTreeEnumratorTests.m in Sources */,
62D8345A19FB1AC4009205A9 /* HTML5LibTokenizerTest.m in Sources */,
6239755F1AC364BB007E26F1 /* HTML5LibTreeConstructionTest.m in Sources */,
+ 624FC37B1AE591D80015DDF9 /* HTMLKitNodesTests.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -808,6 +813,7 @@
623916C71AC7209E0066B4FE /* HTMLKitNodeTreeEnumratorTests.m in Sources */,
62D8345919FB1AC4009205A9 /* HTML5LibTokenizerTest.m in Sources */,
6239755E1AC364BB007E26F1 /* HTML5LibTreeConstructionTest.m in Sources */,
+ 624FC37A1AE591D80015DDF9 /* HTMLKitNodesTests.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/HTMLKit/HTMLNode.h b/HTMLKit/HTMLNode.h
index 00d1f08..b07c56f 100644
--- a/HTMLKit/HTMLNode.h
+++ b/HTMLKit/HTMLNode.h
@@ -53,6 +53,8 @@ typedef NS_ENUM(short, HTMLNodeType)
@property (nonatomic, copy) NSString *textContent;
+- (instancetype)init NS_UNAVAILABLE;
+
- (instancetype)initWithName:(NSString *)name type:(HTMLNodeType)type;
- (BOOL)hasChildNodes;
@@ -75,6 +77,8 @@ typedef NS_ENUM(short, HTMLNodeType)
- (void)replaceAllChildNodesWithNode:(HTMLNode *)node;
+- (void)removeFromParentNode;
+
- (HTMLNode *)removeChildNode:(HTMLNode *)node;
- (HTMLNode *)removeChildNodeAtIndex:(NSUInteger)index;
diff --git a/HTMLKit/HTMLNode.m b/HTMLKit/HTMLNode.m
index 368a196..13dd6b8 100644
--- a/HTMLKit/HTMLNode.m
+++ b/HTMLKit/HTMLNode.m
@@ -168,6 +168,7 @@
NSUInteger index = [self indexOfChildNode:child];
node.parentNode = self;
[(NSMutableOrderedSet *)self.childNodes replaceObjectAtIndex:index withObject:node];
+ [child removeFromParentNode];
return child;
}
@@ -181,6 +182,11 @@
}
}
+- (void)removeFromParentNode
+{
+ [self.parentNode removeChildNode:self];
+}
+
- (HTMLNode *)removeChildNode:(HTMLNode *)child
{
if (child.parentNode != self) {
@@ -205,12 +211,12 @@
for (HTMLNode *child in self.childNodes.array) {
[node appendNode:child];
}
- [self removeAllChildNodes];
+ [(NSMutableOrderedSet *)self.childNodes removeAllObjects];
}
- (void)removeAllChildNodes
{
- [(NSMutableOrderedSet *)self.childNodes removeAllObjects];
+ [self.childNodes.array makeObjectsPerformSelector:@selector(removeFromParentNode)];
}
#pragma mark - Enumeration
diff --git a/HTMLKitTests/HTMLKitNodesTests.m b/HTMLKitTests/HTMLKitNodesTests.m
new file mode 100644
index 0000000..56a5d6a
--- /dev/null
+++ b/HTMLKitTests/HTMLKitNodesTests.m
@@ -0,0 +1,406 @@
+//
+// HTMLKitNodesTests.m
+// HTMLKit
+//
+// Created by Iska on 20/04/15.
+// Copyright (c) 2015 BrainCookie. All rights reserved.
+//
+
+#import
+#import "HTMLNodes.h"
+
+@interface HTMLKitNodesTests : XCTestCase
+
+@end
+
+@implementation HTMLKitNodesTests
+
+- (void)setUp
+{
+ [super setUp];
+}
+
+- (void)tearDown
+{
+ [super tearDown];
+}
+
+- (void)testInitNode
+{
+ HTMLNode *node = [[HTMLNode alloc] initWithName:@"name" type:HTMLNodeElement];
+ XCTAssertNotNil(node);
+ XCTAssertEqualObjects(node.name, @"name");
+ XCTAssertEqual(node.type, HTMLNodeElement);
+ XCTAssertNotNil(node.childNodes);
+ XCTAssertEqual(node.childNodes.count, 0);
+
+ XCTAssertNil(node.ownerDocument);
+ XCTAssertNil(node.baseURI);
+ XCTAssertNil(node.parentNode);
+ XCTAssertNil(node.parentElement);
+ XCTAssertNil(node.firstChiledNode);
+ XCTAssertNil(node.lastChildNode);
+ XCTAssertNil(node.previousSibling);
+ XCTAssertNil(node.lastChildNode);
+}
+
+- (void)testParentNode
+{
+ HTMLNode *node = [[HTMLNode alloc] initWithName:@"name" type:HTMLNodeElement];
+
+ HTMLNode *firstChild = [[HTMLNode alloc] initWithName:@"first" type:HTMLNodeElement];
+ XCTAssertNil(firstChild.parentNode);
+
+ [node appendNode:firstChild];
+ XCTAssertTrue(node.hasChildNodes);
+ XCTAssertEqual(node.childNodesCount, 1);
+
+ XCTAssertNotNil(firstChild.parentNode);
+ XCTAssertEqualObjects(firstChild.parentNode, node);
+
+ HTMLNode *secondChild = [[HTMLNode alloc] initWithName:@"second" type:HTMLNodeElement];
+ HTMLNode *thirdChild = [[HTMLNode alloc] initWithName:@"third" type:HTMLNodeElement];
+
+ [node appendNodes:@[secondChild, thirdChild]];
+ XCTAssertTrue(node.hasChildNodes);
+ XCTAssertEqual(node.childNodesCount, 3);
+
+ XCTAssertNotNil(secondChild.parentNode);
+ XCTAssertEqualObjects(secondChild.parentNode, node);
+
+ XCTAssertNotNil(thirdChild.parentNode);
+ XCTAssertEqualObjects(thirdChild.parentNode, node);
+}
+
+- (void)testChildNodesCount
+{
+ HTMLNode *node = [[HTMLNode alloc] initWithName:@"name" type:HTMLNodeElement];
+ XCTAssertFalse(node.hasChildNodes);
+ XCTAssertEqual(node.childNodesCount, 0);
+
+ HTMLNode *firstChild = [[HTMLNode alloc] initWithName:@"first" type:HTMLNodeElement];
+ [node appendNode:firstChild];
+
+ XCTAssertTrue(node.hasChildNodes);
+ XCTAssertEqual(node.childNodesCount, 1);
+
+ HTMLNode *secondChild = [[HTMLNode alloc] initWithName:@"second" type:HTMLNodeElement];
+ [node appendNode:secondChild];
+
+ XCTAssertTrue(node.hasChildNodes);
+ XCTAssertEqual(node.childNodesCount, 2);
+
+ HTMLNode *thirdChild = [[HTMLNode alloc] initWithName:@"third" type:HTMLNodeElement];
+ [node appendNode:thirdChild];
+
+ XCTAssertTrue(node.hasChildNodes);
+ XCTAssertEqual(node.childNodesCount, 3);
+}
+
+- (void)testFirstAndLastChildNodes
+{
+ HTMLNode *node = [[HTMLNode alloc] initWithName:@"name" type:HTMLNodeElement];
+
+ HTMLNode *firstChild = [[HTMLNode alloc] initWithName:@"first" type:HTMLNodeElement];
+ [node appendNode:firstChild];
+
+ XCTAssertEqualObjects(node.firstChiledNode, firstChild);
+ XCTAssertEqualObjects(node.lastChildNode, firstChild);
+
+ HTMLNode *secondChild = [[HTMLNode alloc] initWithName:@"second" type:HTMLNodeElement];
+ [node appendNode:secondChild];
+
+ XCTAssertEqualObjects(node.firstChiledNode, firstChild);
+ XCTAssertEqualObjects(node.lastChildNode, secondChild);
+
+ HTMLNode *thirdChild = [[HTMLNode alloc] initWithName:@"third" type:HTMLNodeElement];
+ [node appendNode:thirdChild];
+
+ XCTAssertEqualObjects(node.firstChiledNode, firstChild);
+ XCTAssertEqualObjects(node.lastChildNode, thirdChild);
+}
+
+- (void)testNextAndPreviousSiblingNodes
+{
+ HTMLNode *node = [[HTMLNode alloc] initWithName:@"name" type:HTMLNodeElement];
+
+ HTMLNode *firstChild = [[HTMLNode alloc] initWithName:@"first" type:HTMLNodeElement];
+ [node appendNode:firstChild];
+
+ HTMLNode *secondChild = [[HTMLNode alloc] initWithName:@"second" type:HTMLNodeElement];
+ [node appendNode:secondChild];
+
+ HTMLNode *thirdChild = [[HTMLNode alloc] initWithName:@"third" type:HTMLNodeElement];
+ [node appendNode:thirdChild];
+
+ XCTAssertNil(firstChild.previousSibling);
+ XCTAssertEqualObjects(firstChild.nextSibling, secondChild);
+
+ XCTAssertEqualObjects(secondChild.previousSibling, firstChild);
+ XCTAssertEqualObjects(secondChild.nextSibling, thirdChild);
+
+ XCTAssertEqualObjects(thirdChild.previousSibling, secondChild);
+ XCTAssertNil(thirdChild.nextSibling);
+}
+
+- (void)testHasChildNodeOfType
+{
+ HTMLNode *node = [[HTMLNode alloc] initWithName:@"name" type:HTMLNodeElement];
+
+ XCTAssertFalse([node hasChildNodeOfType:HTMLNodeElement]);
+ XCTAssertFalse([node hasChildNodeOfType:HTMLNodeText]);
+ XCTAssertFalse([node hasChildNodeOfType:HTMLNodeComment]);
+
+ HTMLNode *firstChild = [[HTMLNode alloc] initWithName:@"first" type:HTMLNodeElement];
+ [node appendNode:firstChild];
+
+ XCTAssertTrue([node hasChildNodeOfType:HTMLNodeElement]);
+
+ HTMLNode *secondChild = [[HTMLNode alloc] initWithName:@"second" type:HTMLNodeText];
+ [node appendNode:secondChild];
+
+ XCTAssertTrue([node hasChildNodeOfType:HTMLNodeText]);
+
+ HTMLNode *thirdChild = [[HTMLNode alloc] initWithName:@"third" type:HTMLNodeComment];
+ [node appendNode:thirdChild];
+
+ XCTAssertTrue([node hasChildNodeOfType:HTMLNodeComment]);
+}
+
+- (void)testChildNodeAtIndex
+{
+ HTMLNode *node = [[HTMLNode alloc] initWithName:@"name" type:HTMLNodeElement];
+
+ HTMLNode *firstChild = [[HTMLNode alloc] initWithName:@"first" type:HTMLNodeElement];
+ [node appendNode:firstChild];
+
+ HTMLNode *secondChild = [[HTMLNode alloc] initWithName:@"second" type:HTMLNodeElement];
+ [node appendNode:secondChild];
+
+ HTMLNode *thirdChild = [[HTMLNode alloc] initWithName:@"third" type:HTMLNodeElement];
+ [node appendNode:thirdChild];
+
+ XCTAssertEqualObjects([node childNodeAtIndex:0], firstChild);
+ XCTAssertEqualObjects([node childNodeAtIndex:1], secondChild);
+ XCTAssertEqualObjects([node childNodeAtIndex:2], thirdChild);
+}
+
+- (void)testIndexOfChildNode
+{
+ HTMLNode *node = [[HTMLNode alloc] initWithName:@"name" type:HTMLNodeElement];
+
+ HTMLNode *firstChild = [[HTMLNode alloc] initWithName:@"first" type:HTMLNodeElement];
+ [node appendNode:firstChild];
+
+ HTMLNode *secondChild = [[HTMLNode alloc] initWithName:@"second" type:HTMLNodeElement];
+ [node appendNode:secondChild];
+
+ HTMLNode *thirdChild = [[HTMLNode alloc] initWithName:@"third" type:HTMLNodeElement];
+ [node appendNode:thirdChild];
+
+ XCTAssertEqual([node indexOfChildNode:firstChild], 0);
+ XCTAssertEqual([node indexOfChildNode:secondChild], 1);
+ XCTAssertEqual([node indexOfChildNode:thirdChild], 2);
+}
+
+- (void)testIndertNodeBeforeChild
+{
+ HTMLNode *node = [[HTMLNode alloc] initWithName:@"name" type:HTMLNodeElement];
+
+ HTMLNode *firstChild = [[HTMLNode alloc] initWithName:@"first" type:HTMLNodeElement];
+ [node appendNode:firstChild];
+
+ HTMLNode *secondChild = [[HTMLNode alloc] initWithName:@"second" type:HTMLNodeElement];
+ [node insertNode:secondChild beforeChildNode:firstChild];
+
+ XCTAssertEqual([node indexOfChildNode:firstChild], 1);
+ XCTAssertEqual([node indexOfChildNode:secondChild], 0);
+
+ HTMLNode *thirdChild = [[HTMLNode alloc] initWithName:@"third" type:HTMLNodeElement];
+ [node insertNode:thirdChild beforeChildNode:firstChild];
+
+ XCTAssertEqual([node indexOfChildNode:firstChild], 2);
+ XCTAssertEqual([node indexOfChildNode:secondChild], 0);
+ XCTAssertEqual([node indexOfChildNode:thirdChild], 1);
+}
+
+- (void)testReplaceChildNode
+{
+ HTMLNode *node = [[HTMLNode alloc] initWithName:@"name" type:HTMLNodeElement];
+
+ HTMLNode *firstChild = [[HTMLNode alloc] initWithName:@"first" type:HTMLNodeElement];
+ [node appendNode:firstChild];
+
+ HTMLNode *secondChild = [[HTMLNode alloc] initWithName:@"second" type:HTMLNodeElement];
+ [node appendNode:secondChild];
+
+ HTMLNode *thirdChild = [[HTMLNode alloc] initWithName:@"third" type:HTMLNodeElement];
+ [node replaceChildNode:firstChild withNode:thirdChild];
+
+ XCTAssertNil(firstChild.parentNode);
+
+ XCTAssertEqual([node indexOfChildNode:firstChild], NSNotFound);
+ XCTAssertEqual([node indexOfChildNode:secondChild], 1);
+ XCTAssertEqual([node indexOfChildNode:thirdChild], 0);
+}
+
+- (void)testReplaceAllChildNodes
+{
+ HTMLNode *node = [[HTMLNode alloc] initWithName:@"name" type:HTMLNodeElement];
+
+ HTMLNode *firstChild = [[HTMLNode alloc] initWithName:@"first" type:HTMLNodeElement];
+ [node appendNode:firstChild];
+
+ HTMLNode *secondChild = [[HTMLNode alloc] initWithName:@"second" type:HTMLNodeElement];
+ [node appendNode:secondChild];
+
+ HTMLNode *thirdChild = [[HTMLNode alloc] initWithName:@"third" type:HTMLNodeElement];
+ [node replaceAllChildNodesWithNode:thirdChild];
+
+ XCTAssertNil(firstChild.parentNode);
+ XCTAssertNil(secondChild.parentNode);
+ XCTAssertEqualObjects(thirdChild.parentNode, node);
+
+ XCTAssertEqual(node.childNodesCount, 1);
+ XCTAssertEqual([node indexOfChildNode:thirdChild], 0);
+}
+
+- (void)testRemoveFromParentNode
+{
+ HTMLNode *node = [[HTMLNode alloc] initWithName:@"name" type:HTMLNodeElement];
+
+ HTMLNode *firstChild = [[HTMLNode alloc] initWithName:@"first" type:HTMLNodeElement];
+ [node appendNode:firstChild];
+
+ [firstChild removeFromParentNode];
+
+ XCTAssertNil(firstChild.parentNode);
+ XCTAssertEqual(node.childNodesCount, 0);
+ XCTAssertEqual([node indexOfChildNode:firstChild], NSNotFound);
+}
+
+- (void)testRemoveChildNode
+{
+ HTMLNode *node = [[HTMLNode alloc] initWithName:@"name" type:HTMLNodeElement];
+
+ HTMLNode *firstChild = [[HTMLNode alloc] initWithName:@"first" type:HTMLNodeElement];
+ [node appendNode:firstChild];
+
+ HTMLNode *secondChild = [[HTMLNode alloc] initWithName:@"second" type:HTMLNodeElement];
+ [node appendNode:secondChild];
+
+ HTMLNode *thirdChild = [[HTMLNode alloc] initWithName:@"third" type:HTMLNodeElement];
+ [node appendNode:thirdChild];
+
+ [node removeChildNode:secondChild];
+ XCTAssertEqual(node.childNodesCount, 2);
+
+ XCTAssertEqualObjects(firstChild.parentNode, node);
+ XCTAssertNil(secondChild.parentNode);
+ XCTAssertEqualObjects(thirdChild.parentNode, node);
+
+ XCTAssertEqual([node indexOfChildNode:firstChild], 0);
+ XCTAssertEqual([node indexOfChildNode:secondChild], NSNotFound);
+ XCTAssertEqual([node indexOfChildNode:thirdChild], 1);
+
+ [node removeChildNode:firstChild];
+ XCTAssertEqual(node.childNodesCount, 1);
+
+ XCTAssertNil(firstChild.parentNode);
+ XCTAssertNil(secondChild.parentNode);
+ XCTAssertEqualObjects(thirdChild.parentNode, node);
+
+ XCTAssertEqual([node indexOfChildNode:firstChild], NSNotFound);
+ XCTAssertEqual([node indexOfChildNode:secondChild], NSNotFound);
+ XCTAssertEqual([node indexOfChildNode:thirdChild], 0);
+}
+
+- (void)testRemoveChildNodeAtIndex
+{
+ HTMLNode *node = [[HTMLNode alloc] initWithName:@"name" type:HTMLNodeElement];
+
+ HTMLNode *firstChild = [[HTMLNode alloc] initWithName:@"first" type:HTMLNodeElement];
+ [node appendNode:firstChild];
+
+ HTMLNode *secondChild = [[HTMLNode alloc] initWithName:@"second" type:HTMLNodeElement];
+ [node appendNode:secondChild];
+
+ HTMLNode *thirdChild = [[HTMLNode alloc] initWithName:@"third" type:HTMLNodeElement];
+ [node appendNode:thirdChild];
+
+ [node removeChildNodeAtIndex:1];
+ XCTAssertEqual(node.childNodesCount, 2);
+
+ XCTAssertEqualObjects(firstChild.parentNode, node);
+ XCTAssertNil(secondChild.parentNode);
+ XCTAssertEqualObjects(thirdChild.parentNode, node);
+
+ XCTAssertEqual([node indexOfChildNode:firstChild], 0);
+ XCTAssertEqual([node indexOfChildNode:secondChild], NSNotFound);
+ XCTAssertEqual([node indexOfChildNode:thirdChild], 1);
+
+ [node removeChildNodeAtIndex:0];
+ XCTAssertEqual(node.childNodesCount, 1);
+
+ XCTAssertNil(firstChild.parentNode);
+ XCTAssertNil(secondChild.parentNode);
+ XCTAssertEqualObjects(thirdChild.parentNode, node);
+
+ XCTAssertEqual([node indexOfChildNode:firstChild], NSNotFound);
+ XCTAssertEqual([node indexOfChildNode:secondChild], NSNotFound);
+ XCTAssertEqual([node indexOfChildNode:thirdChild], 0);
+}
+
+- (void)testRemoveAllChildNodes
+{
+ HTMLNode *node = [[HTMLNode alloc] initWithName:@"name" type:HTMLNodeElement];
+
+ HTMLNode *firstChild = [[HTMLNode alloc] initWithName:@"first" type:HTMLNodeElement];
+ [node appendNode:firstChild];
+
+ HTMLNode *secondChild = [[HTMLNode alloc] initWithName:@"second" type:HTMLNodeElement];
+ [node appendNode:secondChild];
+
+ HTMLNode *thirdChild = [[HTMLNode alloc] initWithName:@"third" type:HTMLNodeElement];
+ [node appendNode:thirdChild];
+
+ [node removeAllChildNodes];
+ XCTAssertEqual(node.childNodesCount, 0);
+
+ XCTAssertNil(firstChild.parentNode);
+ XCTAssertNil(secondChild.parentNode);
+ XCTAssertNil(thirdChild.parentNode);
+
+ XCTAssertEqual([node indexOfChildNode:firstChild], NSNotFound);
+ XCTAssertEqual([node indexOfChildNode:secondChild], NSNotFound);
+ XCTAssertEqual([node indexOfChildNode:thirdChild], NSNotFound);
+}
+
+- (void)testReparentChildNodes
+{
+ HTMLNode *node = [[HTMLNode alloc] initWithName:@"name" type:HTMLNodeElement];
+
+ HTMLNode *firstChild = [[HTMLNode alloc] initWithName:@"first" type:HTMLNodeElement];
+ [node appendNode:firstChild];
+
+ HTMLNode *secondChild = [[HTMLNode alloc] initWithName:@"second" type:HTMLNodeElement];
+ [node appendNode:secondChild];
+
+ HTMLNode *thirdChild = [[HTMLNode alloc] initWithName:@"third" type:HTMLNodeElement];
+ [node appendNode:thirdChild];
+
+ HTMLNode *newParent = [[HTMLNode alloc] initWithName:@"new-parent" type:HTMLNodeElement];
+
+ [node reparentChildNodesIntoNode:newParent];
+ XCTAssertEqual(node.childNodesCount, 0);
+
+ XCTAssertEqual([node indexOfChildNode:firstChild], NSNotFound);
+ XCTAssertEqual([node indexOfChildNode:secondChild], NSNotFound);
+ XCTAssertEqual([node indexOfChildNode:thirdChild], NSNotFound);
+
+ XCTAssertEqualObjects(firstChild.parentNode, newParent);
+ XCTAssertEqualObjects(secondChild.parentNode, newParent);
+ XCTAssertEqualObjects(thirdChild.parentNode, newParent);
+}
+
+@end