@@ -512,4 +512,60 @@ - (void)testCompareDocumentPosition
512
512
XCTAssertTrue ([image compareDocumentPositionWithNode: outerDiv] == (HTMLDocumentPositionContainedBy | HTMLDocumentPositionFollowing));
513
513
}
514
514
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
+
515
571
@end
0 commit comments