From f53ce3464d786a05a1cf2a9216da4cac879f4b8b Mon Sep 17 00:00:00 2001 From: iska Date: Wed, 11 Jan 2017 18:29:30 +0100 Subject: [PATCH] Add HTML Range tests for node surround and insertion --- Tests/HTMLRangeTests.m | 219 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 219 insertions(+) diff --git a/Tests/HTMLRangeTests.m b/Tests/HTMLRangeTests.m index d47278f..51bfd8a 100644 --- a/Tests/HTMLRangeTests.m +++ b/Tests/HTMLRangeTests.m @@ -1730,4 +1730,223 @@ XCTAssertEqualObjects(fragment.innerHTML, DoubleQuote(@"

his is a text

")); } +#pragma mark - Insertion & Surround + +- (void)testInsertNode_InvalidNode +{ + HTMLDocument *document = self.editingDocument; + HTMLRange *range = [[HTMLRange alloc] initWithDowcument:document]; + + HTMLNode *start = [document querySelector:@"#P1"].firstChild; + [range setStartNode:start startOffset:2]; + HTMLNode *end = [document querySelector:@"#P1"].lastChild; + [range setEndNode:end endOffset:5]; + + XCTAssertThrows([range insertNode:start]); + + HTMLComment *comment = [[HTMLComment alloc] initWithData:@"data"]; + [[document querySelector:@"#D1"] appendNode: comment]; + [range setStartNode:comment startOffset:2]; + + XCTAssertThrows([range insertNode:end]); +} + +- (void)testInsertNode_TextNodeStart_Begin +{ + HTMLDocument *document = self.editingDocument; + HTMLRange *range = [[HTMLRange alloc] initWithDowcument:document]; + + HTMLNode *start = [document querySelector:@"#P1"].firstChild; + [range setStartNode:start startOffset:0]; + HTMLNode *end = [document querySelector:@"#P1"].lastChild; + [range setEndNode:end endOffset:5]; + + HTMLElement *div = [[HTMLElement alloc] initWithTagName:@"div"]; + [div appendNodes:@[ + [[HTMLText alloc] initWithData:@"TEXT"], + [[HTMLElement alloc] initWithTagName:@"a"]]]; + + [range insertNode:div]; + + XCTAssertEqualObjects(BodyOf(document), DoubleQuote(@"
" + @"

TEXT
This is a text

Hello

" + @"

World

" + @"

Another text

" + @"
")); +} + +- (void)testInsertNode_TextNodeStart_Middle +{ + HTMLDocument *document = self.editingDocument; + HTMLRange *range = [[HTMLRange alloc] initWithDowcument:document]; + + HTMLNode *start = [document querySelector:@"#P1"].firstChild; + [range setStartNode:start startOffset:2]; + HTMLNode *end = [document querySelector:@"#P1"].lastChild; + [range setEndNode:end endOffset:5]; + + HTMLElement *div = [[HTMLElement alloc] initWithTagName:@"div"]; + [div appendNodes:@[ + [[HTMLText alloc] initWithData:@"TEXT"], + [[HTMLElement alloc] initWithTagName:@"a"]]]; + + [range insertNode:div]; + + XCTAssertEqualObjects(BodyOf(document), DoubleQuote(@"
" + @"

Th

TEXT
is is a text

Hello

" + @"

World

" + @"

Another text

" + @"
")); +} + +- (void)testInsertNode_NonTextNodeStart_Begin +{ + HTMLDocument *document = self.editingDocument; + HTMLRange *range = [[HTMLRange alloc] initWithDowcument:document]; + + HTMLNode *start = [document querySelector:@"#P1"]; + [range setStartNode:start startOffset:0]; + HTMLNode *end = [document querySelector:@"#P1"].lastChild; + [range setEndNode:end endOffset:5]; + + HTMLElement *div = [[HTMLElement alloc] initWithTagName:@"div"]; + [div appendNodes:@[ + [[HTMLText alloc] initWithData:@"TEXT"], + [[HTMLElement alloc] initWithTagName:@"a"]]]; + + [range insertNode:div]; + + XCTAssertEqualObjects(BodyOf(document), DoubleQuote(@"
" + @"

TEXT
This is a text

Hello

" + @"

World

" + @"

Another text

" + @"
")); +} + +- (void)testInsertNode_NonTextNodeStart_Middle +{ + HTMLDocument *document = self.editingDocument; + HTMLRange *range = [[HTMLRange alloc] initWithDowcument:document]; + + HTMLNode *start = [document querySelector:@"#P1"]; + [range setStartNode:start startOffset:2]; + HTMLNode *end = [document querySelector:@"#P1"].lastChild; + [range setEndNode:end endOffset:5]; + + HTMLElement *div = [[HTMLElement alloc] initWithTagName:@"div"]; + [div appendNodes:@[ + [[HTMLText alloc] initWithData:@"TEXT"], + [[HTMLElement alloc] initWithTagName:@"a"]]]; + + [range insertNode:div]; + + XCTAssertEqualObjects(BodyOf(document), DoubleQuote(@"
" + @"

This is a

TEXT
text

Hello

" + @"

World

" + @"

Another text

" + @"
")); +} + +- (void)testInsertNode_NonTextNodeStart_DifferentParents +{ + HTMLDocument *document = self.editingDocument; + HTMLRange *range = [[HTMLRange alloc] initWithDowcument:document]; + + HTMLNode *start = [document querySelector:@"#D1"]; + [range setStartNode:start startOffset:1]; + HTMLNode *end = [document querySelector:@"#P3"].firstChild; + [range setEndNode:end endOffset:4]; + + HTMLElement *div = [[HTMLElement alloc] initWithTagName:@"div"]; + [div appendNodes:@[ + [[HTMLText alloc] initWithData:@"TEXT"], + [[HTMLElement alloc] initWithTagName:@"a"]]]; + + [range insertNode:div]; + + XCTAssertEqualObjects(BodyOf(document), DoubleQuote(@"
" + @"

This is a text

TEXT

Hello

" + @"

World

" + @"

Another text

" + @"
")); +} + +- (void)testSurroundContents_InvalidNode +{ + HTMLDocument *document = self.editingDocument; + HTMLRange *range = [[HTMLRange alloc] initWithDowcument:document]; + + HTMLNode *start = [document querySelector:@"#P1"].firstChild; + [range setStartNode:start startOffset:2]; + HTMLNode *end = [document querySelector:@"#P1"].lastChild; + [range setEndNode:end endOffset:5]; + + XCTAssertThrows([range surroundContents:[HTMLDocumentType new]]); + XCTAssertThrows([range surroundContents:[HTMLDocument new]]); + XCTAssertThrows([range surroundContents:[[HTMLDocumentFragment alloc] initWithDocument:document]]); +} + +- (void)testSurroundContents_PartiallySelectedAncestors +{ + HTMLDocument *document = self.editingDocument; + HTMLRange *range = [[HTMLRange alloc] initWithDowcument:document]; + + HTMLNode *start = [document querySelector:@"#P1"].firstChild; + [range setStartNode:start startOffset:2]; + HTMLNode *end = [document querySelector:@"#P3"].lastChild; + [range setEndNode:end endOffset:3]; + + HTMLElement *span = [[HTMLElement alloc] initWithTagName:@"span"]; + XCTAssertThrows([range surroundContents:span]); + + start = [document querySelector:@"#D1"]; + [range setStartNode:start startOffset:0]; + end = [document querySelector:@"#D2"]; + [range setEndNode:end endOffset:1]; + + XCTAssertThrows([range surroundContents:span]); +} + +- (void)testSurroundContents_TextNodes +{ + HTMLDocument *document = self.editingDocument; + HTMLRange *range = [[HTMLRange alloc] initWithDowcument:document]; + + HTMLNode *start = [document querySelector:@"#P1"].firstChild; + [range setStartNode:start startOffset:2]; + HTMLNode *end = [document querySelector:@"#P1"].lastChild; + [range setEndNode:end endOffset:3]; + + HTMLElement *span = [[HTMLElement alloc] initWithTagName:@"span"]; + [range surroundContents:span]; + + XCTAssertEqualObjects(BodyOf(document), InnerHTML( + @"
" + @"

This is a text

Hello

" + @"

World

" + @"

Another text

" + @"
")); +} + +- (void)testSurroundContents_NonTextNodes +{ + HTMLDocument *document = self.editingDocument; + HTMLRange *range = [[HTMLRange alloc] initWithDowcument:document]; + + HTMLNode *start = [document querySelector:@"#P1"]; + [range setStartNode:start startOffset:0]; + HTMLNode *end = [document querySelector:@"#P1"]; + [range setEndNode:end endOffset:2]; + + HTMLElement *span = [[HTMLElement alloc] initWithTagName:@"span"]; + [range surroundContents:span]; + + XCTAssertEqualObjects(BodyOf(document), InnerHTML( + @"
" + @"

This is a text

Hello

" + @"

World

" + @"

Another text

" + @"
")); +} + @end