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

xml/soap/webservice

开发平台:

C/C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2000 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. //  Various DOM tests.
  58. //     Contents include
  59. //       1.  Basic functionality for DOMString
  60. //       2.  Regression tests for bugs fixed.
  61. //     All individual are wrapped in a memory leak checker.
  62. //
  63. //     This is NOT a complete test of DOM functionality.
  64. //
  65. /*
  66.  * $Id: DOMMemTest.cpp,v 1.28 2001/11/28 21:44:39 peiyongz Exp $
  67.  */
  68. #include <stdio.h>
  69. #include <string.h>
  70. #include <dom/DOM.hpp>
  71. #include <dom/DomMemDebug.hpp>
  72. #include <util/PlatformUtils.hpp>
  73. #include <util/XMLException.hpp>
  74. #include <util/XMLString.hpp>
  75. #include <util/XMLUniDefs.hpp>
  76. #define TASSERT(c) tassert((c), __FILE__, __LINE__)
  77. void tassert(bool c, const char *file, int line)
  78. {
  79.     if (!c)
  80.         printf("Failure.  Line %d,   file %sn", line, file);
  81. };
  82. #define TESTPROLOG entryMemState = DomMemDebug();
  83. #define TESTEPILOG 
  84.     exitMemState = DomMemDebug(); 
  85.     if (entryMemState != exitMemState) { 
  86.         printf(" Memory leak at line %d, file %s:  ", __LINE__, __FILE__);  
  87.         exitMemState.printDifference(entryMemState); 
  88.     }
  89. #define EXCEPTION_TEST(operation, expected_exception)               
  90. {                                                                   
  91.     try {                                                           
  92.     operation;                                                      
  93.     printf(" Error: no exception thrown at line %dn", __LINE__);   
  94. }                                                                   
  95.     catch (DOM_DOMException &e) {                                       
  96.     if (e.code != expected_exception)                       
  97.     printf(" Wrong exception code: %d at line %dn", e.code, __LINE__); 
  98. }                                                                 
  99.     catch (...)   {                                                 
  100.     printf(" Wrong exception thrown at line %dn", __LINE__);       
  101. }                                                                   
  102. }
  103. //---------------------------------------------------------------------------------------
  104. //
  105. //   DOMStringTests    tests of class DOMString
  106. //
  107. //---------------------------------------------------------------------------------------
  108. void    DOMStringTests()
  109. {
  110.     DomMemDebug     entryMemState, exitMemState;
  111.     //
  112.     //  Test 1.  Basic operations on a simple string.
  113.     //
  114.     printf("DOM Memory Test.n");
  115.     TESTPROLOG;
  116.     {
  117.         DOMString foo = "fop";
  118.         TASSERT(foo.length() == 3);
  119.         TASSERT(foo.equals(foo));
  120.         TASSERT(foo != 0);
  121.         TASSERT(foo.charAt(0) == chLatin_f);
  122.         TASSERT(foo.charAt(2) == chLatin_p);
  123.         TASSERT(foo.charAt(3) == chNull);
  124.     }
  125.     TESTEPILOG
  126.         //
  127.         //  Construct from XMLCh *
  128.         //
  129.         TESTPROLOG
  130.     {
  131.         XMLCh a[] = {chLatin_H, chLatin_e, chLatin_l, chLatin_l, chLatin_o, chNull}; // Unicode "Hello"
  132.         DOMString x(a);
  133.         DOMString y = "Hello";
  134.         TASSERT(x.equals(y));
  135.         DOMString z(a+2, 3);
  136.         TASSERT(z.equals("llo"));
  137.     }
  138.     TESTEPILOG
  139.         //
  140.         //  Test 2.  Empty strings shouldn't leave anything lying around
  141.         //
  142.         TESTPROLOG;
  143.     {
  144.         DOMString a;
  145.         DOMString b;
  146.         TASSERT (a==0);
  147.         a = 0;
  148.         TASSERT(a==0);
  149.         TASSERT((a!=0) == false);
  150.         DOMString c(0);
  151.         TASSERT(c==0);
  152.         TASSERT(c==a);
  153.     }
  154.     TESTEPILOG
  155.         //
  156.         //  Test 3.   Clones should be equal.
  157.         TESTPROLOG;
  158.     {
  159.         DOMString a = "hello";
  160.         DOMString b = a.clone();
  161.         TASSERT(a.equals(b));
  162.         TASSERT(a != b);
  163.         a = 0;
  164.         TASSERT(b.equals("hello"));
  165.         TASSERT(a == 0);
  166.         TASSERT(a.equals(""));
  167.     }
  168.     TESTEPILOG
  169.         //
  170.         //  Test 4.  Copy construction and assignemnt
  171.         //
  172.         TESTPROLOG;
  173.     {
  174.         DOMString a = "Test 04";
  175.         DOMString b(a);
  176.         DOMString c = a;
  177.         DOMString d;
  178.         DOMString e;
  179.         d = a;
  180.         TASSERT(a==b);
  181.         TASSERT(a==c);
  182.         TASSERT(a==d);
  183.         TASSERT(a!=e);
  184.         // printf ("   test04 should have 1 handle, 1 buffer here.  ");
  185.     }
  186.     TESTEPILOG
  187.         //
  188.         // Test 5  AppendData, degenerate cases.
  189.         //
  190.         TESTPROLOG;
  191.     {
  192.         DOMString a;
  193.         DOMString b = "Test 05";
  194.         a.appendData(b);
  195.         TASSERT(a.equals(b));
  196.         TASSERT(a!=b);
  197.         TASSERT(a.equals("Test 05"));
  198.     };
  199.     TESTEPILOG
  200.         //
  201.         //  Test 6  Append data, degenerate case 2
  202.         //
  203.         TESTPROLOG;
  204.     {
  205.         DOMString a;
  206.         DOMString b = "Test 06";
  207.         b.appendData(a);
  208.         TASSERT(!a.equals(b));
  209.         TASSERT(a!=b);
  210.         TASSERT(b.equals("Test 06"));
  211.         TASSERT(a==0);
  212.     }
  213.     TESTEPILOG
  214.         //
  215.         //  Test 7  Append Data, Common case, no extra space in original buffer.
  216.         //          Also, operator +=, which is a convenience alias for appendData.
  217.         //
  218.         TESTPROLOG;
  219.     {
  220.         DOMString a = "Test 07";
  221.         DOMString b = "append";
  222.         a.appendData(b);
  223.         TASSERT(a.equals("Test 07append"));
  224.         TASSERT(b.equals("append"));
  225.         a.appendData((XMLCh)0x31);
  226.         TASSERT(a.equals("Test 07append1"));
  227.         XMLCh  s[] = {0x32, 0x33, 0x00};
  228.         a.appendData(s);
  229.         TASSERT(a.equals("Test 07append123"));
  230.         a = "Test 07a ";
  231.         a += b;
  232.         TASSERT(a.equals("Test 07a append"));
  233.         a += (XMLCh)0x31;
  234.         TASSERT(a.equals("Test 07a append1"));
  235.         a += s;
  236.         TASSERT(a.equals("Test 07a append123"));
  237.     }
  238.     TESTEPILOG
  239.         //
  240.         //  Test 8 Append Data, with plenty of extra space in buffer.
  241.         //
  242.         TESTPROLOG;
  243.     {
  244.         DOMString a;
  245.         a.reserve(100);
  246.         DOMString b("Test 08");
  247.         DOMString c("append");
  248.         TASSERT(a != 0);  // (The String object has an identity, even if no contents)
  249.         TASSERT(a.length() == 0);
  250.         a.appendData(b);
  251.         TASSERT(a.equals(b));
  252.         TASSERT(a.equals("Test 08"));
  253.         TASSERT(a != b);
  254.         a.appendData(c);
  255.         TASSERT(a.equals("Test 08append"));
  256.         TASSERT(b.equals("Test 08"));
  257.         TASSERT(c.equals("append"));
  258.     };
  259.     TESTEPILOG
  260.         //
  261.         //  Test 9 Append Data, with plenty of extra space in buffer, but with
  262.         //                      a clone, so that the original buffer can not be modified.
  263.         //
  264.         TESTPROLOG;
  265.     {
  266.         DOMString a;
  267.         a.reserve(100);
  268.         DOMString b("Test 09");
  269.         DOMString c("append");
  270.         TASSERT(a.length() == 0);
  271.         a.appendData(b);
  272.         TASSERT(a.equals(b));
  273.         TASSERT(a.equals("Test 09"));
  274.         TASSERT(a != b);
  275.         DOMString d = a.clone();
  276.         TASSERT(a.equals("Test 09"));
  277.         TASSERT(b.equals("Test 09"));
  278.         TASSERT(d.equals("Test 09"));
  279.         TASSERT(a != b);
  280.         TASSERT(a != d);
  281.         TASSERT(b != d);
  282.         a.appendData(c);
  283.         TASSERT(a.equals("Test 09append"));
  284.         TASSERT(b.equals("Test 09"));
  285.         TASSERT(c.equals("append"));
  286.         TASSERT(d.equals("Test 09"));
  287.     };
  288.     TESTEPILOG;
  289.     //
  290.     // Test 10   DOMString Operator +
  291.     //
  292.     TESTPROLOG;
  293.     {
  294.         DOMString a;
  295.         DOMString b("DOMString ");
  296.         XMLCh     s[] = {0x58, 0x4d, 0x4c, 0x20, 0x00};   // Unicode "XML "
  297.         XMLCh     Z   = 0x5A;                             // Unicode 'Z'
  298.         a = b + b;
  299.         TASSERT(a.equals("DOMString DOMString "));
  300.         a = b + s;
  301.         TASSERT(a.equals("DOMString XML "));
  302.         a = s + b;
  303.         TASSERT(a.equals("XML DOMString "));
  304.         a = b + Z;
  305.         TASSERT(a.equals("DOMString Z"));
  306.         a = Z + b;
  307.         TASSERT(a.equals("ZDOMString "));
  308.     }
  309.     TESTEPILOG;
  310.     //
  311.     // Test 11   DOMString::subStringData(unsigned int offset, unsigned int count)
  312.     //
  313.     TESTPROLOG;
  314.     {
  315.         DOMString srcString("This is the source string.");
  316.         //                   01234567890123456789012345
  317.         DOMString This = srcString.substringData(0,4);
  318.         DOMString is   = srcString.substringData(5,2);
  319.         DOMString dot  = srcString.substringData(25,1);
  320.         DOMString offEnd = srcString.substringData(19, 1000);
  321.         TASSERT(This.equals("This"));
  322.         TASSERT(is  .equals("is"));
  323.         TASSERT(dot .equals("."));
  324.         TASSERT(offEnd.equals("string."));
  325.         EXCEPTION_TEST(srcString.substringData(-1, 10), DOM_DOMException::INDEX_SIZE_ERR);
  326.         EXCEPTION_TEST(srcString.substringData(26, 1), DOM_DOMException::INDEX_SIZE_ERR);
  327.         srcString.insertData(0, "x");   // Changing the source should not alter previously
  328.         //   extracted substrings.
  329.         TASSERT(This.equals("This"));
  330.         TASSERT(is  .equals("is"));
  331.         TASSERT(dot .equals("."));
  332.         TASSERT(offEnd.equals("string."));
  333.         TASSERT(srcString.equals("xThis is the source string."));
  334.     }
  335.     TESTEPILOG;
  336.     //
  337.     // Test 12   DOMString::insertData(unsigned int offset, DOMString &src)
  338.     //
  339.     TESTPROLOG;
  340.     {
  341.         DOMString aString("This is a string.");
  342.         //                 01234567890123456
  343.         aString.insertData(17, " Added at end.");
  344.         TASSERT(aString.equals("This is a string. Added at end."));
  345.         aString = "This is a string.";
  346.         EXCEPTION_TEST(aString.insertData(18, "x"), DOM_DOMException::INDEX_SIZE_ERR);
  347.         TASSERT(aString.equals("This is a string."));
  348.         aString = 0;
  349.         aString.reserve(100);
  350.         aString.appendData("This is a string.");
  351.         aString.insertData(17, " Added at end.");
  352.         TASSERT(aString.equals("This is a string. Added at end."));
  353.         aString.insertData(0, "So ");
  354.         TASSERT(aString.equals("So This is a string. Added at end."));
  355.         aString.insertData(2, "x");
  356.         TASSERT(aString.equals("Sox This is a string. Added at end."));
  357.         EXCEPTION_TEST(aString.substringData(-1, 1), DOM_DOMException::INDEX_SIZE_ERR);
  358.     }
  359.     TESTEPILOG;
  360. //
  361. // Minimal test of DOMString::transcode()
  362. //
  363. TESTPROLOG;
  364. {
  365. static char testStr[] = "This is our test string.";
  366. DOMString DOMTestStr = testStr;
  367. char *roundTripString = DOMTestStr.transcode();
  368. TASSERT(strcmp(testStr, roundTripString) == 0);
  369. delete [] roundTripString;
  370.         DOMString domstr2 = DOMString::transcode(testStr);
  371.         TASSERT(domstr2.equals(DOMTestStr));
  372. }
  373.     TESTEPILOG;
  374.     //
  375.     //  String bugs submitted by David Chung
  376.     //
  377. TESTPROLOG;
  378. {
  379.         DOMString greeting("hello");
  380.         greeting.appendData(greeting);
  381.         TASSERT(greeting.equals("hellohello"));
  382.         // Test DOMString.insertData, when source string is the same as the destination.
  383.         //   Implementation forces creation of a new buffer.
  384.         //
  385.         DOMString greeting2("Hello              ");
  386.         //                   0123456789012345678
  387.         greeting2.deleteData(5, 14);    // Leave unused space at end of buffer.
  388.         TASSERT(greeting2.equals("Hello"));
  389.         greeting2.insertData(2, greeting2);
  390.         TASSERT(greeting2.equals("HeHellollo"));
  391.         // DOMString.insertData().  Original buffer has space, and is retained.
  392.         DOMString greeting3("Hello              ");
  393.         //                   0123456789012345678
  394.         greeting3.deleteData(5, 14);    // Leave unused space at end of buffer.
  395.         TASSERT(greeting3.equals("Hello"));
  396.         greeting3.insertData(2, "ByeBye");
  397.         TASSERT(greeting3.equals("HeByeByello"));
  398.     }
  399.     TESTEPILOG;
  400.     //
  401.     //  String bug submitted by Nadav Aharoni
  402.     //
  403.     TESTPROLOG;
  404.     {
  405.         char testString[] = "            ";
  406.         testString[4] = 0;
  407.         testString[5] = 'x';
  408.         char *origString = testString;
  409.         XMLString::trim(testString);
  410.         TASSERT(strlen(testString) == 0);
  411.         TASSERT(testString[5] == 'x');
  412.         strcpy(testString, "  Hello  ");
  413.         XMLString::trim(testString);
  414.         TASSERT(strcmp(testString, "Hello") == 0);
  415.     }
  416.     TESTEPILOG;
  417. }
  418. //---------------------------------------------------------------------------------------
  419. //
  420. //   DOMBasicTests    Basic DOM Level 1 tests
  421. //
  422. //---------------------------------------------------------------------------------------
  423. void DOMBasicTests()
  424. {
  425.         DomMemDebug     entryMemState, exitMemState;
  426.     //
  427.     //  Test Doc01      Create a new empty document
  428.     //
  429.     {
  430.         //  First precondition, so that lazily created strings do not appear
  431.         //  as memory leaks.
  432.         DOM_Document    doc;
  433.         doc = DOM_Document::createDocument();
  434.     }
  435.     TESTPROLOG;
  436.     {
  437.         DOM_Document    doc;
  438.         doc = DOM_Document::createDocument();
  439.     }
  440.     TESTEPILOG
  441.     //
  442.     //  Test Doc02      Create one of each kind of node using the
  443.     //                  document createXXX methods.
  444.     //                  Watch for memory leaks.
  445.     //
  446.     {
  447.         //  Do all operations in a preconditioning step, to force the
  448.         //  creation of implementation objects that are set up on first use.
  449.         //  Don't watch for leaks in this block (no TESTPROLOG / TESTEPILOG)
  450.         DOM_Document doc = DOM_Document::createDocument();
  451.         DOM_Element     el = doc.createElement("Doc02Element");
  452.         DOM_DocumentFragment frag = doc.createDocumentFragment ();
  453.         DOM_Text  text = doc.createTextNode("Doc02TextNode");
  454.         DOM_Comment comment = doc.createComment("Doc02Comment");
  455.         DOM_CDATASection  cdataSec = doc.createCDATASection("Doc02CDataSection");
  456.         DOM_DocumentType  docType = doc.createDocumentType("Doc02DocumentType");
  457.         DOM_Notation notation = doc.createNotation("Doc02Notation");
  458.         DOM_ProcessingInstruction pi = doc.createProcessingInstruction("Doc02PITarget",
  459.                                     "Doc02PIData");
  460.         DOM_NodeList    nodeList = doc.getElementsByTagName("*");
  461.     }
  462.     TESTPROLOG;
  463.     {
  464.         DOM_Document doc = DOM_Document::createDocument();
  465.         DOM_Element     el = doc.createElement("Doc02Element");
  466.     }
  467.     TESTEPILOG;
  468.     TESTPROLOG
  469.     {
  470.         DOM_Document    doc = DOM_Document::createDocument();
  471.         DOM_DocumentFragment frag = doc.createDocumentFragment ();
  472.     };
  473.     TESTEPILOG
  474.     TESTPROLOG;
  475.     {
  476.         DOM_Document doc = DOM_Document::createDocument();
  477.         DOM_Element     el = doc.createElement("Doc02Element");
  478.     }
  479.     TESTEPILOG;
  480.     TESTPROLOG;
  481.     {
  482.         DOM_Document doc = DOM_Document::createDocument();
  483.         DOM_Text  text = doc.createTextNode("Doc02TextNode");
  484.     }
  485.     TESTEPILOG;
  486.     TESTPROLOG;
  487.     {
  488.         DOM_Document doc = DOM_Document::createDocument();
  489.         DOM_Comment comment = doc.createComment("Doc02Comment");
  490.     }
  491.     TESTEPILOG;
  492.     TESTPROLOG;
  493.     {
  494.         DOM_Document doc = DOM_Document::createDocument();
  495.         DOM_CDATASection  cdataSec = doc.createCDATASection("Doc02CDataSection");
  496.     }
  497.     TESTEPILOG;
  498.     TESTPROLOG;
  499.     {
  500.         DOM_Document doc = DOM_Document::createDocument();
  501.         DOM_DocumentType  docType = doc.createDocumentType("Doc02DocumentType");
  502.     }
  503.     TESTEPILOG;
  504.     TESTPROLOG;
  505.     {
  506.         DOM_Document doc = DOM_Document::createDocument();
  507.         DOM_Notation notation = doc.createNotation("Doc02Notation");
  508.     }
  509.     TESTEPILOG;
  510.     TESTPROLOG;
  511.     {
  512.         DOM_Document doc = DOM_Document::createDocument();
  513.         DOM_ProcessingInstruction pi = doc.createProcessingInstruction("Doc02PITarget",
  514.                                     "Doc02PIData");
  515.     }
  516.     TESTEPILOG;
  517.     TESTPROLOG;
  518.     {
  519.         DOM_Document doc = DOM_Document::createDocument();
  520.         DOM_Attr  attribute = doc.createAttribute("Doc02Attribute");
  521.     }
  522.     TESTEPILOG;
  523.     TESTPROLOG;
  524.     {
  525.         DOM_Document doc = DOM_Document::createDocument();
  526.         DOM_EntityReference  er = doc.createEntityReference("Doc02EntityReference");
  527.     }
  528.     TESTEPILOG;
  529.     TESTPROLOG;
  530.     {
  531.         DOM_Document doc = DOM_Document::createDocument();
  532.         DOM_NodeList    nodeList = doc.getElementsByTagName("*");
  533.     }
  534.     TESTEPILOG;
  535.     //
  536.     //  Doc03 - Create a small document tree
  537.     //
  538.     TESTPROLOG;
  539.     {
  540.         DOM_Document    doc = DOM_Document::createDocument();
  541.         DOM_Element     rootEl = doc.createElement("Doc03RootElement");
  542.         doc.appendChild(rootEl);
  543.         DOM_Text        textNode = doc.createTextNode("Doc03 text stuff");
  544.         rootEl.appendChild(textNode);
  545.         DOM_NodeList    nodeList = doc.getElementsByTagName("*");
  546.     };
  547.     TESTEPILOG;
  548.     //
  549.     //  Attr01
  550.     //
  551.     {
  552.         DOM_Document    doc = DOM_Document::createDocument();
  553.         DOM_Element     rootEl  = doc.createElement("RootElement");
  554.         doc.appendChild(rootEl);
  555.         {
  556.             DOM_Attr        attr01  = doc.createAttribute("Attr01");
  557.             rootEl.setAttributeNode(attr01);
  558.         }
  559.         TESTPROLOG;
  560.         {
  561.             DOM_Attr attr02 = doc.createAttribute("Attr01");
  562.             rootEl.setAttributeNode(attr02);
  563.         }
  564.         TESTEPILOG
  565.     };
  566.     //
  567.     //  Attr02
  568.     //
  569.     TESTPROLOG;
  570.     {
  571.         DOM_Document    doc = DOM_Document::createDocument();
  572.         DOM_Element     rootEl  = doc.createElement("RootElement");
  573.         doc.appendChild(rootEl);
  574.         DOM_Attr        attr01  = doc.createAttribute("Attr02");
  575.         rootEl.setAttributeNode(attr01);
  576.         DOM_Attr        attr02 = doc.createAttribute("Attr02");
  577.         rootEl.setAttributeNode(attr02);
  578.     }
  579.     TESTEPILOG;
  580.     //
  581.     //  Attr03
  582.     //
  583.     TESTPROLOG;
  584.     {
  585.         DOM_Document    doc = DOM_Document::createDocument();
  586.         DOM_Element     rootEl  = doc.createElement("RootElement");
  587.         doc.appendChild(rootEl);
  588.         DOM_Attr        attr01  = doc.createAttribute("Attr03");
  589.         rootEl.setAttributeNode(attr01);
  590.         attr01.setValue("Attr03Value1");
  591.         attr01.setValue("Attr03Value2");
  592.     }
  593.     TESTEPILOG;
  594.     //
  595.     //  Attr04
  596.     //
  597.     TESTPROLOG;
  598.     {
  599.         DOM_Document    doc = DOM_Document::createDocument();
  600.         DOM_Element     rootEl  = doc.createElement("RootElement");
  601.         doc.appendChild(rootEl);
  602.         DOM_Attr        attr01  = doc.createAttribute("Attr04");
  603.         rootEl.setAttributeNode(attr01);
  604.         attr01.setValue("Attr04Value1");
  605.         DOM_Node value = attr01.getFirstChild();
  606.     }
  607.     TESTEPILOG;
  608.     //
  609.     //  Text01
  610.     //
  611.     TESTPROLOG;
  612.     {
  613.         DOM_Document    doc = DOM_Document::createDocument();
  614.         DOM_Element     rootEl  = doc.createElement("RootElement");
  615.         doc.appendChild(rootEl);
  616.         DOMString       tmp("Hello Goodbye");
  617.         DOM_Text        txt1 = doc.createTextNode(tmp);
  618. tmp = 0;
  619.         rootEl.appendChild(txt1);
  620.         txt1.splitText(6);
  621.         rootEl.normalize();
  622.     }
  623.     TESTEPILOG;
  624.     //
  625.     //  Notation01
  626.     //
  627.     TESTPROLOG;
  628.     {
  629.         DOM_Document        doc = DOM_Document::createDocument();
  630.         DOM_DocumentType    dt  = doc.createDocumentType("DocType_for_Notation01");
  631.         doc.appendChild(dt);
  632.         DOM_NamedNodeMap notationMap = dt.getNotations();
  633.         DOM_Notation    nt1 = doc.createNotation("Notation01");
  634.         notationMap.setNamedItem (nt1);
  635. DOM_Node  abc1 = notationMap.getNamedItem("Notation01");
  636.         DOM_Notation    nt2 = (DOM_Notation &) abc1;
  637.         TASSERT(nt1==nt2);
  638.         nt2 = DOM_Notation();
  639.         nt1 = 0;
  640. DOM_Node abc6 = notationMap.getNamedItem("Notation01");
  641.         nt2 = (DOM_Notation &) abc6;
  642.     }
  643.     TESTEPILOG;
  644.     //
  645.     //  NamedNodeMap01 - comparison operators.
  646.     //
  647.     TESTPROLOG;
  648.     {
  649.         DOM_NamedNodeMap    nnm;
  650.         TASSERT(nnm == 0);
  651.         DOM_Document        doc = DOM_Document::createDocument();
  652.         nnm = doc.getAttributes();    // Should be null, because node type
  653.                                       //   is not Element.
  654.         TASSERT(nnm == 0);
  655.         TASSERT(!(nnm != 0));
  656.         DOM_Element el = doc.createElement("NamedNodeMap01");
  657.         DOM_NamedNodeMap nnm2 = el.getAttributes();    // Should be an empty, but non-null map.
  658.         TASSERT(nnm2 != 0);
  659.         TASSERT(nnm != nnm2);
  660.         nnm = nnm2;
  661.         TASSERT(nnm == nnm2);
  662.     }
  663.     TESTEPILOG;
  664.     //
  665.     //  importNode quick test
  666.     //
  667.     TESTPROLOG
  668.     {
  669.         DOM_Document    doc1 = DOM_Document::createDocument();
  670.         DOM_Document    doc2 = DOM_Document::createDocument();
  671.         DOM_Element     el1  = doc1.createElement("abc");
  672.         doc1.appendChild(el1);
  673.         TASSERT(el1.getParentNode() != 0);
  674.         DOM_Node        el2  = doc2.importNode(el1, true);
  675.         TASSERT(el2.getParentNode() == 0);
  676.         DOMString       tagName = el2.getNodeName();
  677.         TASSERT(tagName.equals("abc"));
  678.         TASSERT(el2.getOwnerDocument() == doc2);
  679.         TASSERT(doc1 != doc2);
  680.     }
  681.     TESTEPILOG;
  682.     //
  683.     //  getLength() tests.  Both Node CharacterData and NodeList implement
  684.     //                  getLength().  Early versions of the DOM had a clash
  685.     //                  between the two, originating in the implementation class
  686.     //                  hirearchy, which has NodeList as a (distant) base class
  687.     //                  of CharacterData.  This is a regression test to verify
  688.     //                  that the problem stays fixed.
  689.     //
  690.     TESTPROLOG
  691.     {
  692.         DOM_Document     doc = DOM_Document::createDocument();
  693.         DOM_Text          tx = doc.createTextNode("Hello");
  694.         DOM_Element       el = doc.createElement("abc");
  695.         el.appendChild(tx);
  696.         int     textLength = tx.getLength();
  697.         TASSERT(textLength == 5);
  698.         DOM_NodeList      nl = tx.getChildNodes();
  699.         int      nodeListLen = nl.getLength();
  700.         TASSERT(nodeListLen == 0);
  701.         nl = el.getChildNodes();
  702.         nodeListLen = nl.getLength();
  703.         TASSERT(nodeListLen == 1);
  704.     }
  705.     //
  706.     //  NodeList - comparison operators, basic operation.
  707.     //
  708.     TESTPROLOG;
  709.     {
  710.         DOM_NodeList    nl;
  711.         DOM_NodeList    nl2;
  712.         TASSERT(nl == 0);
  713.         TASSERT(!(nl != 0));
  714.         TASSERT(nl == nl2);
  715.         DOM_Document        doc = DOM_Document::createDocument();
  716.         nl = doc.getChildNodes();    // Should be non-null, but empty
  717.         TASSERT(nl != 0);
  718.         int len = nl.getLength();
  719.         TASSERT(len == 0);
  720.         DOM_Element el = doc.createElement("NodeList01");
  721.         doc.appendChild(el);
  722.         len = nl.getLength();
  723.         TASSERT(len == 1);
  724.         TASSERT(nl != nl2);
  725.         nl2 = nl;
  726.         TASSERT(nl == nl2);
  727.     }
  728.     TESTEPILOG;
  729.     //
  730.     //  Name validity checking.
  731.     //
  732.     TESTPROLOG;
  733.     {
  734.          DOM_Document        doc = DOM_Document::createDocument();
  735.          try
  736.          {
  737.              DOM_Element el = doc.createElement("!@@ bad element name");
  738.              TASSERT(false);  // Exception above should prevent us reaching here.
  739.          }
  740.          catch ( DOM_DOMException &e)
  741.          {
  742.              TASSERT(e.code == DOM_DOMException::INVALID_CHARACTER_ERR);
  743.          }
  744.          catch (...)
  745.          {
  746.              TASSERT(false);  // Wrong exception thrown.
  747.          }
  748.     }
  749.     TESTEPILOG;
  750.     //
  751.     //  Assignment ops return value
  752.     //
  753.     TESTPROLOG;
  754.     {
  755.         DOM_Document        doc = DOM_Document::createDocument();
  756.         DOM_Element el = doc.createElement("NodeList01");
  757.         doc.appendChild(el);
  758.         DOM_Element n1, n2, n3;
  759.         n1 = n2 = n3 = el;
  760.         TASSERT(n1 == n2);
  761.         TASSERT(n1 == n3);
  762.         TASSERT(n1 == el);
  763.         TASSERT(n1 != 0);
  764.         n1 = n2 = n3 = 0;
  765.         TASSERT(n1 == 0);
  766.     }
  767.     TESTEPILOG;
  768.     //
  769.     //  Cloning of a node with attributes. Regression test for a ref counting
  770.     //  bug in attributes of cloned nodes that occured when the "owned" flag
  771.     //  was not set in the clone.
  772.     //
  773.     TESTPROLOG;
  774.     {
  775.         DOM_Document    doc = DOM_Document::createDocument();
  776.         DOM_Element     root = doc.createElement("CTestRoot");
  777.         root.setAttribute("CTestAttr", "CTestAttrValue");
  778.         DOMString s = root.getAttribute("CTestAttr");
  779.         TASSERT(s.equals("CTestAttrValue"));
  780.         DOM_Node abc2 = root.cloneNode(true);
  781.         DOM_Element     cloned = (DOM_Element &) abc2;
  782.         DOM_Attr a = cloned.getAttributeNode("CTestAttr");
  783.         TASSERT(a != 0);
  784.         s = a.getValue();
  785.         TASSERT(s.equals("CTestAttrValue"));
  786.         a = 0;
  787.         a = cloned.getAttributeNode("CTestAttr");
  788.         TASSERT(a != 0);
  789.         s = a.getValue();
  790.         TASSERT(s.equals("CTestAttrValue"));
  791.     }
  792.     TESTEPILOG;
  793.     //
  794.     //  splitText()
  795.     //     Regression test for a bug from Tinny Ng
  796.     //
  797.     TESTPROLOG;
  798.     {
  799.         DOM_Document doc;
  800.         doc = DOM_Document::createDocument();
  801.         DOM_Text tn, tn1, tn2;
  802.         tn = doc.createTextNode ("0123456789");
  803.         tn1 = tn.splitText(5);
  804.         TASSERT( tn.getNodeValue().equals("01234"));
  805.         TASSERT(tn1.getNodeValue().equals("56789"));
  806.         tn2 = tn.splitText(5);
  807.         TASSERT( tn.getNodeValue().equals("01234"));
  808.         TASSERT(tn2.getNodeValue().equals(""));
  809.         EXCEPTION_TEST(tn.splitText(6), DOM_DOMException::INDEX_SIZE_ERR);
  810.     }
  811.     TESTEPILOG;
  812. }
  813. //---------------------------------------------------------------------------------------
  814. //
  815. //   DOMNSTests    DOM Name Space tests
  816. //
  817. //---------------------------------------------------------------------------------------
  818. void DOMNSTests()
  819. {
  820.         DomMemDebug     entryMemState, exitMemState;
  821.     //
  822.     //  DOM Level 2 tests.  These should be split out as a separate test.
  823.     //
  824.     //
  825.     // hasFeature.  The set of supported options tested here is for Xerces 1.1
  826.     //              Note: because the implementation lazily creates some of the comprison
  827.     //                    strings within the implementation, this test must be pre-flighted
  828.     //                    outside of the TESPROLOG/TESTEPILOG macros to avoid spurious
  829.     //                    reports of memory leaks.
  830.     //
  831.     {
  832.         DOM_DOMImplementation  impl;
  833.         TASSERT(impl.hasFeature("XML", "2.0")    == true);
  834.         TASSERT(impl.hasFeature("XML", "")       == true);
  835.         //  We also support 1.0
  836.         TASSERT(impl.hasFeature("XML", "1.0")    == true);
  837.         TASSERT(impl.hasFeature("XML", "3.0")    == false);
  838.         TASSERT(impl.hasFeature("Traversal", "") == true);
  839.     }
  840.     TESTPROLOG;
  841.     {
  842.         DOM_DOMImplementation  impl;
  843.         TASSERT(impl.hasFeature("XML", "2.0")    == true);
  844.         TASSERT(impl.hasFeature("XML", "")       == true);
  845.         //  We also support 1.0
  846.         TASSERT(impl.hasFeature("XML", "1.0")    == true);
  847.         TASSERT(impl.hasFeature("XML", "3.0")    == false);
  848.         TASSERT(impl.hasFeature("Traversal", "") == true);
  849.         TASSERT(impl.hasFeature("HTML", "")           == false);
  850.         TASSERT(impl.hasFeature("Views", "")          == false);
  851.         TASSERT(impl.hasFeature("StyleSheets", "")    == false);
  852.         TASSERT(impl.hasFeature("CSS", "")            == false);
  853.         TASSERT(impl.hasFeature("CSS2", "")           == false);
  854.         TASSERT(impl.hasFeature("Events", "")         == false);
  855.         TASSERT(impl.hasFeature("UIEvents", "")       == false);
  856.         TASSERT(impl.hasFeature("MouseEvents", "")    == false);
  857.         TASSERT(impl.hasFeature("MutationEvents", "") == false);
  858.         TASSERT(impl.hasFeature("HTMLEvents", "")     == false);
  859.         TASSERT(impl.hasFeature("Range", "")          == false);
  860.     }
  861.     TESTEPILOG;
  862.     //
  863.     // CreateDocumentType
  864.     //
  865.     TESTPROLOG;
  866.     {
  867.         DOM_DOMImplementation impl;
  868.         DOMString qName = "foo:docName";
  869.         DOMString pubId = "pubId";
  870.         DOMString sysId = "http://sysId";
  871.         DOM_DocumentType dt = impl.createDocumentType(qName, pubId, sysId);
  872.         TASSERT(dt != 0);
  873.         TASSERT(dt.getNodeType() == DOM_Node::DOCUMENT_TYPE_NODE);
  874.         TASSERT(dt.getNodeName().equals(qName));
  875.         TASSERT(dt.getNamespaceURI().equals(0));
  876.         TASSERT(dt.getPrefix().equals(0));
  877.         TASSERT(dt.getLocalName().equals(0));
  878.         TASSERT(dt.getPublicId().equals(pubId));
  879.         TASSERT(dt.getSystemId().equals(sysId));
  880.         TASSERT(dt.getInternalSubset().equals(0));
  881.         TASSERT(dt.getOwnerDocument() == 0);
  882.         DOM_NamedNodeMap nnm = dt.getEntities();
  883.         TASSERT(nnm.getLength() == 0);
  884.         nnm = dt.getNotations();
  885.         TASSERT(nnm.getLength() == 0);
  886.         //
  887.         // Qualified name without prefix should also work.
  888.         //
  889.         qName = "docName";
  890.         dt = impl.createDocumentType(qName, pubId, sysId);
  891.         TASSERT(dt != 0);
  892.         TASSERT(dt.getNodeType() == DOM_Node::DOCUMENT_TYPE_NODE);
  893.         TASSERT(dt.getNodeName().equals(qName));
  894.         TASSERT(dt.getNamespaceURI().equals(0));
  895.         TASSERT(dt.getPrefix().equals(0));
  896.         TASSERT(dt.getLocalName().equals(0));
  897.         TASSERT(dt.getPublicId().equals(pubId));
  898.         TASSERT(dt.getSystemId().equals(sysId));
  899.         TASSERT(dt.getInternalSubset().equals(0));
  900.         TASSERT(dt.getOwnerDocument() == 0);
  901.         // Creating a DocumentType with invalid or malformed qName should fail.
  902.         EXCEPTION_TEST(impl.createDocumentType("<docName", pubId, sysId), DOM_DOMException::INVALID_CHARACTER_ERR);
  903.         EXCEPTION_TEST(impl.createDocumentType(":docName", pubId, sysId), DOM_DOMException::NAMESPACE_ERR);
  904.         EXCEPTION_TEST(impl.createDocumentType("docName:", pubId, sysId), DOM_DOMException::NAMESPACE_ERR);
  905.         EXCEPTION_TEST(impl.createDocumentType("doc::Name", pubId, sysId), DOM_DOMException::NAMESPACE_ERR);
  906.         EXCEPTION_TEST(impl.createDocumentType("doc:N:ame", pubId, sysId), DOM_DOMException::NAMESPACE_ERR);
  907.     }
  908.     TESTEPILOG;
  909.     //
  910.     //  DOMImplementation::CreateDocument
  911.     {
  912.         // Preflight the operations that will lazily create DOMStrings
  913.         // in the implementation.  This prevents incorrect reports of
  914.         // memory leaks in the real test.
  915.         DOM_DOMImplementation   impl;
  916.         DOM_DocumentType        dt;
  917.         DOM_Document            doc = impl.createDocument("", "a", dt);
  918.         doc.getNodeName();
  919.     }
  920.     //
  921.     TESTPROLOG;
  922.     {
  923.         DOM_DOMImplementation impl;
  924.         DOMString qName = "foo:docName";
  925.         DOMString pubId = "pubId";
  926.         DOMString sysId = "http://sysId";
  927.         DOM_DocumentType dt = impl.createDocumentType(qName, pubId, sysId);
  928.         DOMString docNSURI = "http://document.namespace";
  929.         DOM_Document doc = impl.createDocument(docNSURI, qName, dt);
  930.         TASSERT(dt.getOwnerDocument() == doc);
  931.         TASSERT(doc.getOwnerDocument() == 0);
  932.         TASSERT(doc.getNodeType() == DOM_Node::DOCUMENT_NODE);
  933.         TASSERT(doc.getDoctype() == dt);
  934.         TASSERT(doc.getNodeName().equals("#document"));
  935.         TASSERT(doc.getNodeValue() == 0);
  936.         TASSERT(doc.getNamespaceURI().equals(0));
  937.         TASSERT(doc.getPrefix().equals(0));
  938.         TASSERT(doc.getLocalName().equals(0));
  939.         DOM_Element el = doc.getDocumentElement();
  940.         TASSERT(el.getLocalName().equals("docName"));
  941.         TASSERT(el.getNamespaceURI().equals(docNSURI));
  942.         TASSERT(el.getNodeName().equals(qName));
  943.         TASSERT(el.getOwnerDocument() == doc);
  944.         TASSERT(el.getParentNode() == doc);
  945.         TASSERT(el.getPrefix().equals("foo"));
  946.         TASSERT(el.getTagName().equals(qName));
  947.         TASSERT(el.hasChildNodes() == false);
  948.         //
  949.         // Creating a second document with the same docType object should fail.
  950.         //
  951.         try
  952.         {
  953.             DOM_Document doc2 = impl.createDocument(docNSURI, qName, dt);
  954.             TASSERT(false);  // should not reach here.
  955.         }
  956.         catch ( DOM_DOMException &e)
  957.         {
  958.             TASSERT(e.code == DOM_DOMException::WRONG_DOCUMENT_ERR);
  959.         }
  960.         catch (...)
  961.         {
  962.             TASSERT(false);  // Wrong exception thrown.
  963.         }
  964.         // Creating a document with null NamespaceURI and DocumentType
  965.         doc = impl.createDocument(docNSURI, qName, 0);
  966.         // Namespace tests of createDocument are covered by createElementNS below
  967.     }
  968.     TESTEPILOG;
  969.     //
  970.     //  CreateElementNS methods
  971.     //
  972.     TESTPROLOG;
  973.     {
  974.         // Set up an initial (root element only) document.
  975.         //
  976.         DOM_DOMImplementation impl;
  977.         DOMString qName = "foo:docName";
  978.         DOMString pubId = "pubId";
  979.         DOMString sysId = "http://sysId";
  980.         DOM_DocumentType dt = impl.createDocumentType(qName, pubId, sysId);
  981.         DOMString docNSURI = "http://document.namespace";
  982.         DOM_Document doc = impl.createDocument(docNSURI, qName, dt);
  983.         DOM_Element rootEl = doc.getDocumentElement();
  984.         //
  985.         // CreateElementNS
  986.         //
  987.         DOM_Element ela = doc.createElementNS("http://nsa", "a:ela");  // prefix and URI
  988.         DOM_Element elb = doc.createElementNS("http://nsb", "elb");    //  URI, no prefix.
  989.         DOM_Element elc = doc.createElementNS("", "elc");              // No URI, no prefix.
  990.         rootEl.appendChild(ela);
  991.         rootEl.appendChild(elb);
  992.         rootEl.appendChild(elc);
  993.         TASSERT(ela.getNodeName().equals("a:ela"));
  994.         TASSERT(ela.getNamespaceURI().equals("http://nsa"));
  995.         TASSERT(ela.getPrefix().equals("a"));
  996.         TASSERT(ela.getLocalName().equals("ela"));
  997.         TASSERT(ela.getTagName().equals("a:ela"));
  998.         TASSERT(elb.getNodeName().equals("elb"));
  999.         TASSERT(elb.getNamespaceURI().equals("http://nsb"));
  1000.         TASSERT(elb.getPrefix().equals(""));
  1001.         TASSERT(elb.getLocalName().equals("elb"));
  1002.         TASSERT(elb.getTagName().equals("elb"));
  1003.         TASSERT(elc.getNodeName().equals("elc"));
  1004.         TASSERT(elc.getNamespaceURI().equals(""));
  1005.         TASSERT(elc.getPrefix().equals(""));
  1006.         TASSERT(elc.getLocalName().equals("elc"));
  1007.         TASSERT(elc.getTagName().equals("elc"));
  1008.         // Badly formed qualified name
  1009.         EXCEPTION_TEST(doc.createElementNS("http://nsa", "<a"), DOM_DOMException::INVALID_CHARACTER_ERR);
  1010.         EXCEPTION_TEST(doc.createElementNS("http://nsa", ":a"), DOM_DOMException::NAMESPACE_ERR);
  1011.         EXCEPTION_TEST(doc.createElementNS("http://nsa", "a:"), DOM_DOMException::NAMESPACE_ERR);
  1012.         EXCEPTION_TEST(doc.createElementNS("http://nsa", "a::a"), DOM_DOMException::NAMESPACE_ERR);
  1013.         EXCEPTION_TEST(doc.createElementNS("http://nsa", "a:a:a"), DOM_DOMException::NAMESPACE_ERR);
  1014.         // xml:a must have namespaceURI == "http://www.w3.org/XML/1998/namespace"
  1015.         DOMString xmlURI = "http://www.w3.org/XML/1998/namespace";
  1016.         TASSERT(doc.createElementNS(xmlURI, "xml:a").getNamespaceURI().equals(xmlURI));
  1017.         EXCEPTION_TEST(doc.createElementNS("http://nsa", "xml:a"), DOM_DOMException::NAMESPACE_ERR);
  1018.         EXCEPTION_TEST(doc.createElementNS("", "xml:a"), DOM_DOMException::NAMESPACE_ERR);
  1019.         EXCEPTION_TEST(doc.createElementNS(0,  "xml:a"), DOM_DOMException::NAMESPACE_ERR);
  1020.         //unlike Attribute, xmlns (no different from foo) can have any namespaceURI for Element
  1021.         TASSERT(doc.createElementNS("http://nsa", "xmlns").getNamespaceURI().equals("http://nsa"));
  1022.         TASSERT(doc.createElementNS(xmlURI, "xmlns").getNamespaceURI().equals(xmlURI));
  1023.         TASSERT(doc.createElementNS("", "xmlns").getNamespaceURI().equals(""));
  1024.         TASSERT(doc.createElementNS(0,  "xmlns").getNamespaceURI().equals(""));
  1025.         //unlike Attribute, xmlns:a (no different from foo:a) can have any namespaceURI for Element
  1026.         //except "" and null
  1027.         TASSERT(doc.createElementNS("http://nsa", "xmlns:a").getNamespaceURI().equals("http://nsa"));
  1028.         TASSERT(doc.createElementNS(xmlURI, "xmlns:a").getNamespaceURI().equals(xmlURI));
  1029.         EXCEPTION_TEST(doc.createElementNS("", "xmlns:a"), DOM_DOMException::NAMESPACE_ERR);
  1030.         EXCEPTION_TEST(doc.createElementNS(0,  "xmlns:a"), DOM_DOMException::NAMESPACE_ERR);
  1031.         //In fact, any prefix != null should have a namespaceURI != 0 or != ""
  1032.         TASSERT(doc.createElementNS("http://nsa", "foo:a").getNamespaceURI().equals("http://nsa"));
  1033.         EXCEPTION_TEST(doc.createElementNS("", "foo:a"), DOM_DOMException::NAMESPACE_ERR);
  1034.         EXCEPTION_TEST(doc.createElementNS(0,  "foo:a"), DOM_DOMException::NAMESPACE_ERR);
  1035.         //Change prefix
  1036.         DOM_Element elem = doc.createElementNS("http://nsa", "foo:a");
  1037.         elem.setPrefix("bar");
  1038.         TASSERT(elem.getNodeName().equals("bar:a"));
  1039.         TASSERT(elem.getNamespaceURI().equals("http://nsa"));
  1040.         TASSERT(elem.getPrefix().equals("bar"));
  1041.         TASSERT(elem.getLocalName().equals("a"));
  1042.         TASSERT(elem.getTagName().equals("bar:a"));
  1043.         //The spec does not prevent us from setting prefix to a node without prefix
  1044.         elem = doc.createElementNS("http://nsa", "a");
  1045.         TASSERT(elem.getPrefix().equals(""));
  1046.         elem.setPrefix("bar");
  1047.         TASSERT(elem.getNodeName().equals("bar:a"));
  1048.         TASSERT(elem.getNamespaceURI().equals("http://nsa"));
  1049.         TASSERT(elem.getPrefix().equals("bar"));
  1050.         TASSERT(elem.getLocalName().equals("a"));
  1051.         TASSERT(elem.getTagName().equals("bar:a"));
  1052.         //Special case for xml:a where namespaceURI must be xmlURI
  1053.         elem = doc.createElementNS(xmlURI, "foo:a");
  1054.         elem.setPrefix("xml");
  1055.         elem = doc.createElementNS("http://nsa", "foo:a");
  1056.         EXCEPTION_TEST(elem.setPrefix("xml"), DOM_DOMException::NAMESPACE_ERR);
  1057.         //However, there is no restriction on prefix xmlns
  1058.         elem.setPrefix("xmlns");
  1059.         //Also an element can not have a prefix with namespaceURI == null or ""
  1060.         elem = doc.createElementNS(0, "a");
  1061.         EXCEPTION_TEST(elem.setPrefix("foo"), DOM_DOMException::NAMESPACE_ERR);
  1062.         elem = doc.createElementNS("", "a");
  1063.         EXCEPTION_TEST(elem.setPrefix("foo"), DOM_DOMException::NAMESPACE_ERR);
  1064.         //Only prefix of Element and Attribute can be changed
  1065.         EXCEPTION_TEST(doc.setPrefix("foo"), DOM_DOMException::NAMESPACE_ERR);
  1066.         //Prefix of readonly Element can not be changed.
  1067.         //However, there is no way to create such DOM_Element for testing yet.
  1068.     }
  1069.     TESTEPILOG;
  1070.     //
  1071.     //  CreateAttributeNS methods
  1072.     //
  1073.     TESTPROLOG;
  1074.     {
  1075.         // Set up an initial (root element only) document.
  1076.         //
  1077.         DOM_DOMImplementation impl;
  1078.         DOMString qName = "foo:docName";
  1079.         DOMString pubId = "pubId";
  1080.         DOMString sysId = "http://sysId";
  1081.         DOM_DocumentType dt = impl.createDocumentType(qName, pubId, sysId);
  1082.         DOMString docNSURI = "http://document.namespace";
  1083.         DOM_Document doc = impl.createDocument(docNSURI, qName, dt);
  1084.         DOM_Element rootEl = doc.getDocumentElement();
  1085.         //
  1086.         // CreateAttributeNS
  1087.         //
  1088.         DOM_Attr attra = doc.createAttributeNS("http://nsa", "a:attra");       // prefix and URI
  1089.         DOM_Attr attrb = doc.createAttributeNS("http://nsb", "attrb");         //  URI, no prefix.
  1090.         DOM_Attr attrc = doc.createAttributeNS("", "attrc");    // No URI, no prefix.
  1091.         TASSERT(attra.getNodeName().equals("a:attra"));
  1092.         TASSERT(attra.getNamespaceURI().equals("http://nsa"));
  1093.         TASSERT(attra.getPrefix().equals("a"));
  1094.         TASSERT(attra.getLocalName().equals("attra"));
  1095.         TASSERT(attra.getName().equals("a:attra"));
  1096.         TASSERT(attra.getOwnerElement() == 0);
  1097.         TASSERT(attrb.getNodeName().equals("attrb"));
  1098.         TASSERT(attrb.getNamespaceURI().equals("http://nsb"));
  1099.         TASSERT(attrb.getPrefix().equals(""));
  1100.         TASSERT(attrb.getLocalName().equals("attrb"));
  1101.         TASSERT(attrb.getName().equals("attrb"));
  1102.         TASSERT(attrb.getOwnerElement() == 0);
  1103.         TASSERT(attrc.getNodeName().equals("attrc"));
  1104.         TASSERT(attrc.getNamespaceURI().equals(""));
  1105.         TASSERT(attrc.getPrefix().equals(""));
  1106.         TASSERT(attrc.getLocalName().equals("attrc"));
  1107.         TASSERT(attrc.getName().equals("attrc"));
  1108.         TASSERT(attrc.getOwnerElement() == 0);
  1109.         // Badly formed qualified name
  1110.         EXCEPTION_TEST(doc.createAttributeNS("http://nsa", "<a"), DOM_DOMException::INVALID_CHARACTER_ERR);
  1111.         EXCEPTION_TEST(doc.createAttributeNS("http://nsa", ":a"), DOM_DOMException::NAMESPACE_ERR);
  1112.         EXCEPTION_TEST(doc.createAttributeNS("http://nsa", "a:"), DOM_DOMException::NAMESPACE_ERR);
  1113.         EXCEPTION_TEST(doc.createAttributeNS("http://nsa", "a::a"), DOM_DOMException::NAMESPACE_ERR);
  1114.         EXCEPTION_TEST(doc.createAttributeNS("http://nsa", "a:a:a"), DOM_DOMException::NAMESPACE_ERR);
  1115.         // xml:a must have namespaceURI == "http://www.w3.org/XML/1998/namespace"
  1116.         DOMString xmlURI = "http://www.w3.org/XML/1998/namespace";
  1117.         TASSERT(doc.createAttributeNS(xmlURI, "xml:a").getNamespaceURI().equals(xmlURI));
  1118.         EXCEPTION_TEST(doc.createAttributeNS("http://nsa", "xml:a"), DOM_DOMException::NAMESPACE_ERR);
  1119.         EXCEPTION_TEST(doc.createAttributeNS("", "xml:a"), DOM_DOMException::NAMESPACE_ERR);
  1120.         EXCEPTION_TEST(doc.createAttributeNS(0,  "xml:a"), DOM_DOMException::NAMESPACE_ERR);
  1121.         //unlike Element, xmlns must have namespaceURI == "http://www.w3.org/2000/xmlns/"
  1122.         DOMString xmlnsURI = "http://www.w3.org/2000/xmlns/";
  1123.         TASSERT(doc.createAttributeNS(xmlnsURI, "xmlns").getNamespaceURI().equals(xmlnsURI));
  1124.         EXCEPTION_TEST(doc.createAttributeNS("http://nsa", "xmlns"), DOM_DOMException::NAMESPACE_ERR);
  1125.         EXCEPTION_TEST(doc.createAttributeNS(xmlURI, "xmlns"), DOM_DOMException::NAMESPACE_ERR);
  1126.         EXCEPTION_TEST(doc.createAttributeNS("", "xmlns"), DOM_DOMException::NAMESPACE_ERR);
  1127.         EXCEPTION_TEST(doc.createAttributeNS(0,  "xmlns"), DOM_DOMException::NAMESPACE_ERR);
  1128.         //unlike Element, xmlns:a must have namespaceURI == "http://www.w3.org/2000/xmlns/"
  1129.         TASSERT(doc.createAttributeNS(xmlnsURI, "xmlns:a").getNamespaceURI().equals(xmlnsURI));
  1130.         EXCEPTION_TEST(doc.createAttributeNS("http://nsa", "xmlns:a"), DOM_DOMException::NAMESPACE_ERR);
  1131.         EXCEPTION_TEST(doc.createAttributeNS(xmlURI, "xmlns:a"), DOM_DOMException::NAMESPACE_ERR);
  1132.         EXCEPTION_TEST(doc.createAttributeNS("", "xmlns:a"), DOM_DOMException::NAMESPACE_ERR);
  1133.         EXCEPTION_TEST(doc.createAttributeNS(0,  "xmlns:a"), DOM_DOMException::NAMESPACE_ERR);
  1134.         //In fact, any prefix != null should have a namespaceURI != 0 or != ""
  1135.         TASSERT(doc.createAttributeNS("http://nsa", "foo:a").getNamespaceURI().equals("http://nsa"));
  1136.         EXCEPTION_TEST(doc.createAttributeNS("", "foo:a"), DOM_DOMException::NAMESPACE_ERR);
  1137.         EXCEPTION_TEST(doc.createAttributeNS(0,  "foo:a"), DOM_DOMException::NAMESPACE_ERR);
  1138.         //Change prefix
  1139.         DOM_Attr attr = doc.createAttributeNS("http://nsa", "foo:a");
  1140.         attr.setPrefix("bar");
  1141.         TASSERT(attr.getNodeName().equals("bar:a"));
  1142.         TASSERT(attr.getNamespaceURI().equals("http://nsa"));
  1143.         TASSERT(attr.getPrefix().equals("bar"));
  1144.         TASSERT(attr.getLocalName().equals("a"));
  1145.         TASSERT(attr.getName().equals("bar:a"));
  1146.         //The spec does not prevent us from setting prefix to a node without prefix
  1147.         attr = doc.createAttributeNS("http://nsa", "a");
  1148.         TASSERT(attr.getPrefix().equals(""));
  1149.         attr.setPrefix("bar");
  1150.         TASSERT(attr.getNodeName().equals("bar:a"));
  1151.         TASSERT(attr.getNamespaceURI().equals("http://nsa"));
  1152.         TASSERT(attr.getPrefix().equals("bar"));
  1153.         TASSERT(attr.getLocalName().equals("a"));
  1154.         TASSERT(attr.getName().equals("bar:a"));
  1155.         //Special case for xml:a where namespaceURI must be xmlURI
  1156.         attr = doc.createAttributeNS(xmlURI, "foo:a");
  1157.         attr.setPrefix("xml");
  1158.         attr = doc.createAttributeNS("http://nsa", "foo:a");
  1159.         EXCEPTION_TEST(attr.setPrefix("xml"), DOM_DOMException::NAMESPACE_ERR);
  1160.         //Special case for xmlns:a where namespaceURI must be xmlURI
  1161.         attr = doc.createAttributeNS(xmlnsURI, "foo:a");
  1162.         attr.setPrefix("xmlns");
  1163.         attr = doc.createAttributeNS("http://nsa", "foo:a");
  1164.         EXCEPTION_TEST(attr.setPrefix("xmlns"), DOM_DOMException::NAMESPACE_ERR);
  1165.         //Special case for xmlns where no prefix can be set
  1166.         attr = doc.createAttributeNS(xmlnsURI, "xmlns");
  1167.         EXCEPTION_TEST(attr.setPrefix("foo"), DOM_DOMException::NAMESPACE_ERR);
  1168.         EXCEPTION_TEST(attr.setPrefix("xmlns"), DOM_DOMException::NAMESPACE_ERR);
  1169.         //Also an attribute can not have a prefix with namespaceURI == null or ""
  1170.         attr = doc.createAttributeNS(0, "a");
  1171.         EXCEPTION_TEST(attr.setPrefix("foo"), DOM_DOMException::NAMESPACE_ERR);
  1172.         attr = doc.createAttributeNS("", "a");
  1173.         EXCEPTION_TEST(attr.setPrefix("foo"), DOM_DOMException::NAMESPACE_ERR);
  1174.         //Only prefix of Element and Attribute can be changed
  1175.         EXCEPTION_TEST(doc.setPrefix("foo"), DOM_DOMException::NAMESPACE_ERR);
  1176.         //Prefix of readonly Attribute can not be changed.
  1177.         //However, there is no way to create such DOM_Attribute for testing yet.
  1178.     }
  1179.     TESTEPILOG;
  1180.     //
  1181.     //  getElementsByTagName*
  1182.     //
  1183.     TESTPROLOG;
  1184.     {
  1185.         // Set up an initial (root element only) document.
  1186.         //
  1187.         DOM_DOMImplementation impl;
  1188.         DOMString qName = "foo:docName";
  1189.         DOMString pubId = "pubId";
  1190.         DOMString sysId = "http://sysId";
  1191.         DOM_DocumentType dt = impl.createDocumentType(qName, pubId, sysId);
  1192.         DOMString docNSURI = "http://document.namespace";
  1193.         DOM_Document doc = impl.createDocument(docNSURI, qName, dt);
  1194.         DOM_Element rootEl = doc.getDocumentElement();
  1195.         //
  1196.         // Populate the document
  1197.         //
  1198.         DOM_Element ela = doc.createElementNS("http://nsa", "a:ela");
  1199.         rootEl.appendChild(ela);
  1200.         DOM_Element elb = doc.createElementNS("http://nsb", "elb");
  1201.         rootEl.appendChild(elb);
  1202.         DOM_Element elc = doc.createElementNS("",           "elc");
  1203.         rootEl.appendChild(elc);
  1204.         DOM_Element eld = doc.createElementNS("http://nsa", "d:ela");
  1205.         rootEl.appendChild(eld);
  1206.         DOM_Element ele = doc.createElementNS("http://nse", "elb");
  1207.         rootEl.appendChild(ele);
  1208.         //
  1209.         // Access with DOM Level 1 getElementsByTagName
  1210.         //
  1211.         DOM_NodeList nl;
  1212.         nl = doc.getElementsByTagName("a:ela");
  1213.         TASSERT(nl.getLength() == 1);
  1214.         TASSERT(nl.item(0) == ela);
  1215.         nl = doc.getElementsByTagName("elb");
  1216.         TASSERT(nl.getLength() == 2);
  1217.         TASSERT(nl.item(0) == elb);
  1218.         TASSERT(nl.item(1) == ele);
  1219.         nl = doc.getElementsByTagName("d:ela");
  1220.         TASSERT(nl.getLength() == 1);
  1221.         TASSERT(nl.item(0) == eld);
  1222.         //
  1223.         //  Access with DOM Level 2 getElementsByTagNameNS
  1224.         //
  1225.         nl = doc.getElementsByTagNameNS("", "elc");
  1226.         TASSERT(nl.getLength() == 1);
  1227.         TASSERT(nl.item(0) == elc);
  1228.         nl = doc.getElementsByTagNameNS(0, "elc");
  1229.         TASSERT(nl.getLength() == 1);
  1230.         TASSERT(nl.item(0) == elc);
  1231.         nl = doc.getElementsByTagNameNS("http://nsa", "ela");
  1232.         TASSERT(nl.getLength() == 2);
  1233.         TASSERT(nl.item(0) == ela);
  1234.         TASSERT(nl.item(1) == eld);
  1235.         nl = doc.getElementsByTagNameNS("", "elb");
  1236.         TASSERT(nl.getLength() == 0);
  1237.         nl = doc.getElementsByTagNameNS("http://nsb", "elb");
  1238.         TASSERT(nl.getLength() == 1);
  1239.         TASSERT(nl.item(0) == elb);
  1240.         nl = doc.getElementsByTagNameNS("*", "elb");
  1241.         TASSERT(nl.getLength() == 2);
  1242.         TASSERT(nl.item(0) == elb);
  1243.         TASSERT(nl.item(1) == ele);
  1244.         nl = doc.getElementsByTagNameNS("http://nsa", "*");
  1245.         TASSERT(nl.getLength() == 2);
  1246.         TASSERT(nl.item(0) == ela);
  1247.         TASSERT(nl.item(1) == eld);
  1248.         nl = doc.getElementsByTagNameNS("*", "*");
  1249.         TASSERT(nl.getLength() == 6);     // Gets the document root element, plus 5 more
  1250.         TASSERT(nl.item(6) == 0);
  1251.         // TASSERT(nl.item(-1) == 0);
  1252.         nl = rootEl.getElementsByTagNameNS("*", "*");
  1253.         TASSERT(nl.getLength() == 5);
  1254.         nl = doc.getElementsByTagNameNS("http://nsa", "d:ela");
  1255.         TASSERT(nl.getLength() == 0);
  1256.         //
  1257.         // Node lists are Live
  1258.         //
  1259.         nl = doc.getElementsByTagNameNS("*", "*");
  1260.         DOM_NodeList nla = ela.getElementsByTagNameNS("*", "*");
  1261.         TASSERT(nl.getLength() == 6);
  1262.         TASSERT(nla.getLength() == 0);
  1263.         rootEl.removeChild(elc);
  1264.         TASSERT(nl.getLength() == 5);
  1265.         TASSERT(nla.getLength() == 0);
  1266.         ela.appendChild(elc);
  1267.         TASSERT(nl.getLength() == 6);
  1268.         TASSERT(nla.getLength() == 1);
  1269.     }
  1270.     TESTEPILOG;
  1271.    //
  1272.     // Attributes and NamedNodeMaps.
  1273.     //
  1274.     TESTPROLOG;
  1275.     {
  1276.         // Set up an initial (root element only) document.
  1277.         //
  1278.         DOM_DOMImplementation impl;
  1279.         DOMString qName = "foo:docName";
  1280.         DOMString pubId = "pubId";
  1281.         DOMString sysId = "http://sysId";
  1282.         DOM_DocumentType dt = impl.createDocumentType(qName, pubId, sysId);
  1283.         DOMString docNSURI = "http://document.namespace";
  1284.         DOM_Document doc = impl.createDocument(docNSURI, qName, dt);
  1285.         DOM_Element rootEl = doc.getDocumentElement();
  1286.         //
  1287.         // Create a set of attributes and hang them on the root element.
  1288.         //
  1289.         DOM_Attr attra = doc.createAttributeNS("http://nsa", "a:attra");
  1290.         rootEl.setAttributeNodeNS(attra);
  1291.         DOM_Attr attrb = doc.createAttributeNS("http://nsb", "attrb");
  1292.         rootEl.setAttributeNodeNS(attrb);
  1293.         DOM_Attr attrc = doc.createAttributeNS("",           "attrc");
  1294.         rootEl.setAttributeNodeNS(attrc);
  1295.         DOM_Attr attrd = doc.createAttributeNS("http://nsa", "d:attra");
  1296.         rootEl.setAttributeNodeNS(attrd);
  1297.         DOM_Attr attre = doc.createAttributeNS("http://nse", "attrb");
  1298.         rootEl.setAttributeNodeNS(attre);
  1299.         //
  1300.         // Check that the attribute nodes were created with the correct properties.
  1301.         //
  1302.         TASSERT(attra.getNodeName().equals("a:attra"));
  1303.         TASSERT(attra.getNamespaceURI().equals("http://nsa"));
  1304.         TASSERT(attra.getLocalName().equals("attra"));
  1305.         TASSERT(attra.getName().equals("a:attra"));
  1306.         TASSERT(attra.getNodeType() == DOM_Node::ATTRIBUTE_NODE);
  1307.         TASSERT(attra.getNodeValue().equals(""));
  1308.         TASSERT(attra.getPrefix().equals("a"));
  1309.         TASSERT(attra.getSpecified() == true);
  1310.         TASSERT(attra.getValue().equals(""));
  1311.         TASSERT(attra.getOwnerElement() == 0);
  1312.         // Test methods of NamedNodeMap
  1313.         DOM_NamedNodeMap nnm = rootEl.getAttributes();
  1314.         TASSERT(nnm.getLength() == 4);
  1315.         TASSERT(nnm.getNamedItemNS("http://nsa", "attra") == attrd);
  1316.         TASSERT(nnm.getNamedItemNS("http://nsb", "attrb") == attrb);
  1317.         TASSERT(nnm.getNamedItemNS("http://nse", "attrb") == attre);
  1318.         TASSERT(nnm.getNamedItemNS("", "attrc") == attrc);
  1319.         TASSERT(nnm.getNamedItemNS("", "attra") == 0);
  1320.         TASSERT(nnm.getNamedItemNS("http://nsa", "attrb") == 0);
  1321.     }
  1322.     TESTEPILOG;
  1323.     //
  1324.     //
  1325.     //
  1326. }
  1327. //---------------------------------------------------------------------------------------
  1328. //
  1329. //   main
  1330. //
  1331. //---------------------------------------------------------------------------------------
  1332. int  main()
  1333. {
  1334.     try {
  1335.         XMLPlatformUtils::Initialize();
  1336.     }
  1337.     catch (const XMLException& toCatch) {
  1338.         char *pMessage = XMLString::transcode(toCatch.getMessage());
  1339.         fprintf(stderr, "Error during XMLPlatformUtils::Initialize(). n"
  1340.             "  Message is: %sn", pMessage);
  1341.         delete [] pMessage;
  1342.         return -1;
  1343.     }
  1344.     DOMStringTests();
  1345.     DOMBasicTests();
  1346.     DOMNSTests();
  1347.     //
  1348.     //  Print Final allocation stats for full set of tests
  1349.     //
  1350.     XMLPlatformUtils::Terminate();
  1351.     DomMemDebug().print();
  1352.     return 0;
  1353. };