Log in Help
Print
Homegatewikicowtestunitgateyamparse 〉 YamParserTests.java
 
/*
 *  YamParserTests.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 java.util.*;
import junit.framework.*;
import org.apache.log4j.Logger;
import gate.util.*;
import gate.yam.*;


/**
 * Unit test for YAM parse trees.
 */
public class YamParserTests extends TestCase
{

  /** Create the test case */
  public YamParserTests(String testName) {
    super(testName);
  }

  /** Logger */
  static Logger lgr = Logger.getLogger("gate.yam");

  /** SInS (plain) logger */
  static Logger slgr = Logger.getLogger("gate.sins");

  /** Test errors and warnings. */
  public void testErrorsAndWarnings() throws Exception {
    String testName = "/gate/yam/resources/yam-errors.yam";
    lgr.info("testing errors generated when parsing " + testName);

    // find the source directory
    String testFilePath =
      this.getClass().getResource(testName).getPath();
    File testFileDir = new File(testFilePath).getParentFile();

    // a reader for the test file
    InputStream testFileStream = 
      this.getClass().getResourceAsStream(testName);
    if(testFileStream == null) fail("couldn't get resource " + testName);
    InputStreamReader testReader =
      new InputStreamReader(testFileStream, "UTF-8");

    // response writer
    StringWriter responseWriter = new StringWriter();

    // run the translator and check the errors
    YamCommand yam = new YamCommand();
    YamParseTree parseTree = yam.translate(
      testReader, responseWriter, YamFile.FileType.HTML, testFileDir
    );
    List errors = parseTree.getErrors();
    List warnings = parseTree.getWarnings();
    
    int e = errors.size();
    if(e != 3) lgr.info(yam.printErrors(parseTree));
    //lgr.info(yam.printErrors(parseTree));
    assertEquals("wrong number of errors", 3, e);

    ParsingProblem p = (ParsingProblem) errors.get(1);
    //lgr.info(p.getMessage());
    assertEquals("begin line wrong", p.beginLine, 17);
    assertEquals("begin column wrong", p.beginColumn, 19);
    assertEquals("end line wrong", p.endLine, 24);
    assertEquals("end column wrong", p.endColumn, 2);
    assertEquals("included flag wrong", p.included, false);

    p = (ParsingProblem) errors.get(2);
    //lgr.info(p.getMessage());
    assertEquals("begin line wrong", p.beginLine, 1);
    assertEquals("begin column wrong", p.beginColumn, 1);
    assertEquals("end line wrong", p.endLine, 1);
    assertEquals("end column wrong", p.endColumn, 9);
    assertEquals("included flag wrong", p.included, true);
  }
  
  /**
   * Test error handling utility stuff.
   */
  public void testErrorStuff() throws Exception
  {
    String eStrings[] = {
      // empty strings
      "",                       "",                     "",

      // empty lines
      "\n",                     "",                     "\n",
      "\n\n",                   "",                     "\n\n",
      "\n\n\n",                 "",                     "\n\n\n",
      "\n\n\n\n",               "\n\n\n",               "\n",

      // unix lines
      "123\n0",                 "",                     "123\n0",
      "123\n456\n7",            "123\n",                "456\n7",
      "123\n456\n789\n0",       "123\n456\n",           "789\n0",
      "123\n",                  "",                     "123\n",
      "123\n456\n",             "123\n",                "456\n",
      "123\n456\n789\n",        "123\n456\n",           "789\n",

      // mac lines
      "123\r0",                 "",                     "123\r0",
      "123\r456\r7",            "123\r",                "456\r7",
      "123\r456\r789\r0",       "123\r456\r",           "789\r0",
      "123\r",                  "",                     "123\r",
      "123\r456\r",             "123\r",                "456\r",
      "123\r456\r789\r",        "123\r456\r",           "789\r",

      // dos lines
      "123\r\n0",               "",                     "123\r\n0",
      "123\r\n456\r\n7",        "123\r\n",              "456\r\n7",
      "123\r\n456\r\n789\r\n0", "123\r\n456\r\n",       "789\r\n0",
      "123\r\n",                "",                     "123\r\n",
      "123\r\n456\r\n",         "123\r\n",              "456\r\n",
      "123\r\n456\r\n789\r\n",  "123\r\n456\r\n",       "789\r\n",

      // messed-up lines
      "123\n\r456\n\r789\n\r",  "123\n\r456\n\r789\n",  "\r",
    };
    StringReader reader = new StringReader("");
    YamParser parser = new YamParser(reader);

    for(int i=0; i<eStrings.length; i += 3) {
      String eString = eStrings[i];
      String start = eStrings[i+1];
      String end = eStrings[i+2];

      // this was superseded by the getNextToken-based error code in
      // YamParser.parse
//      String[] split = parser.splitErrorInput(eString);
      /*
      lgr.info("i=" + i + ", start(" + start + "); end(" + end + ")");
      lgr.info(
        "i=" + i + ", split[0](" + split[0] + "); split[1](" + split[1] + ")"
      );
      lgr.info();
      */
//      assertTrue(
//        "i=" + i + ", start(" + start + ") wrong", start.equals(split[0])
//      );
//      assertTrue(
//        "i=" + i + ", end(" + end + ") wrong", end.equals(split[1])
//      );
    }
  } // testErrorStuff()

  /** Test the getSepSpacing function. */
  public void testGetSepSpacing() {
    String[] cases = {
      "\n", 
      "\n ", 
      "\n  ", 
      "\n\t", 
      "\n  \t  ", 
      "\n  \t\t  \t", 

      "\r", 
      "\r ", 
      "\r  ", 
      "\r\t", 
      "\r  \t  ", 
      "\r  \t\t  \t", 

      "\r\n", 
      "\r\n ", 
      "\r\n  ", 
      "\r\n\t", 
      "\r\n  \t  ", 
      "\r\n  \t\t  \t", 

      "\n\n\r\n", 
      "\n\n\r\n ", 
      "\n\n\r\n  ", 
      "\n\n\r\n\t", 
      "\n\n\r\n  \t  ", 
      "\n\n\r\n  \t\t  \t", 
    };
    int[] expectedSpacings = {
      0, 1, 2, 8, 10, 24,
      0, 1, 2, 8, 10, 24,
      0, 1, 2, 8, 10, 24,
      0, 1, 2, 8, 10, 24,
    };
    StringReader reader = new StringReader("");
    YamParser p = new YamParser(reader);
    Token t = new Token();

    for(int caseNumber = 0; caseNumber < cases.length; caseNumber++) {
      t.image = cases[caseNumber];
      int spacing = p.getSepSpacing(t);
      assertEquals("wrong spacing: ", expectedSpacings[caseNumber], spacing); 
    }
  } // testGetSepSpacing()

} // YamParserTests