/* * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Xerces" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact apache\@apache.org. * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation, and was * originally based on software copyright (c) 1999, International * Business Machines, Inc., http://www.ibm.com . For more information * on the Apache Software Foundation, please see * . */ // // Various DOM tests. // Contents include // 1. Basic functionality for DOMString // 2. Regression tests for bugs fixed. // All individual are wrapped in a memory leak checker. // // This is NOT a complete test of DOM functionality. // /* * $Id: DOMMemTest.cpp,v 1.31 2002/02/04 20:13:01 tng Exp $ */ #include #include #include #include #include #include #include #include #define TASSERT(c) tassert((c), __FILE__, __LINE__) void tassert(bool c, const char *file, int line) { if (!c) printf("Failure. Line %d, file %s\n", line, file); }; #define TESTPROLOG entryMemState = DomMemDebug(); #define TESTEPILOG \ exitMemState = DomMemDebug(); \ if (entryMemState != exitMemState) { \ printf(" Memory leak at line %d, file %s: ", __LINE__, __FILE__); \ exitMemState.printDifference(entryMemState); \ } #define EXCEPTION_TEST(operation, expected_exception) \ { \ try { \ operation; \ printf(" Error: no exception thrown at line %d\n", __LINE__); \ } \ catch (DOM_DOMException &e) { \ if (e.code != expected_exception) \ printf(" Wrong exception code: %d at line %d\n", e.code, __LINE__); \ } \ catch (...) { \ printf(" Wrong exception thrown at line %d\n", __LINE__); \ } \ } //--------------------------------------------------------------------------------------- // // DOMStringTests tests of class DOMString // //--------------------------------------------------------------------------------------- void DOMStringTests() { DomMemDebug entryMemState, exitMemState; // // Test 1. Basic operations on a simple string. // printf("DOM Memory Test.\n"); TESTPROLOG; { DOMString foo = "fop"; TASSERT(foo.length() == 3); TASSERT(foo.equals(foo)); TASSERT(foo != 0); TASSERT(foo.charAt(0) == chLatin_f); TASSERT(foo.charAt(2) == chLatin_p); TASSERT(foo.charAt(3) == chNull); } TESTEPILOG // // Construct from XMLCh * // TESTPROLOG { XMLCh a[] = {chLatin_H, chLatin_e, chLatin_l, chLatin_l, chLatin_o, chNull}; // Unicode "Hello" DOMString x(a); DOMString y = "Hello"; TASSERT(x.equals(y)); DOMString z(a+2, 3); TASSERT(z.equals("llo")); } TESTEPILOG // // Test 2. Empty strings shouldn't leave anything lying around // TESTPROLOG; { DOMString a; DOMString b; TASSERT (a==0); a = 0; TASSERT(a==0); TASSERT((a!=0) == false); DOMString c(0); TASSERT(c==0); TASSERT(c==a); } TESTEPILOG // // Test 3. Clones should be equal. TESTPROLOG; { DOMString a = "hello"; DOMString b = a.clone(); TASSERT(a.equals(b)); TASSERT(a != b); a = 0; TASSERT(b.equals("hello")); TASSERT(a == 0); TASSERT(a.equals("")); } TESTEPILOG // // Test 4. Copy construction and assignemnt // TESTPROLOG; { DOMString a = "Test 04"; DOMString b(a); DOMString c = a; DOMString d; DOMString e; d = a; TASSERT(a==b); TASSERT(a==c); TASSERT(a==d); TASSERT(a!=e); // printf (" test04 should have 1 handle, 1 buffer here. "); } TESTEPILOG // // Test 5 AppendData, degenerate cases. // TESTPROLOG; { DOMString a; DOMString b = "Test 05"; a.appendData(b); TASSERT(a.equals(b)); TASSERT(a!=b); TASSERT(a.equals("Test 05")); }; TESTEPILOG // // Test 6 Append data, degenerate case 2 // TESTPROLOG; { DOMString a; DOMString b = "Test 06"; b.appendData(a); TASSERT(!a.equals(b)); TASSERT(a!=b); TASSERT(b.equals("Test 06")); TASSERT(a==0); } TESTEPILOG // // Test 7 Append Data, Common case, no extra space in original buffer. // Also, operator +=, which is a convenience alias for appendData. // TESTPROLOG; { DOMString a = "Test 07"; DOMString b = "append"; a.appendData(b); TASSERT(a.equals("Test 07append")); TASSERT(b.equals("append")); a.appendData((XMLCh)0x31); TASSERT(a.equals("Test 07append1")); XMLCh s[] = {0x32, 0x33, 0x00}; a.appendData(s); TASSERT(a.equals("Test 07append123")); a = "Test 07a "; a += b; TASSERT(a.equals("Test 07a append")); a += (XMLCh)0x31; TASSERT(a.equals("Test 07a append1")); a += s; TASSERT(a.equals("Test 07a append123")); } TESTEPILOG // // Test 8 Append Data, with plenty of extra space in buffer. // TESTPROLOG; { DOMString a; a.reserve(100); DOMString b("Test 08"); DOMString c("append"); TASSERT(a != 0); // (The String object has an identity, even if no contents) TASSERT(a.length() == 0); a.appendData(b); TASSERT(a.equals(b)); TASSERT(a.equals("Test 08")); TASSERT(a != b); a.appendData(c); TASSERT(a.equals("Test 08append")); TASSERT(b.equals("Test 08")); TASSERT(c.equals("append")); }; TESTEPILOG // // Test 9 Append Data, with plenty of extra space in buffer, but with // a clone, so that the original buffer can not be modified. // TESTPROLOG; { DOMString a; a.reserve(100); DOMString b("Test 09"); DOMString c("append"); TASSERT(a.length() == 0); a.appendData(b); TASSERT(a.equals(b)); TASSERT(a.equals("Test 09")); TASSERT(a != b); DOMString d = a.clone(); TASSERT(a.equals("Test 09")); TASSERT(b.equals("Test 09")); TASSERT(d.equals("Test 09")); TASSERT(a != b); TASSERT(a != d); TASSERT(b != d); a.appendData(c); TASSERT(a.equals("Test 09append")); TASSERT(b.equals("Test 09")); TASSERT(c.equals("append")); TASSERT(d.equals("Test 09")); }; TESTEPILOG; // // Test 10 DOMString Operator + // TESTPROLOG; { DOMString a; DOMString b("DOMString "); XMLCh s[] = {0x58, 0x4d, 0x4c, 0x20, 0x00}; // Unicode "XML " XMLCh Z = 0x5A; // Unicode 'Z' a = b + b; TASSERT(a.equals("DOMString DOMString ")); a = b + s; TASSERT(a.equals("DOMString XML ")); a = s + b; TASSERT(a.equals("XML DOMString ")); a = b + Z; TASSERT(a.equals("DOMString Z")); a = Z + b; TASSERT(a.equals("ZDOMString ")); } TESTEPILOG; // // Test 11 DOMString::subStringData(unsigned int offset, unsigned int count) // TESTPROLOG; { DOMString srcString("This is the source string."); // 01234567890123456789012345 DOMString This = srcString.substringData(0,4); DOMString is = srcString.substringData(5,2); DOMString dot = srcString.substringData(25,1); DOMString offEnd = srcString.substringData(19, 1000); TASSERT(This.equals("This")); TASSERT(is .equals("is")); TASSERT(dot .equals(".")); TASSERT(offEnd.equals("string.")); EXCEPTION_TEST(srcString.substringData(-1, 10), DOM_DOMException::INDEX_SIZE_ERR); EXCEPTION_TEST(srcString.substringData(26, 1), DOM_DOMException::INDEX_SIZE_ERR); srcString.insertData(0, "x"); // Changing the source should not alter previously // extracted substrings. TASSERT(This.equals("This")); TASSERT(is .equals("is")); TASSERT(dot .equals(".")); TASSERT(offEnd.equals("string.")); TASSERT(srcString.equals("xThis is the source string.")); } TESTEPILOG; // // Test 12 DOMString::insertData(unsigned int offset, DOMString &src) // TESTPROLOG; { DOMString aString("This is a string."); // 01234567890123456 aString.insertData(17, " Added at end."); TASSERT(aString.equals("This is a string. Added at end.")); aString = "This is a string."; EXCEPTION_TEST(aString.insertData(18, "x"), DOM_DOMException::INDEX_SIZE_ERR); TASSERT(aString.equals("This is a string.")); aString = 0; aString.reserve(100); aString.appendData("This is a string."); aString.insertData(17, " Added at end."); TASSERT(aString.equals("This is a string. Added at end.")); aString.insertData(0, "So "); TASSERT(aString.equals("So This is a string. Added at end.")); aString.insertData(2, "x"); TASSERT(aString.equals("Sox This is a string. Added at end.")); EXCEPTION_TEST(aString.substringData(-1, 1), DOM_DOMException::INDEX_SIZE_ERR); } TESTEPILOG; // // Minimal test of DOMString::transcode() // TESTPROLOG; { static char testStr[] = "This is our test string."; DOMString DOMTestStr = testStr; char *roundTripString = DOMTestStr.transcode(); TASSERT(strcmp(testStr, roundTripString) == 0); delete [] roundTripString; DOMString domstr2 = DOMString::transcode(testStr); TASSERT(domstr2.equals(DOMTestStr)); } TESTEPILOG; // // String bugs submitted by David Chung // TESTPROLOG; { DOMString greeting("hello"); greeting.appendData(greeting); TASSERT(greeting.equals("hellohello")); // Test DOMString.insertData, when source string is the same as the destination. // Implementation forces creation of a new buffer. // DOMString greeting2("Hello "); // 0123456789012345678 greeting2.deleteData(5, 14); // Leave unused space at end of buffer. TASSERT(greeting2.equals("Hello")); greeting2.insertData(2, greeting2); TASSERT(greeting2.equals("HeHellollo")); // DOMString.insertData(). Original buffer has space, and is retained. DOMString greeting3("Hello "); // 0123456789012345678 greeting3.deleteData(5, 14); // Leave unused space at end of buffer. TASSERT(greeting3.equals("Hello")); greeting3.insertData(2, "ByeBye"); TASSERT(greeting3.equals("HeByeByello")); } TESTEPILOG; // // String bug submitted by Nadav Aharoni // TESTPROLOG; { char testString[] = " "; testString[4] = 0; testString[5] = 'x'; char *origString = testString; XMLString::trim(testString); TASSERT(strlen(testString) == 0); TASSERT(testString[5] == 'x'); strcpy(testString, " Hello "); XMLString::trim(testString); TASSERT(strcmp(testString, "Hello") == 0); } TESTEPILOG; } //--------------------------------------------------------------------------------------- // // DOMBasicTests Basic DOM Level 1 tests // //--------------------------------------------------------------------------------------- void DOMBasicTests() { DomMemDebug entryMemState, exitMemState; // // Test Doc01 Create a new empty document // { // First precondition, so that lazily created strings do not appear // as memory leaks. DOM_Document doc; doc = DOM_Document::createDocument(); } TESTPROLOG; { DOM_Document doc; doc = DOM_Document::createDocument(); } TESTEPILOG // // Test Doc02 Create one of each kind of node using the // document createXXX methods. // Watch for memory leaks. // { // Do all operations in a preconditioning step, to force the // creation of implementation objects that are set up on first use. // Don't watch for leaks in this block (no TESTPROLOG / TESTEPILOG) DOM_Document doc = DOM_Document::createDocument(); DOM_Element el = doc.createElement("Doc02Element"); DOM_DocumentFragment frag = doc.createDocumentFragment (); DOM_Text text = doc.createTextNode("Doc02TextNode"); DOM_Comment comment = doc.createComment("Doc02Comment"); DOM_CDATASection cdataSec = doc.createCDATASection("Doc02CDataSection"); DOM_DocumentType docType = doc.createDocumentType("Doc02DocumentType"); DOM_Notation notation = doc.createNotation("Doc02Notation"); DOM_ProcessingInstruction pi = doc.createProcessingInstruction("Doc02PITarget", "Doc02PIData"); DOM_NodeList nodeList = doc.getElementsByTagName("*"); } TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_Element el = doc.createElement("Doc02Element"); } TESTEPILOG; TESTPROLOG { DOM_Document doc = DOM_Document::createDocument(); DOM_DocumentFragment frag = doc.createDocumentFragment (); }; TESTEPILOG TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_Element el = doc.createElement("Doc02Element"); } TESTEPILOG; TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_Text text = doc.createTextNode("Doc02TextNode"); } TESTEPILOG; TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_Comment comment = doc.createComment("Doc02Comment"); } TESTEPILOG; TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_CDATASection cdataSec = doc.createCDATASection("Doc02CDataSection"); } TESTEPILOG; TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_DocumentType docType = doc.createDocumentType("Doc02DocumentType"); } TESTEPILOG; TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_Notation notation = doc.createNotation("Doc02Notation"); } TESTEPILOG; TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_ProcessingInstruction pi = doc.createProcessingInstruction("Doc02PITarget", "Doc02PIData"); } TESTEPILOG; TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_Attr attribute = doc.createAttribute("Doc02Attribute"); } TESTEPILOG; TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_EntityReference er = doc.createEntityReference("Doc02EntityReference"); } TESTEPILOG; TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_NodeList nodeList = doc.getElementsByTagName("*"); } TESTEPILOG; // // Doc03 - Create a small document tree // TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_Element rootEl = doc.createElement("Doc03RootElement"); doc.appendChild(rootEl); DOM_Text textNode = doc.createTextNode("Doc03 text stuff"); rootEl.appendChild(textNode); DOM_NodeList nodeList = doc.getElementsByTagName("*"); }; TESTEPILOG; // // Attr01 // { DOM_Document doc = DOM_Document::createDocument(); DOM_Element rootEl = doc.createElement("RootElement"); doc.appendChild(rootEl); { DOM_Attr attr01 = doc.createAttribute("Attr01"); rootEl.setAttributeNode(attr01); } TESTPROLOG; { DOM_Attr attr02 = doc.createAttribute("Attr01"); rootEl.setAttributeNode(attr02); } TESTEPILOG }; // // Attr02 // TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_Element rootEl = doc.createElement("RootElement"); doc.appendChild(rootEl); DOM_Attr attr01 = doc.createAttribute("Attr02"); rootEl.setAttributeNode(attr01); DOM_Attr attr02 = doc.createAttribute("Attr02"); rootEl.setAttributeNode(attr02); } TESTEPILOG; // // Attr03 // TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_Element rootEl = doc.createElement("RootElement"); doc.appendChild(rootEl); DOM_Attr attr01 = doc.createAttribute("Attr03"); rootEl.setAttributeNode(attr01); attr01.setValue("Attr03Value1"); attr01.setValue("Attr03Value2"); } TESTEPILOG; // // Attr04 // TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_Element rootEl = doc.createElement("RootElement"); doc.appendChild(rootEl); DOM_Attr attr01 = doc.createAttribute("Attr04"); rootEl.setAttributeNode(attr01); attr01.setValue("Attr04Value1"); DOM_Node value = attr01.getFirstChild(); } TESTEPILOG; // // Text01 // TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_Element rootEl = doc.createElement("RootElement"); doc.appendChild(rootEl); DOMString tmp("Hello Goodbye"); DOM_Text txt1 = doc.createTextNode(tmp); tmp = 0; rootEl.appendChild(txt1); txt1.splitText(6); rootEl.normalize(); } TESTEPILOG; // // Notation01 // TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_DocumentType dt = doc.createDocumentType("DocType_for_Notation01"); doc.appendChild(dt); DOM_NamedNodeMap notationMap = dt.getNotations(); DOM_Notation nt1 = doc.createNotation("Notation01"); notationMap.setNamedItem (nt1); DOM_Node abc1 = notationMap.getNamedItem("Notation01"); DOM_Notation nt2 = (DOM_Notation &) abc1; TASSERT(nt1==nt2); nt2 = DOM_Notation(); nt1 = 0; DOM_Node abc6 = notationMap.getNamedItem("Notation01"); nt2 = (DOM_Notation &) abc6; } TESTEPILOG; // // NamedNodeMap01 - comparison operators. // TESTPROLOG; { DOM_NamedNodeMap nnm; TASSERT(nnm == 0); DOM_Document doc = DOM_Document::createDocument(); nnm = doc.getAttributes(); // Should be null, because node type // is not Element. TASSERT(nnm == 0); TASSERT(!(nnm != 0)); DOM_Element el = doc.createElement("NamedNodeMap01"); DOM_NamedNodeMap nnm2 = el.getAttributes(); // Should be an empty, but non-null map. TASSERT(nnm2 != 0); TASSERT(nnm != nnm2); nnm = nnm2; TASSERT(nnm == nnm2); } TESTEPILOG; // // importNode quick test // TESTPROLOG { DOM_Document doc1 = DOM_Document::createDocument(); DOM_Document doc2 = DOM_Document::createDocument(); DOM_Element el1 = doc1.createElement("abc"); doc1.appendChild(el1); TASSERT(el1.getParentNode() != 0); DOM_Node el2 = doc2.importNode(el1, true); TASSERT(el2.getParentNode() == 0); DOMString tagName = el2.getNodeName(); TASSERT(tagName.equals("abc")); TASSERT(el2.getOwnerDocument() == doc2); TASSERT(doc1 != doc2); } TESTEPILOG; // // getLength() tests. Both Node CharacterData and NodeList implement // getLength(). Early versions of the DOM had a clash // between the two, originating in the implementation class // hirearchy, which has NodeList as a (distant) base class // of CharacterData. This is a regression test to verify // that the problem stays fixed. // TESTPROLOG { DOM_Document doc = DOM_Document::createDocument(); DOM_Text tx = doc.createTextNode("Hello"); DOM_Element el = doc.createElement("abc"); el.appendChild(tx); int textLength = tx.getLength(); TASSERT(textLength == 5); DOM_NodeList nl = tx.getChildNodes(); int nodeListLen = nl.getLength(); TASSERT(nodeListLen == 0); nl = el.getChildNodes(); nodeListLen = nl.getLength(); TASSERT(nodeListLen == 1); } // // NodeList - comparison operators, basic operation. // TESTPROLOG; { DOM_NodeList nl; DOM_NodeList nl2; TASSERT(nl == 0); TASSERT(!(nl != 0)); TASSERT(nl == nl2); DOM_Document doc = DOM_Document::createDocument(); nl = doc.getChildNodes(); // Should be non-null, but empty TASSERT(nl != 0); int len = nl.getLength(); TASSERT(len == 0); DOM_Element el = doc.createElement("NodeList01"); doc.appendChild(el); len = nl.getLength(); TASSERT(len == 1); TASSERT(nl != nl2); nl2 = nl; TASSERT(nl == nl2); } TESTEPILOG; // // Name validity checking. // TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); try { DOM_Element el = doc.createElement("!@@ bad element name"); TASSERT(false); // Exception above should prevent us reaching here. } catch ( DOM_DOMException &e) { TASSERT(e.code == DOM_DOMException::INVALID_CHARACTER_ERR); } catch (...) { TASSERT(false); // Wrong exception thrown. } } TESTEPILOG; // // Assignment ops return value // TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_Element el = doc.createElement("NodeList01"); doc.appendChild(el); DOM_Element n1, n2, n3; n1 = n2 = n3 = el; TASSERT(n1 == n2); TASSERT(n1 == n3); TASSERT(n1 == el); TASSERT(n1 != 0); n1 = n2 = n3 = 0; TASSERT(n1 == 0); } TESTEPILOG; // // Cloning of a node with attributes. Regression test for a ref counting // bug in attributes of cloned nodes that occured when the "owned" flag // was not set in the clone. // TESTPROLOG; { DOM_Document doc = DOM_Document::createDocument(); DOM_Element root = doc.createElement("CTestRoot"); root.setAttribute("CTestAttr", "CTestAttrValue"); DOMString s = root.getAttribute("CTestAttr"); TASSERT(s.equals("CTestAttrValue")); DOM_Node abc2 = root.cloneNode(true); DOM_Element cloned = (DOM_Element &) abc2; DOM_Attr a = cloned.getAttributeNode("CTestAttr"); TASSERT(a != 0); s = a.getValue(); TASSERT(s.equals("CTestAttrValue")); a = 0; a = cloned.getAttributeNode("CTestAttr"); TASSERT(a != 0); s = a.getValue(); TASSERT(s.equals("CTestAttrValue")); } TESTEPILOG; // // splitText() // Regression test for a bug from Tinny Ng // TESTPROLOG; { DOM_Document doc; doc = DOM_Document::createDocument(); DOM_Text tn, tn1, tn2; tn = doc.createTextNode ("0123456789"); tn1 = tn.splitText(5); TASSERT( tn.getNodeValue().equals("01234")); TASSERT(tn1.getNodeValue().equals("56789")); tn2 = tn.splitText(5); TASSERT( tn.getNodeValue().equals("01234")); TASSERT(tn2.getNodeValue().equals("")); EXCEPTION_TEST(tn.splitText(6), DOM_DOMException::INDEX_SIZE_ERR); } TESTEPILOG; } //--------------------------------------------------------------------------------------- // // DOMNSTests DOM Name Space tests // //--------------------------------------------------------------------------------------- void DOMNSTests() { DomMemDebug entryMemState, exitMemState; // // DOM Level 2 tests. These should be split out as a separate test. // // // hasFeature. The set of supported options tested here is for Xerces 1.1 // Note: because the implementation lazily creates some of the comprison // strings within the implementation, this test must be pre-flighted // outside of the TESPROLOG/TESTEPILOG macros to avoid spurious // reports of memory leaks. // // Also test the case-insensitive // { DOM_DOMImplementation impl; TASSERT(impl.hasFeature("XmL", "2.0") == true); TASSERT(impl.hasFeature("xML", "") == true); // We also support 1.0 TASSERT(impl.hasFeature("XMl", "1.0") == true); TASSERT(impl.hasFeature("xMl", "3.0") == false); TASSERT(impl.hasFeature("TrAveRsal", "") == true); } TESTPROLOG; { DOM_DOMImplementation impl; TASSERT(impl.hasFeature("XML", "") == true); TASSERT(impl.hasFeature("XML", "1.0") == true); TASSERT(impl.hasFeature("XML", "2.0") == true); TASSERT(impl.hasFeature("XML", "3.0") == false); TASSERT(impl.hasFeature("Core", "") == true); TASSERT(impl.hasFeature("coRe", "1.0") == true); TASSERT(impl.hasFeature("core", "2.0") == true); TASSERT(impl.hasFeature("cORe", "3.0") == false); TASSERT(impl.hasFeature("Traversal", "") == true); TASSERT(impl.hasFeature("traversal", "1.0") == false); TASSERT(impl.hasFeature("TraVersal", "2.0") == true); TASSERT(impl.hasFeature("Range", "") == true); TASSERT(impl.hasFeature("raNge", "1.0") == false); TASSERT(impl.hasFeature("RaNge", "2.0") == true); TASSERT(impl.hasFeature("HTML", "") == false); TASSERT(impl.hasFeature("Views", "") == false); TASSERT(impl.hasFeature("StyleSheets", "") == false); TASSERT(impl.hasFeature("CSS", "") == false); TASSERT(impl.hasFeature("CSS2", "") == false); TASSERT(impl.hasFeature("Events", "") == false); TASSERT(impl.hasFeature("UIEvents", "") == false); TASSERT(impl.hasFeature("MouseEvents", "") == false); TASSERT(impl.hasFeature("MutationEvents", "") == false); TASSERT(impl.hasFeature("HTMLEvents", "") == false); } TESTEPILOG; // // isSupported test (similar to hasFeature) // TESTPROLOG; { DOM_Document doc; doc = DOM_Document::createDocument(); TASSERT(doc.isSupported("XML", "") == true); TASSERT(doc.isSupported("XML", "1.0") == true); TASSERT(doc.isSupported("XML", "2.0") == true); TASSERT(doc.isSupported("XML", "3.0") == false); TASSERT(doc.isSupported("Core", "") == true); TASSERT(doc.isSupported("coRe", "1.0") == true); TASSERT(doc.isSupported("core", "2.0") == true); TASSERT(doc.isSupported("cORe", "3.0") == false); TASSERT(doc.isSupported("Traversal", "") == true); TASSERT(doc.isSupported("traversal", "1.0") == false); TASSERT(doc.isSupported("TraVersal", "2.0") == true); TASSERT(doc.isSupported("Range", "") == true); TASSERT(doc.isSupported("raNge", "1.0") == false); TASSERT(doc.isSupported("RaNge", "2.0") == true); TASSERT(doc.isSupported("HTML", "") == false); TASSERT(doc.isSupported("Views", "") == false); TASSERT(doc.isSupported("StyleSheets", "") == false); TASSERT(doc.isSupported("CSS", "") == false); TASSERT(doc.isSupported("CSS2", "") == false); TASSERT(doc.isSupported("Events", "") == false); TASSERT(doc.isSupported("UIEvents", "") == false); TASSERT(doc.isSupported("MouseEvents", "") == false); TASSERT(doc.isSupported("MutationEvents", "") == false); TASSERT(doc.isSupported("HTMLEvents", "") == false); } TESTEPILOG; // // CreateDocumentType // TESTPROLOG; { DOM_DOMImplementation impl; DOMString qName = "foo:docName"; DOMString pubId = "pubId"; DOMString sysId = "http://sysId"; DOM_DocumentType dt = impl.createDocumentType(qName, pubId, sysId); TASSERT(dt != 0); TASSERT(dt.getNodeType() == DOM_Node::DOCUMENT_TYPE_NODE); TASSERT(dt.getNodeName().equals(qName)); TASSERT(dt.getNamespaceURI().equals(0)); TASSERT(dt.getPrefix().equals(0)); TASSERT(dt.getLocalName().equals(0)); TASSERT(dt.getPublicId().equals(pubId)); TASSERT(dt.getSystemId().equals(sysId)); TASSERT(dt.getInternalSubset().equals(0)); TASSERT(dt.getOwnerDocument() == 0); DOM_NamedNodeMap nnm = dt.getEntities(); TASSERT(nnm.getLength() == 0); nnm = dt.getNotations(); TASSERT(nnm.getLength() == 0); // // Qualified name without prefix should also work. // qName = "docName"; dt = impl.createDocumentType(qName, pubId, sysId); TASSERT(dt != 0); TASSERT(dt.getNodeType() == DOM_Node::DOCUMENT_TYPE_NODE); TASSERT(dt.getNodeName().equals(qName)); TASSERT(dt.getNamespaceURI().equals(0)); TASSERT(dt.getPrefix().equals(0)); TASSERT(dt.getLocalName().equals(0)); TASSERT(dt.getPublicId().equals(pubId)); TASSERT(dt.getSystemId().equals(sysId)); TASSERT(dt.getInternalSubset().equals(0)); TASSERT(dt.getOwnerDocument() == 0); // Creating a DocumentType with invalid or malformed qName should fail. EXCEPTION_TEST(impl.createDocumentType("