Package org.bifrost.xmlio.test

Source Code of org.bifrost.xmlio.test.FunctionalTestXmlReader

package org.bifrost.xmlio.test;

import java.io.InputStream;
import java.io.ByteArrayInputStream;
import java.net.URL;
import java.util.Calendar;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import junit.framework.TestCase;
import junit.textui.TestRunner;

import org.bifrost.xmlio.XmlReader;
import org.bifrost.xmlio.XmlException;
import org.bifrost.xmlio.config.DateConverter;
import org.bifrost.xmlio.config.NamespaceMap;
import org.bifrost.xmlio.config.ObjectMap;
import org.bifrost.xmlio.config.PropertyMap;
import org.bifrost.xmlio.config.TimestampConverter;
import org.bifrost.xmlio.config.XmlIOConfig;
import org.bifrost.xmlio.impl.ReaderContentHandler;
import org.bifrost.xmlio.test.helpers.*;
import org.bifrost.xmlio.test.helpers.inheritance.*;
import org.bifrost.xmlio.test.helpers.subpackage.TestHelperOther;

/**
* <p>Unit tests to validate the XmlReader package.</p>
* <p>
* Created: Feb 22, 2003<br/>
* Copyright: Copyright (c) 2003<br/>
* Assumptions: none<br/>
* Requires: TestHelperSimple, TestHelperComplex<br/>
* Required by: nothing<br/>
* Revision History:<br/>
* </p>
* @author Donald Kittle <donald@bifrost.org>
* @version 1.0
*/

public class FunctionalTestXmlReader extends TestCase {

  private static final int TEST_SIMPLE = 0;
  private static final int TEST_SIMPLE_ATTRIBUTES = 1;
  private static final int TEST_COMPLEX = 2;
  private static final int TEST_INHERITANCE = 3;
  private static final int TEST_SIMPLE_NO_ATTRIBUTE = 4;
  private static final int TEST_NO_OBJECT = 5;
  private static final int TEST_SIMPLE_ARRAY = 6;
  private static final int TEST_COMPLEX_ARRAY = 7;
  private static final int TEST_BOOLEAN = 8;
  private static final int TEST_MULTI_PACKAGE = 9;
  private static final int TEST_EMPTY = 10;
  private static final int TEST_DATE_SIMPLE = 11;
  private static final int TEST_EMPTY_ELEMENT = 12;
  private static final int TEST_EMPTY_ELEMENT_NOT_CALLED = 13;
  private static final int TEST_NULL = 14;
  private static final int TEST_EMPTY_STRING = 15;
  private static final int TEST_FULL_PACKAGE_NAME = 16;
  private static final int TEST_SIMPLE_NAMESPACES = 17;
  private static final int TEST_ALL_TYPES = 18;
  private static final int TEST_SECOND_NAMESPACES = 19;
  private static final int TEST_OBJECT_PROPERTY_MAPPING = 20;
  private static final int TEST_OBJECT_MAPPING = 21;
  private static final int TEST_PROPERTY_MAPPING = 22;
  private static final int TEST_DATE_COMPLEX = 23;
  private static final int TEST_COLLECTIONS = 24;
  private static final int TEST_AMP = 25;
  private static final int TEST_BRACKETS = 26;
  private static final int TEST_SIMPLE_CHILD = 27;
  private static final int TEST_DEEP_CHILD = 28;
  private static final int TEST_LOWER_FIRST_CHAR = 29;
  private static final int TEST_SIMPLE_DASHES = 30;
  private static final int TEST_VEHICLE_INHERITANCE = 31;
 
  /**
   * Runs all tests (test* methods) using a console based user interface.
   */
  public static void main(String args[])
  {
    TestRunner.run(FunctionalTestXmlReader.class);
  } // end main()

  /**
   * Constructor for TestCase
   */
  public FunctionalTestXmlReader(String s) {
    super(s);
  }

  /**
   * Sets up the tests.
   */
  public void setUp()
  {
    // Reset to default configuration between each test
    XmlIOConfig.getInstance().reset();
  }

  /**
   * Removes the test information from the system.
   */
  public void tearDown()
  {
  }

  /**
   * Creates a string which is sample XML describing objects.
   * @param type the specific xml file type to return
   * @return String the xml
   */
  public String createXml(int type)
  {
    StringBuffer result = new StringBuffer();
   
    switch (type) {
      case TEST_SIMPLE:
        // Simple, one object test.
        result.append("<TestHelperSimple>");
        result.append("  <number>123</number>");
        result.append("  <string>abc</string>");
        result.append("</TestHelperSimple>");
        break;
      case TEST_AMP:
        // Simple, one object test.
        result.append("<TestHelperSimple>");
        result.append("  <number>123</number>");
        result.append("  <string>a&amp;b</string>");
        result.append("</TestHelperSimple>");
        break;
      case TEST_BRACKETS:
        // Simple, one object test.
        result.append("<TestHelperSimple>");
        result.append("  <number>123</number>");
        result.append("  <string>a&lt;b&gt;c</string>");
        result.append("</TestHelperSimple>");
        break;
      case TEST_SIMPLE_ATTRIBUTES:
        // Test an object where properties are set using xml attributes
        // instead of sub-elements.
        result.append("<TestHelperSimple number=\"234\" string=\"bcd\"/>");
        break;
      case TEST_COMPLEX:
        // Complex test, several objects wrapped inside one.
        result.append("<TestHelperComplex>");
        result.append("  <TestHelperSimple number=\"345\" string=\"cde\"/>");
        result.append("  <TestHelperSimple>");
        result.append("    <number>456</number>");
        result.append("    <string>def</string>");
        result.append("  </TestHelperSimple>");
        result.append("</TestHelperComplex>");
        break;
      case TEST_INHERITANCE:
        // Complex test, several objects that extend a superclass.
        result.append("<TestHelperSalesLot>");
        result.append("  <TestHelperBoat>");
        result.append("    <vin>123</vin>");
        result.append("    <kms>1000</kms>");
        result.append("    <topSpeedInKnots>60</topSpeedInKnots>");
        result.append("  </TestHelperBoat>");
        result.append("  <TestHelperCar>");
        result.append("    <vin>i222g4</vin>");
        result.append("    <kms>10000</kms>");
        result.append("    <numberDoors>4</numberDoors>");
        result.append("  </TestHelperCar>");
        result.append("  <TestHelperCar>");
        result.append("    <vin>i387g6</vin>");
        result.append("    <kms>28000</kms>");
        result.append("    <numberDoors>2</numberDoors>");
        result.append("  </TestHelperCar>");
        result.append("</TestHelperSalesLot>");
        break;
      case TEST_SIMPLE_NO_ATTRIBUTE:
        // Test where an attribute will not be found in object.
        result.append("<TestHelperSimple>");
        result.append("  <aNumber>123</aNumber>");
        result.append("  <string>abc</string>");
        result.append("</TestHelperSimple>");
        break;
      case TEST_NO_OBJECT:
        // Test where an object cannot be found.
        result.append("<FooClass>");
        result.append("  <number>123</number>");
        result.append("</FooClass>");
        break;

      case TEST_SIMPLE_ARRAY:
        // Test where an object has an array of primatives
        result.append("<TestHelperArray>");
        result.append("  <number>123</number>");
        result.append("  <string>aaa</string>");
        result.append("  <string>bbb</string>");
        result.append("  <string>ccc</string>");
        result.append("</TestHelperArray>");
        break;
      case TEST_COMPLEX_ARRAY:
        result.append("<TestHelperComplexArray>");
        result.append("  <number>123</number>");
        result.append("  <TestHelperSimple>");
        result.append("    <string>aaa</string>");
        result.append("    <number>222</number>");
        result.append("  </TestHelperSimple>");
        result.append("  <TestHelperSimple>");
        result.append("    <string>bbb</string>");
        result.append("    <number>333</number>");
        result.append("  </TestHelperSimple>");
        result.append("  <TestHelperSimple>");
        result.append("    <string>ccc</string>");
        result.append("    <number>444</number>");
        result.append("  </TestHelperSimple>");
        result.append("</TestHelperComplexArray>");
        break;
      case TEST_BOOLEAN:
        // Simple, one object test.
        result.append("<TestHelperBoolean>");
        result.append("  <fooled>true</fooled>");
        result.append("  <rich>abc</rich>");
        result.append("</TestHelperBoolean>");
        break;
      case TEST_MULTI_PACKAGE:
        // Simple, one object test.
        result.append("<TestHelperTwoPackages>");
        result.append("  <TestHelperSimple>");
        result.append("    <string>aaa</string>");
        result.append("    <number>222</number>");
        result.append("  </TestHelperSimple>");
        result.append("  <TestHelperOther>");
        result.append("    <letter>ccc</letter>");
        result.append("    <number>123</number>");
        result.append("  </TestHelperOther>");
        result.append("</TestHelperTwoPackages>");
        break;
      case TEST_EMPTY:
        // Simple, one object test.
        result.append("<TestHelperEmpty>");
        result.append("</TestHelperEmpty>");
        break;
      case TEST_DATE_SIMPLE:
        // Simple, one object test.
        result.append("<TestHelperDate>");
        result.append("  <created>2003-10-20 10:32</created>");
        result.append("  <startDate>2002-06-16</startDate>");
        result.append("  <calendar>2002-09-21 23:47:34</calendar>");
        result.append("</TestHelperDate>");
        break;
      case TEST_EMPTY_ELEMENT_NOT_CALLED:
        // Test to make sure that a setter is not called if the corresponding
        // tag does not appear in the XML.
        result.append("<TestHelperEmptyElement>");
        result.append("  <!-- called/ -->");
        result.append("  <string>abc</string>");
        result.append("</TestHelperEmptyElement>");
        break;
      case TEST_EMPTY_ELEMENT:
        // Simple, one object test.
        result.append("<TestHelperEmptyElement>");
        result.append("  <called/>");
        result.append("  <string>abc</string>");
        result.append("</TestHelperEmptyElement>");
        break;
      case TEST_NULL:
        // Test an object where an attribute is specifically set to null.
        result.append("<TestHelperSimple>");
        result.append("  <number>123</number>");
        result.append("  <string><null/></string>");
        result.append("</TestHelperSimple>");
        break;
      case TEST_EMPTY_STRING:
        // Test object with empty attribute elements.
        // The number will NOT default to 0, it must be explicitly set,
        // the string WILL default to an empty string (NOT a null string).
        result.append("<TestHelperSimple>");
        result.append("  <number>0</number>");
        result.append("  <string></string>");
        result.append("</TestHelperSimple>");
        break;
      case TEST_FULL_PACKAGE_NAME:
        // Test an object test whose elements use the fully qualified
        // classnames.
        result.append("<org.bifrost.xmlio.test.helpers.TestHelperSimple>");
        result.append("  <number>123</number>");
        result.append("  <string>abc</string>");
        result.append("</org.bifrost.xmlio.test.helpers.TestHelperSimple>");
        break;
      case TEST_SIMPLE_NAMESPACES:
        // Test an object test whose elements use namespaces.
        result.append("<TestHelperSimple xmlns=\"http://www.bifrost.org/xmlio\">");
        result.append("  <number>123</number>");
        result.append("  <string>abc</string>");
        result.append("</TestHelperSimple>");
        break;
      case TEST_SECOND_NAMESPACES:
        // Test an object test whose elements use namespaces.
        result.append("<TestHelperSimple xmlns=\"http://www.bifrost.org/xmlio\">");
        result.append("  <number>123</number>");
        result.append("  <string>abc</string>");
        result.append("</TestHelperSimple>");
        break;
      case TEST_ALL_TYPES:
        // Test an object that contains all of the types that the framework
        // considers to be 'primative'.
        result.append("<TestHelperTypes>");
        result.append("  <string>mdk</string><pint>1</pint><integer>2</integer>");
        result.append("  <plong>3</plong><olong>4</olong><pbool>true</pbool>");
        result.append("  <obool>true</obool><pfloat>5.2</pfloat>");
        result.append("  <ofloat>6.2</ofloat><pshort>7</pshort>");
        result.append("  <oshort>8</oshort><pbyte>9</pbyte><obyte>10</obyte>");
        result.append("  <pchar>a</pchar><ochar>b</ochar>");
        result.append("  <pdouble>11.2</pdouble><odouble>12.2</odouble>");
        result.append("  <date>2003-10-20 10:32:53</date>");
        result.append("</TestHelperTypes>");
        break;
      case TEST_OBJECT_PROPERTY_MAPPING:
        // An object that wraps a collection of inner objects.  The tags for
        // the inner are mapped from their xml names to their actual java
        // names.
        result.append("<TestHelperComplex>");
        result.append("  <obj>");
        result.append("    <a>aaa</a>");
        result.append("    <b>222</b>");
        result.append("  </obj>");
        result.append("  <obj>");
        result.append("    <a>bbb</a>");
        result.append("    <b>333</b>");
        result.append("  </obj>");
        result.append("  <obj>");
        result.append("    <a>ccc</a>");
        result.append("    <b>444</b>");
        result.append("  </obj>");
        result.append("</TestHelperComplex>");
        break;
      case TEST_OBJECT_MAPPING:
        // An object that wraps a collection of inner objects.  The tags for
        // the inner are mapped from their xml names to their actual java
        // names.
        result.append("<TestHelperComplex>");
        result.append("  <obj>");
        result.append("    <string>aaa</string>");
        result.append("    <number>222</number>");
        result.append("  </obj>");
        result.append("  <obj>");
        result.append("    <string>bbb</string>");
        result.append("    <number>333</number>");
        result.append("  </obj>");
        result.append("  <obj>");
        result.append("    <string>ccc</string>");
        result.append("    <number>444</number>");
        result.append("  </obj>");
        result.append("</TestHelperComplex>");
        break;
      case TEST_PROPERTY_MAPPING:
        // An object that wraps a collection of inner objects.  The tags for
        // the inner are mapped from their xml names to their actual java
        // names.
        result.append("<TestHelperComplex>");
        result.append("  <TestHelperSimple>");
        result.append("    <a>aaa</a>");
        result.append("    <b>222</b>");
        result.append("  </TestHelperSimple>");
        result.append("  <TestHelperSimple>");
        result.append("    <a>bbb</a>");
        result.append("    <b>333</b>");
        result.append("  </TestHelperSimple>");
        result.append("  <TestHelperSimple>");
        result.append("    <a>ccc</a>");
        result.append("    <b>444</b>");
        result.append("  </TestHelperSimple>");
        result.append("</TestHelperComplex>");
        break;
      case TEST_DATE_COMPLEX:
        // Test dates where each attribute uses a different format.
        result.append("<TestHelperDate>");
        result.append("  <created>2003-10-20 10:32</created>");
        result.append("  <startDate>2002-06-16</startDate>");
        result.append("  <startTime>10:32:54</startTime>");
        result.append("  <endTime>23:04:47</endTime>");
        result.append("</TestHelperDate>");
        break;
      case TEST_COLLECTIONS:
        // Test where an object full of collections of various types.
        result.append("<TestHelperCollection>");
        result.append("  <widget>waazoo</widget>");
        result.append("  <widget>wizbang</widget>");
        result.append("  <widget>hugug</widget>");
        result.append("  <cheese>cheddar</cheese>");
        result.append("  <cheese>swiss</cheese>");
        result.append("  <book>Dantes Inferno</book>");
        result.append("  <book>Cantebury Tales</book>");
        result.append("  <movie>LotR</movie>");
        result.append("  <movie>Fight Club</movie>");
        result.append("</TestHelperCollection>");
        break;
      case TEST_SIMPLE_CHILD:
        // Test where an object is a child of an object of the same type
        result.append("<TestHelperParent>");
        result.append("  <variable>hello world</variable>");
        result.append("  <TestHelperParent>");
        result.append("    <variable>salut le monde</variable>");
        result.append("  </TestHelperParent>");
        result.append("</TestHelperParent>");
        break;
      case TEST_DEEP_CHILD:
        // Test where an object is a child of an object of the same type
        result.append("<TestHelperParent>");
        result.append("  <variable>a1</variable>");
        result.append("  <TestHelperParent>");
        result.append("    <variable>b2</variable>");
        result.append("    <TestHelperParent>");
        result.append("      <variable>c3</variable>");
        result.append("      <TestHelperParent>");
        result.append("        <variable>d4</variable>");
        result.append("      </TestHelperParent>");
        result.append("      <TestHelperParent>");
        result.append("        <variable>d5</variable>");
        result.append("      </TestHelperParent>");
        result.append("      <TestHelperParent>");
        result.append("        <variable>d6</variable>");
        result.append("      </TestHelperParent>");
        result.append("    </TestHelperParent>");
        result.append("  </TestHelperParent>");
        result.append("</TestHelperParent>");
        break;
      case TEST_LOWER_FIRST_CHAR:
        // Simple, one object test.
        result.append("<testHelperSimple>\n");
        result.append("  <number>123</number>\n");
        result.append("  <string>abc</string>\n");
        result.append("</testHelperSimple>\n");
        break;
      case TEST_SIMPLE_DASHES:
        // Simple, one object test.
        result.append("<test-helper-simple>");
        result.append("  <number>123</number>");
        result.append("  <string>abc</string>");
        result.append("</test-helper-simple>");
        break;
      case TEST_VEHICLE_INHERITANCE:
        // Simple, one object test.
        result.append("<test-helper-owner>\n");
        result.append("  <name>Jane Smith</name>\n");
        result.append("  <test-helper-car>\n");
        result.append("    <vin>A880BBC64</vin>\n");
        result.append("    <kms>18768</kms>\n");
        result.append("    <number-doors>5</number-doors>\n");
        result.append("  </test-helper-car>\n");
        result.append("  <test-helper-boat>\n");
        result.append("    <vin>6674C</vin>\n");
        result.append("    <kms>7248</kms>\n");
        result.append("    <top-speed-in-knots>54</top-speed-in-knots>\n");
        result.append("  </test-helper-boat>\n");
        result.append("</test-helper-owner>\n");
        break;
    }
    return result.toString();
  } // end createXml()
 
  /**
   * Test reading from a file that does not exist.  Make sure the file
   * <code>/foobardpath/foobarfile.xml</code> does not exist.
   */
  public void testInvalidFile()
  {
    XmlReader config = null;
    try
    {
      String packageName = nameOfPackage(this.getClass().getName());
      config = new XmlReader("/foobardpath/foobarfile.xml", packageName);
      assertNotNull(config);
    }
    catch (XmlException e)
    {
      String test = e.toString().toLowerCase();
      assertTrue(test.indexOf("error reading file") >= 0);
      return;
    }
    fail("A file IO exception should have been thrown.");
  } // end testInvalidFile()
 
  /**
   * Test reading from a url that cannot be connected to.  Make sure the url
   * <code>http://foobardhost/foobarfile.xml</code> is invalid.
   */
  public void testInvalidUrl()
  {
    XmlReader config = null;
    try
    {
      String packageName = nameOfPackage(this.getClass().getName());
      URL url = new URL("http://foobardhost/foobarfile.xml");
      config = new XmlReader(url, packageName);
      assertNotNull(config);
    }
    catch (XmlException e)
    {
      String test = e.toString().toLowerCase();
      assertTrue("Got " + e, test.indexOf("error reading url") >= 0);
      return;
    }
    catch (Exception e)
    {
      fail("Unexpected exception: " + e.toString());
    }
    fail("A file IO exception should have been thrown.");
  } // end testInvalidUrl()

  /**
   * Test reading a simple object with 'primative' properties expressed in sub-elements.
   */
  public void testSimpleObject()
  {
    String configString = createXml(TEST_SIMPLE);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperSimple helper = (TestHelperSimple)xmlReader.getRootObject();
    assertNotNull(helper);
    assertTrue(helper.getNumber() == 123);
    assertTrue("abc".equals(helper.getString()));
  } // end testSimpleObject()

  /**
   * Test reading a simple parent/child relationship where both parent and
   * child class are of the same type.
   */
  public void testSimpleChild()
  {
    String configString = createXml(TEST_SIMPLE_CHILD);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperParent helper = (TestHelperParent)xmlReader.getRootObject();
    assertNotNull(helper);
    assertTrue("Got " + helper.getVariable(), "hello world".equals(helper.getVariable()));
    assertNotNull(helper.getTestHelperParent());
    assertTrue(helper.getTestHelperParent().size() == 1);
    Iterator iter = helper.getTestHelperParent().iterator();
    TestHelperParent child = null;
    if (iter.hasNext())
      child = (TestHelperParent)iter.next();
    assertNotNull(child);
    assertTrue("Got " + child.getVariable(), "salut le monde".equals(child.getVariable()));
  } // end testSimpleChild()

  /**
   * Test reading a simple parent/child relationship where both parent and
   * child class are of the same type.
   */
  public void testDeepChild()
  {
    String configString = createXml(TEST_DEEP_CHILD);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperParent helper = (TestHelperParent)xmlReader.getRootObject();
    assertNotNull(helper);
    assertTrue("Got " + helper.getVariable(), "a1".equals(helper.getVariable()));
    assertNotNull(helper.getTestHelperParent());
    assertTrue(helper.getTestHelperParent().size() == 1);
    Iterator iter = helper.getTestHelperParent().iterator();
    TestHelperParent child = null;
    if (iter.hasNext())
      child = (TestHelperParent)iter.next();
    assertNotNull(child);
    assertTrue("Got " + child.getVariable(), "b2".equals(child.getVariable()));
    iter = child.getTestHelperParent().iterator();
    child = null;
    if (iter.hasNext())
      child = (TestHelperParent)iter.next();
    assertNotNull(child);
    assertTrue("Got " + child.getVariable(), "c3".equals(child.getVariable()));
    iter = child.getTestHelperParent().iterator();
    child = null;
    if (iter.hasNext())
      child = (TestHelperParent)iter.next();
    assertNotNull(child);
    assertTrue("Got " + child.getVariable(), "d4".equals(child.getVariable()));
    if (iter.hasNext())
      child = (TestHelperParent)iter.next();
    assertNotNull(child);
    assertTrue("Got " + child.getVariable(), "d5".equals(child.getVariable()));
    if (iter.hasNext())
      child = (TestHelperParent)iter.next();
    assertNotNull(child);
    assertTrue("Got " + child.getVariable(), "d6".equals(child.getVariable()));
  } // end testDeepChild()

  /**
   * Test reading a simple object with 'primative' properties expressed in sub-elements.
   */
  public void testSimpleWithAmpersand()
  {
    String configString = createXml(TEST_AMP);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperSimple helper = (TestHelperSimple)xmlReader.getRootObject();
    assertNotNull(helper);
    assertTrue(helper.getNumber() == 123);
    assertTrue("a&b".equals(helper.getString()));
  } // end testSimpleWithAmpersand()
 
  /**
   * Test reading a simple object with 'primative' properties expressed in sub-elements.
   */
  public void testSimpleWithXmlBrackets()
  {
    String configString = createXml(TEST_BRACKETS);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperSimple helper = (TestHelperSimple)xmlReader.getRootObject();
    assertNotNull(helper);
    assertTrue(helper.getNumber() == 123);
    assertTrue("a<b>c".equals(helper.getString()));
  } // end testSimpleWithAmpersand()

  /**
   * Test reading a simple object and define it's package using namespaces,
   * rather than using fully qualified classnames in the xml itself..
   */
  public void testSimpleNamespaces()
  {
    String configString = createXml(TEST_SIMPLE_NAMESPACES);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    XmlIOConfig config = XmlIOConfig.getInstance();
    try
    {
      NamespaceMap map = new NamespaceMap();
      map.setUri("http://www.bifrost.org/xmlio");
      map.setPrefix("helpers");
      map.setPackageName("org.bifrost.xmlio.test.helpers");
      config.addNamespaceMap(map);
      xmlReader = new XmlReader(reader, "");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperSimple helper = (TestHelperSimple)xmlReader.getRootObject();
    assertNotNull(helper);
    assertTrue(helper.getNumber() == 123);
    assertTrue("abc".equals(helper.getString()));
  } // end testSimpleObject()

  /**
   * Test reading a an object where the full package name is used as the tag
   * name.
   */
  public void testFullPackageName()
  {
    String configString = createXml(TEST_FULL_PACKAGE_NAME);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperSimple helper = (TestHelperSimple)xmlReader.getRootObject();
    assertNotNull(helper);
    assertTrue("Got " + helper.getNumber(), helper.getNumber() == 123);
    assertTrue("Got '" + helper.getString() + "'", "abc".equals(helper.getString()));
  } // end testFullPackageName()

  /**
   * Test reading a simple object with an object property that is null.
   */
  public void testObjectWithNullAttribute()
  {
    String configString = createXml(TEST_NULL);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperSimple helper = (TestHelperSimple)xmlReader.getRootObject();
    assertNotNull(helper);
    assertTrue(helper.getNumber() == 123);
    assertTrue(helper.getString() == null);
  } // end testObjectWithNullAttribute()

  /**
   * Test reading a simple object where an object property has no text node.
   * This should result in a default instance of the object being created, not
   * in a null pointer.
   */
  public void testObjectWithEmptyAttributes()
  {
    String configString = createXml(TEST_EMPTY_STRING);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperSimple helper = (TestHelperSimple)xmlReader.getRootObject();
    assertNotNull(helper);
    assertTrue(helper.getNumber() == 0);
    assertTrue("".equals(helper.getString()));
  } // end testObjectWithNullAttribute()

  /**
   * Test to make sure that a setter is not called if the corresponding
   * tag does not appear in the XML.
   */
  public void testEmptyElementElementNotCalled()
  {
    String configString = createXml(TEST_EMPTY_ELEMENT_NOT_CALLED);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperEmptyElement helper = (TestHelperEmptyElement)xmlReader.getRootObject();
    assertNotNull(helper);
    assertTrue(helper.isCalled() == false);
    assertTrue("abc".equals(helper.getString()));
  } // end testEmptyElementElementNotCalled()

  /**
   * Test to make sure that a setter is called if the corresponding
   * tag does appear in the XML.
   */
  public void testEmptyElementElement()
  {
    String configString = createXml(TEST_EMPTY_ELEMENT);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperEmptyElement helper = (TestHelperEmptyElement)xmlReader.getRootObject();
    assertNotNull(helper);
    assertTrue(helper.isCalled() == true);
    assertTrue("abc".equals(helper.getString()));
  } // end testEmptyElementElement()

  /**
   * Test reading an object with no sub-elements or attributes in the xml stream.
   */
  public void testEmptyObject()
  {
    String configString = createXml(TEST_EMPTY);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperEmpty helper = (TestHelperEmpty)xmlReader.getRootObject();
    assertNotNull(helper);
  } // end testSimpleObject()

  /**
   * Test reading a simple object with 'primative boolean' properties expressed in sub-elements.
   */
  public void testBooleanObject()
  {
    String configString = createXml(TEST_BOOLEAN);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperBoolean helper = (TestHelperBoolean)xmlReader.getRootObject();
    assertNotNull(helper);
    assertTrue(helper.isFooled() == true);
    assertTrue(helper.isRich() == false);
  } // end testBooleanObject()

  /**
   * Test reading an object with lots of different types of collections.
   */
  public void testCollections()
  {
    String configString = createXml(TEST_COLLECTIONS);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperCollection helper = (TestHelperCollection)xmlReader.getRootObject();
    assertNotNull(helper);
    assertNotNull(helper.getWidget());

    // Test to make sure all widgets are present
    List results = new LinkedList();
    results.add("waazoo");
    results.add("wizbang");
    results.add("hugug");
    for (Iterator i = helper.getWidget().iterator(); i.hasNext();)
    {
      // There should be 3 elements
      String temp = (String)i.next();
      assertTrue(inResults(results, temp));
      temp = (String)i.next();
      assertTrue(inResults(results, temp));
      temp = (String)i.next();
      assertTrue(inResults(results, temp));
      assertFalse(inResults(results, temp));
    }

    // Test to make sure all cheeses are present
    results = new LinkedList();
    results.add("cheddar");
    results.add("swiss");
    for (Iterator i = helper.getCheese().iterator(); i.hasNext();)
    {
      // There should be 2 elements
      String temp = (String)i.next();
      assertTrue(inResults(results, temp));
      temp = (String)i.next();
      assertTrue(inResults(results, temp));
      assertFalse(inResults(results, temp));
    }

    // Test to make sure all books are present
    results = new LinkedList();
    results.add("Dantes Inferno");
    results.add("Cantebury Tales");
    for (Iterator i = helper.getBook().iterator(); i.hasNext();)
    {
      // There should be 2 elements
      String temp = (String)i.next();
      assertTrue(inResults(results, temp));
      temp = (String)i.next();
      assertTrue(inResults(results, temp));
      assertFalse(inResults(results, temp));
    }

    // Test to make sure all movies are present
    results = new LinkedList();
    results.add("LotR");
    results.add("Fight Club");
    for (Iterator i = helper.getMovie().iterator(); i.hasNext();)
    {
      // There should be 2 elements
      String temp = (String)i.next();
      assertTrue(inResults(results, temp));
      temp = (String)i.next();
      assertTrue(inResults(results, temp));
      assertFalse(inResults(results, temp));
    }

  } // end testCollections()

  private boolean inResults(List results, String string)
  {
    if (results == null || string == null)
      return false;
   
    if (results.contains(string))
    {
      results.remove(string);
      return true;
    }

    return false;
  } // end inResults()
 
  /**
   * Test reading a simple object with 'primative' properties expressed in attributes.
   */
  public void testSimpleObjectAttributes()
  {
    String configString = createXml(TEST_SIMPLE_ATTRIBUTES);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperSimple helper = (TestHelperSimple)xmlReader.getRootObject();
    assertNotNull(helper);
    assertTrue(helper.getNumber() == 234);
    assertTrue("bcd".equals(helper.getString()));
  } // end testSimpleObject()

  /**
   * Test reading in a more complex object which is a wrapper around a list of
   * more simple objects.
   */
  public void testComplexObject()
  {
    String configString = createXml(TEST_COMPLEX);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperComplex helper = (TestHelperComplex)xmlReader.getRootObject();
    assertNotNull(helper);
    assertNotNull(helper.getTestHelperSimple());
    Iterator i = helper.getTestHelperSimple().iterator();
    assertTrue(i.hasNext());
    TestHelperSimple simple = (TestHelperSimple)i.next();
    assertNotNull(simple);
    assertTrue(simple.getNumber() == 345);
    assertTrue("cde".equals(simple.getString()));
    assertTrue(i.hasNext());
    simple = (TestHelperSimple)i.next();
    assertNotNull(simple);
    assertTrue(simple.getNumber() == 456);
    assertTrue("def".equals(simple.getString()));
  } // end testComplexObject()

  /**
   * Test reading in a more complex object which is a wrapper around a list of
   * more simple objects where the tag names of the simple objects and simple
   * object attributes are mapped from xml names to their actual java names.
   */
  public void testObjectPropertyMapping()
  {
    String configString = createXml(TEST_OBJECT_PROPERTY_MAPPING);
    XmlIOConfig config = XmlIOConfig.getInstance();
    // Set up mapping
    List list = new LinkedList();
    list.add(new PropertyMap("a", "string"));
    list.add(new PropertyMap("b", "number"));
    ObjectMap oMap = new ObjectMap("obj", "TestHelperSimple", list);
    config.addObjectMap(oMap);
    list = new LinkedList();
    list.add(new PropertyMap("obj", "TestHelperSimple"));
    oMap = new ObjectMap("TestHelperComplex", "TestHelperComplex", list);
    config.addObjectMap(oMap);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperComplex helper = (TestHelperComplex)xmlReader.getRootObject();
    assertNotNull(helper);
    assertNotNull(helper.getTestHelperSimple());
    Iterator i = helper.getTestHelperSimple().iterator();
    assertTrue(i.hasNext());
    TestHelperSimple simple = (TestHelperSimple)i.next();
    assertNotNull(simple);
    assertTrue(simple.getNumber() == 222);
    assertTrue("aaa".equals(simple.getString()));
    assertTrue(i.hasNext());
    simple = (TestHelperSimple)i.next();
    assertNotNull(simple);
    assertTrue(simple.getNumber() == 333);
    assertTrue("bbb".equals(simple.getString()));
    simple = (TestHelperSimple)i.next();
    assertNotNull(simple);
    assertTrue(simple.getNumber() == 444);
    assertTrue("ccc".equals(simple.getString()));
  } // end testObjectPropertyMapping()

  /**
   * Test reading in a more complex object which is a wrapper around a list of
   * more simple objects where the tag names of the simple objects and simple
   * object attributes are mapped from xml names to their actual java names.
   */
  public void testObjectMapping()
  {
    String configString = createXml(TEST_OBJECT_MAPPING);
    XmlIOConfig config = XmlIOConfig.getInstance();
    // Set up mapping
    List list = new LinkedList();
    list.add(new PropertyMap("obj", "TestHelperSimple"));
    ObjectMap oMap = new ObjectMap("TestHelperComplex", "TestHelperComplex", list);
    config.addObjectMap(oMap);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperComplex helper = (TestHelperComplex)xmlReader.getRootObject();
    assertNotNull(helper);
    assertNotNull(helper.getTestHelperSimple());
    Iterator i = helper.getTestHelperSimple().iterator();
    assertTrue(i.hasNext());
    TestHelperSimple simple = (TestHelperSimple)i.next();
    assertNotNull(simple);
    assertTrue(simple.getNumber() == 222);
    assertTrue("aaa".equals(simple.getString()));
    assertTrue(i.hasNext());
    simple = (TestHelperSimple)i.next();
    assertNotNull(simple);
    assertTrue(simple.getNumber() == 333);
    assertTrue("bbb".equals(simple.getString()));
    simple = (TestHelperSimple)i.next();
    assertNotNull(simple);
    assertTrue(simple.getNumber() == 444);
    assertTrue("ccc".equals(simple.getString()));
  } // end testObjectMapping()

  /**
   * Test reading in a more complex object which is a wrapper around a list of
   * more simple objects where the tag names of the simple objects and simple
   * object attributes are mapped from xml names to their actual java names.
   */
  public void testPropertyMapping()
  {
    String configString = createXml(TEST_PROPERTY_MAPPING);
    XmlIOConfig config = XmlIOConfig.getInstance();
    // Set up mapping
    List list = new LinkedList();
    list.add(new PropertyMap("a", "string"));
    list.add(new PropertyMap("b", "number"));
    ObjectMap oMap = new ObjectMap("TestHelperSimple", "TestHelperSimple", list);
    config.addObjectMap(oMap);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperComplex helper = (TestHelperComplex)xmlReader.getRootObject();
    assertNotNull(helper);
    assertNotNull(helper.getTestHelperSimple());
    Iterator i = helper.getTestHelperSimple().iterator();
    assertTrue(i.hasNext());
    TestHelperSimple simple = (TestHelperSimple)i.next();
    assertNotNull(simple);
    assertTrue(simple.getNumber() == 222);
    assertTrue("aaa".equals(simple.getString()));
    assertTrue(i.hasNext());
    simple = (TestHelperSimple)i.next();
    assertNotNull(simple);
    assertTrue(simple.getNumber() == 333);
    assertTrue("bbb".equals(simple.getString()));
    simple = (TestHelperSimple)i.next();
    assertNotNull(simple);
    assertTrue(simple.getNumber() == 444);
    assertTrue("ccc".equals(simple.getString()));
  } // end testPropertyMapping()

  /**
   * Test reading in a more complex object which is a wrapper around a list of
   * more simple objects where the tag names of the simple objects and simple
   * object attributes are mapped from xml names to their actual java names.
   */
  public void testGlobalPropertyMapping()
  {
    String configString = createXml(TEST_PROPERTY_MAPPING);
    XmlIOConfig config = XmlIOConfig.getInstance();
    // Set up mapping
    config.addPropertyMap(new PropertyMap("a", "string"));
    config.addPropertyMap(new PropertyMap("b", "number"));
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperComplex helper = (TestHelperComplex)xmlReader.getRootObject();
    assertNotNull(helper);
    assertNotNull(helper.getTestHelperSimple());
    Iterator i = helper.getTestHelperSimple().iterator();
    assertTrue(i.hasNext());
    TestHelperSimple simple = (TestHelperSimple)i.next();
    assertNotNull(simple);
    assertTrue(simple.getNumber() == 222);
    assertTrue("aaa".equals(simple.getString()));
    assertTrue(i.hasNext());
    simple = (TestHelperSimple)i.next();
    assertNotNull(simple);
    assertTrue(simple.getNumber() == 333);
    assertTrue("bbb".equals(simple.getString()));
    simple = (TestHelperSimple)i.next();
    assertNotNull(simple);
    assertTrue(simple.getNumber() == 444);
    assertTrue("ccc".equals(simple.getString()));
  } // end testGlobalPropertyMapping()

  /**
   * Test reading an object that has a setter named after a base class, rather than the
   * name of the class actually being instantiated.
   */
  public void testIneritedObjects()
  {
    String configString = createXml(TEST_INHERITANCE);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers:org.bifrost.xmlio.test.helpers.inheritance");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperSalesLot helper = (TestHelperSalesLot)xmlReader.getRootObject();
    assertNotNull(helper);
    assertNotNull(helper.getTestHelperVehicle());
    Iterator i = helper.getTestHelperVehicle().iterator();
   
    // Boat
    assertTrue(i.hasNext());
    TestHelperVehicle superClass = (TestHelperVehicle)i.next();
    assertNotNull(superClass);
    assertTrue("123".equals(superClass.getVin()));
    assertTrue(superClass.getKms() == 1000);
    assertTrue(superClass instanceof TestHelperBoat);
    TestHelperBoat boat = (TestHelperBoat)superClass;
    assertTrue("60".equals(boat.getTopSpeedInKnots()));
    // Car number 1
    assertTrue(i.hasNext());
    superClass = (TestHelperVehicle)i.next();
    assertNotNull(superClass);
    assertTrue("i222g4".equals(superClass.getVin()));
    assertTrue(superClass.getKms() == 10000);
    assertTrue(superClass instanceof TestHelperCar);
    TestHelperCar car = (TestHelperCar)superClass;
    assertTrue("4".equals(car.getNumberDoors()));
    // Car number 2
    assertTrue(i.hasNext());
    superClass = (TestHelperVehicle)i.next();
    assertNotNull(superClass);
    assertTrue("i387g6".equals(superClass.getVin()));
    assertTrue(superClass.getKms() == 28000);
    assertTrue(superClass instanceof TestHelperCar);
    car = (TestHelperCar)superClass;
    assertTrue("2".equals(car.getNumberDoors()));
  } // end testInheritedObjects()

  /**
   * Test reading a simple object with 'primative' properties expressed in sub-elements.
   */
  public void testSimpleArray()
  {
    String configString = createXml(TEST_SIMPLE_ARRAY);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperArray helper = (TestHelperArray)xmlReader.getRootObject();
    assertNotNull(helper);
    assertTrue("Got " + helper.getNumber(), helper.getNumber() == 123);
    assertTrue(helper.getString().getClass().isArray());
    String[] array = (String[])helper.getString();
    assertNotNull(array);
    assertTrue(array.length == 3);
    assertTrue("aaa".equals(array[0]));
    assertTrue("bbb".equals(array[1]));
    assertTrue("ccc".equals(array[2]));
  } // end testSimpleArray()

  /**
   * Test reading a simple object with 'primative' properties expressed in sub-elements.
   */
  public void testComplexArray()
  {
    String configString = createXml(TEST_COMPLEX_ARRAY);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperComplexArray helper = (TestHelperComplexArray)xmlReader.getRootObject();
    assertNotNull(helper);
    assertTrue(helper.getNumber() == 123);
    assertTrue(helper.getTestHelperSimple().getClass().isArray());
    TestHelperSimple[] array = (TestHelperSimple[])helper.getTestHelperSimple();
    assertNotNull(array);
    assertTrue(array.length == 3);
    TestHelperSimple test = array[0];
    assertNotNull(test);
    assertTrue(test.getNumber() == 222);
    assertTrue("aaa".equals(test.getString()));
    test = array[1];
    assertNotNull(test);
    assertTrue(test.getNumber() == 333);
    assertTrue("bbb".equals(test.getString()));
    test = array[2];
    assertNotNull(test);
    assertTrue(test.getNumber() == 444);
    assertTrue("ccc".equals(test.getString()));
  } // end testSimpleArray()

  /**
   * Test reading an object that has a setter named after a base class, rather than the
   * name of the class actually being instantiated.
   */
  public void testMultiplePackagesSimple()
  {
    String configString = createXml(TEST_MULTI_PACKAGE);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader,
        "org.bifrost.xmlio.test.helpers:org.bifrost.xmlio.test.helpers.subpackage");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperTwoPackages helper = (TestHelperTwoPackages)xmlReader.getRootObject();
    assertNotNull(helper);
    assertNotNull(helper.getTestHelperSimple());
    Iterator i = helper.getTestHelperSimple().iterator();
    assertTrue(i.hasNext());
    TestHelperSimple simpleHelper = (TestHelperSimple)i.next();
    assertEquals(simpleHelper.getNumber(), 222l);
    assertEquals(simpleHelper.getString(), "aaa");
    assertTrue(i.hasNext());
    TestHelperOther otherHelper = (TestHelperOther)i.next();
    assertEquals(otherHelper.getNumber(), 123l);
    assertEquals(otherHelper.getLetter(), "ccc");
  } // end testAbstractObject()

  /**
   * Test reading an object with 'Date' and 'Timestamp' properties.
   */
  public void testDateSimple()
  {
    String configString = createXml(TEST_DATE_SIMPLE);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;

    // Configure date/timestamp formats
    XmlIOConfig config = XmlIOConfig.getInstance();
    DateConverter dconv = new DateConverter("yyyy-MM-dd");
    config.addConverter(dconv);
    TimestampConverter tconv = new TimestampConverter("yyyy-MM-dd HH:mm");
    config.addConverter(tconv);

    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperDate helper = (TestHelperDate)xmlReader.getRootObject();
    assertNotNull(helper);
    Calendar cal = new GregorianCalendar();
    // Validate that the date property was set correctly
    // Note: month numbers start from 0!
    cal.setTime(helper.getCreated());
    assertTrue(cal.get(Calendar.YEAR) == 2003);
    assertTrue(cal.get(Calendar.MONTH) == 9);
    assertTrue(cal.get(Calendar.DAY_OF_MONTH) == 20);
    assertTrue(cal.get(Calendar.HOUR_OF_DAY) == 10);
    assertTrue(cal.get(Calendar.MINUTE) == 32);
    assertTrue(cal.get(Calendar.SECOND) == 0);
    // Validate that the timestamp property was set correctly
    cal.setTime(helper.getStartDate());
    assertTrue(cal.get(Calendar.YEAR) == 2002);
    assertTrue(cal.get(Calendar.MONTH) == 5);
    assertTrue(cal.get(Calendar.DAY_OF_MONTH) == 16);
    // Validate that the calendar property was set correctly
    cal = helper.getCalendar();
    assertTrue(cal.get(Calendar.YEAR) == 2002);
    assertTrue(cal.get(Calendar.MONTH) == 8);
    assertTrue(cal.get(Calendar.DAY_OF_MONTH) == 21);
    assertTrue(cal.get(Calendar.HOUR_OF_DAY) == 23);
    assertTrue(cal.get(Calendar.MINUTE) == 47);
    assertTrue(cal.get(Calendar.SECOND) == 34);
  } // end testDateSimple()

  /**
   * Test reading an object with 'Date' and 'Timestamp' properties.  The Date
   * properties use a couple of different date formats.
   */
  public void testDateComplex()
  {
    String configString = createXml(TEST_DATE_COMPLEX);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;

    // Configure date/timestamp formats
    XmlIOConfig config = XmlIOConfig.getInstance();
    DateConverter dconv = new DateConverter("yyyy-MM-dd");
    config.addConverter(dconv);
    TimestampConverter tconv = new TimestampConverter("yyyy-MM-dd HH:mm");
    config.addConverter(tconv);

    List plist = new LinkedList();
    PropertyMap pmap = new PropertyMap("created");
    plist.add(pmap);
    pmap = new PropertyMap("startDate");
    plist.add(pmap);
    pmap = new PropertyMap("startTime");
    dconv = new DateConverter("HH:mm:ss");
    pmap.setConverter(dconv);
    plist.add(pmap);
    pmap = new PropertyMap("endTime");
    pmap.setConverter(dconv);
    plist.add(pmap);
    ObjectMap omap = new ObjectMap("TestHelperDate", "TestHelperDate", plist);
    config.addObjectMap(omap);

    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperDate helper = (TestHelperDate)xmlReader.getRootObject();
    assertNotNull(helper);
    Calendar cal = new GregorianCalendar();
    // Validate that the timestamp property was set correctly
    cal.setTime(helper.getCreated());
    assertTrue(cal.get(Calendar.YEAR) == 2003);
    assertTrue(cal.get(Calendar.MONTH) == 9);
    assertTrue(cal.get(Calendar.DAY_OF_MONTH) == 20);
    assertTrue(cal.get(Calendar.HOUR_OF_DAY) == 10);
    assertTrue(cal.get(Calendar.MINUTE) == 32);
    assertTrue(cal.get(Calendar.SECOND) == 0);
    // Validate that the date property was set correctly
    cal.setTime(helper.getStartDate());
    assertTrue(cal.get(Calendar.YEAR) == 2002);
    assertTrue(cal.get(Calendar.MONTH) == 5);
    assertTrue(cal.get(Calendar.DAY_OF_MONTH) == 16);
    // Validate that the first time property was set correctly
    cal.setTime(helper.getStartTime());
    assertTrue(cal.get(Calendar.HOUR_OF_DAY) == 10);
    assertTrue(cal.get(Calendar.MINUTE) == 32);
    assertTrue(cal.get(Calendar.SECOND) == 54);
    // Validate that the first time property was set correctly
    cal.setTime(helper.getEndTime());
    assertTrue(cal.get(Calendar.HOUR_OF_DAY) == 23);
    assertTrue(cal.get(Calendar.MINUTE) == 4);
    assertTrue(cal.get(Calendar.SECOND) == 47);
  } // end testDateObject()

  /**
   * Test the case where the xml has an attribute not found in the object.
   */
  public void testSimpleInvalidAttributeName()
  {
    String configString = createXml(TEST_SIMPLE_NO_ATTRIBUTE);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
      assertNotNull(xmlReader) ;
    }
    catch (XmlException e)
    {
      String test = e.toString().toLowerCase();
      assertTrue("Got " + test, test.indexOf(ReaderContentHandler.EX_SETTER_NAME.toLowerCase()) >= 0);
      return;
    }
    catch (Exception e)
    {
      fail("Unexpected exception: " + e.toString());
    }
    fail("An attribute not found exception should have been thrown.");
  } // end testSimpleInvalidAttributeName()

  /**
   * Test the case where the xml has an object that cannot be instantiated.
   */
  public void testObjectNotFound()
  {
    String configString = createXml(TEST_NO_OBJECT);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
      assertNotNull(xmlReader) ;
    }
    catch (XmlException e)
    {
      String test = e.toString().toLowerCase();
      assertTrue(test.indexOf(ReaderContentHandler.EX_CREATE_OBJECT.toLowerCase()) >= 0);
      return;
    }
    catch (Exception e)
    {
      fail("Unexpected exception: " + e.toString());
    }
    fail("An attribute not found exception should have been thrown.");
  } // end testObjectNotFound()

  /**
   * Test an object that contains all of the types that the framework
   * considers to be 'primative'.
   */
  public void testAllTypes()
  {
    String configString = createXml(TEST_ALL_TYPES);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperTypes helper = (TestHelperTypes)xmlReader.getRootObject();
    assertNotNull(helper);
    assertEquals(helper.getPint(), 1);
    assertEquals(helper.getInteger(), new Integer(2));
    assertTrue(helper.getString().equals("mdk"));
    assertEquals(helper.getPlong(), 3l);
    assertEquals(helper.getOlong(), new Long(4));
    assertEquals(helper.isPbool(), true);
    assertEquals(helper.getObool(), new Boolean(true));
    assertTrue(helper.getPfloat() == 5.2f);
    assertEquals(helper.getOfloat(), new Float(6.2));
    assertEquals(helper.getPshort(), (short)7);
    assertEquals(helper.getOshort(), new Short((short)8));
    assertEquals(helper.getPbyte(), (byte)9);
    assertEquals(helper.getObyte(), new Byte((byte)10));
    assertEquals(helper.getPchar(), 'a');
    assertEquals(helper.getOchar(), new Character('b'));
    assertTrue(helper.getPdouble() == 11.2d);
    assertEquals(helper.getOdouble(), new Double(12.2));

    Calendar cal = new GregorianCalendar();
    cal.setTime(helper.getDate());
    assertTrue("Got " + cal.get(Calendar.YEAR), cal.get(Calendar.YEAR) == 2003);
    assertTrue(cal.get(Calendar.MONTH) == 9);
    assertTrue(cal.get(Calendar.DAY_OF_MONTH) == 20);
    assertTrue(cal.get(Calendar.HOUR_OF_DAY) == 10);
    assertTrue(cal.get(Calendar.MINUTE) == 32);
    assertTrue(cal.get(Calendar.SECOND) == 53);
  } // end testAllTypes()

  /**
   * Test reading a simple object with the object name starting with a lower
   * case letter in the XML (similar to how attribute names appear).
   */
  public void testLowerCaseFirstCharacter()
  {
    String configString = createXml(TEST_LOWER_FIRST_CHAR);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperSimple helper = (TestHelperSimple)xmlReader.getRootObject();
    assertNotNull(helper);
    assertTrue(helper.getNumber() == 123);
    assertTrue("abc".equals(helper.getString()));
  } // end testLowerCaseFirstCharacter()

  /**
   * Test reading a simple object with each 'word' separated with dashes and
   * the whole name in lower case.
   */
  public void testSimpleDashes()
  {
    String configString = createXml(TEST_SIMPLE_DASHES);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperSimple helper = (TestHelperSimple)xmlReader.getRootObject();
    assertNotNull(helper);
    assertTrue(helper.getNumber() == 123);
    assertTrue("abc".equals(helper.getString()));
  } // end testSimpleDashes()

  /**
   * Test reading a more complicated object with each 'word' in the object name
   * and in some attributes separated with dashes and the names in lower case.
   * This test also involves inheritance.
   */
  public void testDashesAndInheritance()
  {
    String configString = createXml(TEST_VEHICLE_INHERITANCE);
    InputStream reader = new ByteArrayInputStream(configString.getBytes());
    XmlReader xmlReader = null;
    try
    {
      xmlReader = new XmlReader(reader,
          "org.bifrost.xmlio.test.helpers.inheritance");
    }
    catch (XmlException e)
    {
      fail("Unexpected error: " + e.toString());
    }
    assertNotNull(xmlReader);
    TestHelperOwner owner = (TestHelperOwner)xmlReader.getRootObject();
    assertNotNull(owner);
    assertTrue("Jane Smith".equals(owner.getName()));
    Collection vehicles = owner.getTestHelperVehicle();
    assertNotNull(vehicles);
    assertTrue(vehicles.size() == 2);
    for (Iterator iter = vehicles.iterator(); iter.hasNext();)
    {
      TestHelperVehicle obj = (TestHelperVehicle) iter.next();
      if (obj instanceof TestHelperCar)
      {
        TestHelperCar car = (TestHelperCar)obj;
        assertTrue("A880BBC64".equals(car.getVin()));
        assertTrue(car.getKms() == 18768);
      }
      if (obj instanceof TestHelperBoat)
      {
        TestHelperBoat boat = (TestHelperBoat)obj;
        assertTrue("6674C".equals(boat.getVin()));
        assertTrue(boat.getKms() == 7248);
      }
    }
  } // end testDashesAndInheritance()

  /**
   * Test reading a object which has another object (non-primative) as an
   * attribute and that attribute is null.
   */
//  public void testNullObject()
//  {
//    String configString = createXml(TEST_NULL_OBJECT);
//    InputStream reader = new ByteArrayInputStream(configString.getBytes());
//    XmlReader xmlReader = null;
//    try
//    {
//      xmlReader = new XmlReader(reader, "org.bifrost.xmlio.test.helpers");
//    }
//    catch (XmlException e)
//    {
//      fail("Unexpected error: " + e.toString());
//    }
//    assertNotNull(xmlReader);
//    TestHelperCompany helper = (TestHelperCompany)xmlReader.getRootObject();
//    assertNotNull(helper);
//    assertTrue("Company Name".equals(helper.getName()));
//    assertNull(helper.getTestHelperPerson());
//  } // end testNullObject()

  /**
   * Strips the class name and returns the package
   * @param String the full classname
   * @returns String the package name
   */
  private String nameOfPackage(String source) {
    String result = new String(source);
    int index = source.lastIndexOf(".");
    if (index > -1)
      result = source.substring(0, index + 1);
    return result;
  } // end nameOfPackage()

} // end FunctionalTestXmlReader Class
TOP

Related Classes of org.bifrost.xmlio.test.FunctionalTestXmlReader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.