/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xerces" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache\@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation, and was
* originally based on software copyright (c) 1999, International
* Business Machines, Inc., http://www.ibm.com . For more information
* on the Apache Software Foundation, please see
* .
*/
/**
* $Id: RangeTest.cpp,v 1.5 2002/02/01 22:43:34 peiyongz Exp $
*/
/** This RangeTest tests all of the cases delineated as examples
* in the DOM Level 2 Range specification, and a few others.
*
These do not by any means completely test the API and
* corner cases.
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define TASSERT(c) tassert((c), __FILE__, __LINE__)
void tassert(bool c, const char *file, int line)
{
if (!c)
printf("Failure. Line %d, file %s\n", line, file);
};
#define TESTPROLOG entryMemState = DomMemDebug();
#define TESTEPILOG exitMemState = DomMemDebug(); \
if (entryMemState != exitMemState) { \
printf(" Memory leak at line %d, file %s: ", __LINE__, __FILE__); \
exitMemState.printDifference(entryMemState); \
}
#define EXCEPTION_TEST(operation, expected_exception) \
{ \
try { \
operation; \
printf(" Error: no exception thrown at line %d\n", __LINE__); \
} \
catch (DOM_DOMException &e) { \
if (e.code != expected_exception) \
printf(" Wrong exception code: %d at line %d\n", e.code, __LINE__); \
} \
catch (...) { \
printf(" Wrong exception thrown at line %d\n", __LINE__); \
} \
}
int main()
{
DomMemDebug entryMemState, exitMemState;
try {
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch) {
char *pMessage = XMLString::transcode(toCatch.getMessage());
fprintf(stderr, "Error during XMLPlatformUtils::Initialize(). \n"
" Message is: %s\n", pMessage);
delete [] pMessage;
return -1;
}
/*
Range tests include testing of
createRange
setStart, setStartBefore. setStartAfter,
setEnd, setEndBefore. setEndAfter
getStartContainer, getStartOffset
getEndContainer, getEndOffset
getCommonAncestorContainer
selectNode
selectNodeContents
insertNode
deleteContents
collapse
getCollapsed
surroundContents
compareBoundaryPoints
cloneRange
cloneContents
extractContents
toString
detach
removeChild
*/
{
{
DOM_Document doc = DOM_Document::createDocument();
//Creating a root element
DOM_Element root = doc.createElement("Body");
doc.appendChild(root);
//Creating the siblings of root
DOM_Element E11 = doc.createElement("H1");
root.appendChild(E11);
DOM_Element E12 = doc.createElement("P");
root.appendChild(E12);
//Attaching texts to siblings
DOM_Text textNode1 = doc.createTextNode("Title");
E11.appendChild(textNode1);
DOM_Text textNode11 = doc.createTextNode("AnotherText");
E11.appendChild(textNode11);
DOM_Text textNode2 = doc.createTextNode("Blah xyz");
E12.appendChild(textNode2);
DOM_Text E210 = doc.createTextNode("insertedText");
}
TESTPROLOG;
{
//DOM Tree and some usable node creation
DOM_Document doc = DOM_Document::createDocument();
//Creating a root element
DOM_Element root = doc.createElement("Body");
doc.appendChild(root);
//Creating the siblings of root
DOM_Element E11 = doc.createElement("H1");
root.appendChild(E11);
DOM_Element E12 = doc.createElement("P");
root.appendChild(E12);
//Attaching texts to siblings
DOM_Text textNode1 = doc.createTextNode("Title");
E11.appendChild(textNode1);
DOM_Text textNode11 = doc.createTextNode("AnotherText");
E11.appendChild(textNode11);
DOM_Text textNode2 = doc.createTextNode("Blah xyz");
E12.appendChild(textNode2);
//experimental nodes
DOM_Element E120 = doc.createElement("Element1");
DOM_Element E121 = doc.createElement("Element2");
DOM_Element E122 = doc.createElement("Element3");
DOM_Element E311 = doc.createElement("SurroundNode1");
DOM_Text E210 = doc.createTextNode("insertedText");
DOM_Node rt = doc.getDocumentElement();
DOM_Range range = doc.createRange();
//Tests start here
// Initial dom tree looks like :
// TitleAnother Text
Blah xyz
//i.e., Body(rt)
// _____________|________________
// | |
// ___H1(E11)___ P(E12)
// | | |
// "Title" "Another Text" "Blah xyz"
//test for start and end settings of a range
range.setStart(rt.getFirstChild(), 0);
TASSERT(range.getStartContainer() == rt.getFirstChild() );
TASSERT(range.getStartOffset() == 0);
range.setEnd(rt.getFirstChild(), 1);
TASSERT(range.getEndContainer() == rt.getFirstChild() );
TASSERT(range.getEndOffset() == 1);
DOM_Node node = range.getCommonAncestorContainer();
TASSERT(range.getCommonAncestorContainer() == rt.getFirstChild());
//selection related test
range.selectNode(rt.getLastChild());
TASSERT(range.getStartContainer() == rt);
TASSERT(range.getStartOffset() == 1);
TASSERT(range.getEndContainer() == rt);
TASSERT(range.getEndOffset() == 2);
//insertion related tests
range.insertNode(E120);
//only end offset moves and new node gets into range as being inserted at boundary point
TASSERT(range.getStartContainer() == rt);
TASSERT(range.getStartOffset() == 1);
TASSERT(range.getEndContainer() == rt);
TASSERT(range.getEndOffset() == 3);
range.insertNode(E121);
//only end offset moves and new node gets into range as being inserted at boundary point
TASSERT(range.getStartContainer() == rt);
TASSERT(range.getStartOffset() == 1);
TASSERT(range.getEndContainer() == rt);
TASSERT(range.getEndOffset() == 4);
rt.insertBefore(E122, rt.getFirstChild());
//both offsets move as new node is not part of the range
TASSERT(range.getStartContainer() == rt);
TASSERT(range.getStartOffset() == 2);
TASSERT(range.getEndContainer() == rt);
TASSERT(range.getEndOffset() == 5);
//After above operations, now the tree looks like:
// TitleAnother Text
Blah xyz
//i.e., Body(rt)
// _____________|_______________________________________________________________
// | | | | |
// Element3(E122) ___H1(E11)___ Element2(E121) Element1(E120) P(E12)
// | | |
// "Title" "Another Text" "Blah xyz"
//
// range has rt as start and end container, and 2 as start offset, 5 as end offset
//changing selection
range.selectNode(rt.getLastChild().getPreviousSibling());
TASSERT(range.getStartContainer() == rt);
TASSERT(range.getStartOffset() == 3);
TASSERT(range.getEndContainer() == rt);
TASSERT(range.getEndOffset() == 4);
//deleting related tests
range.deleteContents();
TASSERT(rt.getLastChild().getPreviousSibling() == E121);
range.setStart(rt.getFirstChild().getNextSibling().getFirstChild(), 2);
TASSERT(range.getStartContainer() == rt.getFirstChild().getNextSibling().getFirstChild());
TASSERT(range.getStartContainer().getNodeValue().equals("Title"));
TASSERT(range.getStartOffset() == 2);
range.setEnd(rt.getFirstChild().getNextSibling().getFirstChild(), 4);
TASSERT(range.getEndContainer() == rt.getFirstChild().getNextSibling().getFirstChild());
TASSERT(range.getEndContainer().getNodeValue().equals("Title"));
TASSERT(range.getEndOffset() == 4);
TASSERT(range.toString().equals("tl"));
//inserting text between a text node
range.insertNode(E210);
//only end offset moves and new node gets into range as being inserted at boundary point
TASSERT(range.getStartContainer() == rt.getFirstChild().getNextSibling().getFirstChild());
TASSERT(range.getStartOffset() == 2);
TASSERT(range.getEndContainer() == rt.getFirstChild().getNextSibling().getLastChild().getPreviousSibling());
TASSERT(range.getEndOffset() == 2);
//inserting element node before the selected text node
range.insertNode(E120);
//only end offset moves and new node gets into range as being inserted at boundary point
TASSERT(range.getStartContainer() == rt.getFirstChild().getNextSibling().getFirstChild());
TASSERT(range.getStartContainer().getNodeValue().equals("Ti"));
TASSERT(range.getStartOffset() == 2);
TASSERT(range.getEndContainer() == rt.getFirstChild().getNextSibling().getLastChild().getPreviousSibling());
TASSERT(range.getEndContainer().getNodeValue().equals("tle"));
TASSERT(range.getEndOffset() == 2);
TASSERT(E11.getChildNodes().getLength()==6);
//checking the text replacment
range.getStartContainer().setNodeValue("ReplacedText");
//only the start offset is impact
TASSERT(range.getStartContainer() == rt.getFirstChild().getNextSibling().getFirstChild());
TASSERT(range.getStartContainer().getNodeValue().equals("ReplacedText"));
TASSERT(range.getStartOffset() == 0);
TASSERT(range.getEndContainer() == rt.getFirstChild().getNextSibling().getLastChild().getPreviousSibling());
TASSERT(range.getEndContainer().getNodeValue().equals("tle"));
TASSERT(range.getEndOffset() == 2);
//After above operations, now the tree looks like:
// ReplacedTextinsertedTexttleAnother Text
Blah xyz
//i.e., Body(rt)
// _____________|_______________________________________________________________________________________________
// | | | |
// Element3(E122) ___H1(E11)___________________________________________________________ Element2(E121) P(E12)
// | | | | | | |
// "ReplacedText" "" Element1(E120) "insertedText"(E210) "tle" "Another Text" "Blah xyz"
//
// range has "ReplacedText" as start container and "tle" as end container
// and 0 as start offset, 2 as end offset
//changing the selection. Preparing for 'surround'
range.setStart(range.getStartContainer().getParentNode(), 2);
range.setEnd(range.getStartContainer(), 5);
TASSERT(range.getStartContainer().getNodeName().equals("H1"));
TASSERT(range.getEndContainer().getNodeName().equals("H1"));
TASSERT(range.toString().equals("insertedTexttle"));
range.surroundContents(E311);
TASSERT(range.getStartContainer().getNodeName().equals("H1"));
TASSERT(range.getStartOffset() == 2);
TASSERT(range.getEndContainer().getNodeName().equals("H1"));
TASSERT(range.getEndOffset() == 3);
TASSERT(E11.getChildNodes().getLength()==4);
TASSERT(E311.getChildNodes().getLength()==3);
TASSERT(range.toString().equals("insertedTexttle"));
//After above operations, now the tree looks like:
// ReplacedTextinsertedTexttleAnother Text
Blah xyz
//i.e., Body(rt)
// _____________|_________________________________________________________________________
// | | | |
// Element3(E122) ___H1(E11)___________________________________ Element2(E121) P(E12)
// | | | | |
// "ReplacedText" "" SurroundNode1(E311) "Another Text" "Blah xyz"
// ____________ |_____________________________
// | | |
// Element1(E120) "insertedText"(E210) "tle"
//
// range has H1 as start and end container and 2 as start offset, 3 as end offset
//testing cloning
DOM_Range aRange = range.cloneRange();
TASSERT(aRange.getStartContainer() == range.getStartContainer());
TASSERT(aRange.getEndContainer() == range.getEndContainer());
TASSERT(aRange.getStartOffset() == 2);
TASSERT(aRange.getEndOffset() == 3);
//changing the new ranges start
aRange.setStart(aRange.getStartContainer().getFirstChild(), 1);
//comparing the ranges
short compVal = range.compareBoundaryPoints(DOM_Range::END_TO_END, aRange);
TASSERT(compVal == 0);
compVal = range.compareBoundaryPoints(DOM_Range::START_TO_START, aRange);
TASSERT(compVal == 1);
compVal = range.compareBoundaryPoints(DOM_Range::START_TO_END, aRange);
TASSERT(compVal == 1);
compVal = range.compareBoundaryPoints(DOM_Range::END_TO_START, aRange);
TASSERT(compVal == -1);
//testing collapse
//not collapsed
TASSERT(range.getCollapsed() == false);
TASSERT(range.getStartOffset() == 2);
TASSERT(range.getEndOffset() == 3);
//selectNodeContents
range.selectNodeContents(rt.getLastChild().getFirstChild());
TASSERT(range.getStartContainer() == rt.getLastChild().getFirstChild());
TASSERT(range.getEndContainer() == rt.getLastChild().getFirstChild());
TASSERT(range.getStartOffset() == 0);
TASSERT(range.getEndOffset() == 8);
TASSERT(range.toString().equals("Blah xyz"));
//testing collapse
range.collapse(true); //collapse to start
TASSERT(range.getCollapsed() == true);
TASSERT(range.getStartOffset() == 0);
TASSERT(range.getEndOffset() == 0);
TASSERT(range.toString().equals(""));
TASSERT(aRange.getEndOffset() == 3); //other range is unaffected
TASSERT(aRange.toString().equals("eplacedTextinsertedTexttle"));
//After above operations, now the tree looks like:
// ReplacedTextinsertedTexttleAnother Text
Blah xyz
//i.e., Body(rt)
// _____________|_________________________________________________________________________
// | | | |
// Element3(E122) ___H1(E11)___________________________________ Element2(E121) P(E12)
// | | | | |
// "ReplacedText" "" SurroundNode1(E311) "Another Text" "Blah xyz"
// ____________ |_____________________________
// | | |
// Element1(E120) "insertedText"(E210) "tle"
//
// range has "Blah xyz" as start and end container and 0 as start and end offset (collapsed)
// aRange has "ReplacedText" as start container and H1 as end container
// and 1 as start offset and 3 as end offset
DOM_DocumentFragment docFrag = aRange.cloneContents();
TASSERT( docFrag != 0);
range.selectNode(rt.getFirstChild());
TASSERT(range.getStartContainer() == rt);
TASSERT(range.getEndContainer() == rt);
TASSERT(range.getStartOffset() == 0);
TASSERT(range.getEndOffset() == 1);
//Testing toString()
const char* str = aRange.toString().transcode();
const char* str2 = "eplacedTextinsertedTexttle";
TASSERT(*str == *str2);
//start and end before and after tests
range.setStartBefore(rt.getFirstChild());
TASSERT(range.getStartOffset() == 0);
range.setEndBefore(rt.getFirstChild());
TASSERT(range.getEndOffset() == 0);
range.setStartAfter(rt.getLastChild());
TASSERT(range.getStartOffset() == 4);
range.setStartAfter(rt.getFirstChild());
TASSERT(range.getStartOffset() == 1);
range.setEndBefore(rt.getLastChild());
TASSERT(range.getEndOffset() == 3);
range.setEndAfter(rt.getLastChild());
TASSERT(range.getEndOffset() == 4);
//testing extract()
DOM_DocumentFragment frag2 = range.extractContents();
TASSERT( frag2 != 0);
//After above operations, now the tree looks like:
//
//i.e., Body(rt)
// |
// Element3(E122)
//
// aRange has rt as start and end container, and 1 as start and end offset (collapsed)
// range has rt as start and end container, and 1 as start and end offset (collapsed)
//
//and frag2 looks:
// ReplacedTextinsertedTexttleAnother TextBlah xyz
//i.e., Body(rt)
// ______________|________________________________________________________
// | | |
// ___H1(E11)___________________________________ Element2(E121) P(E12)
// | | | | |
//"ReplacedText" "" SurroundNode1(E311) "Another Text" "Blah xyz"
// ____________ |_____________________________
// | | |
// Element1(E120) "insertedText"(E210) "tle"
//
//the tree do not have those node anymore after extract
//only Element3 left
TASSERT(rt.getChildNodes().getLength()==1);
//aRange is collapsed
TASSERT(aRange.getCollapsed() == true);
TASSERT(aRange.getStartContainer() == rt);
TASSERT(aRange.getStartOffset() == 1);
TASSERT(aRange.getEndContainer() == rt);
TASSERT(aRange.getEndOffset() == 1);
//range is collapsed as well
TASSERT(range.getCollapsed() == true);
TASSERT(range.getStartContainer() == rt);
TASSERT(range.getStartOffset() == 1);
TASSERT(range.getEndContainer() == rt);
TASSERT(range.getEndOffset() == 1);
//test the document fragment frag2
TASSERT(frag2.getChildNodes().getLength()==3);
//detaching the other range
aRange.detach();
range.detach();
//***************************************************************
//another set of test
//TEST createRange, setStart and setEnd, insertnode
//***************************************************************
DOM_Document doc2 = DOM_Document::createDocument();
DOM_Element root2 = doc2.createElement("root2");
doc2.appendChild(root2);
//case 1: simple text node, start==end
// text1
DOM_Element body = doc2.createElement("body");
DOM_Text text1 = doc2.createTextNode("text1");
body.appendChild(text1);
root2.appendChild(body);
//set range
DOM_Range range1 = doc2.createRange();
range1.setStart(text1,1);
range1.setEnd(text1,3);
TASSERT(range1.toString().equals("ex"));
TASSERT(range1.getStartOffset()==1);
TASSERT(range1.getStartContainer().getNodeValue().equals("text1"));
TASSERT(range1.getEndOffset()==3);
TASSERT(range1.getEndContainer().getNodeValue().equals("text1"));
//now insert a text node
//ttext2ext1
DOM_Text text2 = doc2.createTextNode("text2");
range1.insertNode(text2);
TASSERT(range1.toString().equals("text2ex"));
TASSERT(range1.getStartOffset()==1);
TASSERT(range1.getStartContainer().getNodeValue().equals("t"));
TASSERT(range1.getEndOffset()==2);
TASSERT(range1.getEndContainer().getNodeValue().equals("ext1"));
//now insert a non-text node
//ttext2ext1
DOM_Element p1 = doc2.createElement("p1");
range1.insertNode(p1);
TASSERT(range1.toString().equals("text2ex"));
TASSERT(range1.getStartOffset()==1);
TASSERT(range1.getStartContainer().getNodeValue().equals("t"));
TASSERT(range1.getEndOffset()==2);
TASSERT(range1.getEndContainer().getNodeValue().equals("ext1"));
//case 2: non-text node, start==end
//
DOM_Element head = doc2.createElement("head");
DOM_Element h1 = doc2.createElement("h1");
head.appendChild(h1);
root2.appendChild(head);
//set range
DOM_Range range2 = doc2.createRange();
range2.setStart(head,0);
range2.setEnd(head,1);
TASSERT(range2.toString().equals(""));
TASSERT(range2.getStartOffset()==0);
TASSERT(range2.getStartContainer().getNodeName().equals("head"));
TASSERT(range2.getEndOffset()==1);
TASSERT(range2.getEndContainer().getNodeName().equals("head"));
//now insert a non-text node
//
DOM_Element h2 = doc2.createElement("h2");
range2.insertNode(h2);
TASSERT(range2.toString().equals(""));
TASSERT(range2.getStartOffset()==0);
TASSERT(range2.getStartContainer().getNodeName().equals("head"));
TASSERT(range2.getEndOffset()==2);
TASSERT(range2.getEndContainer().getNodeName().equals("head"));
//now insert a text node
//text5
DOM_Text text5 = doc2.createTextNode("text5");
range2.insertNode(text5);
TASSERT(range2.toString().equals("text5"));
TASSERT(range2.getStartOffset()==0);
TASSERT(range2.getStartContainer().getNodeName().equals("head"));
TASSERT(range2.getEndOffset()==3);
TASSERT(range2.getEndContainer().getNodeName().equals("head"));
//case 3: simple text node, start!=end
// text3
DOM_Element body2 = doc2.createElement("body2");
DOM_Text text3 = doc2.createTextNode("text3");
body2.appendChild(text3);
root2.appendChild(body2);
//set range
DOM_Range range3 = doc2.createRange();
range3.setStart(text3,1);
range3.setEnd(body2,1);
TASSERT(range3.toString().equals("ext3"));
TASSERT(range3.getStartOffset()==1);
TASSERT(range3.getStartContainer().getNodeValue().equals("text3"));
TASSERT(range3.getEndOffset()==1);
TASSERT(range3.getEndContainer().getNodeName().equals("body2"));
//now insert a textnode
//ttext4ext3
DOM_Text text4 = doc2.createTextNode("text4");
range3.insertNode(text4);
TASSERT(range3.toString().equals(""));
TASSERT(range3.getStartOffset()==1);
TASSERT(range3.getStartContainer().getNodeValue().equals("t"));
TASSERT(range3.getEndOffset()==1);
TASSERT(range3.getEndContainer().getNodeName().equals("body2"));
//now insert a non-text node
//ttext4ext3
DOM_Element p2 = doc2.createElement("p2");
range3.insertNode(p2);
//extra empty node caused by splitting 't'
TASSERT(range3.toString().equals(""));
TASSERT(range3.getStartOffset()==1);
TASSERT(range3.getStartContainer().getNodeValue().equals("t"));
TASSERT(range3.getEndOffset()==1);
TASSERT(range3.getEndContainer().getNodeName().equals("body2"));
//test toString a bit
range3.setStart(body2,1);
range3.setEnd(body2,5);
TASSERT(range3.toString().equals("text4ext3"));
range3.setStart(body2,0);
range3.setEnd(body2,5);
TASSERT(range3.toString().equals("ttext4ext3"));
//case 4: non-text node, start!=end
//
DOM_Element head2 = doc2.createElement("head2");
DOM_Element h3 = doc2.createElement("h3");
head2.appendChild(h3);
root2.appendChild(head2);
//set range
DOM_Range range4 = doc2.createRange();
range4.setStart(head2,0);
range4.setEnd(h3,0);
TASSERT(range4.toString().equals(""));
TASSERT(range4.getStartOffset()==0);
TASSERT(range4.getStartContainer().getNodeName().equals("head2"));
TASSERT(range4.getEndOffset()==0);
TASSERT(range4.getEndContainer().getNodeName().equals("h3"));
//now insert a non-text node
//
DOM_Element h4 = doc2.createElement("h4");
range4.insertNode(h4);
TASSERT(range4.toString().equals(""));
TASSERT(range4.getStartOffset()==0);
TASSERT(range4.getStartContainer().getNodeName().equals("head2"));
TASSERT(range4.getEndOffset()==0);
TASSERT(range4.getEndContainer().getNodeName().equals("h3"));
//now insert a text node
//text6
DOM_Text text6 = doc2.createTextNode("text6");
range4.insertNode(text6);
TASSERT(range4.toString().equals("text6"));
TASSERT(range4.getStartOffset()==0);
TASSERT(range4.getStartContainer().getNodeName().equals("head2"));
TASSERT(range4.getEndOffset()==0);
TASSERT(range4.getEndContainer().getNodeName().equals("h3"));
//***************************************************************
// quick test of updating
//***************************************************************
// text1
DOM_Element upbody = doc2.createElement("upbody");
DOM_Text uptext1 = doc2.createTextNode("uptext1");
upbody.appendChild(uptext1);
root2.appendChild(upbody);
DOM_Range uprange = doc2.createRange();
uprange.setStart(upbody,0);
uprange.setEnd(upbody,1);
TASSERT(uprange.toString().equals("uptext1"));
TASSERT(uprange.getStartOffset()==0);
TASSERT(uprange.getStartContainer().getNodeName().equals("upbody"));
TASSERT(uprange.getEndOffset()==1);
TASSERT(uprange.getEndContainer().getNodeName().equals("upbody"));
// split text
uptext1.splitText(1);
TASSERT(uprange.toString().equals("u"));
TASSERT(uprange.getStartOffset()==0);
TASSERT(uprange.getStartContainer().getNodeName().equals("upbody"));
TASSERT(uprange.getEndOffset()==1);
TASSERT(uprange.getEndContainer().getNodeName().equals("upbody"));
//insert node
DOM_Element upbody2 = doc2.createElement("upbody2");
DOM_Text uptext2 = doc2.createTextNode("uptext2");
upbody2.appendChild(uptext2);
root2.appendChild(upbody2);
DOM_Range uprange2 = doc2.createRange();
uprange2.setStart(uptext2,1);
uprange2.setEnd(upbody2,1);
DOM_Range uprange3 = doc2.createRange();
uprange3.setStart(uptext2,1);
uprange3.setEnd(upbody2,1);
TASSERT(uprange2.toString().equals("ptext2"));
TASSERT(uprange2.getStartOffset()==1);
TASSERT(uprange2.getStartContainer().getNodeValue().equals("uptext2"));
TASSERT(uprange2.getEndOffset()==1);
TASSERT(uprange2.getEndContainer().getNodeName().equals("upbody2"));
TASSERT(uprange3.toString().equals("ptext2"));
TASSERT(uprange3.getStartOffset()==1);
TASSERT(uprange3.getStartContainer().getNodeValue().equals("uptext2"));
TASSERT(uprange3.getEndOffset()==1);
TASSERT(uprange3.getEndContainer().getNodeName().equals("upbody2"));
DOM_Element upp1 = doc2.createElement("upp1");
uprange2.insertNode(upp1);
TASSERT(uprange2.toString().equals(""));
TASSERT(uprange2.getStartOffset()==1);
TASSERT(uprange2.getStartContainer().getNodeValue().equals("u"));
TASSERT(uprange2.getEndOffset()==1);
TASSERT(uprange2.getEndContainer().getNodeName().equals("upbody2"));
TASSERT(uprange3.toString().equals(""));
TASSERT(uprange3.getStartOffset()==1);
TASSERT(uprange3.getStartContainer().getNodeValue().equals("u"));
TASSERT(uprange3.getEndOffset()==1);
TASSERT(uprange3.getEndContainer().getNodeName().equals("upbody2"));
//***************************************************************
//another set of test
//abHello cdef
//
// ______________________foo_____________________
// | | | | |
// c moo "ab" a cool
// | | |
// b "Hello cd" "ef"
//
DOM_Document doc3 = DOM_Document::createDocument();
DOM_Element root3 = doc3.createElement("root");
doc3.appendChild(root3);
DOM_Element foo = doc3.createElement("foo");
DOM_Element moo = doc3.createElement("moo");
DOM_Element cool = doc3.createElement("cool");
DOM_Text ab = doc3.createTextNode("ab");
DOM_Text cd = doc3.createTextNode("Hello cd");
DOM_Text ef = doc3.createTextNode("ef");
DOM_Element a = doc3.createElement("a");
DOM_Element b = doc3.createElement("b");
DOM_Element c = doc3.createElement("c");
root3.appendChild(foo);
foo.appendChild(c);
foo.appendChild(moo);
foo.appendChild(ab);
foo.appendChild(a);
foo.appendChild(cool);
moo.appendChild(b);
a.appendChild(cd);
cool.appendChild(ef);
//***************************************************************
//TEST toString
//***************************************************************
DOM_Range newtestrange = doc3.createRange();
//case 1:
//start container is text node
// i) end container is also text node
// a) start==end
// b) start!=end
// ii) end container is not text node
// a) start==end => impossible
// b) start!=end
//
//case 2:
//start container is not text node
// i) end container is text node
// a) start==end => impossible
// b) start!=end
// ii) end container is not text node
// a) start==end
// b) start!=end
//case 1, i, a
newtestrange.setStart( cd, 1 );
newtestrange.setEnd( cd, 4 );
TASSERT(newtestrange.toString().equals("ell"));
//case 1, i, b
newtestrange.setStart( cd, 1 );
newtestrange.setEnd( ef, 2 );
TASSERT(newtestrange.toString().equals("ello cdef"));
//case 1, ii, b
newtestrange.setStart( cd, 1 );
newtestrange.setEnd( foo, 4 );
TASSERT(newtestrange.toString().equals("ello cd"));
//case 2, i, b
newtestrange.setStart( foo, 1 );
newtestrange.setEnd( cd, 5 );
TASSERT(newtestrange.toString().equals("abHello"));
//case 2, ii, a
newtestrange.setStart( foo, 1 );
newtestrange.setEnd( foo, 4 );
TASSERT(newtestrange.toString().equals("abHello cd"));
//case 2, ii, b
newtestrange.setStart( moo, 1 );
newtestrange.setEnd( foo, 4 );
TASSERT(newtestrange.toString().equals("abHello cd"));
//***************************************************************
//test removeChild
//***************************************************************
DOM_Range newrange = doc3.createRange();
newrange.setStart( moo, 0 );
newrange.setEnd( foo, 4 );
TASSERT(newrange.getStartOffset()==0);
TASSERT(newrange.getStartContainer().getNodeName().equals("moo"));
TASSERT(newrange.getEndOffset()==4);
TASSERT(newrange.getEndContainer().getNodeName().equals("foo"));
TASSERT(newrange.toString().equals("abHello cd"));
DOM_Node n = newrange.cloneContents();
DOM_NodeList nol = foo.getChildNodes();
//removing moo
foo.removeChild(nol.item(1));
TASSERT(newrange.getStartOffset()==1);
TASSERT(newrange.getStartContainer().getNodeName().equals("foo"));
TASSERT(newrange.getEndOffset()==3);
TASSERT(newrange.getEndContainer().getNodeName().equals("foo"));
TASSERT(newrange.toString().equals("abHello cd"));
TASSERT(newtestrange.getStartOffset()==1);
TASSERT(newtestrange.getStartContainer().getNodeName().equals("foo"));
TASSERT(newtestrange.getEndOffset()==3);
TASSERT(newtestrange.getEndContainer().getNodeName().equals("foo"));
TASSERT(newtestrange.toString().equals("abHello cd"));
}
TESTEPILOG;
} //creating the dom tree and tests
//
// Print Final allocation stats for full test
//
DomMemDebug().print();
// And call the termination method
XMLPlatformUtils::Terminate();
return 0;
};