From 1bc896efc9f465a80f14b5f33b7fd0adcbe5225e Mon Sep 17 00:00:00 2001 From: iska Date: Thu, 23 Apr 2015 00:43:06 +0200 Subject: [PATCH] Add tests for HTML Node methods Todo: Tests for negative cases, e.g. invalid manipulations that lead to hierarchy or not found errors. --- HTMLKit.xcodeproj/project.pbxproj | 6 + HTMLKit/HTMLNode.h | 4 + HTMLKit/HTMLNode.m | 10 +- HTMLKitTests/HTMLKitNodesTests.m | 406 ++++++++++++++++++++++++++++++ 4 files changed, 424 insertions(+), 2 deletions(-) create mode 100644 HTMLKitTests/HTMLKitNodesTests.m 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