/**
* Author: Georg Hofferek <georg.hofferek@iaik.tugraz.at>
*/
package at.iaik.suraq.test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.junit.Assert;
import org.junit.Test;
import at.iaik.suraq.exceptions.ParseError;
import at.iaik.suraq.parser.SExpParser;
import at.iaik.suraq.sexp.SExpression;
import at.iaik.suraq.sexp.Token;
/**
* @author Georg Hofferek <georg.hofferek@iaik.tugraz.at>
*
*/
public class SExpParserTest {
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#getSourceLines()}.
*/
@Test
public void testGetSourceLinesNull() {
SExpParser parser = new SExpParser((String) null);
String[] expected = { "" };
Assert.assertArrayEquals(expected, parser.getSourceLines());
}
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#getSourceLines()}.
*/
@Test
public void testGetSourceLinesEmpty() {
SExpParser parser = new SExpParser("");
String[] expected = { "" };
Assert.assertArrayEquals(expected, parser.getSourceLines());
}
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#getSourceLines()}.
*/
@Test
public void testGetSourceLinesOneLine() {
String testString = "This is just some test string.";
SExpParser parser = new SExpParser(testString);
String[] expected = { testString };
Assert.assertArrayEquals(expected, parser.getSourceLines());
}
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#getSourceLines()}.
*/
@Test
public void testGetSourceLinesTwoLines() {
String testString = "This is just some test string.\nWith two lines";
SExpParser parser = new SExpParser(testString);
String[] expected = testString.split("\n");
Assert.assertArrayEquals(expected, parser.getSourceLines());
}
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#parse()}.
*/
@Test
public void testParseEmpty() {
SExpParser parser = new SExpParser("");
try {
parser.parse();
Assert.assertTrue(parser.wasParsingSuccessfull());
} catch (ParseError exc) {
exc.printStackTrace();
Assert.fail(exc.getMessage());
}
SExpression result = parser.getRootExpr();
Assert.assertNotNull(result);
Assert.assertTrue(result.size() == 0);
}
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#parse()}.
*/
@Test
public void testParseSpace() {
SExpParser parser = new SExpParser(" ");
try {
parser.parse();
Assert.assertTrue(parser.wasParsingSuccessfull());
} catch (ParseError exc) {
exc.printStackTrace();
Assert.fail(exc.getMessage());
}
SExpression result = parser.getRootExpr();
Assert.assertNotNull(result);
Assert.assertTrue(result.size() == 0);
}
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#parse()}.
*/
@Test
public void testParseWitespace() {
SExpParser parser = new SExpParser(" \n \r \t \n");
try {
parser.parse();
Assert.assertTrue(parser.wasParsingSuccessfull());
} catch (ParseError exc) {
exc.printStackTrace();
Assert.fail(exc.getMessage());
}
SExpression result = parser.getRootExpr();
Assert.assertNotNull(result);
Assert.assertTrue(result.size() == 0);
}
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#parse()}.
*/
@Test
public void testParseComment() {
SExpParser parser = new SExpParser(
" ; This is a comment\n \n \t ; and another one");
try {
parser.parse();
Assert.assertTrue(parser.wasParsingSuccessfull());
} catch (ParseError exc) {
exc.printStackTrace();
Assert.fail(exc.getMessage());
}
SExpression result = parser.getRootExpr();
Assert.assertNotNull(result);
Assert.assertTrue(result.size() == 0);
}
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#parse()}.
*/
@Test
public void testParseSingleToken() {
SExpParser parser = new SExpParser("SingleToken");
try {
parser.parse();
Assert.assertTrue(parser.wasParsingSuccessfull());
} catch (ParseError exc) {
exc.printStackTrace();
Assert.fail(exc.getMessage());
}
SExpression result = parser.getRootExpr();
Assert.assertNotNull(result);
Assert.assertTrue(result.size() == 1);
Assert.assertEquals(result.getChildren().get(0).toString(),
"SingleToken");
}
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#parse()}.
*/
@Test
public void testParseSingleTokenAndWhitespace() {
SExpParser parser = new SExpParser(" SingleToken \n \t \r");
try {
parser.parse();
Assert.assertTrue(parser.wasParsingSuccessfull());
} catch (ParseError exc) {
exc.printStackTrace();
Assert.fail(exc.getMessage());
}
SExpression result = parser.getRootExpr();
Assert.assertNotNull(result);
Assert.assertEquals(1, result.size());
Assert.assertEquals(result.getChildren().get(0).toString(),
"SingleToken");
}
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#parse()}.
*/
@Test
public void testParseSingleTokenAndWhitespaceAndComments() {
SExpParser parser = new SExpParser(
" ; a comment\nSingleToken ;another comment\n ; comment \t \r");
try {
parser.parse();
Assert.assertTrue(parser.wasParsingSuccessfull());
} catch (ParseError exc) {
exc.printStackTrace();
Assert.fail(exc.getMessage());
}
SExpression result = parser.getRootExpr();
Assert.assertNotNull(result);
Assert.assertEquals(1, result.size());
Assert.assertEquals(result.getChildren().get(0).toString(),
"SingleToken");
}
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#parse()}.
*/
@Test
public void testParseThreeTokensAndComments() {
SExpParser parser = new SExpParser(
" ; a comment\nFirstToken ;another comment\n\n\t SecondToken ThirdToken ; comment \t \r");
try {
parser.parse();
Assert.assertTrue(parser.wasParsingSuccessfull());
} catch (ParseError exc) {
exc.printStackTrace();
Assert.fail(exc.getMessage());
}
SExpression result = parser.getRootExpr();
Assert.assertNotNull(result);
Assert.assertEquals(3, result.size());
Assert.assertEquals("FirstToken", result.getChildren().get(0)
.toString());
Assert.assertEquals("SecondToken", result.getChildren().get(1)
.toString());
Assert.assertEquals("ThirdToken", result.getChildren().get(2)
.toString());
}
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#parse()}.
*/
@Test
public void testParseEmpytExpression() {
SExpParser parser = new SExpParser("()");
try {
parser.parse();
Assert.assertTrue(parser.wasParsingSuccessfull());
} catch (ParseError exc) {
exc.printStackTrace();
Assert.fail(exc.getMessage());
}
SExpression result = parser.getRootExpr();
Assert.assertNotNull(result);
Assert.assertEquals(1, result.size());
Assert.assertEquals(0, result.getChildren().get(0).size());
}
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#parse()}.
*/
@Test
public void testParseEmpytExpressionNested() {
SExpParser parser = new SExpParser("(())");
try {
parser.parse();
Assert.assertTrue(parser.wasParsingSuccessfull());
} catch (ParseError exc) {
exc.printStackTrace();
Assert.fail(exc.getMessage());
}
SExpression result = parser.getRootExpr();
Assert.assertNotNull(result);
Assert.assertEquals(1, result.size());
Assert.assertEquals(1, result.getChildren().get(0).size());
Assert.assertEquals(0, result.getChildren().get(0).getChildren().get(0)
.size());
}
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#parse()}.
*/
@Test
public void testParseNestedExpression() {
SExpParser parser;
try {
parser = new SExpParser("(first (second third))");
parser.parse();
Assert.assertTrue(parser.wasParsingSuccessfull());
SExpression result = parser.getRootExpr();
Assert.assertNotNull(result);
Token first = Token.generate("first");
Token second = Token.generate("second");
Token third = Token.generate("third");
SExpression secondThird = new SExpression();
secondThird.addChild(second);
secondThird.addChild(third);
SExpression expected = new SExpression();
expected.addChild(first);
expected.addChild(secondThird);
Assert.assertTrue(result.size() == 1);
Assert.assertEquals(expected, result.getChildren().get(0));
} catch (ParseError exc) {
exc.printStackTrace();
Assert.fail(exc.getMessage());
}
}
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#parse()}.
*/
@Test
public void testParsePipelineExample() {
SExpParser parser;
try {
parser = new SExpParser(new File(
"./rsc/test/no_readonly_pipeline_example.smt2"));
parser.parse();
Assert.assertTrue(parser.wasParsingSuccessfull());
SExpression result = parser.getRootExpr();
Assert.assertNotNull(result);
SExpression actualFirst = result.getChildren().get(0);
SExpression[] expectedFirstChildren = { Token.generate("set-logic"),
Token.generate("ArraysEx") };
SExpression expectedFirst = new SExpression(expectedFirstChildren);
SExpression actualLast = result.getChildren().get(
result.getChildren().size() - 1);
SExpression[] expectedLastChildren = { Token.generate("get-info"),
Token.generate("model") };
SExpression expectedLast = new SExpression(expectedLastChildren);
Assert.assertEquals(expectedFirst, actualFirst);
Assert.assertEquals(expectedLast, actualLast);
} catch (FileNotFoundException exc1) {
exc1.printStackTrace();
Assert.fail(exc1.getMessage());
} catch (IOException exc1) {
exc1.printStackTrace();
Assert.fail(exc1.getMessage());
} catch (ParseError exc) {
exc.printStackTrace();
Assert.fail(exc.getMessage());
}
}
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#parse()}.
*/
@Test
public void testParsePipelineExampleUIFE() {
SExpParser parser;
try {
parser = new SExpParser(new File(
"./rsc/test/no_readonly_pipeline_example_uife.smt2"));
parser.parse();
Assert.assertTrue(parser.wasParsingSuccessfull());
SExpression result = parser.getRootExpr();
Assert.assertNotNull(result);
SExpression actualFirst = result.getChildren().get(0);
SExpression[] expectedFirstChildren = { Token.generate("set-logic"),
Token.generate("QF_LIA") };
SExpression expectedFirst = new SExpression(expectedFirstChildren);
SExpression actualLast = result.getChildren().get(
result.getChildren().size() - 1);
SExpression[] expectedLastChildren = { Token.generate("check-sat") };
SExpression expectedLast = new SExpression(expectedLastChildren);
Assert.assertEquals(expectedFirst, actualFirst);
Assert.assertEquals(expectedLast, actualLast);
Assert.assertEquals(
result.getChildren().get(result.getChildren().size() - 2)
.getChildren().get(0), Token.generate("assert"));
} catch (FileNotFoundException exc1) {
exc1.printStackTrace();
Assert.fail(exc1.getMessage());
} catch (IOException exc1) {
exc1.printStackTrace();
Assert.fail(exc1.getMessage());
} catch (ParseError exc) {
exc.printStackTrace();
Assert.fail(exc.getMessage());
}
}
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#parse()}.
*/
@Test
public void testParsePipelineExampleEQ() {
SExpParser parser;
try {
parser = new SExpParser(new File(
"./rsc/test/no_readonly_pipeline_example_eq.smt2"));
parser.parse();
Assert.assertTrue(parser.wasParsingSuccessfull());
SExpression result = parser.getRootExpr();
Assert.assertNotNull(result);
SExpression actualFirst = result.getChildren().get(0);
SExpression[] expectedFirstChildren = { Token.generate("set-logic"),
Token.generate("QF_LIA") };
SExpression expectedFirst = new SExpression(expectedFirstChildren);
SExpression actualLast = result.getChildren().get(
result.getChildren().size() - 1);
SExpression[] expectedLastChildren = { Token.generate("check-sat") };
SExpression expectedLast = new SExpression(expectedLastChildren);
Assert.assertEquals(expectedFirst, actualFirst);
Assert.assertEquals(expectedLast, actualLast);
Assert.assertEquals(
result.getChildren().get(result.getChildren().size() - 2)
.getChildren().get(0), Token.generate("assert"));
} catch (FileNotFoundException exc1) {
exc1.printStackTrace();
Assert.fail(exc1.getMessage());
} catch (IOException exc1) {
exc1.printStackTrace();
Assert.fail(exc1.getMessage());
} catch (ParseError exc) {
exc.printStackTrace();
Assert.fail(exc.getMessage());
}
}
/**
* Test method for {@link at.iaik.suraq.parser.SExpParser#parse()}.
*/
@Test
public void testParsePipelineExampleProp() {
SExpParser parser;
try {
parser = new SExpParser(new File(
"./rsc/test/no_readonly_pipeline_example_prop.smt2"));
parser.parse();
Assert.assertTrue(parser.wasParsingSuccessfull());
SExpression result = parser.getRootExpr();
Assert.assertNotNull(result);
SExpression actualFirst = result.getChildren().get(0);
SExpression[] expectedFirstChildren = { Token.generate("set-option"),
Token.generate(":print-success"), Token.generate("false") };
SExpression expectedFirst = new SExpression(expectedFirstChildren);
SExpression actualLast = result.getChildren().get(
result.getChildren().size() - 1);
SExpression[] expectedLastChildren = { Token.generate("check-sat") };
SExpression expectedLast = new SExpression(expectedLastChildren);
Assert.assertEquals(expectedFirst, actualFirst);
Assert.assertEquals(expectedLast, actualLast);
Assert.assertEquals(
result.getChildren().get(result.getChildren().size() - 2)
.getChildren().get(0), Token.generate("assert"));
} catch (FileNotFoundException exc1) {
exc1.printStackTrace();
Assert.fail(exc1.getMessage());
} catch (IOException exc1) {
exc1.printStackTrace();
Assert.fail(exc1.getMessage());
} catch (ParseError exc) {
exc.printStackTrace();
Assert.fail(exc.getMessage());
}
}
/**
* Test method for
* {@link at.iaik.suraq.parser.SExpParser#wasParsingSuccessfull()}.
*/
@Test
public void testWasParsingSuccessfull() {
SExpParser parser = new SExpParser("");
Assert.assertFalse(parser.wasParsingSuccessfull());
try {
parser.parse();
} catch (ParseError exc) {
exc.printStackTrace();
Assert.fail(exc.getMessage());
}
Assert.assertTrue(parser.wasParsingSuccessfull());
}
}