Log in Help
Print
Homegatewikicowtestunitgateyamparse 〉 YamParseTreeTests.java
 
/*
 *  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