/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* TestBook - test the basic features.
*
* The following test assumes that we know the content of the
* graph as we get elements, add and change them. Therefore, the TestBook.xml
* file and this java test should be kept in sync.
*
* Test the following:
*
* single String: get/set/remove/set/get
* boolean (from true): get/set true/get/set false/get/set true/get
* boolean (from false): get/set false/get/set true/get/set false/get
* String[]: get/set (null & !null)/add/remove
* Bean: remove/set(null)/create bean and graph of beans/set/add
*
*/
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import org.netbeans.modules.schema2beans.*;
import book.*;
public class TestBook
extends BaseTest {
public static void main(String[] argv) {
TestBook o =
new TestBook();
if (argv.length > 0)
o.setDocumentDir(argv[0]);
try {
o.run();
}
catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
System.exit(0);
}
public void run()
throws Exception {
Book book;
this.readDocument();
out(
"creating the bean graph");
book = Book.createGraph(doc);
// Check that we can read the graph an it is complete
out(
"bean graph created");
//out(book.toString());
//out(book.clone().toString());
//((BaseBean)book.clone()).write(System.out);
//
// Single string test
//
String s1, s2;
// Get a String element and change it
{
setTest(
"single String - get/set");
s1 = book.getSummary();
s1 +=
"Some more dynamic notes on the summary.";
book.setSummary(s1);
s2 = book.getSummary();
check(s1.equals(s2));
}
// Remove a final string element
{
setTest(
"single String - remove");
book.setSummary(
null);
s2 = book.getSummary();
check(s2==
null);
out(
"should not have a 'summary' element:",
book.dumpDomNode(
"summary", 1));
}
// Adding a final string
{
setTest(
"single String - set new");
book.setSummary(s1);
s2 = book.getSummary();
check(s1.equals(s2));
out(
"should have a 'summary' element:",
book.dumpDomNode(
"summary", 1));
}
//
// Boolean test - from initial value true
//
{
boolean b1, b2;
setTest(
"boolean - get value (from true)");
b1 = book.isGood();
check(b1==
true);
out(
"should have a 'good' element:",
book.dumpDomNode(
"good", 1));
setTest(
"boolean - change to same value (true)");
book.setGood(b1);
check(b1==book.isGood());
out(
"should still have a 'good' element:",
book.dumpDomNode(
"good", 1));
setTest(
"boolean - change to false");
book.setGood(!b1);
check(b1!=book.isGood());
out(
"should not have a 'good' element:",
book.dumpDomNode(
"good", 1));
setTest(
"boolean - change back to true");
book.setGood(b1);
check(b1==book.isGood());
out(
"should have a 'good' element:",
book.dumpDomNode(
"good", 1));
}
//
// Boolean test - from initial value false
//
{
boolean b1, b2;
setTest(
"boolean - get value (from false)");
b1 = book.isAvailable();
check(b1==
false);
out(
"should not have an 'available' element:",
book.dumpDomNode(
"available", 1));
setTest(
"boolean - change to same value (false)");
book.setAvailable(b1);
check(b1==book.isAvailable());
out(
"should not have an 'available' element:",
book.dumpDomNode(
"available", 1));
setTest(
"boolean - change to true");
book.setAvailable(!b1);
check(b1!=book.isAvailable());
out(
"should have now an 'available' element:",
book.dumpDomNode(
"available", 1));
setTest(
"boolean - change back to false");
book.setAvailable(b1);
check(b1==book.isAvailable());
out(
"should not have an 'available' element:",
book.dumpDomNode(
"available", 1));
}
//
// Array of string test
//
// The tests are performed on the Paragraph string array,
// member of the Chapter bean.
// The book contains three chapter. There is one chapter
// with no paragraph, one with one paragraph and one with
// two paragraph. This convers the three cases: empty array,
// array with only one element, and array with more than one
// element.
//
{
out(
"String[] - search for the string arrays");
out(
"found " + book.sizeChapter() +
" chapter in book");
for (
int i=0; i<book.sizeChapter(); i++) {
Chapter c = book.getChapter(i);
out(
"chapter " + (i+1) +
" has " + c.sizeParagraph() +
" paragraphs:", c.dumpDomNode(
"paragraph", 1));
}
}
// Test array size = 0
{
Chapter c =
null;
setTest(
"String[0] - search for empty array");
for (
int i=0; i<book.sizeChapter(); i++) {
Chapter c2 = book.getChapter(i);
if (c2.sizeParagraph() == 0) {
c = c2;
break;
}
}
check(c !=
null);
int tmp[] = {-1, 0, 1, 999};
// Check for out of bound exception
for (
int i=0; i<tmp.length; i++) {
setTest(
"String[0] - out of bounds access [" + tmp[i] +
"]");
s1 =
"This is a new paragraph";
try {
c.setParagraph(tmp[i], s1);
check(
false,
"didn't get an exception");
}
catch(IndexOutOfBoundsException e) {
check(
true,
"(IndexOutOfBoundsException)");
}
catch(Exception ee) {
check(
false, ee.getMessage());
}
}
// Adding an element
setTest(
"String[0] - add a string to the array");
c.addParagraph(s1);
if (c.sizeParagraph() != 1)
err(
"array size != 1");
s2 = c.getParagraph(0);
check(s1.equals(s2));
out(
"should contain one paragraph:",
c.dumpDomNode(
"paragraph", 1));
setTest(
"String[0] - add another string to the array");
c.addParagraph(s1);
if (c.sizeParagraph() != 2)
err(
"array size != 2");
s2 = c.getParagraph(1);
check(s1.equals(s2));
out(
"should contain two paragraphs:",
c.dumpDomNode(
"paragraph", 1));
setTest(
"String[0] - compare paragraphs");
s1 = c.getParagraph(0);
s2 = c.getParagraph(1);
check(s1.equals(s2),
"(same content)");
check(s1 != s2,
"(different instances)");
setTest(
"String[0] - remove element");
c.setParagraph(0,
null);
check(c.sizeParagraph() == 2);
out(
"should contain one paragraph:",
c.dumpDomNode(
"paragraph", 1));
setTest(
"String[0] - access elements");
s2 = c.getParagraph(0);
check(s2 ==
null,
"(first, should be null)");
s2 = c.getParagraph(1);
check(s2 !=
null,
"(second, should be !null)");
s1 =
"This is another new paragraph";
setTest(
"String[0] - set again first element");
c.setParagraph(0, s1);
check(c.sizeParagraph() == 2);
out(
"should contain two paragraphs:",
c.dumpDomNode(
"paragraph", 1));
setTest(
"String[0] - removing all elements");
s1 = c.getParagraph(1);
int i1 = c.removeParagraph(s1);
check(i1 == 1,
"(removed correct index)");
check(c.sizeParagraph() == 1,
"(size is now 1)");
s1 = c.getParagraph(0);
int i2 = c.removeParagraph(s1);
check(i2 == 0,
"(removed correct index)");
check(c.sizeParagraph() == 0,
"(size is now 0)");
out(
"should contain no paragraph:",
c.dumpDomNode(
"paragraph", 1));
}
// Test array size = 1
{
Chapter c =
null;
s1 =
"This is again another new paragraph";
setTest(
"String[0] - search for array of size 1");
for (
int i=0; i<book.sizeChapter(); i++) {
Chapter c2 = book.getChapter(i);
if (c2.sizeParagraph() == 1) {
c = c2;
break;
}
}
check(c !=
null);
int tmp[] = {-1, 1, 999};
// Check for out of bound exception
for (
int i=0; i<tmp.length; i++) {
setTest(
"String[0] - out of bounds access [" + tmp[i] +
"]");
try {
c.setParagraph(tmp[i], s1);
check(
false,
"didn't get an exception");
}
catch(IndexOutOfBoundsException e) {
check(
true,
"(IndexOutOfBoundsException)");
}
catch(Exception ee) {
check(
false, ee.getMessage());
}
}
// Adding an element
setTest(
"String[0] - add a string to the array");
c.addParagraph(s1);
if (c.sizeParagraph() != 2)
err(
"array size != 2");
s2 = c.getParagraph(1);
check(s1.equals(s2));
out(
"should contain two paragraphs:",
c.dumpDomNode(
"paragraph", 1));
setTest(
"String[0] - compare paragraphs");
s1 = c.getParagraph(0);
s2 = c.getParagraph(1);
check(!s1.equals(s2),
"(different content)");
setTest(
"String[0] - add more paragraphs");
s1 =
"I always wanted to be a kind of a big paragraph " +
" as I always dreamed to fill an XML paragraph element " +
" only to make sure it could be large enough stuffed with " +
" useless characters.";
int size = 100;
for (
int i=0; i<size; i++)
c.addParagraph(s1);
check(c.sizeParagraph() == size+2 ,
"(" + size +
" new paragraphs)");
setTest(
"String[0] - removing paragraphs (leaving 10)");
for (
int i=0; i<size-8; i++)
c.removeParagraph(s1);
check(c.sizeParagraph() == 10);
out(
"should contain 10 paragraphs:",
c.dumpDomNode(
"paragraph", 1));
}
//
// Bean elements test
//
// The following tests that we can create a brand new bean,
// populate it with other beans an insert it into an existing
// bean graph.
//
// The bean elements test are using the Index and Ref beans
// of the Book bean graph:
//
// Book
// Index[1,n]
// Word - String
// Ref[1,n]
// Page - String
// Line - String
// ...
//
//
{
Index idx;
int size = book.sizeIndex();
out(
"book has " + size +
" Index beans",
book.dumpDomNode(
"index", 1));
setTest(
"remove a bean w/ remove()");
idx = book.getIndex(0);
int i1 = book.removeIndex(idx);
check(i1==0,
"(correct element removed)");
check(book.sizeIndex()==size-1,
"(correct Index array size)");
out(
"book should have " + (size - 1) +
" Index beans",
book.dumpDomNode(
"index", 1));
setTest(
"remove another bean w/ set(null)");
idx = book.getIndex(0);
book.setIndex(0,
null);
check(book.sizeIndex()==size-1,
"(correct Index array size)");
out(
"book should have " + (size - 2) +
" Index beans",
book.dumpDomNode(
"index", 1));
setTest(
"add an empty bean to the graph");
idx =
new Index();
book.addIndex(idx);
check(book.sizeIndex()==size,
"(correct Index array size)");
out(
"book should have " + (size - 1) +
" Index beans",
book.dumpDomNode(
"index", 1));
setTest(
"add a subtree bean");
Ref r =
new Ref();
r.setPage(
"122");
r.setLine(
"32");
idx =
new Index();
idx.addRef(r);
r =
new Ref();
r.setPage(
"1");
r.setLine(
"3");
idx.addRef(r);
idx.setWord(
"who");
book.setIndex(0, idx);
out(
"book should have " + size +
" Index beans",
book.dumpDomNode(
"index", 1));
out(
"idx should have 2 refs",
idx.dumpDomNode(3));
check(book.sizeIndex() == size);
setTest(
"add another subtree bean");
r =
new Ref();
r.setPage(
"22");
r.setLine(
"2");
idx =
new Index();
idx.setWord(
"what");
idx.addRef(r);
book.addIndex(idx);
out(
"book should have " + (size+1) +
" Index beans",
book.dumpDomNode(
"index", 1));
out(
"idx should have 1 ref",
idx.dumpDomNode(3));
check(book.sizeIndex() == size+1);
setTest(
"should failed adding the same instance subtree");
try {
book.addIndex(idx);
check(
false,
"didn't get an exception");
}
catch(IllegalArgumentException e) {
check(
true,
"\n >> caught: " + e);
}
catch(Exception ee) {
ee.printStackTrace();
check(
false,
"\n >> got wrong type of exception: " + ee);
}
setTest(
"add the same cloned tree");
int i2 = book.addIndex((Index)book.getIndex(0).clone());
out(
"book should have " + (i2+1) +
" Index beans",
book.dumpDomNode(
"index", 1));
out(
"Initial Index is:",
book.getIndex(0).dumpDomNode(3));
out(
"New Index should be identical:",
book.getIndex(i2).dumpDomNode(3));
check(book.sizeIndex() == i2+1);
}
//
// Bean elements test 2
//
// The following tests that we can create, add, remove beans
// and values of a graph that is not attached to a DOM tree.
//
{
Index idx =
new Index();
idx.setWord(
"oops");
setTest(
"add beans");
Ref r =
new Ref();
r.setPage(
"999");
r.setLine(
"9");
idx.addRef(r);
r =
new Ref();
r.setPage(
"888");
r.setLine(
"8");
idx.addRef(r);
check(idx.sizeRef()==2,
"(correct size of array)");
out(
"should have nothing to print: ", idx.dumpDomNode(1));
setTest(
"remove an element");
idx.removeRef(r);
check(idx.sizeRef()==1,
"(correct size of array)");
setTest(
"remove last element");
idx.setRef(0,
null);
check(idx.sizeRef()==1,
"(correct size)");
r =
new Ref();
r.setPage(
"77");
r.setLine(
"7");
idx.setRef(0, r);
out(
"add an element and test getValues:", idx.dumpBeanNode());
}
//
// The following test creates a brand new bean graph and therefore
// a new DOM graph.
//
setTest(
"creating the root for a brand new graph");
book = Book.createGraph();
check(book !=
null);
setTest(
"populating the graph");
book.setGood(
false);
book.setAvailable(
true);
book.setSummary(
"This book is about avoiding summaries at the end of books");
Chapter c =
new Chapter();
c.setComment(
"What's a good summary in chapter 1");
c.setComment2(
"Additional comment");
c.addParagraph(
"This is the first paragraph");
c.addParagraph(
"This is a second paragraph");
book.addChapter(c);
c =
new Chapter();
book.addChapter(c);
c.setComment(
"Yet another comment for chapter 2");
c.addParagraph(
"only one paragraph in this second chapter");
c =
new Chapter();
book.addChapter(c);
Index i =
new Index();
i.setWord(
"summary");
Ref r =
new Ref();
r.setPage(
"22");
r.setLine(
"12");
i.addRef(r);
r =
new Ref();
i.addRef(r);
r.setPage(
"4");
r.setLine(
"5");
book.addIndex(i);
check(
true);
out(
"print the new graph DOM nodes:",
book.dumpDomNode(9));
out(
"Re-read the original XML file for array getter/setter testing");
this.readDocument();
book = Book.createGraph(doc);
out(
"bean graph created");
{
setTest(
"check Index[] getter() method");
Index []a1 = book.getIndex();
check(a1.length == book.sizeIndex(),
"(correct array size)");
check(a1[0] == book.getIndex(0),
"(same first element)");
check(a1[1] == book.getIndex(1),
"(same second element)");
check(a1[0] != book.getIndex(1),
"([0] != [1])");
setTest(
"check Chapter[] getter() method");
Chapter []a2 = book.getChapter();
check(a2.length == book.sizeChapter(),
"(correct array size)");
check(a2[0] == book.getChapter(0),
"(same first element)");
check(a2[1] == book.getChapter(1),
"(same second element)");
check(a2[2] == book.getChapter(2),
"(same third element)");
check(a2[0] != book.getChapter(2),
"([0] != [2])");
setTest(
"check Chapter.Paragraph getter() method");
String []p = a2[0].getParagraph();
check(p.length == book.getChapter(0).sizeParagraph(),
"(correct array size)");
p = a2[1].getParagraph();
check(p.length == book.getChapter(1).sizeParagraph(),
"(correct array size)");
p = a2[2].getParagraph();
check(p.length == book.getChapter(2).sizeParagraph(),
"(correct array size)");
setTest(
"change the Chapter[] order");
int []s =
new int[3];
s[0] = a2[0].sizeParagraph();
s[1] = a2[1].sizeParagraph();
s[2] = a2[2].sizeParagraph();
Chapter []a3 =
new Chapter[3];
a3[2] = (Chapter)a2[0];
a3[1] = (Chapter)a2[1];
a3[0] = (Chapter)a2[2];
book.setChapter(a3);
check(book.getChapter(2).sizeParagraph()==s[0],
"(reversed first element)");
check(book.getChapter(1).sizeParagraph()==s[1],
"(same second element)");
check(book.getChapter(0).sizeParagraph()==s[2],
"(reversed third element)");
setTest(
"Chapter going in and out of Book");
out(
"Make sure the contents of a Chapter object remain intact after removing that Chapter from the Book");
Chapter undecidedChapter =
new Chapter();
undecidedChapter.setComment(
"This chapter may not make it into the book.");
out(undecidedChapter.getComment());
book.addChapter(undecidedChapter);
out(book.sizeChapter());
check(book.getChapter(book.sizeChapter()-1) == undecidedChapter,
"undecided chapter is in there");
book.removeChapter(undecidedChapter);
out(
"make sure undecidedChapter is intact");
out(undecidedChapter.getComment());
out(
"make sure book is intact");
out(book.sizeChapter());
out(
"Put the chapter back in.");
book.addChapter(undecidedChapter);
out(book);
}
// Read again the document and play with the choice properties
this.readDocument();
out(
"creating the bean graph");
book = Book.createGraph(doc);
setTest(
"check if the root has any choice prop");
Iterator it = book.listChoiceProperties();
check(!it.hasNext(),
"(none found)");
check(book.listChoiceProperties(
"Chapter") ==
null,
"(none found on Chapter prop)")
;
check(book.listChoiceProperties("index") == null, "(none found on index prop)");
setTest("test extra prop");
BaseProperty[] bps;
Extra e = book.getExtra();
it = e.listChoiceProperties();
check(it.hasNext(), "(at least one)");
//#90905: the iterator returns the elements in different order
// for jdk5 and 6, so we need to put them to a list to maintain the order.
List<BaseProperty[]> propertiesList = new ArrayList<BaseProperty[]>();
while (it.hasNext()) {
propertiesList.add((BaseProperty[])it.next());
}
Collections.sort(propertiesList, new Comparator<BaseProperty[]>(){
public int compare(BaseProperty[] o1, BaseProperty []o2) {
return o1[0].getName().compareTo(o2[0].getName());
}});
for (BaseProperty[] each : propertiesList){
out("Getting a set of choice properties:");
this.printChoiceProperties(each);
}
out("Getting the same list 3 times:");
bps = e.listChoiceProperties("Size");
this.printChoiceProperties(bps);
bps = e.listChoiceProperties("size-cm");
this.printChoiceProperties(bps);
bps = e.listChoiceProperties("size-inches");
this.printChoiceProperties(bps);
out("Getting twice the same list:");
bps = e.listChoiceProperties("WeightKg");
this.printChoiceProperties(bps);
bps = e.listChoiceProperties("weight-lb");
this.printChoiceProperties(bps);
check(!e.isChoiceProperty("color"), " color not choice prop");
//
// This tests the DDParser class
//
//this.out(book.dumpBeanNode());
this.parse(book, "/Book/Good");
this.parse(book, "/Good");
this.parse(book, "Summary/");
book.setSummary(null);
this.parse(book, "Summary");
this.parse(book, "Available");
this.parse(book, "Extra");
this.parse(book, "Chapter");
this.parse(book, "Chapter/Comment");
this.parse(book, "Chapter/Paragraph");
this.parse(book, "index/ref/line");
out(book.dumpBeanNode());
this.parse(book, "/Book/Index.Word=E-Tools/Ref/Page");
this.parse(book, "/Book/Index.Word=E-Tool/Ref/Page");
this.parse(book, "/Book/Index.Word=E-Tool/Ref.Line=15/Page");
this.parse(book, "/Book/Index.Word=E-Tool/Ref.Line=15/Page=22");
this.parse(book, "/Book/Index.Word=E-Tool/Ref.Line=15/Page=5");
book = new Book();
out(book.dumpBeanNode());
this.parse(book, "/Book/Index.Word=E-Tools/Ref.Line=15/Page!");
out(book.dumpBeanNode());
this.parse(book, "/Book/Chapter.Comment=My Comment");
out(book.dumpBeanNode());
this.parse(book, "/Book/Chapter.Comment=My Comment!");
out(book.dumpBeanNode());
this.parse(book, "/Book/Index.Word=the word/Ref.Line=10/Page=20!");
out(book.dumpBeanNode());
// Make sure that we can merge (this test the case of merge
// without attribute which is covered by TestMerge)
setTest("simple merge");
this.readDocument();
out("creating the bean graph");
book = Book.createGraph(doc);
Book b2 = (Book)book.clone();
s1 = "Some more dynamic notes on the summary.";
b2.setSummary(s1);
b2.getChapter(0).setComment("New Comment");
book.merge(b2);
check(book.isEqualTo(b2), "identical graphs");
// Merge two elements that are not part of the graph
Chapter c1 = new Chapter();
Chapter c2 = new Chapter();
c1.merge(c2);
}
void parse(BaseBean bean, String parse) {
out("Parsing " + parse);
DDParser p = new DDParser(bean, parse);
while (p.hasNext()) {
Object o = p.next();
if (o != null) {
if (o instanceof BaseBean)
this.out(((BaseBean)o).dumpBeanNode());
else
this.out(o.toString());
}
else
this.out("null");
}
}
void printChoiceProperties(BaseProperty[] bps) {
if (bps == null)
err("got null instead a BaseProperty[] instance");
else {
for (int l=0; l<bps.length; l++)
check(bps[l].isChoiceProperty(), bps[l].getDtdName());
}
}
}