/*
* PrettyTranslatorTests.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, 3rd May 2006
*/
package gate.yam.translate;
import java.io.*;
import junit.framework.*;
import org.apache.log4j.Logger;
import gate.*;
import gate.util.*;
import gate.wiki.*;
import gate.yam.*;
import gate.yam.parse.*;
import static gate.yam.translate.NodeKind.*;
/**
* Unit test for PrettyTranslator.
*/
public class PrettyTranslatorTests extends AbstractTranslatorTest
{
/** Logger */
static Logger log =
Logger.getLogger("gate.yam.translate.PrettyTranslatorTests");
/** Initialise GATE if it hasn't already been done. */
static {
if(! Gate.isInitialised()) {
File cowGate =
new File(System.getProperty("user.dir"), "web-app/WEB-INF/gate");
System.setProperty(
"gate.user.session",
new File(cowGate, "user-gate.session").getAbsolutePath()
);
System.setProperty(
"gate.user.config",
new File(cowGate, "user-gate.xml").getAbsolutePath()
);
System.setProperty(
"gate.site.config",
new File(cowGate, "site-gate.xml").getAbsolutePath()
);
Gate.setGateHome(cowGate);
try {
GateClassLoaderCreator.createGateClassLoaderWithParent(
PrettyTranslatorTests.class.getClassLoader());
Gate.init();
} catch(Exception e) {
log.error("couldn't init Gate");
log.error(e);
}
}
} // static block
/** Create the test case. */
public PrettyTranslatorTests(String testName) { super(testName); }
/** Paths of example test files. */
public String[] getTestFilePaths() {
String testFilePaths[] = {
/* TODO
"/yam-errors", // unterminated comment
*/
"/yam-tables",
"/yam-small-tables",
"/yam-tables-bug",
"/yam-errors-min",
"/yam-small-error",
"/yam-minimal",
"/yam-lists",
"/yam-includes",
"/yam-pretty",
"/yam-anchor-links",
"/yam-context",
"/yam-includes2",
"/yam-lists-bug",
"/yam-lists-bug-simple",
"/yam-lists-bug2",
"/yam-lists-bug2-simple",
"/yam-scratch",
"/yam-images",
"/yam-zero",
"/yam-first",
"/yam-urls",
"/yam-predicates",
"/yam-heading-increments",
"/yam-comprehensive",
"/yam-large",
"/yam-backlog-bug",
"/yam-wierd",
"/yam-headings",
"/yam-huge",
};
return testFilePaths;
}
/** Suffix of input files. */
public String getInputSuffix() { return "yam"; }
/** Suffix of output files. */
public String[] getOutputSuffixes() {
String outputSuffixes[] = {
"pretty"
};
return outputSuffixes;
}
/** Run the translator and get the response */
public Writer doTranslation(
Reader testReader, Writer responseWriter, String outputType,
String testName
) throws Exception {
log.debug("testName = " + testName);
// find the source directory
String testFilePath =
this.getClass().getResource(testName + ".yam").getPath();
File testFileDir = new File(testFilePath).getParentFile();
YamParseTree tree = null;
if(outputType.equals("pretty")) {
YamCommand yam = new YamCommand();
tree = yam.translate(
testReader, responseWriter, YamFile.FileType.PRETTY, testFileDir
);
} else {
throw new GateException("unknown output type " + outputType);
}
if(testName.equals("/gate/yam/resources/yam-pretty")) {
log.debug("doing extra tests...");
doSuperCleverMysteriousTests(tree);
}
return responseWriter;
} // doTranslation(...)
public void doSuperCleverMysteriousTests(YamParseTree tree) {
// tree has a first Sep node
SimpleNode rootNode = tree.getRootNode();
SimpleNode child = null;
Class childClass = null;
int childNumber = 0;
int numChildren = rootNode.jjtGetNumChildren();
do {
child = (SimpleNode) rootNode.jjtGetChild(childNumber++);
} while(
childNumber < numChildren && child != null &&
( (childClass = child.getClass()) == ASTSep.class )
);
log.debug("childClass=" + childClass.getName());
assertTrue(child != null && childClass != ASTSep.class);
// Cursor finds the first Sep node, etc.
Cursor here = new Cursor(rootNode, 1, 3);
log.debug(
"previousKind=" + here.getPreviousKind() + "; kind=" + here.getKind() +
"; nextKind=" + here.getNextKind()
);
assertTrue(child == here.getHereNode());
assertTrue(here.getKind() == NodeKind.UNIT_PARA);
assertTrue(here.getPreviousKind() == NodeKind.NULL);
// all children of the root are Sep, Unit or Word
childNumber = 0;
for( ; childNumber < numChildren; childNumber++) {
SimpleNode n = (SimpleNode) rootNode.jjtGetChild(childNumber);
if(n == null) continue;
Class nClass = n.getClass();
log.debug("nClass=" + nClass.getName());
assertTrue(
nClass == ASTSep.class || nClass == ASTWord.class ||
nClass == ASTUnit.class
);
}
log.debug(
"previousKind=" + here.getPreviousKind() + "; kind=" + here.getKind() +
"; nextKind=" + here.getNextKind()
);
checkHere(here, NULL, UNIT_PARA, UNIT_PARA);
here.advance();
checkHere(here, UNIT_PARA, UNIT_PARA, UNIT_INCLUDE);
here.advance();
checkHere(here, UNIT_PARA, UNIT_INCLUDE, UNIT_PARA);
here.advance();
checkHere(here, UNIT_INCLUDE, UNIT_PARA, UNIT_PARA);
here.advance();
checkHere(here, UNIT_PARA, UNIT_PARA, UNIT_SECTION);
here.advance();
checkHere(here, UNIT_PARA, UNIT_SECTION, UNIT_PARA);
here.advance();
checkHere(here, UNIT_SECTION, UNIT_PARA, NULL);
here.advance();
assertTrue(here.atEnd());
checkHere(here, UNIT_PARA, NULL, NULL);
here.advance();
assertTrue(here.atEnd());
checkHere(here, NULL, NULL, NULL);
here.advance();
assertTrue(here.atEnd());
checkHere(here, NULL, NULL, NULL);
} // doSuperClever...
/** check the types at the current cursor position */
void checkHere(Cursor c, NodeKind prevK, NodeKind hereK, NodeKind nextK) {
log.debug(
"previousKind=" + c.getPreviousKind() + "; kind=" + c.getKind() +
"; nextKind=" + c.getNextKind()
);
assertTrue(c.getPreviousKind() == prevK);
assertTrue(c.getKind() == hereK);
assertTrue(c.getNextKind() == nextK);
} // checkHere(Cursor, NodeKind, NodeKind, NodeKind)
} // PrettyTranslatorTests