RangeTest.cpp
上传用户:huihehuasu
上传日期:2007-01-10
资源大小:6948k
文件大小:39k
源码类别:

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 1999, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /**
  57.  * $Id: RangeTest.cpp,v 1.4 2001/11/23 19:28:49 tng Exp $
  58.  */
  59. /** This RangeTest tests all of the cases delineated as examples
  60.  *  in the DOM Level 2 Range specification, and a few others.
  61.  *  <p>These do not by any means completely test the API and
  62.  *  corner cases.
  63.  */
  64. #include <stdio.h>
  65. #include <string.h>
  66. #include <dom/DOM.hpp>
  67. #include <dom/DomMemDebug.hpp>
  68. #include <parsers/DOMParser.hpp>
  69. #include <util/PlatformUtils.hpp>
  70. #include <util/XMLException.hpp>
  71. #include <util/XMLString.hpp>
  72. #include <dom/DOM_Range.hpp>
  73. #include <dom/DOM_XMLDecl.hpp>
  74. #include <framework/MemBufInputSource.hpp>
  75. #define TASSERT(c) tassert((c), __FILE__, __LINE__)
  76. void tassert(bool c, const char *file, int line)
  77. {
  78.     if (!c)
  79.         printf("Failure.  Line %d,   file %sn", line, file);
  80. };
  81. #define TESTPROLOG entryMemState = DomMemDebug();
  82. #define TESTEPILOG    exitMemState = DomMemDebug(); 
  83.     if (entryMemState != exitMemState) { 
  84.         printf(" Memory leak at line %d, file %s:  ", __LINE__, __FILE__);  
  85.         exitMemState.printDifference(entryMemState); 
  86.     }
  87. #define EXCEPTION_TEST(operation, expected_exception)               
  88. {                                                                   
  89.     try {                                                           
  90.     operation;                                                      
  91.     printf(" Error: no exception thrown at line %dn", __LINE__);   
  92. }                                                                   
  93.     catch (DOM_DOMException &e) {                                       
  94.     if (e.code != expected_exception)                       
  95.     printf(" Wrong exception code: %d at line %dn", e.code, __LINE__); 
  96. }                                                                 
  97.     catch (...)   {                                                 
  98.     printf(" Wrong exception thrown at line %dn", __LINE__);       
  99. }                                                                   
  100. }
  101. int  main()
  102. {
  103.     DomMemDebug     entryMemState, exitMemState;
  104. try {
  105. XMLPlatformUtils::Initialize();
  106. }
  107. catch (const XMLException& toCatch) {
  108.         char *pMessage = XMLString::transcode(toCatch.getMessage());
  109.         fprintf(stderr, "Error during XMLPlatformUtils::Initialize(). n"
  110.                         "  Message is: %sn", pMessage);
  111.         delete [] pMessage;
  112.         return -1;
  113.     }
  114.     /*
  115.     Range tests include testing of
  116.     createRange
  117.     setStart, setStartBefore. setStartAfter,
  118.     setEnd, setEndBefore. setEndAfter
  119.     getStartContainer, getStartOffset
  120.     getEndContainer, getEndOffset
  121.     getCommonAncestorContainer
  122.     selectNode
  123.     selectNodeContents
  124.     insertNode
  125.     deleteContents
  126.     collapse
  127.     getCollapsed
  128.     surroundContents
  129.     compareBoundaryPoints
  130.     cloneRange
  131.     cloneContents
  132.     extractContents
  133.     toString
  134.     detach
  135.     removeChild
  136.     */
  137.     {
  138.         {
  139.             DOM_Document    doc = DOM_Document::createDocument();
  140.             //Creating a root element
  141.             DOM_Element     root = doc.createElement("Body");
  142.             doc.appendChild(root);
  143.             //Creating the siblings of root
  144.             DOM_Element     E11 = doc.createElement("H1");
  145.             root.appendChild(E11);
  146.             DOM_Element     E12 = doc.createElement("P");
  147.             root.appendChild(E12);
  148.             //Attaching texts to siblings
  149.             DOM_Text        textNode1 = doc.createTextNode("Title");
  150.             E11.appendChild(textNode1);
  151.             DOM_Text        textNode11 = doc.createTextNode("AnotherText");
  152.             E11.appendChild(textNode11);
  153.             DOM_Text        textNode2 = doc.createTextNode("Blah xyz");
  154.             E12.appendChild(textNode2);
  155.             DOM_Text     E210 = doc.createTextNode("insertedText");
  156.         }
  157.         TESTPROLOG;
  158.         {
  159.             //DOM Tree and some usable node creation
  160.             DOM_Document    doc = DOM_Document::createDocument();
  161.             //Creating a root element
  162.             DOM_Element     root = doc.createElement("Body");
  163.             doc.appendChild(root);
  164.             //Creating the siblings of root
  165.             DOM_Element     E11 = doc.createElement("H1");
  166.             root.appendChild(E11);
  167.             DOM_Element     E12 = doc.createElement("P");
  168.             root.appendChild(E12);
  169.             //Attaching texts to siblings
  170.             DOM_Text        textNode1 = doc.createTextNode("Title");
  171.             E11.appendChild(textNode1);
  172.             DOM_Text        textNode11 = doc.createTextNode("AnotherText");
  173.             E11.appendChild(textNode11);
  174.             DOM_Text        textNode2 = doc.createTextNode("Blah xyz");
  175.             E12.appendChild(textNode2);
  176.             //experimental nodes
  177.             DOM_Element     E120 = doc.createElement("Element1");
  178.             DOM_Element     E121 = doc.createElement("Element2");
  179.             DOM_Element     E122 = doc.createElement("Element3");
  180.             DOM_Element     E311 = doc.createElement("SurroundNode1");
  181.             DOM_Text     E210 = doc.createTextNode("insertedText");
  182.             DOM_Node rt = doc.getDocumentElement();
  183.             DOM_Range range = doc.createRange();
  184.             //Tests start here
  185.             // Initial dom tree looks like :
  186.             // <Body><H1>TitleAnother Text</H1><P>Blah xyz</P></Body>
  187.             //i.e.,            Body(rt)
  188.             //     _____________|________________
  189.             //     |                           |
  190.             //  ___H1(E11)___                    P(E12)
  191.             //  |           |                    |
  192.             //  "Title"  "Another Text"        "Blah xyz"
  193.             //test for start and end settings of a range
  194.             range.setStart(rt.getFirstChild(), 0);
  195.             TASSERT(range.getStartContainer() == rt.getFirstChild() );
  196.             TASSERT(range.getStartOffset() == 0);
  197.             range.setEnd(rt.getFirstChild(), 1);
  198.             TASSERT(range.getEndContainer() == rt.getFirstChild() );
  199.             TASSERT(range.getEndOffset() == 1);
  200.             DOM_Node node = range.getCommonAncestorContainer();
  201.             TASSERT(range.getCommonAncestorContainer() == rt.getFirstChild());
  202.             //selection related test
  203.             range.selectNode(rt.getLastChild());
  204.             TASSERT(range.getStartContainer() == rt);
  205.             TASSERT(range.getStartOffset() == 1);
  206.             TASSERT(range.getEndContainer() == rt);
  207.             TASSERT(range.getEndOffset() == 2);
  208.             //insertion related tests
  209.             range.insertNode(E120);
  210.             //only end offset moves and new node gets into range as being inserted at boundary point
  211.             TASSERT(range.getStartContainer() == rt);
  212.             TASSERT(range.getStartOffset() == 1);
  213.             TASSERT(range.getEndContainer() == rt);
  214.             TASSERT(range.getEndOffset() == 3);
  215.             range.insertNode(E121);
  216.             //only end offset moves and new node gets into range as being inserted at boundary point
  217.             TASSERT(range.getStartContainer() == rt);
  218.             TASSERT(range.getStartOffset() == 1);
  219.             TASSERT(range.getEndContainer() == rt);
  220.             TASSERT(range.getEndOffset() == 4);
  221.             rt.insertBefore(E122, rt.getFirstChild());
  222.             //both offsets move as new node is not part of the range
  223.             TASSERT(range.getStartContainer() == rt);
  224.             TASSERT(range.getStartOffset() == 2);
  225.             TASSERT(range.getEndContainer() == rt);
  226.             TASSERT(range.getEndOffset() == 5);
  227.             //After above operations, now the tree looks like:
  228.             // <Body><Element3/><H1>TitleAnother Text</H1><Element2/><Element1/><P>Blah xyz</P></Body>
  229.             //i.e.,            Body(rt)
  230.             //     _____________|_______________________________________________________________
  231.             //     |                |                  |                |                      |
  232.             //  Element3(E122)  ___H1(E11)___        Element2(E121)    Element1(E120)          P(E12)
  233.             //                  |           |                                                  |
  234.             //               "Title"  "Another Text"                                        "Blah xyz"
  235.             //
  236.             // range has rt as start and end container, and 2 as start offset, 5 as end offset
  237.             //changing selection
  238.             range.selectNode(rt.getLastChild().getPreviousSibling());
  239.             TASSERT(range.getStartContainer() == rt);
  240.             TASSERT(range.getStartOffset() == 3);
  241.             TASSERT(range.getEndContainer() == rt);
  242.             TASSERT(range.getEndOffset() == 4);
  243.             //deleting related tests
  244.             range.deleteContents();
  245.             TASSERT(rt.getLastChild().getPreviousSibling() == E121);
  246.             range.setStart(rt.getFirstChild().getNextSibling().getFirstChild(), 2);
  247.             TASSERT(range.getStartContainer() == rt.getFirstChild().getNextSibling().getFirstChild());
  248.             TASSERT(range.getStartContainer().getNodeValue().equals("Title"));
  249.             TASSERT(range.getStartOffset() == 2);
  250.             range.setEnd(rt.getFirstChild().getNextSibling().getFirstChild(), 4);
  251.             TASSERT(range.getEndContainer() == rt.getFirstChild().getNextSibling().getFirstChild());
  252.             TASSERT(range.getEndContainer().getNodeValue().equals("Title"));
  253.             TASSERT(range.getEndOffset() == 4);
  254.             TASSERT(range.toString().equals("tl"));
  255.             //inserting text between a text node
  256.             range.insertNode(E210);
  257.             //only end offset moves and new node gets into range as being inserted at boundary point
  258.             TASSERT(range.getStartContainer() == rt.getFirstChild().getNextSibling().getFirstChild());
  259.             TASSERT(range.getStartOffset() == 2);
  260.             TASSERT(range.getEndContainer() == rt.getFirstChild().getNextSibling().getLastChild().getPreviousSibling());
  261.             TASSERT(range.getEndOffset() == 2);
  262.             //inserting element node before the selected text node
  263.             range.insertNode(E120);
  264.             //only end offset moves and new node gets into range as being inserted at boundary point
  265.             TASSERT(range.getStartContainer() == rt.getFirstChild().getNextSibling().getFirstChild());
  266.             TASSERT(range.getStartContainer().getNodeValue().equals("Ti"));
  267.             TASSERT(range.getStartOffset() == 2);
  268.             TASSERT(range.getEndContainer() == rt.getFirstChild().getNextSibling().getLastChild().getPreviousSibling());
  269.             TASSERT(range.getEndContainer().getNodeValue().equals("tle"));
  270.             TASSERT(range.getEndOffset() == 2);
  271.             TASSERT(E11.getChildNodes().getLength()==6);
  272.            //checking the text replacment
  273.             range.getStartContainer().setNodeValue("ReplacedText");
  274.             //only the start offset is impact
  275.             TASSERT(range.getStartContainer() == rt.getFirstChild().getNextSibling().getFirstChild());
  276.             TASSERT(range.getStartContainer().getNodeValue().equals("ReplacedText"));
  277.             TASSERT(range.getStartOffset() == 0);
  278.             TASSERT(range.getEndContainer() == rt.getFirstChild().getNextSibling().getLastChild().getPreviousSibling());
  279.             TASSERT(range.getEndContainer().getNodeValue().equals("tle"));
  280.             TASSERT(range.getEndOffset() == 2);
  281.             //After above operations, now the tree looks like:
  282.             // <Body><Element3/><H1>ReplacedText<Element1/>insertedTexttleAnother Text</H1><Element2/><P>Blah xyz</P></Body>
  283.             //i.e.,            Body(rt)
  284.             //     _____________|_______________________________________________________________________________________________
  285.             //     |                |                                                                          |                |
  286.             //  Element3(E122)  ___H1(E11)___________________________________________________________        Element2(E121)    P(E12)
  287.             //                  |              |     |                |                      |      |                             |
  288.             //               "ReplacedText"   ""   Element1(E120)   "insertedText"(E210)   "tle"  "Another Text"              "Blah xyz"
  289.             //
  290.             // range has "ReplacedText" as start container and "tle" as end container
  291.             //   and 0 as start offset, 2 as end offset
  292.             //changing the selection. Preparing for 'surround'
  293.             range.setStart(range.getStartContainer().getParentNode(), 2);
  294.             range.setEnd(range.getStartContainer(), 5);
  295.             TASSERT(range.getStartContainer().getNodeName().equals("H1"));
  296.             TASSERT(range.getEndContainer().getNodeName().equals("H1"));
  297.             TASSERT(range.toString().equals("insertedTexttle"));
  298.             range.surroundContents(E311);
  299.             TASSERT(range.getStartContainer().getNodeName().equals("H1"));
  300.             TASSERT(range.getStartOffset() == 2);
  301.             TASSERT(range.getEndContainer().getNodeName().equals("H1"));
  302.             TASSERT(range.getEndOffset() == 3);
  303.             TASSERT(E11.getChildNodes().getLength()==4);
  304.             TASSERT(E311.getChildNodes().getLength()==3);
  305.             TASSERT(range.toString().equals("insertedTexttle"));
  306.             //After above operations, now the tree looks like:
  307.             // <Body><Element3/><H1>ReplacedText<SurroundNode1><Element1/>insertedTexttle</SurroundNode1>Another Text</H1><Element2/><P>Blah xyz</P></Body>
  308.             //i.e.,            Body(rt)
  309.             //     _____________|_________________________________________________________________________
  310.             //     |                |                                                    |                |
  311.             //  Element3(E122)  ___H1(E11)___________________________________        Element2(E121)    P(E12)
  312.             //                  |              |     |                      |                            |
  313.             //               "ReplacedText"   ""   SurroundNode1(E311)  "Another Text"              "Blah xyz"
  314.             //                          ____________ |_____________________________
  315.             //                          |                    |                    |
  316.             //                          Element1(E120)   "insertedText"(E210)   "tle"
  317.             //
  318.             // range has H1 as start and end container and 2 as start offset, 3 as end offset
  319.             //testing cloning
  320.             DOM_Range aRange = range.cloneRange();
  321.             TASSERT(aRange.getStartContainer() == range.getStartContainer());
  322.             TASSERT(aRange.getEndContainer() == range.getEndContainer());
  323.             TASSERT(aRange.getStartOffset() == 2);
  324.             TASSERT(aRange.getEndOffset() == 3);
  325.             //changing the new ranges start
  326.             aRange.setStart(aRange.getStartContainer().getFirstChild(), 1);
  327.             //comparing the ranges
  328.             short compVal = range.compareBoundaryPoints(DOM_Range::END_TO_END, aRange);
  329.             TASSERT(compVal == 0);
  330.             compVal = range.compareBoundaryPoints(DOM_Range::START_TO_START, aRange);
  331.             TASSERT(compVal == 1);
  332.             compVal = range.compareBoundaryPoints(DOM_Range::START_TO_END, aRange);
  333.             TASSERT(compVal == 1);
  334.             compVal = range.compareBoundaryPoints(DOM_Range::END_TO_START, aRange);
  335.             TASSERT(compVal == -1);
  336.             //testing collapse
  337.             //not collapsed
  338.             TASSERT(range.getCollapsed() == false);
  339.             TASSERT(range.getStartOffset() == 2);
  340.             TASSERT(range.getEndOffset() == 3);
  341.             //selectNodeContents
  342.             range.selectNodeContents(rt.getLastChild().getFirstChild());
  343.             TASSERT(range.getStartContainer() == rt.getLastChild().getFirstChild());
  344.             TASSERT(range.getEndContainer() == rt.getLastChild().getFirstChild());
  345.             TASSERT(range.getStartOffset() == 0);
  346.             TASSERT(range.getEndOffset() == 8);
  347.             TASSERT(range.toString().equals("Blah xyz"));
  348.             //testing collapse
  349.             range.collapse(true); //collapse to start
  350.             TASSERT(range.getCollapsed() == true);
  351.             TASSERT(range.getStartOffset() == 0);
  352.             TASSERT(range.getEndOffset() == 0);
  353.             TASSERT(range.toString().equals(""));
  354.             TASSERT(aRange.getEndOffset() == 3); //other range is unaffected
  355.             TASSERT(aRange.toString().equals("eplacedTextinsertedTexttle"));
  356.             //After above operations, now the tree looks like:
  357.             // <Body><Element3/><H1>ReplacedText<SurroundNode1><Element1/>insertedTexttle</SurroundNode1>Another Text</H1><Element2/><P>Blah xyz</P></Body>
  358.             //i.e.,            Body(rt)
  359.             //     _____________|_________________________________________________________________________
  360.             //     |                |                                                    |                |
  361.             //  Element3(E122)  ___H1(E11)___________________________________        Element2(E121)    P(E12)
  362.             //                  |              |     |                      |                            |
  363.             //               "ReplacedText"   ""   SurroundNode1(E311)  "Another Text"              "Blah xyz"
  364.             //                          ____________ |_____________________________
  365.             //                          |                    |                    |
  366.             //                          Element1(E120)   "insertedText"(E210)   "tle"
  367.             //
  368.             // range has "Blah xyz" as start and end container and 0 as start and end offset (collapsed)
  369.             // aRange has "ReplacedText" as start container and H1 as end container
  370.             //    and 1 as start offset and 3 as end offset
  371.             DOM_DocumentFragment docFrag = aRange.cloneContents();
  372.             TASSERT( docFrag != 0);
  373.             range.selectNode(rt.getFirstChild());
  374.             TASSERT(range.getStartContainer() == rt);
  375.             TASSERT(range.getEndContainer() == rt);
  376.             TASSERT(range.getStartOffset() == 0);
  377.             TASSERT(range.getEndOffset() == 1);
  378.             //Testing toString()
  379.             const char* str = aRange.toString().transcode();
  380.             const char* str2 = "eplacedTextinsertedTexttle";
  381.             TASSERT(*str == *str2);
  382.             //start and end before and after tests
  383.             range.setStartBefore(rt.getFirstChild());
  384.             TASSERT(range.getStartOffset() == 0);
  385.             range.setEndBefore(rt.getFirstChild());
  386.             TASSERT(range.getEndOffset() == 0);
  387.             range.setStartAfter(rt.getLastChild());
  388.             TASSERT(range.getStartOffset() == 4);
  389.             range.setStartAfter(rt.getFirstChild());
  390.             TASSERT(range.getStartOffset() == 1);
  391.             range.setEndBefore(rt.getLastChild());
  392.             TASSERT(range.getEndOffset() == 3);
  393.             range.setEndAfter(rt.getLastChild());
  394.             TASSERT(range.getEndOffset() == 4);
  395.             //testing extract()
  396.             DOM_DocumentFragment frag2 = range.extractContents();
  397.             TASSERT( frag2 != 0);
  398.             //After above operations, now the tree looks like:
  399.             // <Body><Element3/></Body>
  400.             //i.e.,            Body(rt)
  401.             //                  |
  402.             //               Element3(E122)
  403.             //
  404.             // aRange has rt as start and end container, and 1 as start and end offset (collapsed)
  405.             // range has rt as start and end container, and 1 as start and end offset (collapsed)
  406.             //
  407.             //and frag2 looks:
  408.             // <Body>ReplacedText<SurroundNode1><Element1/>insertedTexttle</SurroundNode1>Another Text</H1><Element2/><P>Blah xyz</P></Body>
  409.             //i.e.,             Body(rt)
  410.             //      ______________|________________________________________________________
  411.             //      |                                                    |                |
  412.             //   ___H1(E11)___________________________________        Element2(E121)    P(E12)
  413.             //   |              |     |                      |                            |
  414.             //"ReplacedText"   ""   SurroundNode1(E311)  "Another Text"              "Blah xyz"
  415.             //           ____________ |_____________________________
  416.             //           |                    |                    |
  417.             //        Element1(E120)   "insertedText"(E210)   "tle"
  418.             //
  419.             //the tree do not have those node anymore after extract
  420.             //only Element3 left
  421.             TASSERT(rt.getChildNodes().getLength()==1);
  422.             //aRange is collapsed
  423.             TASSERT(aRange.getCollapsed() == true);
  424.             TASSERT(aRange.getStartContainer() == rt);
  425.             TASSERT(aRange.getStartOffset() == 1);
  426.             TASSERT(aRange.getEndContainer() == rt);
  427.             TASSERT(aRange.getEndOffset() == 1);
  428.             //range is collapsed as well
  429.             TASSERT(range.getCollapsed() == true);
  430.             TASSERT(range.getStartContainer() == rt);
  431.             TASSERT(range.getStartOffset() == 1);
  432.             TASSERT(range.getEndContainer() == rt);
  433.             TASSERT(range.getEndOffset() == 1);
  434.             //test the document fragment frag2
  435.             TASSERT(frag2.getChildNodes().getLength()==3);
  436.             //detaching the other range
  437.             aRange.detach();
  438.             range.detach();
  439.            //***************************************************************
  440.            //another set of test
  441.            //TEST createRange, setStart and setEnd, insertnode
  442.            //***************************************************************
  443.            DOM_Document doc2 = DOM_Document::createDocument();
  444.            DOM_Element root2 = doc2.createElement("root2");
  445.            doc2.appendChild(root2);
  446.            //case 1: simple text node, start==end
  447.            // <body>text1</body>
  448.            DOM_Element body = doc2.createElement("body");
  449.            DOM_Text text1 = doc2.createTextNode("text1");
  450.            body.appendChild(text1);
  451.            root2.appendChild(body);
  452.            //set range
  453.            DOM_Range range1 = doc2.createRange();
  454.            range1.setStart(text1,1);
  455.            range1.setEnd(text1,3);
  456.            TASSERT(range1.toString().equals("ex"));
  457.            TASSERT(range1.getStartOffset()==1);
  458.            TASSERT(range1.getStartContainer().getNodeValue().equals("text1"));
  459.            TASSERT(range1.getEndOffset()==3);
  460.            TASSERT(range1.getEndContainer().getNodeValue().equals("text1"));
  461.            //now insert a text node
  462.            //<body>ttext2ext1</body>
  463.            DOM_Text text2 = doc2.createTextNode("text2");
  464.            range1.insertNode(text2);
  465.            TASSERT(range1.toString().equals("text2ex"));
  466.            TASSERT(range1.getStartOffset()==1);
  467.            TASSERT(range1.getStartContainer().getNodeValue().equals("t"));
  468.            TASSERT(range1.getEndOffset()==2);
  469.            TASSERT(range1.getEndContainer().getNodeValue().equals("ext1"));
  470.            //now insert a non-text node
  471.            //<body>t<p1/>text2ext1</body>
  472.            DOM_Element p1 = doc2.createElement("p1");
  473.            range1.insertNode(p1);
  474.            TASSERT(range1.toString().equals("text2ex"));
  475.            TASSERT(range1.getStartOffset()==1);
  476.            TASSERT(range1.getStartContainer().getNodeValue().equals("t"));
  477.            TASSERT(range1.getEndOffset()==2);
  478.            TASSERT(range1.getEndContainer().getNodeValue().equals("ext1"));
  479.            //case 2: non-text node, start==end
  480.            // <head><h1/></head>
  481.            DOM_Element head = doc2.createElement("head");
  482.            DOM_Element h1 = doc2.createElement("h1");
  483.            head.appendChild(h1);
  484.            root2.appendChild(head);
  485.            //set range
  486.            DOM_Range range2 = doc2.createRange();
  487.            range2.setStart(head,0);
  488.            range2.setEnd(head,1);
  489.            TASSERT(range2.toString().equals(""));
  490.            TASSERT(range2.getStartOffset()==0);
  491.            TASSERT(range2.getStartContainer().getNodeName().equals("head"));
  492.            TASSERT(range2.getEndOffset()==1);
  493.            TASSERT(range2.getEndContainer().getNodeName().equals("head"));
  494.            //now insert a non-text node
  495.            //<head><h2/><h1/></head>
  496.            DOM_Element h2 = doc2.createElement("h2");
  497.            range2.insertNode(h2);
  498.            TASSERT(range2.toString().equals(""));
  499.            TASSERT(range2.getStartOffset()==0);
  500.            TASSERT(range2.getStartContainer().getNodeName().equals("head"));
  501.            TASSERT(range2.getEndOffset()==2);
  502.            TASSERT(range2.getEndContainer().getNodeName().equals("head"));
  503.            //now insert a text node
  504.            //<head>text5<h2/><h1/></head>
  505.            DOM_Text text5 = doc2.createTextNode("text5");
  506.            range2.insertNode(text5);
  507.            TASSERT(range2.toString().equals("text5"));
  508.            TASSERT(range2.getStartOffset()==0);
  509.            TASSERT(range2.getStartContainer().getNodeName().equals("head"));
  510.            TASSERT(range2.getEndOffset()==3);
  511.            TASSERT(range2.getEndContainer().getNodeName().equals("head"));
  512.            //case 3: simple text node, start!=end
  513.            // <body2>text3</body2>
  514.            DOM_Element body2 = doc2.createElement("body2");
  515.            DOM_Text text3 = doc2.createTextNode("text3");
  516.            body2.appendChild(text3);
  517.            root2.appendChild(body2);
  518.            //set range
  519.            DOM_Range range3 = doc2.createRange();
  520.            range3.setStart(text3,1);
  521.            range3.setEnd(body2,1);
  522.            TASSERT(range3.toString().equals("ext3"));
  523.            TASSERT(range3.getStartOffset()==1);
  524.            TASSERT(range3.getStartContainer().getNodeValue().equals("text3"));
  525.            TASSERT(range3.getEndOffset()==1);
  526.            TASSERT(range3.getEndContainer().getNodeName().equals("body2"));
  527.            //now insert a textnode
  528.            //<body2>ttext4ext3</body2>
  529.            DOM_Text text4 = doc2.createTextNode("text4");
  530.            range3.insertNode(text4);
  531.            TASSERT(range3.toString().equals(""));
  532.            TASSERT(range3.getStartOffset()==1);
  533.            TASSERT(range3.getStartContainer().getNodeValue().equals("t"));
  534.            TASSERT(range3.getEndOffset()==1);
  535.            TASSERT(range3.getEndContainer().getNodeName().equals("body2"));
  536.            //now insert a non-text node
  537.            //<body2>t<p2/>text4ext3</body2>
  538.            DOM_Element p2 = doc2.createElement("p2");
  539.            range3.insertNode(p2);
  540.            //extra empty node caused by splitting 't'
  541.            TASSERT(range3.toString().equals(""));
  542.            TASSERT(range3.getStartOffset()==1);
  543.            TASSERT(range3.getStartContainer().getNodeValue().equals("t"));
  544.            TASSERT(range3.getEndOffset()==1);
  545.            TASSERT(range3.getEndContainer().getNodeName().equals("body2"));
  546.            //test toString a bit
  547.            range3.setStart(body2,1);
  548.            range3.setEnd(body2,5);
  549.            TASSERT(range3.toString().equals("text4ext3"));
  550.            range3.setStart(body2,0);
  551.            range3.setEnd(body2,5);
  552.            TASSERT(range3.toString().equals("ttext4ext3"));
  553.            //case 4: non-text node, start!=end
  554.            // <head2><h3/></head2>
  555.            DOM_Element head2 = doc2.createElement("head2");
  556.            DOM_Element h3 = doc2.createElement("h3");
  557.            head2.appendChild(h3);
  558.            root2.appendChild(head2);
  559.            //set range
  560.            DOM_Range range4 = doc2.createRange();
  561.            range4.setStart(head2,0);
  562.            range4.setEnd(h3,0);
  563.            TASSERT(range4.toString().equals(""));
  564.            TASSERT(range4.getStartOffset()==0);
  565.            TASSERT(range4.getStartContainer().getNodeName().equals("head2"));
  566.            TASSERT(range4.getEndOffset()==0);
  567.            TASSERT(range4.getEndContainer().getNodeName().equals("h3"));
  568.            //now insert a non-text node
  569.            //<head2><h4/><h3/></head2>
  570.            DOM_Element h4 = doc2.createElement("h4");
  571.            range4.insertNode(h4);
  572.            TASSERT(range4.toString().equals(""));
  573.            TASSERT(range4.getStartOffset()==0);
  574.            TASSERT(range4.getStartContainer().getNodeName().equals("head2"));
  575.            TASSERT(range4.getEndOffset()==0);
  576.            TASSERT(range4.getEndContainer().getNodeName().equals("h3"));
  577.            //now insert a text node
  578.            //<head2>text6<h4/><h3/></head2>
  579.            DOM_Text text6 = doc2.createTextNode("text6");
  580.            range4.insertNode(text6);
  581.            TASSERT(range4.toString().equals("text6"));
  582.            TASSERT(range4.getStartOffset()==0);
  583.            TASSERT(range4.getStartContainer().getNodeName().equals("head2"));
  584.            TASSERT(range4.getEndOffset()==0);
  585.            TASSERT(range4.getEndContainer().getNodeName().equals("h3"));
  586.            //***************************************************************
  587.            // quick test of updating
  588.            //***************************************************************
  589.            // <upbody>text1</upbody>
  590.            DOM_Element upbody = doc2.createElement("upbody");
  591.            DOM_Text uptext1 = doc2.createTextNode("uptext1");
  592.            upbody.appendChild(uptext1);
  593.            root2.appendChild(upbody);
  594.            DOM_Range uprange = doc2.createRange();
  595.            uprange.setStart(upbody,0);
  596.            uprange.setEnd(upbody,1);
  597.            TASSERT(uprange.toString().equals("uptext1"));
  598.            TASSERT(uprange.getStartOffset()==0);
  599.            TASSERT(uprange.getStartContainer().getNodeName().equals("upbody"));
  600.            TASSERT(uprange.getEndOffset()==1);
  601.            TASSERT(uprange.getEndContainer().getNodeName().equals("upbody"));
  602.            // split text
  603.            uptext1.splitText(1);
  604.            TASSERT(uprange.toString().equals("u"));
  605.            TASSERT(uprange.getStartOffset()==0);
  606.            TASSERT(uprange.getStartContainer().getNodeName().equals("upbody"));
  607.            TASSERT(uprange.getEndOffset()==1);
  608.            TASSERT(uprange.getEndContainer().getNodeName().equals("upbody"));
  609.            //insert node
  610.            DOM_Element upbody2 = doc2.createElement("upbody2");
  611.            DOM_Text uptext2 = doc2.createTextNode("uptext2");
  612.            upbody2.appendChild(uptext2);
  613.            root2.appendChild(upbody2);
  614.            DOM_Range uprange2 = doc2.createRange();
  615.            uprange2.setStart(uptext2,1);
  616.            uprange2.setEnd(upbody2,1);
  617.            DOM_Range uprange3 = doc2.createRange();
  618.            uprange3.setStart(uptext2,1);
  619.            uprange3.setEnd(upbody2,1);
  620.            TASSERT(uprange2.toString().equals("ptext2"));
  621.            TASSERT(uprange2.getStartOffset()==1);
  622.            TASSERT(uprange2.getStartContainer().getNodeValue().equals("uptext2"));
  623.            TASSERT(uprange2.getEndOffset()==1);
  624.            TASSERT(uprange2.getEndContainer().getNodeName().equals("upbody2"));
  625.            TASSERT(uprange3.toString().equals("ptext2"));
  626.            TASSERT(uprange3.getStartOffset()==1);
  627.            TASSERT(uprange3.getStartContainer().getNodeValue().equals("uptext2"));
  628.            TASSERT(uprange3.getEndOffset()==1);
  629.            TASSERT(uprange3.getEndContainer().getNodeName().equals("upbody2"));
  630.            DOM_Element upp1 = doc2.createElement("upp1");
  631.            uprange2.insertNode(upp1);
  632.            TASSERT(uprange2.toString().equals(""));
  633.            TASSERT(uprange2.getStartOffset()==1);
  634.            TASSERT(uprange2.getStartContainer().getNodeValue().equals("u"));
  635.            TASSERT(uprange2.getEndOffset()==1);
  636.            TASSERT(uprange2.getEndContainer().getNodeName().equals("upbody2"));
  637.            TASSERT(uprange3.toString().equals(""));
  638.            TASSERT(uprange3.getStartOffset()==1);
  639.            TASSERT(uprange3.getStartContainer().getNodeValue().equals("u"));
  640.            TASSERT(uprange3.getEndOffset()==1);
  641.            TASSERT(uprange3.getEndContainer().getNodeName().equals("upbody2"));
  642.            //***************************************************************
  643.            //another set of test
  644.            //<foo><c/><moo><b/></moo>ab<a>Hello cd</a><cool>ef</cool></foo>
  645.            //
  646.            //  ______________________foo_____________________
  647.            //  |          |           |          |           |
  648.            //  c         moo        "ab"         a          cool
  649.            //             |                      |           |
  650.            //             b                    "Hello cd"   "ef"
  651.            //
  652.            DOM_Document doc3 = DOM_Document::createDocument();
  653.            DOM_Element root3 = doc3.createElement("root");
  654.            doc3.appendChild(root3);
  655.            DOM_Element foo = doc3.createElement("foo");
  656.            DOM_Element moo = doc3.createElement("moo");
  657.            DOM_Element cool = doc3.createElement("cool");
  658.            DOM_Text ab = doc3.createTextNode("ab");
  659.            DOM_Text cd = doc3.createTextNode("Hello cd");
  660.            DOM_Text ef = doc3.createTextNode("ef");
  661.            DOM_Element a = doc3.createElement("a");
  662.            DOM_Element b = doc3.createElement("b");
  663.            DOM_Element c = doc3.createElement("c");
  664.            root3.appendChild(foo);
  665.            foo.appendChild(c);
  666.            foo.appendChild(moo);
  667.            foo.appendChild(ab);
  668.            foo.appendChild(a);
  669.            foo.appendChild(cool);
  670.            moo.appendChild(b);
  671.            a.appendChild(cd);
  672.            cool.appendChild(ef);
  673.            //***************************************************************
  674.            //TEST toString
  675.            //***************************************************************
  676.            DOM_Range newtestrange = doc3.createRange();
  677.            //case 1:
  678.            //start container is text node
  679.            //   i) end container is also text node
  680.            //    a) start==end
  681.            //    b) start!=end
  682.            //  ii) end container is not text node
  683.            //    a) start==end => impossible
  684.            //    b) start!=end
  685.            //
  686.            //case 2:
  687.            //start container is not text node
  688.            //   i) end container is text node
  689.            //    a) start==end => impossible
  690.            //    b) start!=end
  691.            //  ii) end container is not text node
  692.            //    a) start==end
  693.            //    b) start!=end
  694.            //case 1, i, a
  695.            newtestrange.setStart( cd, 1 );
  696.            newtestrange.setEnd( cd, 4 );
  697.            TASSERT(newtestrange.toString().equals("ell"));
  698.            //case 1, i, b
  699.            newtestrange.setStart( cd, 1 );
  700.            newtestrange.setEnd( ef, 2 );
  701.            TASSERT(newtestrange.toString().equals("ello cdef"));
  702.            //case 1, ii, b
  703.            newtestrange.setStart( cd, 1 );
  704.            newtestrange.setEnd( foo, 4 );
  705.            TASSERT(newtestrange.toString().equals("ello cd"));
  706.            //case 2, i, b
  707.            newtestrange.setStart( foo, 1 );
  708.            newtestrange.setEnd( cd, 5 );
  709.            TASSERT(newtestrange.toString().equals("abHello"));
  710.            //case 2, ii, a
  711.            newtestrange.setStart( foo, 1 );
  712.            newtestrange.setEnd( foo, 4 );
  713.            TASSERT(newtestrange.toString().equals("abHello cd"));
  714.            //case 2, ii, b
  715.            newtestrange.setStart( moo, 1 );
  716.            newtestrange.setEnd( foo, 4 );
  717.            TASSERT(newtestrange.toString().equals("abHello cd"));
  718.            //***************************************************************
  719.            //test removeChild
  720.            //***************************************************************
  721.            DOM_Range newrange = doc3.createRange();
  722.            newrange.setStart( moo, 0 );
  723.            newrange.setEnd( foo, 4 );
  724.            TASSERT(newrange.getStartOffset()==0);
  725.            TASSERT(newrange.getStartContainer().getNodeName().equals("moo"));
  726.            TASSERT(newrange.getEndOffset()==4);
  727.            TASSERT(newrange.getEndContainer().getNodeName().equals("foo"));
  728.            TASSERT(newrange.toString().equals("abHello cd"));
  729.            DOM_Node n = newrange.cloneContents();
  730.            DOM_NodeList nol = foo.getChildNodes();
  731.            //removing moo
  732.            foo.removeChild(nol.item(1));
  733.            TASSERT(newrange.getStartOffset()==1);
  734.            TASSERT(newrange.getStartContainer().getNodeName().equals("foo"));
  735.            TASSERT(newrange.getEndOffset()==3);
  736.            TASSERT(newrange.getEndContainer().getNodeName().equals("foo"));
  737.            TASSERT(newrange.toString().equals("abHello cd"));
  738.            TASSERT(newtestrange.getStartOffset()==1);
  739.            TASSERT(newtestrange.getStartContainer().getNodeName().equals("foo"));
  740.            TASSERT(newtestrange.getEndOffset()==3);
  741.            TASSERT(newtestrange.getEndContainer().getNodeName().equals("foo"));
  742.            TASSERT(newtestrange.toString().equals("abHello cd"));
  743.     }
  744.     TESTEPILOG;
  745.     } //creating the dom tree and tests
  746.     //
  747.     //  Print Final allocation stats for full test
  748.     //
  749.     DomMemDebug().print();
  750.     // And call the termination method
  751.     XMLPlatformUtils::Terminate();
  752.     return 0;
  753. };