@@ -512,4 +512,60 @@ - (void)testCompareDocumentPosition
512512 XCTAssertTrue ([image compareDocumentPositionWithNode: outerDiv] == (HTMLDocumentPositionContainedBy | HTMLDocumentPositionFollowing));
513513}
514514
515+ - (void )testDeepCloneElement {
516+ HTMLElement *outer = [[HTMLElement alloc ] initWithTagName: @" div"
517+ attributes: @{@" id" : @" outer" ,
518+ @" class" : @" green" }];
519+
520+ HTMLElement *innerLevel1 = [[HTMLElement alloc ] initWithTagName: @" div"
521+ attributes: @{@" id" : @" inner1" ,
522+ @" class" : @" red" }];
523+
524+ HTMLElement *innerLevel2 = [[HTMLElement alloc ] initWithTagName: @" div"
525+ attributes: @{@" id" : @" inner2" ,
526+ @" class" : @" red" }];
527+
528+ [outer appendNode: innerLevel1];
529+ [innerLevel1 appendNode: innerLevel2];
530+
531+ HTMLElement *clone = [outer cloneNodeDeep: YES ];
532+
533+ XCTAssertNotEqual (clone, outer);
534+ XCTAssertEqualObjects (clone.elementId , outer.elementId );
535+ XCTAssertEqualObjects (clone.attributes , outer.attributes );
536+
537+ XCTAssertNotEqual (clone.firstChild , innerLevel1);
538+ XCTAssertEqualObjects (clone.firstChild .asElement .elementId , innerLevel1.elementId );
539+ XCTAssertEqualObjects (clone.firstChild .asElement .attributes , innerLevel1.attributes );
540+
541+ XCTAssertNotEqual (clone.firstChild , innerLevel2);
542+ XCTAssertEqualObjects (clone.firstChild .firstChild .asElement .elementId , innerLevel2.elementId );
543+ XCTAssertEqualObjects (clone.firstChild .firstChild .asElement .attributes , innerLevel2.attributes );
544+ }
545+
546+ - (void )testDeepCloneElementAttributes {
547+ HTMLElement *div = [[HTMLElement alloc ] initWithTagName: @" div"
548+ attributes: @{@" id" : @" outer" ,
549+ @" class" : @" green" ,
550+ @" data" : @" test" }];
551+
552+ HTMLElement *clone = [div cloneNodeDeep: YES ];
553+
554+ XCTAssertEqualObjects (clone.attributes , div.attributes );
555+ XCTAssertTrue ([clone.attributes isKindOfClass: [HTMLOrderedDictionary class ]]);
556+ }
557+
558+ #pragma mark - Bug Fixes
559+
560+ - (void )testBugFix_Issue_20 {
561+ HTMLElement *element = [HTMLElement new ];
562+ element.elementId = @" originalId" ;
563+
564+ HTMLElement *clone = [element cloneNodeDeep: YES ];
565+ NSString *cloneId = @" cloneId" ;
566+ clone.elementId = cloneId;
567+
568+ XCTAssertTrue ([clone.elementId isEqualToString: cloneId]);
569+ }
570+
515571@end
0 commit comments