/*
* YamParseTreeTests.java
* Copyright (c) 1998-2008, The University of Sheffield.
*
* This code is from the GATE project (http://gate.ac.uk/) and is free
* software licenced under the GNU General Public License version 3. It is
* distributed without any warranty. For more details see COPYING.txt in the
* top level directory (or at http://gatewiki.sf.net/COPYING.txt).
*
* Hamish Cunningham, 12th May 2006
*/
package gate.yam.parse;
import java.io.*;
import junit.framework.*;
import org.apache.log4j.Logger;
import gate.util.*;
import gate.yam.*;
import gate.yam.*;
/**
* Unit test for YAM parse trees.
*/
public class YamParseTreeTests extends TestCase
{
/** Create the test case */
public YamParseTreeTests(String testName) {
super(testName);
}
/** Logger */
static Logger lgr = Logger.getLogger("gate.yam");
/** SInS (plain) logger */
static Logger slgr = Logger.getLogger("gate.sins");
/**
* Test setup and reset of trees.
*/
public void testTreeStuff() throws Exception
{
// path, suffixes
String path = "/gate/yam/resources/yam-minimal.yam";
// report
lgr.info("testing tree setup and reset");
// a reader for the test file
InputStream testFileStream =
this.getClass().getResourceAsStream(path);
if(testFileStream == null)
fail("couldn't get resource " + path);
BufferedReader testReader =
new BufferedReader(new InputStreamReader(testFileStream, "UTF-8"));
// find the source directory
String testFilePath = this.getClass().getResource(path).getPath();
File testFileDir = new File(testFilePath).getParentFile();
// a writer for the output
StringWriter responseWriter = new StringWriter();
// run the translator and get the response
YamCommand yam = new YamCommand();
YamParseTree tree = yam.translate(
testReader, responseWriter, YamFile.FileType.HTML, testFileDir
);
// check that the tree is non-empty
SimpleNode n = tree.getRootNode();
if(treeEmpty(n)) fail("parse tree empty");
// check that there are the right number of links / includes
int links = tree.getLinks().size();
int includes = tree.getIncludes().size();
assertTrue("wrong number of links: " + links, links == 2);
assertTrue("wrong number of includes: " + includes, includes == 1);
// reset, and check that the tree is empty
tree.reset();
if(! treeEmpty(n)) fail("parse tree not empty");
} // testTreeStuff()
/**
* Test tree merging.
*/
public void testTreeMerging() throws Exception
{
// path, suffixes
String path = "/gate/yam/resources/yam-minimal.yam";
// report
lgr.info("testing tree merging");
// readers for the test file
InputStream testFileStream1 =
this.getClass().getResourceAsStream(path);
if(testFileStream1 == null)
fail("couldn't get resource " + path);
BufferedReader testReader1 =
new BufferedReader(new InputStreamReader(testFileStream1, "UTF-8"));
InputStream testFileStream2 =
this.getClass().getResourceAsStream(path);
if(testFileStream2 == null)
fail("couldn't get resource " + path);
BufferedReader testReader2 =
new BufferedReader(new InputStreamReader(testFileStream2, "UTF-8"));
// find the source directory
String testFilePath = this.getClass().getResource(path).getPath();
File testFileDir = new File(testFilePath).getParentFile();
// writers for the output
StringWriter responseWriter1 = new StringWriter();
StringWriter responseWriter2 = new StringWriter();
// run two translators
YamCommand yam1 = new YamCommand();
YamParseTree tree1 = yam1.translate(
testReader1, responseWriter1, YamFile.FileType.HTML, testFileDir
);
YamCommand yam2 = new YamCommand();
YamParseTree tree2 = yam2.translate(
testReader2, responseWriter2, YamFile.FileType.HTML, testFileDir
);
// get stats for each tree and check they're the same
boolean gotTitle1 = (tree1.getTitleNode() != null);
boolean gotTitle2 = (tree2.getTitleNode() != null);
assertTrue("gotTitle flags disagree", gotTitle1 == gotTitle2);
int numHeaders1 = tree1.getHeadingNodes().size();
int numHeaders2 = tree2.getHeadingNodes().size();
assertTrue("num headers disagree", numHeaders1 == numHeaders2);
int numNodes1 = tree1.getNumNodes(tree1.getRootNode());
int numNodes2 = tree2.getNumNodes(tree2.getRootNode());
assertTrue("num nodes disagree", numNodes1 == numNodes2);
//lgr.info("headings = " + numHeaders1);
//lgr.info("nodes = " + numNodes1);
// merge the trees and check that their stats are combined
tree1.merge(tree2);
boolean gotTitleMerged = (tree1.getTitleNode() != null);
int numHeadersMerged = tree1.getHeadingNodes().size();
int numNodesMerged = tree1.getNumNodes(tree1.getRootNode());
//lgr.info("merged headings = " + numHeadersMerged);
//lgr.info("merged nodes = " + numNodesMerged);
assertTrue("seem to have mislaid merged title", gotTitleMerged);
assertTrue( // headings = double each
"wrong num merged headings", numHeadersMerged == (numHeaders1 * 2)
);
assertTrue( // double, minus one for the root
"wrong num merged nodes", numNodesMerged == ((numNodes1 * 2) - 1)
);
} // testTreeMerging()
/** Helper to check tree contents. */
public boolean treeEmpty(SimpleNode n) {
if(! (
n.getStart() == null &&
n.getEnd() == null &&
n.getBody() == null
)
) {
//lgr.info("non-empty node: " + n.toString());
//lgr.info(
// "n.getStart/End/Body: " + n.getStart() + n.getEnd() + n.getBody()
//);
return false;
}
int i = n.jjtGetNumChildren();
if(i == 0) return true;
for(int j = 0; j < i; j++)
if(! treeEmpty((SimpleNode) n.jjtGetChild(j)))
return false;
return true;
} // treeEmpty(SimpleNode)
} // YamParseTreeTests