/* Copyright (c) 2005 Ricebridge. All Rights Reserved.
 *
 * This file is available under the terms and conditions of the
 * Ricebridge "Open Source API" policy; Ricebridge grants use of this
 * copyrighted work under the terms of a BSD-style license only. See
 * http://www.opensource.org/licenses/bsd-license.php for more
 * information.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 
 *  - Redistributions of source code must retain the above copyright
 *  notice, this list of conditions and the following disclaimer.
 *
 *  - 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.
 *
 *  - Neither the name of the Ricebridge nor the names of its
 *  contributors may be used to endorse or promote products derived
 *  from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS 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
 * COPYRIGHT OWNER OR 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.  
 */

package com.ricebridge.xmlman.in.test;


import com.ricebridge.xmlman.*;
import com.ricebridge.xmlman.in.*;

import org.jostraca.util.*;

import junit.framework.*;
import junit.textui.*;

import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;

import java.util.*;
import java.io.*;


/** Test cases for namespace handling. 
 *    <p>Test file is <a href="namespace.xml">namespace.xml</a>.</p> 
 *    <p>The <b><a href="NamespaceTest.java.html">Source Code</a></b> of this Java class 
 *    is available under a <a href="http://www.opensource.org/licenses/bsd-license.php">BSD-style license</a>.</p>
 */
public class NamespaceTest extends TestCase {

  // test framework
  
  public NamespaceTest( String pName ) {
    super( pName );
  }

  public static TestSuite suite() {
    return new TestSuite( NamespaceTest.class );
  }

  public static void main( String[] pArgs ) {
    TestRunner.run( suite() );
  }



  private static ArrayList sRecordSpecList = new ArrayList();
  private static ArrayList sRecordDataList = new ArrayList();
  private static ArrayList sXmlSpecList    = new ArrayList();

  private static ArrayList sOutRecordSpecList = new ArrayList();
  private static ArrayList sOutRecordDataList = new ArrayList();
  private static ArrayList sOutXmlSpecList    = new ArrayList();


  static {
    XmlSpec xs;

    sRecordSpecList.add( new RecordSpec( "//a:bar", new String[] { "@barn", "namespace::a:que" } ) );
    xs = new XmlSpec(); xs.addNamespace( "a", "ns-a" ); sXmlSpecList.add(xs);
    sRecordDataList.add( ListUtil.make( new String[] { "bar1", "ns-a" } ) );

    sRecordSpecList.add( new RecordSpec( "//a:foo", new String[] { "@a:name" } ) );
    xs = new XmlSpec(); xs.addNamespace( "a", "ns-a1" ); sXmlSpecList.add(xs);
    sRecordDataList.add( ListUtil.make( new String[] {"foo2"} ) );

    sRecordSpecList.add( new RecordSpec( "//a:foo", new String[] { "@a:name" } ) );
    xs = new XmlSpec(); xs.addNamespace( "a", "ns-a2" ); sXmlSpecList.add(xs);
    sRecordDataList.add( ListUtil.make( new String[] {"foo3"} ) );

    sRecordSpecList.add( new RecordSpec( "//a:foo[namespace-uri()='ns-a2']", new String[] { "@a:name" } ) );
    xs = new XmlSpec(); xs.addNamespace( "a", "ns-a2" ); sXmlSpecList.add(xs);
    sRecordDataList.add( ListUtil.make( new String[] {"foo3"} ) );

    sRecordSpecList.add( new RecordSpec( "//a:foo/a:bar", new String[] { "namespace-uri(//a:foo)" } ) );
    xs = new XmlSpec(); xs.addNamespace( "a", "ns-a" ); sXmlSpecList.add(xs);
    sRecordDataList.add( ListUtil.make( new String[] {"ns-a"} ) );

    sRecordSpecList.add( new RecordSpec( "//a:foo/a:bar", new String[] { "local-name(//a:foo)" } ) );
    xs = new XmlSpec(); xs.addNamespace( "a", "ns-a" ); sXmlSpecList.add(xs);
    sRecordDataList.add( ListUtil.make( new String[] {"foo"} ) );

    // only matches elements in specified namespace
    sRecordSpecList.add( new RecordSpec( "//a:*", new String[] { "name()" } ) );
    xs = new XmlSpec(); xs.addNamespace( "a", "ns-a" ); sXmlSpecList.add(xs);
    sRecordDataList.add( ListUtil.make( new String[] {"que"},
                                        new String[] {"bar"},
                                        new String[] {"foo"} ) );

    sRecordSpecList.add( new RecordSpec( "//a:foo", new String[] { "namespace::a:bar[1]" } ) );
    xs = new XmlSpec(); xs.addNamespace( "a", "ns-a" ); sXmlSpecList.add(xs);
    sRecordDataList.add( ListUtil.make( new String[] {"ns-a"} ) );

    sRecordSpecList.add( new RecordSpec( "//baz", new String[] { "namespace::bat1:bat" } ) );
    xs = new XmlSpec(); xs.addNamespace( "bat1", "bat1" ); sXmlSpecList.add(xs);
    sRecordDataList.add( ListUtil.make( new String[] {"bat1"} ) );


    // out

    sOutRecordSpecList.add( new RecordSpec( "/root/foo", new String[] { "@a", 
                                                                     "rb:bar/@a", "rb:bar/@rb:c",
                                                                     "rb:bar/@rb:a", "rb:bar/@c",
                                                                     ".//h:div/@a", ".//h:div/@h:c",
                                                                     ".//h:div/@h:a", ".//h:div/@c" } ) );
    xs = new XmlSpec(); 
    xs.addNamespace( "rb", "uri:ricebridge" ); 
    xs.addNamespace( "h", "uri:html" ); 
    sOutXmlSpecList.add(xs);
    sOutRecordDataList.add( ListUtil.make( new String[] {"b", "b", "d", "", "", "b", "d", "", ""} ) );

  } 
  


  // test methods

  
  public void testNamespace() throws Exception {
    TestUtil.testRecords( "com/ricebridge/xmlman/in/test/namespace.xml", sXmlSpecList, sRecordSpecList, sRecordDataList, this );
  }

  
  public void testAwareness() throws Exception {
    File xmlfile = TestUtil.findFile( "com/ricebridge/xmlman/in/test/namespace.xml" );
    XmlManager xm = new XmlManager();
    xm.getXmlSpec().setNamespaceAware(false);
    RecordSpec rs = new RecordSpec("//a:foo",new String[] {"@a:name"});
    List data = xm.loadAsLists( xmlfile, rs );
    assertEquals("[[foo2], [foo3]]", ""+data);
  }


  public void testXmlFunc() throws Exception {
    // just outputs verbatim with prefixes, but no namespace declarations
    File xmlfile = TestUtil.findFile( "com/ricebridge/xmlman/in/test/nstext.xml" );
    XmlManager xm = new XmlManager();
    xm.getXmlSpec().addNamespace( "a", "ns-a" );
    RecordSpec rs = new RecordSpec("/root/a:foo",new String[] {"@a:bar", "@que", "rb:xml(zoo)", "rb:xml(.)"});
    List data = xm.loadAsLists( xmlfile, rs );
    assertEquals( "[[b1, q1, <zoo>z1t</zoo>, <a:foo a:bar=\"b1\" que=\"q1\">ft1<zoo>z1t</zoo>ft2</a:foo>]]", data.toString() );
  }


  public void testOutputNamespace() throws Exception {
    TestUtil.testRecords( "com/ricebridge/xmlman/in/test/nsout.xml", sOutXmlSpecList, sOutRecordSpecList, sOutRecordDataList, this );
  }


}





Syntax Highlighting created using the com.Ostermiller.Syntax package.
Thursday, February 23 2006 at 16:47