/*
* YamTest.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, 2nd February 2007
*/
package gate.yam;
import java.io.*;
import junit.framework.*;
import org.apache.log4j.Logger;
import org.springframework.core.io.*;
import org.springframework.context.support.*;
import gate.util.*;
import gate.yam.*;
import gate.yam.parse.*;
import gate.yam.translate.*;
import gate.yam.convert.*;
/**
* Unit test for the YamFile class.
*/
public class YamTests extends TestCase
{
/** Create the test case */
public YamTests(String testName) {
super(testName);
}
/** Logger */
static Logger log = Logger.getLogger("gate.yam.YamTest");
/** The URL of the bibliography file used for citations in tests */
private static String BIB_URL = "http://gate.ac.uk/sale/bib/main.html";
/** The anchor prefix used for citations in tests */
private static String BIB_ANCHOR_PREFIX = "X";
/** Resource directory name. */
static final String resDir = AbstractTranslatorTest.resDir;
/**
* Test file-system translate method. Takes yam-again.yam and generates
* an html file on disk from it, yam-again.html. Compares this with
* yam-minimal.html. The comparison assumes that yam-again.yam is a copy of
* yam-minimal.yam
*
*/
public void testFSTranslate() throws Exception
{
// report
log.info("=============================================================");
log.info("============= YamTest.testFSTranslate() =====================");
log.info("testing file-system-based translate");
log.debug("**NOTE**: yam-again.yam should be copy of yam-minimal.yam");
// path, suffixes
String path = "/yam-again.yam";
String keyPath = "/yam-again.html";
String responsePath = "/yam-minimal.html";
// get the spring context and get an FSR from the path
ClassPathXmlApplicationContext factory = new
ClassPathXmlApplicationContext(resDir + "/spring-app-context.xml");
FileSystemResource yamLocation =
new FileSystemResource(factory.getResource(resDir + path).getFile());
// the yam factory method: finding a .yam
log.info("yamLocation = " + yamLocation.getDescription());
YamFile yam = YamFile.get(yamLocation);
if(yam == null) fail("yam == null");
log.info("yam.getLocation().getPath() = " + yam.getLocation().getPath());
assertEquals(
"path != yam.getLocation.getPath()", yamLocation.getPath(),
yam.getLocation().getPath()
);
// the yam factory method: finding a .yam via a .html
FileSystemResource htmlLocation = new
FileSystemResource(factory.getResource(resDir + responsePath).getFile());
YamFile yamFromHtml = YamFile.get(htmlLocation);
log.info("yamFromHtml = " + yamFromHtml.getLocation().getDescription());
htmlLocation = new FileSystemResource("/nonexistant.html");
yamFromHtml = YamFile.get(htmlLocation);
assertNull("yamFromHtml should be null", yamFromHtml);
// check that the dependent html needs regeneration
StringBuilder yamAgainYamPath =
new StringBuilder(yamLocation.getFile().getPath());
int len = yamAgainYamPath.length();
String yamAgainHtmlPath =
yamAgainYamPath.replace(
len - 4, len, YamFile.FileType.HTML.suffix()
).toString();
(new File(yamAgainHtmlPath)).delete();
FileSystemResource yamAgainHtmlLocation =
new FileSystemResource(yamAgainHtmlPath);
log.debug("yamAgainHtmlLocation= "+yamAgainHtmlLocation.getDescription());
YamFile yamForRegen = YamFile.needsGeneration(yamAgainHtmlLocation);
assertNotNull("yamForRegen is null", yamForRegen);
// check that the non-existent dependent html doesn't need generation
log.debug("htmlLocation= "+htmlLocation.getDescription());
yamForRegen = YamFile.needsGeneration(htmlLocation);
assertNull("yamForRegen is not null", yamForRegen);
// config, run the translator and get the response
yam.setBibPageUrl(new UrlResource(BIB_URL));
yam.setBibAnchorPrefix(BIB_ANCHOR_PREFIX);
YamParseTree tree = yam.generate();
// check that the tree is non-empty
SimpleNode n = tree.getRootNode();
if(new YamParseTreeTests("testFSTranslate").treeEmpty(n))
fail("testFSTranslate: parse tree empty");
// check that the output file is correct
String key = YamTestUtils.getResourceAsString(resDir + keyPath, "UTF-8");
String response =
YamTestUtils.getResourceAsString(resDir + responsePath, "UTF-8");
boolean correctResponse = (response.compareTo(key) == 0);
if(!correctResponse) {
String errorPath = "." + responsePath + "-error";
FileWriter fwriter = new FileWriter(errorPath);
fwriter.write(key);
fwriter.close();
fail(
"response not equal to key (1) for test file " + responsePath +
Strings.getNl() + " error response in " + errorPath
);
}
// check that getting via the (YAM) path and its (HTML) dependency both
// return the same path
FileSystemResource yamLocation2 =
new FileSystemResource(factory.getResource(resDir + keyPath).getFile());
YamFile yam2 = YamFile.get(yamLocation2);
assertEquals(
"yam != yam2",
yam.getLocation().getDescription(), yam2.getLocation().getDescription()
);
log.info("=============================================================");
} // testFSTranslate()
/**
* Test a translation from yam to html out of context. Takes yam-again.yam,
* and writes it to a new disk file, yam-test*.yam. YAM statements are now
* out of their original context. Translates yam-test*.yam to yam-test*.html
* and compares this to yam-minimal.html.
*/
public void testContextPath() throws Exception
{
// report
log.info("============= YamTest.testContextPath() =====================");
log.info("testing out of context translate");
// path, suffixes
String path = "/yam-again.yam";
String keyPath = "/yam-minimal.html";
// get the spring context and get an FSR from the path
ClassPathXmlApplicationContext factory = new
ClassPathXmlApplicationContext(resDir + "/spring-app-context.xml");
FileSystemResource yamLocation =
new FileSystemResource(factory.getResource(resDir + path).getFile());
// create a temp file with a copy of yam-again
log.info(yamLocation.getPath());
String yamText = Files.getString(yamLocation.getPath());
File tempFile = File.createTempFile("yam-test", ".yam");
FileWriter fwriter = new FileWriter(tempFile);
fwriter.write(yamText);
fwriter.close();
// do translation with the context path set
YamFile translator = YamFile.get(new FileSystemResource(tempFile));
log.info("setContextPath(yamLocation.getPath()) =" + yamLocation.getPath());
translator.setContextPath(yamLocation.getFile().getParent() + "/");
translator.setBibPageUrl(new UrlResource(BIB_URL));
translator.setBibAnchorPrefix(BIB_ANCHOR_PREFIX);
YamParseTree tree = translator.generate();
// measure difference with yam-minimal.html
String newResponsePath = tempFile.getPath().replaceAll("\\.yam", ".html");
String newResponse = Files.getString(newResponsePath);
String key = YamTestUtils.getResourceAsString(resDir + keyPath, "UTF-8");
boolean correctResponse = (newResponse.compareTo(key) == 0);
if(!correctResponse) {
String errorPath =
"./" + tempFile.getName().replaceAll("\\.yam", ".html") + "-error";
fwriter = new FileWriter(errorPath);
fwriter.write(newResponse);
fwriter.close();
fail(
"newResponse not equal to key (2) for test file " + newResponsePath +
Strings.getNl() + " error response in " + errorPath
);
}
log.info("=============================================================");
} // testContextPath()
/**
* Test the file types enum.
*/
public void testFileTypes() throws Exception {
log.info("============= YamTest.testFileTypes() =====================");
for(YamFile.FileType type : YamFile.FileType.values())
log.debug("type=" + type + "; suffix=" + type.suffix());
assertEquals(
"suffix should be .html", ".html", YamFile.FileType.HTML.suffix()
);
if(! (YamFile.FileType.LATEX.translator() instanceof LaTeXTranslator))
fail("wrong translator type");
if(! YamFile.FileType.dependent("something.html"))
fail(".html not dependent");
if(YamFile.FileType.dependent("something"))
fail("something dependent");
File tempFile = File.createTempFile("yam-test-file-types-", ".yam");
YamFile yam = YamFile.get(tempFile);
File htmlFile = yam.getOutputFile(YamFile.FileType.HTML);
String pathShouldBe = yam.getLocation().getFile().getPath();
pathShouldBe =
pathShouldBe.substring(0, pathShouldBe.lastIndexOf('.')) + ".html";
assertEquals(
"oops, paths not equal", pathShouldBe, htmlFile.getPath()
);
log.debug("htmlFile path = " + htmlFile.getPath());
} // testFileTypes()
/**
* <p>Test HtmlToYamConverter, using an html file generated with no includes
* processing. Takes the file yam-minimal-no-includes.html, and converts to
* yam im memory. Compares this in-memory yam with a disk copy of
* yam-minimal.yam.
* </p>
* <p>
* If there is a difference between the original and resultant yam, then
* the resultant yam will be output to <tt>yam-again.yam-conversion-fault<tt>
* Results can be viewed by e.g:
* </p>
* <p><tt>
* tkdiff yam-minimal-no-includes.yam-conversion-fault \
* test/resources/yam/yam-minimal.yam &
* </tt></p>
*/
public void testHtmlToYamNoIncludes() throws Exception
{
log.info("==============================================================");
log.info("============= YamTest.testHtmlToYamNoIncludes() ==============");
log.info("testing html to yam, from html with no includes processing");
String keyPath = "/yam-minimal.yam";
String sourceHtmlPath = "/yam-minimal-no-includes.html";
String errorPath = "./yam-minimal-no-includes.yam-conversion-fault";
// get the spring context and get an FSR from the source path
ClassPathXmlApplicationContext factory = new
ClassPathXmlApplicationContext(resDir + "/spring-app-context.xml");
File htmlFile = factory.getResource(resDir + sourceHtmlPath).getFile();
log.debug("htmlFile.getPath() = " + htmlFile.getPath());
// do the conversion
StringReader sourceHtmlReader = new StringReader(Files.getString(htmlFile));
String response = HtmlToYamConverter.readerToString(sourceHtmlReader);
// check that the conversion result is correct
String key = YamTestUtils.getResourceAsString(resDir + keyPath, "UTF-8");
boolean correctResponse = (response.compareTo(key) == 0);
if(!correctResponse) {
FileWriter fwriter = new FileWriter(errorPath);
fwriter.write(response);
fwriter.close();
//fail(
//TODO
log.warn(
"conversion response not equal (3) to key for test file " + keyPath +
Strings.getNl() + " error response in " + errorPath
);
}
} // end testHtmlToYamIndependently()
/**
* <p>
* Test a round trip translation from yam to html and back to yam. Takes the
* file yam-again.yam and copies to yam-test.*.yam. Translates this to
* yam-test*.html on disk. Converts yam-test*.html to yam in memory. Compares
* this back to yam-again.yam.
* </p>
* <p>
* There is some repetition of to other methods, and this method could instead
* make use of files output form those other methods (e.g. take a html file
* already generated from yam in a previous test). However, keeping this test
* separate keeps the intention clear and isolates it from changes to other
* tests.
* </p>
* <p>
* If there is a difference between the original and resultant yam, then
* the resultant yam will be output and can be viewed with e.g. tkdiff.
* The intermediate html may also be viewed.
* </p>
*
* @throws Exception
*/
public void testYamToHtmlToYam() throws Exception
{
log.info("===============================================================");
log.info("============= YamTest.testYamToHtmlToYam() ====================");
log.info("Testing yam to html to yam round trip");
String originalYamPath = "/yam-again.yam";
// get the spring context and get an FSR from the path
ClassPathXmlApplicationContext factory = new
ClassPathXmlApplicationContext(resDir + "/spring-app-context.xml");
FileSystemResource originalYamLocation = new FileSystemResource(
factory.getResource(resDir + originalYamPath).getFile()
);
// create a temp yam file with a copy of yam-again
log.info(originalYamLocation.getPath());
String originalYamText = Files.getString(originalYamLocation.getPath());
File tempYamFile = File.createTempFile("yam-test", ".yam");
FileWriter fwriter = new FileWriter(tempYamFile);
fwriter.write(originalYamText);
fwriter.close();
// do translation from the temp yam file to html with doIncludes false
YamFile translator = YamFile.get(new FileSystemResource(tempYamFile));
translator.setContextPath(originalYamLocation.getFile().getParent() + "/");
translator.setBibPageUrl(new UrlResource(BIB_URL));
translator.setBibAnchorPrefix(BIB_ANCHOR_PREFIX);
translator.setDoIncludes(false);
YamParseTree tree = translator.generate();
// Get the html and convert it back to yam
String tempHtmlPath = tempYamFile.getPath().replaceAll("\\.yam", ".html");
StringReader sourceHtmlReader
= new StringReader(Files.getString(tempHtmlPath));
String responseYam = HtmlToYamConverter.readerToString(sourceHtmlReader);
// check that the conversion result is correct
String keyYam =
YamTestUtils.getResourceAsString(resDir + originalYamPath, "UTF-8");
boolean correctResponse = (responseYam.compareTo(keyYam) == 0);
if(!correctResponse) {
String errorPath =
"./" + tempYamFile.getName() + "-error";
fwriter = new FileWriter(errorPath);
fwriter.write(responseYam);
fwriter.close();
//fail(
//TODO
log.warn(
"conversion response not equal (4) to key for test file " + originalYamPath
+ Strings.getNl() + " error response in " + errorPath
+ Strings.getNl() + " intermediate html in " + tempHtmlPath
);
}
} //testYamToHtmlToYam()
/**
* Test a translation of yam to html without processing includes. Takes
* yam-again.yam and copies to the disk file yam-test*.yam. Translates this
* to yam-test*.html without processing includes, and compares this to
* yam-minimal-no-includes.html.
*/
public void testNoIncludes() throws Exception
{
// report
log.info("============================================================");
log.info("============= YamTest.testNoIncludes() =====================");
log.info("Testing yam to html with no includes processing");
// path, suffixes
String path = "/yam-again.yam";
String keyPath = "/yam-minimal-no-includes.html";
// get the spring context and get an FSR from the path
ClassPathXmlApplicationContext factory = new
ClassPathXmlApplicationContext(resDir + "/spring-app-context.xml");
FileSystemResource yamLocation =
new FileSystemResource(factory.getResource(resDir + path).getFile());
// create a temp file with a copy of yam-again
log.info(yamLocation.getPath());
String yamText = Files.getString(yamLocation.getPath());
File tempFile = File.createTempFile("yam-test", ".yam");
FileWriter fwriter = new FileWriter(tempFile);
fwriter.write(yamText);
fwriter.close();
// do translation with doIncludes false
YamFile translator = YamFile.get(new FileSystemResource(tempFile));
translator.setContextPath(yamLocation.getFile().getParent() + "/");
translator.setBibPageUrl(new UrlResource(BIB_URL));
translator.setBibAnchorPrefix(BIB_ANCHOR_PREFIX);
translator.setDoIncludes(false);
YamParseTree tree = translator.generate();
String newResponsePath = tempFile.getPath().replaceAll("\\.yam", ".html");
String newResponse = Files.getString(newResponsePath);
String key = YamTestUtils.getResourceAsString(resDir + keyPath, "UTF-8");
boolean correctResponse = (newResponse.compareTo(key) == 0);
if(!correctResponse) {
String errorPath =
"." + keyPath.replaceAll("\\.yam", ".html") + "-error";
fwriter = new FileWriter(errorPath);
fwriter.write(newResponse);
fwriter.close();
fail(
"newResponse not equal to key (5) for test file " + newResponsePath +
Strings.getNl() + " error response in " + errorPath
);
}
log.info("=============================================================");
} // testNoIncludes()
} // YamTest