/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2003 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 "Apache" 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 
*    XMLBeans", 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) 2000-2003 BEA Systems 
* Inc., <http://www.bea.com/>. For more information on the Apache Software
* Foundation, please see <http://www.apache.org/>.
*/

package drtcases;

import org.apache.xmlbeans.XmlCursor.TokenType;
import org.apache.xmlbeans.XmlCursor.XmlBookmark;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlSaxHandler;
import org.apache.xmlbeans.XmlLineNumber;
import org.apache.xmlbeans.XmlBeans;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions;
import org.apache.xmlbeans.impl.common.XmlNameImpl;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Iterator;
import java.util.TreeSet;
import javax.xml.namespace.QName;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import junit.framework.Assert;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.ext.LexicalHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import weblogic.xml.stream.Attribute;
import weblogic.xml.stream.AttributeIterator;
import weblogic.xml.stream.ChangePrefixMapping;
import weblogic.xml.stream.CharacterData;
import weblogic.xml.stream.Comment;
import weblogic.xml.stream.EndDocument;
import weblogic.xml.stream.EndElement;
import weblogic.xml.stream.EndPrefixMapping;
import weblogic.xml.stream.StartDocument;
import weblogic.xml.stream.StartElement;
import weblogic.xml.stream.StartPrefixMapping;
import weblogic.xml.stream.XMLEvent;
import weblogic.xml.stream.XMLInputStream;
import weblogic.xml.stream.XMLName;
   
public class StoreTests extends TestCase
{
    public StoreTests(String name) { super(name); }
    public static Test suite() { return new TestSuite(StoreTests.class); }

    static String[] _args;
    static String _test;

    public static File getCaseFile(String theCase)
    {
        return TestEnv.xbeanCase("store/" + theCase);
    }

    static XmlCursor loadCase(String theCase) throws Exception
    {
        return XmlObject.Factory.parse(getCaseFile(theCase), null).newCursor();
    }

    public void testReplaceContents ( )
        throws Exception
    {
        XmlObject xDst = XmlObject.Factory.newInstance();
        XmlObject xSrc = XmlObject.Factory.parse( "<foo/>" );
        XmlObject newDst = xDst.set( xSrc );
        Assert.assertTrue( newDst.xmlText().equals( "<foo/>" ) );
        
        xDst = XmlObject.Factory.parse( "<bar/>" );
        xSrc = XmlObject.Factory.parse( "<foo/>" );
        XmlCursor c = xDst.newCursor();
        c.toNextToken();
        xDst = c.getObject();
        xDst.set( xSrc );
        c.toStartDoc();
        xDst = c.getObject();
        Assert.assertTrue( xDst.xmlText().equals( "<bar><foo/></bar>" ) );

        xDst = XmlObject.Factory.parse( "<bar x='y'/>" );
        xSrc = XmlObject.Factory.parse( "<foo>moo</foo>" );
        c = xDst.newCursor();
        c.toNextToken();
        c.toNextToken();
        xDst = c.getObject();
        xDst.set( xSrc );
        c.toStartDoc();
        xDst = c.getObject();
        Assert.assertTrue( xDst.xmlText().equals( "<bar x=\"moo\"/>" ) );
    }
    
    public void testSniffing ( )
        throws Exception
    {
        XmlObject x;
        
        x = XmlObject.Factory.parse( "<xoo/>" );
        Assert.assertTrue( x.schemaType() == XmlBeans.NO_TYPE );
        
        x = XmlObject.Factory.parse(
            "<schema xmlns='http://www.w3.org/2001/XMLSchema'/>" );
        Assert.assertTrue(
            x.schemaType() == org.w3.x2001.xmlSchema.SchemaDocument.type );

        x = XmlObject.Factory.parse(
            "<schema xmlns='http://www.w3.org/2001/XMLSchema/moo'/>" );
        Assert.assertTrue( x.schemaType() == XmlBeans.NO_TYPE );

        x = XmlObject.Factory.parse(
            "<schema xmlns='http://www.w3.org/2001/XMLSchema'/>" );
        Assert.assertTrue(
            x.schemaType() == org.w3.x2001.xmlSchema.SchemaDocument.type );

        x = org.w3.x2001.xmlSchema.SchemaDocument.Factory.parse(
                "<schema xmlns='http://www.w3.org/2001/XMLSchema'/>" );
        Assert.assertTrue(
            x.schemaType() == org.w3.x2001.xmlSchema.SchemaDocument.type );

        try {
            x = 
                org.w3.x2001.xmlSchema.SchemaDocument.Factory.parse(
                    "<schema xmlns='http://www.w3.org/2001/XMLSchema/moo'/>" );
            Assert.assertTrue( false );
        }
        catch ( Throwable e ) { }
    }
    
    public void testCursorStack ( )
        throws Exception
    {
        XmlObject x = XmlObject.Factory.parse( "<foo x='y'/>" );
        XmlCursor c = x.newCursor();
        c.push();
        c.toNextToken();
        c.push();
        c.toNextToken();
        Assert.assertTrue( c.isAttr() );
        c.pop();
        Assert.assertTrue( c.isStart() );
        c.pop();
        Assert.assertTrue( c.isStartdoc() );
    }
    
    public void testImplicitNamespaces ( )
        throws Exception
    {
        Map namespaces = new HashMap();
        namespaces.put( "foo", "foo.com" );
        namespaces.put( "bar", "bar.com" );
        namespaces.put( "", "default.com" );

        XmlOptions options = new XmlOptions();
        options.put( XmlOptions.SAVE_IMPLICIT_NAMESPACES, namespaces );

        XmlObject x = XmlObject.Factory.newInstance();
        XmlCursor c = x.newCursor();

        c.toNextToken();

        c.beginElement( "a", "foo.com" );
        c.beginElement( "b", "default.com" );
        c.beginElement( "c", "bar.com" );

        Assert.assertTrue(
            x.xmlText( options ).equals( "<foo:a><b><bar:c/></b></foo:a>" ) );
    }

    private static class Content implements ContentHandler, LexicalHandler
    {
        public void startDocument ( ) throws SAXException 
        {
            add( "START_DOCUMENT" );
        }

        public void endDocument ( ) throws SAXException 
        {
            add( "END_DOCUMENT" );
        }

        public void startElement (
            String namespaceURI, String localName,
            String qName, Attributes atts )
                throws SAXException
        {
            add( "START_ELEMENT" );
            add( "  namespaceURI: " + namespaceURI );
            add( "  localName: " + localName );
//            add( "  qName: " + qName ); 

            TreeSet sortedAttrs = new TreeSet();

            for ( int i = 0 ; i < atts.getLength() ; i++ )
            {
                String ln = atts.getLocalName( i );
                String uri = atts.getURI( i );
                String qname = atts.getQName( i );

                if (ln.equals("xmlns"))
                    continue;
                if (qname.startsWith("xmlns"))
                    continue;

//                if (ln.equals( "xmlns" ))
//                    ln = "";
//
//                if (uri.equals( "xmlns" ))
//                    uri = "";

                sortedAttrs.add(
                    uri + "-" + ln + "-" +
                        atts.getQName( i ) + "-" + atts.getType( i ) + "-" +
                            atts.getValue( i ) );
            }

            for ( Iterator i = sortedAttrs.iterator() ; i.hasNext() ; )
                add( "  Attr: " + i.next() );
        }

        public void endElement (
            String namespaceURI, String localName, String qName )
                throws SAXException
        {
            add( "END_ELEMENT" );
            add( "  namespaceURI: " + namespaceURI );
            add( "  localName: " + localName );
//            add( "  qName: " + qName );
        }

        public void characters ( char ch[], int start, int length )
            throws SAXException
        {
            if (length > 0)
            {
                add( "CHARACTERS" );
                add( ch, start, length );
            }
        }

        public void comment ( char ch[], int start, int length ) 
            throws SAXException 
        { 
            add( "COMMENT" );
            add( "  Comment: ", ch, start, length );
        }

        public void processingInstruction ( String target, String data )
            throws SAXException
        {
            add( "PROCESSING_INSTRUCTION" );
            add(   "target: " + target );
            add(   "data: " + data );
        }

        public void ignorableWhitespace ( char ch[], int start, int length )
            throws SAXException
        {
            if (length > 0)
            {
                add( "IGNORABLE_WHITESPACE" );
                add( "  whitespace: ", ch, start, length );
            }
        }
        
        public void startPrefixMapping ( String prefix, String uri )
            throws SAXException
        {
            add( "START_PREFIX_MAPPING" );
//            add( "  prefix: " + prefix );
            add( "  uri: " + uri );
        }
        
        public void endPrefixMapping ( String prefix ) throws SAXException
        {
            add( "END_PREFIX_MAPPING" );
//            add( "  prefix: " + prefix );
        }
        
        public void startCDATA ( ) throws SAXException
        {
            add( "START_CDATA" );
        }
        
        public void endCDATA ( ) throws SAXException
        {
            add( "END_CDATA" );
        }
        
        public void startDTD ( String name, String publicId, String systemId )
            throws SAXException
        {
            add( "START_DTD" );
            add( "  name: " + name );
            add( "  publicId: " + publicId );
            add( "  systemId: " + systemId );
        }
        
        public void endDTD ( ) throws SAXException
        {
            add( "END_DTD" );
        }
        
        public void startEntity ( String name ) throws SAXException
        {
            add( "START_ENTITY" );
            add( "  name: " + name );
        }
        
        public void endEntity ( String name ) throws SAXException
        {
            add( "END_ENTITY" );
            add( "  name: " + name );
        }
        
        public void setDocumentLocator ( Locator locator )
        {
            // add( "START_DOCUMENT_LOCATOR" );
        }

        public void skippedEntity ( String name ) throws SAXException
        {
            add( "SKIPPED_ENTITY" );
            add( "  name: " + name );
        }

        private void add ( String s )
        {
            _sb.append( s );
            _sb.append( "\n" );
        }
        
        private void add ( String s, char[] buf, int off, int cch )
        {
            _sb.append( s );
            _sb.append( buf, off, cch );
            _sb.append( "\n" );
        }
        
        private void add ( char[] buf, int off, int cch )
        {
            _sb.append( buf, off, cch );
            _sb.append( "\n" );
        }
        
        public boolean equals ( Object that )
        {
            return toString().equals( that.toString() );
        }

        public String toString ( )
        {
            return _sb.toString();
        }

        private StringBuffer _sb = new StringBuffer();
    }
    
    public void doTestSaxSaver ( String xml )
        throws Exception
    {
        // ME
        
        Content content2 = new Content();

        XmlObject x = XmlObject.Factory.parse( xml );

        x.save( content2, content2 );

        // THEM

        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        
        XMLReader xr = sp.getXMLReader();
        
        Content content1 = new Content();
        
        xr.setProperty( "http://xml.org/sax/properties/lexical-handler", content1 );
        xr.setFeature( "http://xml.org/sax/features/namespace-prefixes", true );
        xr.setFeature( "http://xml.org/sax/features/namespaces", true );
        xr.setFeature( "http://xml.org/sax/features/validation", false );

        xr.setContentHandler( content1 );
        
        InputSource is = new InputSource( new StringReader(  xml ) );

        xr.parse( is );


        if (!content1.equals( content2 ))
        {
            System.err.println( "SAX save failure: " );
            System.err.println( xml );
            System.err.println();
            
            System.err.println( "SAX: " );
            System.err.println( content1.toString() );
            System.err.println();
            
            System.err.println( "ME: " );
            System.err.println( content2.toString() );
            System.err.println();
            
            Assert.assertTrue( false );
        }
    }
    
    public void testSaxSaver ( )
        throws Exception
    {
        doTestSaxSaver( "<a xmlns='nnn'></a>" );
        doTestSaxSaver( "<a x='y'><!---->x<b/><c p='q'>z</c></a>" );
        doTestSaxSaver( "<a x='y'><!----><b>moo</b><c p='q'></c></a>" );
        doTestSaxSaver( "<a>asa<b/>sdsd<c>aaz</c>adsasd</a>" );
        doTestSaxSaver( "<a><?target value?></a>" );
        doTestSaxSaver( "<n:a xmlns:n='nnn'></n:a>" );
        doTestSaxSaver( "<j:a x='y' p='q' xmlns:j='k'></j:a>" );
    }
    
    public void __testParsing ( )
        throws Exception
    {
        Random r = new Random( 1 );
        
        for ( int i = 0 ; i < 100000 ; i++ )
        {
            String xml = makeRandomDocument( r );

//            System.err.println( "Starting..." );
//
//            System.err.println( xml );

            try
            {
                XmlObject.Factory.parse( xml );
            }
            catch ( Throwable e )
            {
                System.err.println( "Failed parse test:" );
                e.printStackTrace();
                System.err.println( xml );

                OutputStream os = new FileOutputStream( "c:\\ee.xml" );
                PrintStream ps = new PrintStream( os );
                ps.println( xml );
                ps.close();
                os.close();

                throw (RuntimeException) e;
            }
            
//            System.err.println( "Finished..." );
        }
    }

    public void doTestLineNumbers ( String xml )
        throws Exception
    {
        int line = 1;
        int col = 1;

        XmlCursor c =
            XmlObject.Factory.parse(
                xml, new XmlOptions().setLoadLineNumbers() ).
                    newCursor();

        for ( int i = 0 ; i < xml.length() ; i++ )
        {
            char ch = xml.charAt( i );

            if (ch == '<' && Character.isLetter( xml.charAt( i + 1 ) ) )
            {
                while (!c.currentTokenType().isStart())
                    c.toNextToken();

                Assert.assertTrue( c.currentTokenType().isStart() );
                    
                XmlLineNumber ln =
                    (XmlLineNumber)
                        c.getBookmark( XmlLineNumber.class );

                Assert.assertTrue( ln != null );

                Assert.assertTrue( ln.getLine()   == -1 || ln.getLine() == line );
                Assert.assertTrue( ln.getColumn() == -1 || ln.getColumn() == col );
                Assert.assertTrue( ln.getOffset() == -1 || ln.getOffset() == i );
                
                c.toNextToken();
            }

            if (ch == '\n')
            {
                line++;
                col= 1;
            }
            else
                col++;
        }
    }
    
    public void __testLineNumbers ( )
        throws Exception
    {
        Random r = new Random( 1 );
        
        for ( int i = 0 ; i < 1000 ; i++ )
        {
            String xml = makeRandomDocument( r );

//            System.err.println( "Starting..." );
//
//            System.err.println( xml );

            try
            {
                doTestLineNumbers( xml );
            }
            catch ( Throwable e )
            {
                System.err.println( "Failed line number test:" );
                System.err.println( xml );

                OutputStream os = new FileOutputStream( "c:\\ee.xml" );
                PrintStream ps = new PrintStream( os );
                ps.println( xml );
                ps.close();
                os.close();

                throw (RuntimeException) e;
            }
            
//            System.err.println( "Finished..." );
        }
    }

    private static class DocBuilder
    {
        Random r;
        StringBuffer sb;
        
        DocBuilder ( Random _r, StringBuffer _sb )
        {
            r = _r;
            sb = _sb;
        }

        void append ( char ch )
        {
            sb.append( ch );
        }
        
        void append ( String s )
        {
            sb.append( s );
        }

        public void whitespace ( )
        {
            int p = r.nextInt( 100 );

            if (p < 20)
                append( '\t' );
            else if (p < 40)
                append( '\n' );
            else
                append( ' ' );
        }

        public void whitespaces ( )
        {
            for ( int i = r.nextInt( 8 ) ; i > 0 ; i-- )
                whitespace();
        }

        public char makeLetter ( )
        {
            return (char) (((int) 'a') + r.nextInt( 26 ));
        }
        
        public void letter ( )
        {
            append( makeLetter() );
        }

        public void charEntity ( )
        {
            switch ( r.nextInt( 5 ) )
            {
            case 0 : append( "&lt;" ); break;
            case 1 : append( "&gt;" ); break;
            case 2 : append( "&amp;" ); break;
            case 3 : append( "&apos;" ); break;
            case 4 : append( "&quot;" ); break;
            }
        }
                
        public void text ( )
        {
            for ( int i = r.nextInt( 20 ) ; i > 0 ; i-- )
            {
                int p = r.nextInt( 100 );

                if (p < 70)
                    letter();
                else if (p < 74)
                    charEntity();
                else
                    whitespace();
            }
        }

        public String makeNcName ( )
        {
            StringBuffer name = new StringBuffer();
            
            for ( ; ; )
            {
                char ch = makeLetter();

                if (ch == 'x' || ch == 'X')
                    continue;

                name.append( ch );

                break;
            }
            
            for ( int i = r.nextInt( 20 ) ; i > 0 ; i-- )
                name.append( makeLetter() );

            return name.toString();
        }

        public void ncName ( )
        {
            append( makeNcName() );
        }

        public void comment ( )
        {
            append( "<!--" );
            text();
            append( "-->" );
        }
        
        public void procinst ( )
        {
            append( "<?" );
            ncName();

            if (r.nextInt( 100 ) < 90)
            {
                whitespace();
                text();
            }

            append( "?>" );
        }

        public void whiteContent ( )
        {
            for ( ; ; )
            {
                int p = r.nextInt( 100 );

                if (p < 20)
                    break;
                else if (p < 50)
                    whitespaces();
                else if (p < 70)
                    comment();
                else
                    procinst();
            }
        }
        
        public void xmlDecl ( )
        {
            append( "<?xml version=\"1.0\"?>" );
        }
        
        public void content ( int depth )
        {
            for ( int i = r.nextInt( 10 ) ; i > 0 ; i-- )
            {
                switch ( r.nextInt( 4 ) )
                {
                case 0 :
                    elementContent( depth + 1 );
                    break;
                    
                case 1 : text();           break;
                case 2 : comment();        break;
                case 3 : procinst();       break;
                }
            }
        }
        
        public void attribute ( )
        {
            ncName();
            
            if (r.nextInt( 100 ) == 0)
                whitespaces();

            append( '=' );
            
            if (r.nextInt( 100 ) == 0)
                whitespaces();

            char q = r.nextInt( 2 ) == 0 ? '\'' : '"';

            append( q );

            text();
            
            append( q );
        }
        
        public void elementContent ( int depth )
        {
            // If depth == 0, guarantee an element, otherwise, as depth
            // increases, the probablility we'll spit out an element
            // gets smaller.

            if (r.nextInt( depth + 1 ) <= 1)
            {
                String name = makeNcName();

                append( '<' );
                append( name );

                if (r.nextInt( 100 ) == 0)
                    whitespaces();

                HashMap attrs = new HashMap();
                
                for ( int i = r.nextInt( 3 ) ; i > 0 ; i-- )
                {
                    append( ' ' );
                    
                    String aname;

                    for ( ; ; )
                    {
                        aname = makeNcName();
                            
                        if (!attrs.containsKey( aname ))
                            break;
                    }

                    attrs.put( aname, null );

                    append( aname );

                    if (r.nextInt( 100 ) == 0)
                        whitespaces();

                    append( '=' );

                    if (r.nextInt( 100 ) == 0)
                        whitespaces();

                    char q = r.nextInt( 2 ) == 0 ? '\'' : '"';

                    append( q );

                    text();

                    append( q );
                            
                    if (r.nextInt( 10 ) == 0)
                        whitespaces();
                }

                append( '>' );

                content( depth );

                append( "</" );
                append( name );
                
                if (r.nextInt( 100 ) == 0)
                    whitespaces();

                append( '>' );
            }
        }
        
        public void document ( )
        {
            if (r.nextInt( 2 ) == 0)
                xmlDecl();
            
            whiteContent();
            
            elementContent( 0 );
            
            whiteContent();
        }
    }
    
    public String makeRandomDocument ( Random r )
    {
        StringBuffer sb = new StringBuffer();

        DocBuilder db = new DocBuilder( r, sb );

        db.document();

        return sb.toString();
    }
    
    public void testThatAssertIsOn ( )
    {
        try
        {
            assert false;

            Assert.assertTrue( false );
        }
        catch ( Throwable e )
        {
        }
    }
            
    static class MyMark extends XmlBookmark
    {
    }

    public void testBookmarks ( )
        throws Exception
    {
        XmlObject x = XmlObject.Factory.parse( "<foo x='y'>abcdefg<!---->xy</foo>" );
        
        XmlCursor c = x.newCursor();
        MyMark m1 = new MyMark(); c.setBookmark( m1 );
        
        c.toNextToken();
        MyMark m2 = new MyMark(); c.setBookmark( m2 );
        
        c.toNextToken();
        MyMark m3 = new MyMark(); c.setBookmark( m3 );
        
        c.toNextToken();
        MyMark m4 = new MyMark(); c.setBookmark( m4 );
        
        c.toNextChar( 1 );
        MyMark m5 = new MyMark(); c.setBookmark( m5 );
        
        c.toNextChar( 3 );
        MyMark m6 = new MyMark(); c.setBookmark( m6 );

        c.toNextToken();
        c.toNextToken();
        c.toNextToken();
        MyMark m7 = new MyMark(); c.setBookmark( m7 );
        
        c.toNextToken();
        MyMark m8 = new MyMark(); c.setBookmark( m8 );

        c.toStartDoc();

        Assert.assertTrue( c.getBookmark   ( MyMark.class ) == m1 );
        Assert.assertTrue( c.toNextBookmark( MyMark.class ) == m2 );
        Assert.assertTrue( c.toNextBookmark( MyMark.class ) == m3 );
        Assert.assertTrue( c.toNextBookmark( MyMark.class ) == m4 );
        Assert.assertTrue( c.toNextBookmark( MyMark.class ) == m5 );
        Assert.assertTrue( c.toNextBookmark( MyMark.class ) == m6 );
        Assert.assertTrue( c.toNextBookmark( MyMark.class ) == m7 );
        Assert.assertTrue( c.toNextBookmark( MyMark.class ) == m8 );
        Assert.assertTrue( c.toNextBookmark( MyMark.class ) == null );
        
        c.toEndDoc();
        
        Assert.assertTrue( c.getBookmark   ( MyMark.class ) == m8 );
        Assert.assertTrue( c.toPrevBookmark( MyMark.class ) == m7 );
        Assert.assertTrue( c.toPrevBookmark( MyMark.class ) == m6 );
        Assert.assertTrue( c.toPrevBookmark( MyMark.class ) == m5 );
        Assert.assertTrue( c.toPrevBookmark( MyMark.class ) == m4 );
        Assert.assertTrue( c.toPrevBookmark( MyMark.class ) == m3 );
        Assert.assertTrue( c.toPrevBookmark( MyMark.class ) == m2 );
        Assert.assertTrue( c.toPrevBookmark( MyMark.class ) == m1 );
        Assert.assertTrue( c.toPrevBookmark( MyMark.class ) == null );
    }
    
    public void testSetName( )
        throws Exception
    {
        XmlObject x = XmlObject.Factory.parse( "<foo x='a'/>" );
        XmlCursor c = x.newCursor();
        c.toNextToken();
        c.setName( new QName( "bar" ) );
        c.toNextToken();
        c.setName( new QName( "y" ) );

        Assert.assertTrue( x.xmlText().equals( "<bar y=\"a\"/>" ) );
    }
    
    //
    // Basic load up a file and iterate through it
    //

   
    public void testBasicXml( )
        throws Exception
    {
        XmlCursor c = loadCase("test.xml");

        int n = 0;
        
        for ( ; ; )
        {
            TokenType t = c.toNextToken();

            n++;
            
            if (t == TokenType.NONE)
                break;
        }
        
        Assert.assertTrue( n == 6 );
    }

    //
    // Make sure the tokens going forward the the reverse of the tokens
    // going backward
    //

    public void testConsistentTokenOrder( )
        throws Exception
    {
        ArrayList l = new ArrayList();

        XmlCursor c = loadCase("test.xml");

        for ( ; ; )
        {
            // System.err.println(c.currentTokenType());
            l.add(c.currentTokenType());

            if (c.toNextToken() == TokenType.NONE)
                break;
        }

        c.toEndDoc();
        // System.err.println("Reversing");

        for ( int i = l.size() - 1 ; ; i-- )
        {
            // System.err.println(c.currentTokenType());
            Assert.assertEquals(l.get(i), c.currentTokenType());

            if (c.toPrevToken() == TokenType.NONE)
                break;
        }
    }

    //
    // Make sure you can't insert text before the doc begin
    // going backward
    //

    public void testIllegalTextInsert( )
        throws Exception
    {
        XmlCursor c = loadCase("test.xml");

        try
        {
            c.insertChars( "Ho ho ho" );
        }
        catch (IllegalStateException e)
        {
            return;
        }

        Assert.assertTrue("Did not catch IllegalStateException", false);
    }

    //
    // Make sure getText works in a basic way
    //

    public void testgetText( )
        throws Exception
    {
        XmlCursor c = loadCase("test.xml");

        Assert.assertTrue( c.getTextValue().equals( "ab" ) ); // Doc node

        c.toNextToken();
        Assert.assertTrue( c.getTextValue().equals( "ab" ) ); // Doc elem

        c.toNextToken();
        Assert.assertTrue( c.getTextValue().equals( "y" ) ); // Attr x

        c.toNextToken();
        Assert.assertTrue( c.getChars().equals( "ab" ) ); // Text

        c.toNextChar( 1 );
        Assert.assertTrue( c.getChars().equals( "b" ) ); // Text

        c.toNextToken();
        Assert.assertTrue( c.getChars().length() == 0 );       // End tag

        c.toNextToken();
        Assert.assertTrue( c.getChars().length() == 0 );       // End doc
    }

    //
    // Text XMLInputStream support
    //

    private void assertName (
        XMLName name, String uri, String local, String prefix )
    {
        Assert.assertTrue( local != null );
        
        String nameUri = name.getNamespaceUri();
        String nameLocal = name.getLocalName();
        String namePrefix = name.getPrefix();

        if (uri == null)
            Assert.assertTrue( nameUri == null );
        else
            Assert.assertTrue( nameUri.equals( uri ) );
        
        if (local == null)
            Assert.assertTrue( nameLocal == null );
        else
            Assert.assertTrue( nameLocal.equals( local ) );
        
        if (prefix == null)
            Assert.assertTrue( namePrefix == null );
        else
            Assert.assertTrue( namePrefix.equals( prefix ) );

        if (prefix != null)
        {
            String qName = prefix + ":" + local;
            Assert.assertTrue( name.getQualifiedName().equals( qName ) );
        }
        else
            Assert.assertTrue( name.getQualifiedName().equals( local ) );
    }

    private void doXmlStreamTest ( String xml )
        throws Exception
    {
        XmlCursor c = XmlObject.Factory.parse( xml ).newCursor();
        XMLInputStream xmlStream = c.newXMLInputStream();
        XmlObject o = XmlObject.Factory.parse( xmlStream );
        Assert.assertTrue( o.xmlText().equals( xml ) );
    }

    private void doSaverTest ( String xml )
        throws Exception
    {
        XmlCursor c = XmlObject.Factory.parse( xml ).newCursor();
        Assert.assertTrue( c.xmlText().equals( xml ) );
    }
    
    private void doSaveTest ( String xml )
        throws Exception
    {
        doXmlStreamTest( xml );
        doSaverTest( xml );
    }

    public void testSaving ( )
        throws Exception
    {
        doSaveTest( "<foo xmlns=\"foo.com\"><bar>1</bar></foo>" );
        doSaveTest( "<foo><!--comment--><?target foo?></foo>" );
        doSaveTest( "<foo>a<bar>b</bar>c<bar>d</bar>e</foo>" );
        doSaveTest( "<foo xmlns:x=\"y\"><bar xmlns:x=\"z\"/></foo>" );
        doSaveTest( "<foo x=\"y\" p=\"r\"/>" );

        String s = "<foo>aaa</foo>bbb";
        s = s + s + s + s + s + s + s + s + s + s + s + s + s + s + s;
        s = "<bar>xxxx" + s + "</bar>";
        
        doSaveTest( s );

        XmlObject x =
            XmlObject.Factory.parse( "<foo xmlns:a='a.com'><bar xmlns:a='b.com'/></foo>" );

        XmlCursor c = x.newCursor();

        c.toFirstChild();
        c.toFirstChild();

        Assert.assertTrue( c.xmlText().equals( "<bar xmlns:a=\"b.com\"/>" ) );
        
        x = XmlObject.Factory.parse( "<foo xmlns:a='a.com'><bar/></foo>" );

        c = x.newCursor();

        c.toFirstChild();
        c.toFirstChild();

        Assert.assertTrue( c.xmlText().equals( "<bar xmlns:a=\"a.com\"/>" ) );
    }

    public void testXMLStream ( )
        throws Exception
    {
        XmlObject o =
            XmlObject.Factory.parse(
                "<foo x=\"y\" xmlns=\"default.com\">" +
                    "<!-- x -->bar</foo>" );
        
        XmlCursor c = o.newCursor();
        
        c.toNextToken();
        c.toNextToken();
        c.toNextToken();
        c.toNextToken();
        
        c.insertElement( "bar", "bar.com" );
        
        c.toStartDoc();

        XMLInputStream xis = c.newXMLInputStream();

        XMLEvent xev;
        StartDocument startDocument;
        EndDocument endDocument;
        StartElement startElement;
        AttributeIterator attributeIterator;
        StartPrefixMapping startPrefixMapping;
        EndPrefixMapping endPrefixMapping;
        ChangePrefixMapping cpm;
        EndElement endElement;
        Attribute attribute;
        Comment comment;
        CharacterData characterData;
        XMLName name;
        String str;
        Map map;
        
        xev = startDocument = (StartDocument) xis.next();
        Assert.assertTrue( xev.getType() == XMLEvent.START_DOCUMENT );
        Assert.assertTrue( !xev.hasName() );
        Assert.assertTrue( startDocument.isStartDocument() );
        
        xev = startPrefixMapping = (StartPrefixMapping) xis.next();
        Assert.assertTrue( xev.getType() == XMLEvent.START_PREFIX_MAPPING );
        Assert.assertTrue( !xev.hasName() );
        Assert.assertTrue( xev.isStartPrefixMapping() );
        str = startPrefixMapping.getNamespaceUri();
        Assert.assertTrue( str.equals( "default.com" ) );
        Assert.assertTrue( startPrefixMapping.getPrefix().length() == 0 );
        
        xev = startElement = (StartElement) xis.next();
        Assert.assertTrue( xev.getType() == XMLEvent.START_ELEMENT );
        Assert.assertTrue( xev.hasName() );
        Assert.assertTrue( xev.isStartElement() );
        assertName( startElement.getName(), "default.com", "foo", null );
        attributeIterator = startElement.getAttributes();
        attribute = attributeIterator.next();
        assertName( attribute.getName(), null, "x", null );
        Assert.assertTrue( attribute.getValue().equals( "y" ) );
        Assert.assertTrue( attributeIterator.next() == null );
        attributeIterator = startElement.getNamespaces();
        attribute = attributeIterator.next();
        assertName( attribute.getName(), null, "xmlns", null );
        Assert.assertTrue( attribute.getValue().equals( "default.com" ) );
        Assert.assertTrue( attributeIterator.next() == null );
        attributeIterator = startElement.getAttributesAndNamespaces();
        Assert.assertTrue( attributeIterator.next() != null );
        Assert.assertTrue( attributeIterator.next() != null );
        Assert.assertTrue( attributeIterator.next() == null );
        name = new XmlNameImpl( null, "x", null );
        attribute = startElement.getAttributeByName( name );
        Assert.assertTrue( attribute != null );
        Assert.assertTrue( attribute.getValue().equals( "y" ) );
        name = new XmlNameImpl( null, "xmlns", null );
        attribute = startElement.getAttributeByName( name );
        Assert.assertTrue( attribute == null );
        str = startElement.getNamespaceUri( null );
        Assert.assertTrue( str.equals( "default.com" ) );

        xev = startPrefixMapping = (StartPrefixMapping) xis.next();
        Assert.assertTrue( xev.getType() == XMLEvent.START_PREFIX_MAPPING );
        Assert.assertTrue( !xev.hasName() );
        Assert.assertTrue( xev.isStartPrefixMapping() );
        str = startPrefixMapping.getNamespaceUri();
        Assert.assertTrue( str.equals( "bar.com" ) );
        Assert.assertTrue( startPrefixMapping.getPrefix().equals( "bar" ) );
        
        xev = startElement = (StartElement) xis.next();
        Assert.assertTrue( xev.getType() == XMLEvent.START_ELEMENT );
        Assert.assertTrue( xev.hasName() );
        Assert.assertTrue( xev.isStartElement() );
        assertName( startElement.getName(), "bar.com", "bar", "bar" );
        attributeIterator = startElement.getAttributes();
        Assert.assertTrue( attributeIterator.next() == null );
        attributeIterator = startElement.getNamespaces();
        attribute = attributeIterator.next();
        assertName( attribute.getName(), null, "bar", "xmlns" );
        Assert.assertTrue( attribute.getValue().equals( "bar.com" ) );
        Assert.assertTrue( attributeIterator.next() == null );
        attributeIterator = startElement.getAttributesAndNamespaces();
        Assert.assertTrue( attributeIterator.next() != null );
        Assert.assertTrue( attributeIterator.next() == null );
        str = startElement.getNamespaceUri( "bar" );
        Assert.assertTrue( str.equals( "bar.com" ) );
        map = startElement.getNamespaceMap();
        Assert.assertTrue( map.get( "bar" ).equals( "bar.com" ) );
        
        xev = endElement = (EndElement) xis.next();
        Assert.assertTrue( xev.getType() == XMLEvent.END_ELEMENT );
        Assert.assertTrue( xev.hasName() );
        Assert.assertTrue( xev.isEndElement() );
        assertName( endElement.getName(), "bar.com", "bar", "bar" );

        xev = endPrefixMapping = (EndPrefixMapping) xis.next();
        Assert.assertTrue( xev.getType() == XMLEvent.END_PREFIX_MAPPING );
        Assert.assertTrue( !xev.hasName() );
        Assert.assertTrue( xev.isEndPrefixMapping() );
        Assert.assertTrue( endPrefixMapping.getPrefix().equals( "bar" ) );

        xev = comment = (Comment) xis.next();
        Assert.assertTrue( xev.getType() == XMLEvent.COMMENT );
        Assert.assertTrue( !xev.hasName() );
        Assert.assertTrue( comment.hasContent() );
        Assert.assertTrue( comment.getContent().equals( " x " ) );
        
        xev = characterData = (CharacterData) xis.next();
        Assert.assertTrue( xev.getType() == XMLEvent.CHARACTER_DATA );
        Assert.assertTrue( !xev.hasName() );
        Assert.assertTrue( xev.isCharacterData() );
        Assert.assertTrue( characterData.hasContent() );
        Assert.assertTrue( characterData.getContent().equals( "bar" ) );

        xev = endElement = (EndElement) xis.next();
        Assert.assertTrue( xev.getType() == XMLEvent.END_ELEMENT );
        Assert.assertTrue( xev.hasName() );
        Assert.assertTrue( xev.isEndElement() );
        assertName( endElement.getName(), "default.com", "foo", null );

        xev = cpm = (ChangePrefixMapping) xis.next();
        Assert.assertTrue( xev.getType() == XMLEvent.CHANGE_PREFIX_MAPPING );
        Assert.assertTrue( !xev.hasName() );
        Assert.assertTrue( xev.isChangePrefixMapping() );
        Assert.assertTrue( cpm.getPrefix().length() == 0 );
        Assert.assertTrue( cpm.getOldNamespaceUri().equals( "default.com" ) );
        Assert.assertTrue( cpm.getNewNamespaceUri().equals( "" ) );

        xev = endDocument = (EndDocument) xis.next();
        Assert.assertTrue( xev.getType() == XMLEvent.END_DOCUMENT );
        Assert.assertTrue( !xev.hasName() );
        Assert.assertTrue( xev.isEndDocument() );
        
        xev = xis.next();
        Assert.assertTrue( xev == null );

        //
        // Test ChangePrefixMapping event
        //

        o = XmlObject.Factory.parse( "<foo xmlns:x=\"y\"><bar xmlns:x=\"z\"/></foo>" );
        c = o.newCursor();
        xis = c.newXMLInputStream();
        
        startDocument = (StartDocument) xis.next();
        
        startPrefixMapping = (StartPrefixMapping) xis.next();
        str = startPrefixMapping.getNamespaceUri();
        Assert.assertTrue( str.equals( "y" ) );
        Assert.assertTrue( startPrefixMapping.getPrefix().equals( "x" ) );
        
        startElement = (StartElement) xis.next();

        startPrefixMapping = (StartPrefixMapping) xis.next();
        str = startPrefixMapping.getNamespaceUri();
        Assert.assertTrue( str.equals( "z" ) );
        Assert.assertTrue( startPrefixMapping.getPrefix().equals( "x" ) );
        
        startElement = (StartElement) xis.next();
        
        endElement = (EndElement) xis.next();

        cpm = (ChangePrefixMapping) xis.next();
        str = cpm.getOldNamespaceUri();
        Assert.assertTrue( str.equals( "z" ) );
        str = cpm.getNewNamespaceUri();
        Assert.assertTrue( str.equals( "y" ) );
        str = cpm.getPrefix();
        Assert.assertTrue( str.equals( "x" ) );

        endElement = (EndElement) xis.next();
        
        endPrefixMapping = (EndPrefixMapping) xis.next();
        Assert.assertTrue( endPrefixMapping.getPrefix().equals( "x" ) );

        endDocument = (EndDocument) xis.next();
        
        xev = xis.next();
        Assert.assertTrue( xev == null );

        //
        // Test CharacterData events
        //

        o = XmlObject.Factory.parse( "<foo>a<bar>b<baz>c</baz>d</bar>e</foo>" );
        c = o.newCursor();
        xis = c.newXMLInputStream();
        
        startDocument = (StartDocument) xis.next();

        startElement = (StartElement) xis.next();

        characterData = (CharacterData) xis.next();
        Assert.assertTrue( characterData.hasContent() );
        Assert.assertTrue( characterData.getContent().equals( "a" ) );

        startElement = (StartElement) xis.next();
        
        characterData = (CharacterData) xis.next();
        Assert.assertTrue( characterData.hasContent() );
        Assert.assertTrue( characterData.getContent().equals( "b" ) );

        startElement = (StartElement) xis.next();
        
        characterData = (CharacterData) xis.next();
        Assert.assertTrue( characterData.hasContent() );
        Assert.assertTrue( characterData.getContent().equals( "c" ) );

        endElement = (EndElement) xis.next();
        
        characterData = (CharacterData) xis.next();
        Assert.assertTrue( characterData.hasContent() );
        Assert.assertTrue( characterData.getContent().equals( "d" ) );

        endElement = (EndElement) xis.next();

        characterData = (CharacterData) xis.next();
        Assert.assertTrue( characterData.hasContent() );
        Assert.assertTrue( characterData.getContent().equals( "e" ) );

        endElement = (EndElement) xis.next();
        
        endDocument = (EndDocument) xis.next();
        
        xev = xis.next();
        Assert.assertTrue( xev == null );

        //
        // Test SubStreams
        //

        o = XmlObject.Factory.parse( "<foo>a<bar>b<baz>c</baz>d</bar>e</foo>" );
        c = o.newCursor();
        xis = c.newXMLInputStream();
        
        startDocument = (StartDocument) xis.next();

        startElement = (StartElement) xis.next();

        characterData = (CharacterData) xis.next();
        Assert.assertTrue( characterData.hasContent() );
        Assert.assertTrue( characterData.getContent().equals( "a" ) );

        startElement = (StartElement) xis.next();
        
        characterData = (CharacterData) xis.next();
        Assert.assertTrue( characterData.hasContent() );
        Assert.assertTrue( characterData.getContent().equals( "b" ) );

            XMLInputStream xis2 = xis.getSubStream();

        startElement = (StartElement) xis.next();
        
        characterData = (CharacterData) xis.next();
        Assert.assertTrue( characterData.hasContent() );
        Assert.assertTrue( characterData.getContent().equals( "c" ) );

        endElement = (EndElement) xis.next();
        
        characterData = (CharacterData) xis.next();
        Assert.assertTrue( characterData.hasContent() );
        Assert.assertTrue( characterData.getContent().equals( "d" ) );

            startElement = (StartElement) xis2.next();

            characterData = (CharacterData) xis2.next();
            Assert.assertTrue( characterData.hasContent() );
            Assert.assertTrue( characterData.getContent().equals( "c" ) );

            endElement = (EndElement) xis2.next();
            
            xev = xis2.next();
            Assert.assertTrue( xev == null );
            
        endElement = (EndElement) xis.next();

        characterData = (CharacterData) xis.next();
        Assert.assertTrue( characterData.hasContent() );
        Assert.assertTrue( characterData.getContent().equals( "e" ) );

        endElement = (EndElement) xis.next();
        
        endDocument = (EndDocument) xis.next();
        
        xev = xis.next();
        Assert.assertTrue( xev == null );
    }
    
    private XmlCursor navDoc ( XmlObject x, String dirs )
    {
        return navCursor( x.newCursor(), dirs );
    }
    
    private XmlCursor navNewCursor ( XmlCursor c, String dirs )
    {
        return navCursor( c.newCursor(), dirs );
    }

    //
    // Format:
    //
    //    ( [-][N] type ) *
    //
    //    type:
    //
    //      c - character
    //      t - token
    //      p - parent element
    //      s - sibling element
    //      d - descendent (child) element
    //      r - end of the doc (root)
    //      b - begin of the doc
    //
    
    private XmlCursor navCursor ( XmlCursor c, String dirs )
    {
        int n = 0;
        boolean prev = false;
        
        for ( int i = 0 ; i < dirs.length() ; i++ )
        {
            char ch = dirs.charAt( i );

            if (ch == '-')
            {
                prev = ! prev;
                continue;
            }
            else if (ch >= '0' && ch <= '9')
            {
                n = n * 10 + (ch - '0');
                continue;
            }

            if (n == 0)
                n = 1;
            
            if (ch == 'c')
            {
                if (prev)
                    Assert.assertTrue( c.toPrevChar( n ) == n );
                else
                    Assert.assertTrue( c.toNextChar( n ) == n );
            }
            else if (ch == 't')
            {
                while ( n-- > 0 )
                {
                    if (prev)
                        Assert.assertTrue( c.toPrevToken() != TokenType.NONE );
                    else
                        Assert.assertTrue( c.toNextToken() != TokenType.NONE );
                }
            }
            else if (ch == 'p')
            {
                Assert.assertTrue( ! prev );
                
                while ( n-- > 0 )
                    Assert.assertTrue( c.toParent() );
            }
            else if (ch == 'r')
            {
                Assert.assertTrue( ! prev );
                Assert.assertTrue( n == 1 );
                
                c.toEndDoc();
            }
            else if (ch == 'b')
            {
                Assert.assertTrue( ! prev );
                Assert.assertTrue( n == 1 );
                
                c.toStartDoc();
            }
            else if (ch == 's')
            {
                while ( n-- > 0 )
                {
                    if (prev)
                        Assert.assertTrue( c.toPrevSibling() );
                    else
                        Assert.assertTrue( c.toNextSibling() );
                }
            }
            else if (ch == 'd')
            {
                Assert.assertTrue( ! prev );
                
                while ( n-- > 0 )
                    Assert.assertTrue( c.toFirstChild() );
            }
            else
            {
                Assert.assertTrue( false );
            }
            
            n = 0;
            prev = false;
        }

        return c;
    }
    
    public void testOps ( )
        throws Exception
    {
        XmlObject x, x2, y;
        XmlCursor cFrom, cTo, cTemp, cTemp2, c, d;
        XmlBookmark anno;
        
        //
        
        x = XmlObject.Factory.parse( "<foo>abcdef</foo>" );
        cFrom = navDoc( x, "d" );
        cTo = navNewCursor( cFrom, "" );
        Assert.assertTrue( !cFrom.moveXml( cTo ) );
        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );

        XmlOptions options = new XmlOptions();
        
        options.put(
            XmlOptions.SAVE_SYNTHETIC_DOCUMENT_ELEMENT,
            new QName( null, "bar" ) );

        Assert.assertTrue(
            x.xmlText( options ).equals( "<bar>[FROM][TO]<foo>abcdef</foo></bar>" ) ||
                x.xmlText( options ).equals( "<bar>[TO][FROM]<foo>abcdef</foo></bar>" ) );
        
        //
        
        x = XmlObject.Factory.parse( "<foo>abcdef</foo>" );
        
        cFrom = navDoc( x, "d" );
        cTo = navNewCursor( cFrom, "ttt" );
        Assert.assertTrue( !cFrom.moveXml( cTo ) );
        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );

        Assert.assertTrue(
            x.xmlText( options ).equals( "<bar>[FROM]<foo>abcdef</foo>[TO]</bar>" ) );
        
        //
        
        x = XmlObject.Factory.parse( "<foo>abcdef</foo>" );
        
        cFrom = navDoc( x, "d" );
        cTo = navNewCursor( cFrom, "t3c" );
        Assert.assertTrue( !cFrom.moveXml( cTo ) );
        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );

        Assert.assertTrue(
            x.xmlText( options ).equals( "<bar>[FROM]<foo>abc[TO]def</foo></bar>" ) );
        
        //
        
        x = XmlObject.Factory.parse( "<r><a>xyz</a><b>pqr</b></r>" );
        
        cFrom = navDoc( x, "dd" );
        cTo = navNewCursor( cFrom, "r-1t" );
        Assert.assertTrue( cFrom.moveXml( cTo ) );
        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );

        Assert.assertTrue(
            x.xmlText().equals( "<r>[FROM]<b>pqr</b><a>xyz</a>[TO]</r>" ) );
        
        //
        
        x = XmlObject.Factory.parse( "<r><a>xyz</a><b>pqr</b>AB</r>" );
        
        cFrom = navDoc( x, "dd" );
        cTo = navNewCursor( cFrom, "r-1t-1c" );
        Assert.assertTrue( cFrom.moveXml( cTo ) );
        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );

        Assert.assertTrue(
            x.xmlText().equals( "<r>[FROM]<b>pqr</b>A<a>xyz</a>[TO]B</r>" ) );
        
        //
        
        x = XmlObject.Factory.parse( "<r><a>xyz</a><b>pqr</b>AB</r>" );
        
        cFrom = navDoc( x, "dd" );
        cTo = navNewCursor( cFrom, "stc" );
        Assert.assertTrue( cFrom.moveXml( cTo ) );
        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );

        Assert.assertTrue(
            x.xmlText().equals( "<r>[FROM]<b>p<a>xyz</a>[TO]qr</b>AB</r>" ) );
        
        //
        
        x = XmlObject.Factory.parse( "<r><a>xyz</a><b>pqr</b>AB</r>" );
        
        cFrom = navDoc( x, "dd" );
        cTo = navDoc( x, "d" );
        Assert.assertTrue( cFrom.moveXml( cTo ) );
        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );

        testTextFrag( x.xmlText(), "<a>xyz</a>[TO]<r>[FROM]<b>pqr</b>AB</r>" );
        
        //
        
        x = XmlObject.Factory.parse( "<r><a>xyz</a><b>pqr</b>AB</r>" );
        
        cFrom = navDoc( x, "dd" );
        cTo = navDoc( x, "r" );
        Assert.assertTrue( cFrom.moveXml( cTo ) );
        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );

        Assert.assertTrue(
            x.xmlText( options ).equals( "<bar><r>[FROM]<b>pqr</b>AB</r><a>xyz</a>[TO]</bar>" ) );
        
        //
        
        x = XmlObject.Factory.parse( "<r><a>xyz</a></r>" );
        x2 = XmlObject.Factory.parse( "<s></s>" );
        
        cFrom = navDoc( x, "dd" );
        cTo = navDoc( x2, "dt" );
        Assert.assertTrue( cFrom.moveXml( cTo ) );
        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );

        Assert.assertTrue(  x.xmlText().equals( "<r>[FROM]</r>" ) );
        Assert.assertTrue( x2.xmlText().equals( "<s><a>xyz</a>[TO]</s>" ) );
        
        //
        
        x = XmlObject.Factory.parse( "<r><a>pq</a><b></b></r>" );
        
        cFrom = navDoc( x, "dd" );
        cTo = navDoc( x, "ddst" );
        cTemp = navDoc( x, "ddt1c" );
        Assert.assertTrue( cFrom.moveXml( cTo ) );
        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );
        cTemp.insertChars( "[TEMP]" );

        Assert.assertTrue(
            x.xmlText().equals( "<r>[FROM][TEMP]<b><a>pq</a>[TO]</b></r>" ) );
        
        //
        
        x = XmlObject.Factory.parse( "<foo>abcdef</foo>" );
        
        cFrom = navDoc( x, "2t2c" );
        cTo = navNewCursor( cFrom, "-1c" );
        cFrom.moveChars( 2, cTo );
        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );

        Assert.assertTrue(
            x.xmlText().equals( "<foo>acd[TO]b[FROM]ef</foo>" ) );
        
        //
        
        x = XmlObject.Factory.parse( "<foo>abcdef</foo>" );
        
        cFrom = navDoc( x, "2t2c" );
        cTo = navNewCursor( cFrom, "3c" );
        cFrom.moveChars( 2, cTo );
        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );

        Assert.assertTrue(
            x.xmlText().equals( "<foo>ab[FROM]ecd[TO]f</foo>" ) );
    
        //
        
        x = XmlObject.Factory.parse( "<bar><foo>abcdef</foo><foo>123456</foo></bar>" );
        
        cFrom = navDoc( x, "3t2c" );
        cTo = navNewCursor( cFrom, "3t3c" );
        cFrom.moveChars( 2, cTo );
        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );

        Assert.assertTrue(
            x.xmlText().equals(
                "<bar><foo>ab[FROM]ef</foo><foo>123cd[TO]456</foo></bar>" ) );
        
        //
        
        x = XmlObject.Factory.parse( "<bar><foo>abcdef</foo><foo>123456</foo></bar>" );
        
        cFrom = navDoc( x, "2d" );
        cTo = navDoc( x, "2dst2c" );
        Assert.assertTrue( cFrom.copyXml( cTo ) );
        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );

        Assert.assertTrue(
            x.xmlText().equals(
                "<bar>[FROM]<foo>abcdef</foo><foo>12" +
                        "<foo>abcdef</foo>[TO]3456</foo></bar>" ) );

        //
        
        x = XmlObject.Factory.parse( "<r><a>xyz</a></r>" );
        x2 = XmlObject.Factory.parse( "<s></s>" );
        
        cFrom = navDoc( x, "dd" );
        cTo = navDoc( x2, "dt" );
        Assert.assertTrue( cFrom.copyXml( cTo ) );
        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );

        Assert.assertTrue(  x.xmlText().equals( "<r>[FROM]<a>xyz</a></r>" ) );
        Assert.assertTrue( x2.xmlText().equals( "<s><a>xyz</a>[TO]</s>" ) );
        
        //
        
        x = XmlObject.Factory.parse(
            "<bar><foo>abcdef</foo>blah<foo>123456</foo></bar>" );
        
        cFrom = navDoc( x, "2d" );
        cTo = navDoc( x, "2dst2c" );
        Assert.assertTrue( cFrom.copyXml( cTo ) );
        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );

        Assert.assertTrue(
            x.xmlText().equals(
                "<bar>[FROM]<foo>abcdef</foo>blah<foo>12" +
                        "<foo>abcdef</foo>[TO]3456</foo></bar>" ) );
        
        //
        
        x = XmlObject.Factory.parse(
            "<bar><foo x='y'>abcdef</foo><foo>123456</foo>7890</bar>" );
        
        cFrom = navDoc( x, "2dt" );
        cTo = navDoc( x, "2dst" );
        cTemp = navDoc( x, "2dst3c" );
        cTemp2 = navDoc( x, "2ds3t2c" );
        Assert.assertTrue( cFrom.copyXml( cTo ) );
        cTemp.insertChars( "[TEMP]" );
        cTemp2.insertChars( "[TEMP2]" );

        Assert.assertTrue(
            x.xmlText().equals(
                "<bar><foo x=\"y\">abcdef</foo>" +
                    "<foo x=\"y\">123[TEMP]456</foo>78[TEMP2]90</bar>" ) );

        //
        
        x = XmlObject.Factory.parse(
            "<bar>xy<foo x='y'>abcdef</foo>pqr<foo>123456</foo></bar>" );
        
        cFrom = navDoc( x, "2d" );
        cTo = navDoc( x, "2ds-2c" );
        
        Assert.assertTrue( cFrom.removeXml() );

        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );

        Assert.assertTrue(
            x.xmlText().equals(
                "<bar>xy[FROM]p[TO]qr<foo>123456</foo></bar>" ) );
        
        //
        
        x = XmlObject.Factory.parse(
            "<bar>xy<foo x='y'>abcdef</foo>pqr<foo>123456</foo></bar>" );
        
        cFrom = navDoc( x, "2d2t2c" );
        cTo = navDoc( x, "2d2t5c" );
        
        cFrom.removeChars( 2 );

        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );

        Assert.assertTrue(
            x.xmlText().equals(
                "<bar>xy<foo x=\"y\">ab[FROM]e[TO]f" +
                    "</foo>pqr<foo>123456</foo></bar>" ) );
        
        //
        
        x = XmlObject.Factory.parse( "<bar><!---->abc</bar>" );
        
        cFrom = navDoc( x, "tt" );
        cTo = navDoc( x, "tttc" );
        
        Assert.assertTrue( cFrom.removeXml() );

        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );

        Assert.assertTrue( x.xmlText().equals( "<bar>[FROM]a[TO]bc</bar>" ) );

        //
        
        x = XmlObject.Factory.newInstance();

        cTo = navDoc( x, "t" );
        cTo.insertElement( "boo" );
        cTo.toPrevToken();
        cTo.insertElement( "moo" );
        cTo.toPrevToken();
        cTo.insertElement( "goo" );

        Assert.assertTrue( x.xmlText().equals(
            "<boo><moo><goo/></moo></boo>" ) );

        //
        
        x = XmlObject.Factory.newInstance();

        cTo = navDoc( x, "t" );
        cTo.insertElement( "boo" );
        cTo.toPrevToken();
        cTo.insertElement( "moo" );
        cTo.toPrevToken();
        cTo.insertAttributeWithValue( "x", "y" );

        Assert.assertTrue( x.xmlText().equals(
            "<boo><moo x=\"y\"/></boo>" ) );
                                              
        //
        
        x = XmlObject.Factory.parse( "<bar x='y'>abc</bar>" );
        cTo = navDoc( x, "tt" );
        cTo.insertAttributeWithValue( "p", "q" );
        
        Assert.assertTrue( x.xmlText().equals(
            "<bar p=\"q\" x=\"y\">abc</bar>" ) );

        // Text XmlBookmark

        x = XmlObject.Factory.parse( "<r><foo>abc</foo><bar></bar></r>" );
        cFrom = navDoc( x, "tt" );
        anno = new Anno();
        cFrom.setBookmark( anno );
        cTo = navDoc( x, "6t" );
        Assert.assertTrue( cFrom.moveXml( cTo ) );
        cFrom.insertChars( "[FROM]" );
        cTo.insertChars( "[TO]" );
        anno.createCursor().insertChars( "[ANNO]" );
        
        Assert.assertTrue( x.xmlText().equals(
            "<r>[FROM]<bar>[ANNO]<foo>abc</foo>[TO]</bar></r>" ) );

        // Test content ops

        x = XmlObject.Factory.parse( "<foo x='y'>abc</foo>" );
        y = XmlObject.Factory.newInstance();
        d = y.newCursor();
        d.toNextToken();
        x.newCursor().moveXmlContents( d );
        Assert.assertTrue( y.xmlText().equals( "<foo x=\"y\">abc</foo>" ) );
        
        x = XmlObject.Factory.parse( "<bar><foo x='y'>abc</foo></bar>" );
        y = XmlObject.Factory.newInstance();
        c = x.newCursor();
        c.toNextToken();
        d = y.newCursor();
        d.toNextToken();
        c.moveXmlContents( d );
        Assert.assertTrue( y.xmlText().equals( "<foo x=\"y\">abc</foo>" ) );

        x = XmlObject.Factory.parse( "<bar><foo x='y'>abc</foo></bar>" );
        c = x.newCursor();
        c.toNextToken();
        c.removeXmlContents();
        Assert.assertTrue( x.xmlText().equals( "<bar/>" ) );

        x = XmlObject.Factory.parse( "<foo x='y'>abc</foo>" );
        y = XmlObject.Factory.newInstance();
        d = y.newCursor();
        d.toNextToken();
        x.newCursor().copyXmlContents( d );
        Assert.assertTrue( y.xmlText().equals( "<foo x=\"y\">abc</foo>" ) );
    }        

    public static class Anno extends XmlBookmark
    {
    }
    
    public void testSave ( )
        throws Exception
    {
        XmlObject x;
        XmlCursor cTo;
        
        //
        
        x = XmlObject.Factory.parse( "<foo>abcdef</foo>" );
        
        Assert.assertTrue( x.xmlText().equals( "<foo>abcdef</foo>" ) );

        //
        
        x = XmlObject.Factory.parse( "<foo>a&lt;b&amp;c</foo>" );
        
        Assert.assertTrue( x.xmlText().equals( "<foo>a&lt;b&amp;c</foo>" ) );

        //
        
        x = XmlObject.Factory.parse( "<foo></foo>" );
        
        cTo = navDoc( x, "dt" );
        cTo.insertChars( "&<" );
        
        Assert.assertTrue( x.xmlText().equals( "<foo>&amp;&lt;</foo>" ) );

        //
        
        x = XmlObject.Factory.parse( "<foo><boo>bar</boo></foo>" );
        
        cTo = navDoc( x, "dt" );
        
        Assert.assertTrue( cTo.xmlText().equals( "<boo>bar</boo>" ) );

        //
        
        x = XmlObject.Factory.parse( "<foo><boo x=\"y\">bar</boo></foo>" );
        
        cTo = navDoc( x, "dt" );
        
        Assert.assertTrue( cTo.xmlText().equals( "<boo x=\"y\">bar</boo>" ) );

        // Tests fragment saving and loading
        
        x = XmlObject.Factory.parse( "<foo>Eric</foo>" );
        
        cTo = navDoc( x, "dt" );

        x = XmlObject.Factory.parse( cTo.xmlText() );
        
        cTo = navDoc( x, "" );
        
        Assert.assertTrue( cTo.getTextValue().equals( "Eric" ) );

        // test save where I replace the name of an element
        
        x = XmlObject.Factory.parse( "<foo>Eric</foo>" );
        
        cTo = navDoc( x, "d" );

        XmlOptions options = new XmlOptions();
        
        options.put(
            XmlOptions.SAVE_SYNTHETIC_DOCUMENT_ELEMENT,
            new QName( null, "bar" ) );
        
        x = XmlObject.Factory.parse( cTo.xmlText( options ) );
        
        cTo = navDoc( x, "" );
        
        Assert.assertTrue( cTo.xmlText().equals( "<bar>Eric</bar>" ) );

        // test save where I replace the name of the document
        
        x = XmlObject.Factory.parse( "<foo>Eric</foo>" );
        
        cTo = navDoc( x, "" );

        options = new XmlOptions();
        
        options.put(
            XmlOptions.SAVE_SYNTHETIC_DOCUMENT_ELEMENT,
            new QName( null, "bar" ) );
        
        x = XmlObject.Factory.parse( cTo.xmlText( options ) );
        
        cTo = navDoc( x, "" );
        
        Assert.assertTrue(
            cTo.xmlText().equals( "<bar><foo>Eric</foo></bar>" ) );

        //
        //
        //
        
        x = XmlObject.Factory.parse( "<a xmlns='foo'/>" );

        XmlCursor c = x.newCursor();

        c.toFirstContentToken();
        c.toFirstContentToken();

        c.insertElement( "b" );
        c.toPrevSibling();
        Assert.assertTrue( c.getName().getLocalPart().equals( "b" ) );
        Assert.assertTrue( c.getName().getNamespaceURI().length() == 0 );
        
        x = XmlObject.Factory.parse( x.xmlText() );
        
        c = x.newCursor();
        
        c.toFirstContentToken();
        c.toFirstContentToken();

        Assert.assertTrue( c.getName().getLocalPart().equals( "b" ) );
        Assert.assertTrue( c.getName().getNamespaceURI().length() == 0 );
    }

    private void testTextFrag ( String actual, String expected )
    {
        String pre = "<xml-fragment>";
        
        String post = "</xml-fragment>";
        
        Assert.assertTrue( actual.startsWith( pre ) );
        Assert.assertTrue( actual.endsWith( post ) );
        
        Assert.assertTrue(
            expected.equals(
                actual.substring(
                    pre.length(), actual.length() - post.length() ) ) );
    }
    
    public void testSaveFrag ( )
        throws Exception
    {
        XmlObject x;
        XmlCursor c;
        
        x = XmlObject.Factory.newInstance();

        c = x.newCursor();
        
        c.toNextToken();
        
        c.insertChars( "Eric" );

        testTextFrag( x.xmlText(), "Eric" );

        //

        x = XmlObject.Factory.newInstance();

        c = x.newCursor();

        c.toNextToken();

        c.insertComment( "" );
        c.insertChars( "x" );
        
        testTextFrag( x.xmlText(), "<!---->x" );

        //

        x = XmlObject.Factory.newInstance();

        c = x.newCursor();

        c.toNextToken();

        c.insertElement( "foo" );
        c.insertChars( "x" );
        
        testTextFrag( x.xmlText(), "<foo/>x" );
        
        //

        x = XmlObject.Factory.newInstance();

        c = x.newCursor();

        c.toNextToken();

        c.insertElement( "foo" );
        c.insertElement( "bar" );
        
        testTextFrag( x.xmlText(), "<foo/><bar/>" );
    }
    
    public void testLoad ( )
        throws Exception
    {
        XmlObject x;
        
        XmlOptions options = new XmlOptions();
        
        options.put( XmlOptions.LOAD_REPLACE_DOCUMENT_ELEMENT, null );
        
        x =
            XmlObject.Factory.parse(
                "<bar p='q' x='y'>ab<foo>xy</foo>cd</bar>", options );
        
        XmlCursor c = navDoc( x, "t" );

        assertTrue( c.currentTokenType() == TokenType.ATTR );

        String open = "xmlns:open='http://www.openuri.org/fragment'";
        
        x =
            XmlObject.Factory.parse(
                "<open:fragment p='q' x='y' " + open +
                    ">ab<foo>xy</foo>cd</open:fragment>" );
        
        c = navDoc( x, "t" );

        assertTrue( c.currentTokenType() == TokenType.ATTR );
    }
    
    public void testCompare ( )
        throws Exception
    {
        XmlObject x;
        XmlCursor cFrom, cTo;

        // Forward navigation 
        
        x = XmlObject.Factory.parse( "<bar p='q' x='y'>ab<foo>xy</foo>cd</bar>" );

        cFrom = navDoc( x, "" );
        cTo = navDoc( x, "" );
            
        for ( ; ; )
        {
            Assert.assertTrue( cFrom.comparePosition( cTo ) == 0 );
            Assert.assertTrue( cFrom.isAtSamePositionAs( cTo ) );

            TokenType tt = cFrom.currentTokenType();
            
            if (tt == TokenType.ENDDOC)
            {
                break;
            }
            else if (tt == TokenType.TEXT)
            {
                cFrom.toNextChar( 1 );
                cTo.toNextChar( 1 );
            }
            else
            {
                cFrom.toNextToken();
                cTo.toNextToken();
            }
        }

        // Backward navigation 
        
        x = XmlObject.Factory.parse( "<bar p='q' x='y'>ab<foo>xy</foo>cd</bar>" );

        cFrom = navDoc( x, "r" );
        cTo = navDoc( x, "r" );
            
        for ( ; ; )
        {
            Assert.assertTrue( cFrom.comparePosition( cTo ) == 0 );
            Assert.assertTrue( cFrom.isAtSamePositionAs( cTo ) );

            if (cFrom.toPrevChar( 1 ) == 1)
                cTo.toPrevChar( 1 );
            else if (cFrom.toPrevToken() != TokenType.NONE)
                cTo.toPrevToken();
            else
                break;
        }

        //
        
        x = XmlObject.Factory.parse(
            "<bar p='q' x='y'>ab<foo>xy</foo>c<f y='x'>xy</f>d</bar>" );

        cFrom = navDoc( x, "" );

        for ( ; ; )
        {
            boolean passed = false;
            
            cTo = navDoc( x, "" );

            for ( ; ; )
            {
                if (cTo.isAtSamePositionAs( cFrom ))
                {
                    Assert.assertTrue( !passed );
                    passed = true;
                }
                else if (cTo.isLeftOf( cFrom ))
                {
                    Assert.assertTrue( !passed );
                }
                else
                {
                    Assert.assertTrue( passed );
                    Assert.assertTrue( cTo.isRightOf( cFrom ) );
                }
                
                if (cTo.toNextChar( 1 ) != 1)
                    if (cTo.toNextToken() == TokenType.ENDDOC)
                        break;
            }
            
            if (cFrom.toNextChar( 1 ) != 1)
                if (cFrom.toNextToken() == TokenType.ENDDOC)
                    break;
        }
    }

    static class MyAnno extends XmlBookmark
    {
    }

    public void testAnnotation ( )
        throws Exception
    {
        XmlObject x = XmlObject.Factory.parse( "<foo/>" );
        XmlCursor c = x.newCursor();
        c.toNextToken();
        MyAnno a = new MyAnno();
        c.setBookmark( a );
        Assert.assertTrue( c.removeXml() );
        XmlCursor c2 = a.createCursor();
        Assert.assertTrue( c2 == null );
    }
    
    public void testAttrSetter ( )
        throws Exception
    {
        XmlObject x = XmlObject.Factory.parse( "<foo/>" );
        XmlCursor c = x.newCursor();
        c.toNextToken();
        c.setAttributeText( new QName( null, "x" ), "hardehar" );
        Assert.assertTrue( x.xmlText().equals( "<foo x=\"hardehar\"/>" ) );
    }
    
    public void testNavigation ( )
        throws Exception
    {
        XmlObject x = XmlObject.Factory.parse( "<a><x/><y/><z/></a>" );
        XmlCursor c = x.newCursor();
        Assert.assertTrue( c.toNextSibling() == false );
        Assert.assertTrue( c.toPrevSibling() == false );
        Assert.assertTrue( c.toFirstAttribute() == false );
        Assert.assertTrue( c.toLastAttribute() == false );
        c.toNextToken();
        c.toNextToken();
        Assert.assertTrue( c.toNextSibling() == true );
        Assert.assertTrue( c.getName().getLocalPart().equals( "y" ) );
        Assert.assertTrue( c.toNextSibling() == true );
        Assert.assertTrue( c.getName().getLocalPart().equals( "z" ) );
        Assert.assertTrue( c.toNextSibling() == false );

        x = XmlObject.Factory.parse( "<a p='q' m='n'><x/><y/><z/></a>" );
        c = x.newCursor();
        c.toNextToken();
        c.toNextToken();
        Assert.assertTrue( c.currentTokenType().isAttr() );
        Assert.assertTrue( c.toPrevSibling() == false );
        Assert.assertTrue( c.currentTokenType().isAttr() );
        Assert.assertTrue( c.toNextSibling() == true );
        Assert.assertTrue( c.getName().getLocalPart().equals( "x" ) );

        c.toEndDoc();
        c.toPrevToken();
        Assert.assertTrue( c.toPrevSibling() == true );
        Assert.assertTrue( c.getName().getLocalPart().equals( "z" ) );
        Assert.assertTrue( c.toPrevSibling() == true );
        Assert.assertTrue( c.getName().getLocalPart().equals( "y" ) );
        Assert.assertTrue( c.toPrevSibling() == true );
        Assert.assertTrue( c.getName().getLocalPart().equals( "x" ) );
        Assert.assertTrue( c.toPrevSibling() == false );
        
        c.toEndDoc();
        c.toPrevToken();
        Assert.assertTrue( c.toParent() == true );
        Assert.assertTrue( c.getName().getLocalPart().equals( "a" ) );
        
        c.toEndDoc();
        Assert.assertTrue( c.toParent() == true );
        Assert.assertTrue( c.currentTokenType().isStartdoc() );
        
        x = XmlObject.Factory.parse( "<a>moo<!---->foo</a>" );
        c = x.newCursor();
        c.toStartDoc();
        c.toNextToken();
        c.toNextToken();
        c.toNextToken();
        Assert.assertTrue( c.toParent() == true );
        Assert.assertTrue( c.getName().getLocalPart().equals( "a" ) );
        
        c.toStartDoc();
        c.toNextToken();
        c.toNextToken();
        c.toNextToken();
        c.toNextToken();
        Assert.assertTrue( c.toParent() == true );
        Assert.assertTrue( c.getName().getLocalPart().equals( "a" ) );

        c.toStartDoc();
        c.toNextToken();
        c.toNextToken();
        c.toNextToken();
        c.toNextToken();
        c.toNextChar( 2 );
        Assert.assertTrue( c.toParent() == true );
        Assert.assertTrue( c.getName().getLocalPart().equals( "a" ) );
        
        x = XmlObject.Factory.parse( "<foo>early<bar>text<char>zap</char></bar></foo>" );
        c = x.newCursor();
        c.toNextToken();
        c.toNextToken();
        Assert.assertTrue( c.toFirstChild() == true );
        Assert.assertTrue( c.getTextValue().equals( "zap" ) );
    }
    
    public void testGetName ( )
        throws Exception
    {
        XmlObject x = XmlObject.Factory.parse( "<a x='y'>eric<!----><?moo?></a>" );
        XmlCursor c = x.newCursor();
        Assert.assertTrue( c.getName() == null );
        Assert.assertTrue( !c.toNextToken().isNone() );
        Assert.assertTrue( c.getName().getLocalPart().equals( "a" ) );
        Assert.assertTrue( c.getName().getNamespaceURI().length() == 0 );
        Assert.assertTrue( !c.toNextToken().isNone() );
        Assert.assertTrue( c.getName().getLocalPart().equals( "x" ) );
        Assert.assertTrue( c.getName().getNamespaceURI().length() == 0 );
        Assert.assertTrue( !c.toNextToken().isNone() );
        Assert.assertTrue( c.getName() == null );
        Assert.assertTrue( !c.toNextToken().isNone() );
        Assert.assertTrue( c.getName() == null );
        Assert.assertTrue( !c.toNextToken().isNone() );
        Assert.assertTrue( c.getName().getLocalPart().equals( "moo" ) );
        Assert.assertTrue( c.getName().getNamespaceURI().length() == 0 );
        Assert.assertTrue( !c.toNextToken().isNone() );
        Assert.assertTrue( c.getName() == null );
        Assert.assertTrue( !c.toNextToken().isNone() );
        Assert.assertTrue( c.getName() == null );
        Assert.assertTrue( c.toNextToken().isNone() );
    }
    
    public void testGetChars ( )
        throws Exception
    {
        XmlObject x = XmlObject.Factory.parse( "<foo>abcdefghijkl</foo>" );
        XmlCursor c = x.newCursor();
        c.toNextToken();
        c.toNextToken();
        c.toNextChar( 2 );
        
        char[] buf = new char[ 3 ];
        int n = c.getChars( buf, 0, 400 );

        Assert.assertTrue( n == 3 );
        Assert.assertTrue( buf[0] == 'c' );
        Assert.assertTrue( buf[1] == 'd' );
        Assert.assertTrue( buf[2] == 'e' );
    }
    
    public void testNamespaceSubstitution ( )
        throws Exception
    {
        HashMap subs = new HashMap();
        subs.put( "foo", "moo" );
        subs.put( "a", "b" );
        
        XmlOptions options = new XmlOptions();
        options.put( XmlOptions.LOAD_SUBSTITUTE_NAMESPACES, subs );
                     
        XmlObject x =
            XmlObject.Factory.parse(
                "<a xmlns='foo' xmlns:a='a' a:x='y'/>",
                options );

        XmlCursor c = x.newCursor();

        c.toNextToken();
        Assert.assertTrue( c.getName().getNamespaceURI().equals( "moo" ) );
        
        c.toNextToken();
        Assert.assertTrue( c.getName().getNamespaceURI().equals( "moo" ) );
        
        c.toNextToken();
        Assert.assertTrue( c.getName().getNamespaceURI().equals( "b" ) );
        
        c.toNextToken();
        Assert.assertTrue( c.getName().getNamespaceURI().equals( "b" ) );
    }
    
    public void testNamespaceInsertion ( )
        throws Exception
    {
        XmlObject x = XmlObject.Factory.newInstance();

        XmlCursor c = x.newCursor();

        c.toNextToken();
        c.insertElement( "foo", "http://p.com" );
        c.toPrevToken();
        c.insertNamespace( "p", "http://p.com" );

        Assert.assertTrue(
            x.xmlText().equals( "<p:foo xmlns:p=\"http://p.com\"/>" ) );
    }

    private void dotestParser ( String xml, String xmlResult )
        throws Exception
    {
        XmlObject x = XmlObject.Factory.parse( xml );
        String result = x.xmlText();
        Assert.assertTrue( xmlResult.equals( result ) );
    }
    
    private void dotestParserErrors ( String xml )
    {
        try
        {
            XmlObject.Factory.parse( xml );
        }
        catch ( Throwable t )
        {
            return;
        }
        
        Assert.assertTrue( false );
    }

    public void testNil ( )
        throws Exception
    {
        XmlObject x = noNamespace.CanBeNilDocument.Factory.parse( "<canBeNil/>" );
        XmlCursor c = x.newCursor();
        c.toFirstChild();
        XmlObject fc = c.getObject();
        Assert.assertTrue( ! fc.isNil() );
        fc.setNil();
        Assert.assertTrue( fc.isNil() );
        Assert.assertTrue( x.xmlText().equals( "<canBeNil xsi:nil=\"true\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"/>" ) );
        c.toNextToken();
        Assert.assertTrue( c.isAttr() );
        c.removeXml();
        Assert.assertTrue( x.xmlText().equals( "<canBeNil/>" ) );
        Assert.assertTrue( ! fc.isNil() );
    }
    
    
    public void testParser ( )
        throws Exception
    {
        dotestParserErrors( "<hee yee='five'><haw>66</haw></any>" );
        dotestParserErrors( "<foo></moo>" );
        dotestParserErrors( "<a><foo></moo></a>" );
        dotestParserErrors( "" );
        dotestParserErrors( "    " );
        
        dotestParserErrors( "har" );
        dotestParserErrors( "<!-- comment -->" );
        dotestParserErrors( "<?moo?>" );
        dotestParserErrors( "<?xml version=\"1.0\" encoding=\"utf-8\"?>" );
        dotestParserErrors( "<a$/>" );
        dotestParserErrors( "<foo a='<'></foo>" );
        dotestParserErrors( "<foo a></foo>" );
        dotestParserErrors( "<foo>" );
        dotestParserErrors( "</foo>" );
// Fix the parser to make these work
//        dotestParserErrors( "<foo><!-- -- --></foo>" );
//        dotestParserErrors( "<foo><!-- ---></foo>" );

        dotestParser( "<a b=\"x\n\ny\"/>", "<a b=\"x  y\"/>" );
    }
    
    public void testSaxParser ( )
        throws Exception
    {
        String xml =  "<a x='y'><!---->x<b/><c p='q'>z</c></a>";
        
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();
        InputSource is = new InputSource( new StringReader(  xml ) );
        XmlSaxHandler sh = XmlObject.Factory.newXmlSaxHandler();
        
        xr.setFeature(
            "http://xml.org/sax/features/namespace-prefixes",
            true );

        xr.setFeature(
            "http://xml.org/sax/features/namespaces", true );

        xr.setFeature(
            "http://xml.org/sax/features/validation", false );

        xr.setContentHandler( sh.getContentHandler() );
        
        xr.setProperty(
            "http://xml.org/sax/properties/lexical-handler",
            sh.getLexicalHandler() );

        xr.parse( is );

        XmlObject x1 = sh.getObject();

        XmlObject x2 = XmlObject.Factory.parse( xml );

        Assert.assertTrue( x1.xmlText().equals( x2.xmlText() ) );
    }
}
