From 718e43ff9c3e36d97e0bdbbf3382634bac87bd2b Mon Sep 17 00:00:00 2001 From: iska Date: Fri, 13 Jan 2017 18:23:56 +0100 Subject: [PATCH] Add HTML Range tests for Text split callbacks --- Sources/HTMLRange.m | 2 +- Tests/HTMLRangeTests.m | 105 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 1 deletion(-) diff --git a/Sources/HTMLRange.m b/Sources/HTMLRange.m index 57c2ade..e2b9454 100644 --- a/Sources/HTMLRange.m +++ b/Sources/HTMLRange.m @@ -406,7 +406,7 @@ NS_INLINE HTMLNode * GetHighestPartiallyContainedChild(HTMLNode *node, HTMLNode NS_INLINE HTMLCharacterData * CloneCharachterData(HTMLNode *node, NSUInteger start, NSUInteger length, BOOL delete) { - HTMLCharacterData *clone = (HTMLCharacterData *)[node cloneNodeDeep:NO]; + HTMLCharacterData *clone = (HTMLCharacterData *)[node copy]; NSRange range = NSMakeRange(start, length); [clone setData:[clone.data substringWithRange:range]]; diff --git a/Tests/HTMLRangeTests.m b/Tests/HTMLRangeTests.m index 7c657fc..bf70ca5 100644 --- a/Tests/HTMLRangeTests.m +++ b/Tests/HTMLRangeTests.m @@ -1091,6 +1091,111 @@ XCTAssertEqual(range.endOffset, 9); } +- (void)testThatTextSplitUpdateRangeCorrectly_BeforeStartTextNode +{ + HTMLRange *range = [[HTMLRange alloc] initWithDowcument:_document]; + //

Title

Hello

First textSecond text
<--Second comment-->
+ // |________| + [range selectNodeContents:_firstText]; + + //

Title

Hello

First textSecond text
<--Second comment-->
+ // ^________| + HTMLText *split = [_firstText splitTextAtOffset:0]; + + XCTAssertEqualObjects(range.startContainer, _firstText); + XCTAssertEqual(range.startOffset, 0); + XCTAssertEqualObjects(range.endContainer, split); + XCTAssertEqual(range.endOffset, 10); +} + +- (void)testThatTextSplitUpdateRangeCorrectly_AfterEndTextNode +{ + HTMLRange *range = [[HTMLRange alloc] initWithDowcument:_document]; + //

Title

Hello

First textSecond text
<--Second comment-->
+ // |________| + [range selectNodeContents:_firstText]; + + //

Title

Hello

First textSecond text
<--Second comment-->
+ // |________^ + [_firstText splitTextAtOffset:_firstText.length]; + + XCTAssertEqualObjects(range.startContainer, _firstText); + XCTAssertEqual(range.startOffset, 0); + XCTAssertEqualObjects(range.endContainer, _firstText); + XCTAssertEqual(range.endOffset, 10); +} + +- (void)testThatTextSplitUpdateRangeCorrectly_MidleSameTextNode +{ + HTMLRange *range = [[HTMLRange alloc] initWithDowcument:_document]; + //

Title

Hello

First textSecond text
<--Second comment-->
+ // |________| + [range selectNodeContents:_firstText]; + + //

Title

Hello

First textSecond text
<--Second comment-->
+ // |____^___| + HTMLText *split = [_firstText splitTextAtOffset:6]; + + XCTAssertEqualObjects(range.startContainer, _firstText); + XCTAssertEqual(range.startOffset, 0); + XCTAssertEqualObjects(range.endContainer, split); + XCTAssertEqual(range.endOffset, 4); +} + +- (void)testThatTextSplitUpdateRangeCorrectly_MidleDifferentTextNodes +{ + HTMLRange *range = [[HTMLRange alloc] initWithDowcument:_document]; + //

Title

Hello

First textSecond text
<--Second comment-->
+ // |______________________________| + [range setStartNode:_firstText startOffset:2]; + [range setEndNode:_secondText endOffset:3]; + + //

Title

Hello

First textSecond text
<--Second comment-->
+ // |____^__________________________| + [_firstText splitTextAtOffset:6]; + + XCTAssertEqualObjects(range.startContainer, _firstText); + XCTAssertEqual(range.startOffset, 2); + XCTAssertEqualObjects(range.endContainer, _secondText); + XCTAssertEqual(range.endOffset, 3); +} + +- (void)testThatTextSplitUpdateRangeCorrectly_BeforeStartDifferentTextNodes +{ + HTMLRange *range = [[HTMLRange alloc] initWithDowcument:_document]; + //

Title

Hello

First textSecond text
<--Second comment-->
+ // |______________________________| + [range setStartNode:_firstText startOffset:6]; + [range setEndNode:_secondText endOffset:3]; + + //

Title

Hello

First textSecond text
<--Second comment-->
+ // ^ |__________________________| + HTMLText *split = [_firstText splitTextAtOffset:2]; + + XCTAssertEqualObjects(range.startContainer, split); + XCTAssertEqual(range.startOffset, 4); + XCTAssertEqualObjects(range.endContainer, _secondText); + XCTAssertEqual(range.endOffset, 3); +} + +- (void)testThatTextSplitUpdateRangeCorrectly_BeforeEndDifferentTextNodes +{ + HTMLRange *range = [[HTMLRange alloc] initWithDowcument:_document]; + //

Title

Hello

First textSecond text
<--Second comment-->
+ // |_______________________________| + [range setStartNode:_firstText startOffset:6]; + [range setEndNode:_secondText endOffset:4]; + + //

Title

Hello

First textSecond text
<--Second comment-->
+ // |_____________________________^_| + HTMLText *split = [_secondText splitTextAtOffset:2]; + + XCTAssertEqualObjects(range.startContainer, _firstText); + XCTAssertEqual(range.startOffset, 6); + XCTAssertEqualObjects(range.endContainer, split); + XCTAssertEqual(range.endOffset, 2); +} + #pragma mark - Editing - (HTMLDocument *)editingDocument