package test.processing.mode.java;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static test.processing.mode.java.ProcessingTestUtil.COMPILER;
import static test.processing.mode.java.ProcessingTestUtil.preprocess;
import static test.processing.mode.java.ProcessingTestUtil.res;
import java.io.File;
import java.io.FileWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.junit.BeforeClass;
import org.junit.Test;
import processing.app.SketchException;
import processing.app.exec.ProcessResult;
import antlr.RecognitionException;
public class ParserTests {
@BeforeClass
public static void init() {
ProcessingTestUtil.init();
}
static void expectRecognitionException(final String id,
final String expectedMessage,
final int expectedLine) {
try {
preprocess(id, res(id + ".pde"));
fail("Expected to fail with \"" + expectedMessage + "\" on line "
+ expectedLine);
} catch (RecognitionException e) {
assertEquals(expectedMessage, e.getMessage());
assertEquals(expectedLine, e.getLine());
} catch (Exception e) {
if (!e.equals(e.getCause()) && e.getCause() != null)
fail(e.getCause().toString());
else
fail(e.toString());
}
}
static void expectRunnerException(final String id,
final String expectedMessage,
final int expectedLine) {
try {
preprocess(id, res(id + ".pde"));
fail("Expected to fail with \"" + expectedMessage + "\" on line "
+ expectedLine);
} catch (SketchException e) {
assertEquals(expectedMessage, e.getMessage());
assertEquals(expectedLine, e.getCodeLine());
} catch (Exception e) {
if (!e.equals(e.getCause()) && e.getCause() != null)
fail(e.getCause().toString());
else
fail(e.toString());
}
}
static void expectCompilerException(final String id,
final String expectedMessage,
final int expectedLine) {
try {
final String program = ProcessingTestUtil
.preprocess(id, res(id + ".pde"));
final ProcessResult compilerResult = COMPILER.compile(id, program);
if (compilerResult.succeeded()) {
fail("Expected to fail with \"" + expectedMessage + "\" on line "
+ expectedLine);
}
final String e = compilerResult.getStderr().split("\n")[0];
final Matcher m = Pattern.compile(":(\\d+):\\s+(.+)$").matcher(e);
m.find();
assertEquals(expectedMessage, m.group(2));
assertEquals(String.valueOf(expectedLine), m.group(1));
} catch (Exception e) {
if (!e.equals(e.getCause()) && e.getCause() != null)
fail(e.getCause().toString());
else
fail(e.toString());
}
}
static void expectGood(final String id) {
try {
final String program = ProcessingTestUtil
.preprocess(id, res(id + ".pde"));
final ProcessResult compilerResult = COMPILER.compile(id, program);
if (!compilerResult.succeeded()) {
System.err.println(program);
System.err.println("----------------------------");
System.err.println(compilerResult.getStderr());
fail("Compilation failed with status " + compilerResult.getResult());
}
final File expectedFile = res(id + ".expected");
if (expectedFile.exists()) {
final String expected = ProcessingTestUtil.read(expectedFile);
assertEquals(expected, program);
} else {
System.err.println("WARN: " + id
+ " does not have an expected output file. Generating.");
final FileWriter sug = new FileWriter(res(id + ".expected"));
sug.write(ProcessingTestUtil.normalize(program));
sug.close();
}
} catch (Exception e) {
if (!e.equals(e.getCause()) && e.getCause() != null)
fail(e.getCause().toString());
else
fail(e.toString());
}
}
@Test
public void bug4() {
expectGood("bug4");
}
@Test
public void bug5a() {
expectGood("bug5a");
}
@Test
public void bug5b() {
expectGood("bug5b");
}
@Test
public void bug6() {
expectRecognitionException("bug6", "expecting EOF, found '/'", 1);
}
@Test
public void bug16() {
expectRunnerException("bug16", "Unclosed /* comment */", 2);
}
@Test
public void bug136() {
expectGood("bug136");
}
@Test
public void bug196() {
expectRecognitionException("bug196",
"Web colors must be exactly 6 hex digits. This looks like 5.", 4);
}
@Test
public void bug281() {
expectGood("bug281");
}
@Test
public void bug481() {
expectGood("bug481");
}
@Test
public void bug507() {
expectRecognitionException("bug507", "expecting EOF, found 'else'", 5);
}
@Test
public void bug598() {
expectGood("bug598");
}
@Test
public void bug631() {
expectGood("bug631");
}
@Test
public void bug763() {
expectRunnerException("bug763", "Unterminated string constant", 6);
}
@Test
public void bug820() {
expectCompilerException("bug820", "error: variable x1 is already defined in method setup()", 18);
}
@Test
public void bug1064() {
expectGood("bug1064");
}
@Test
public void bug1145() {
expectCompilerException("bug1145", "error: '.' expected", 6);
}
@Test
public void bug1362() {
expectGood("bug1362");
}
@Test
public void bug1390() {
expectGood("bug1390");
}
@Test
public void bug1442() {
expectGood("bug1442");
}
@Test
public void bug1511() {
expectGood("bug1511");
}
@Test
public void bug1512() {
expectGood("bug1512");
}
@Test
public void bug1514a() {
expectGood("bug1514a");
}
@Test
public void bug1514b() {
expectGood("bug1514b");
}
@Test
public void bug1515() {
expectGood("bug1515");
}
@Test
public void bug1516() {
expectGood("bug1516");
}
@Test
public void bug1517() {
expectGood("bug1517");
}
@Test
public void bug1518a() {
expectGood("bug1518a");
}
@Test
public void bug1518b() {
expectGood("bug1518b");
}
@Test
public void bug1519() {
expectRecognitionException("bug1519", "Maybe too many > characters?", 7);
}
@Test
public void bug1525() {
expectGood("bug1525");
}
@Test
public void bug1532() {
expectRecognitionException("bug1532", "unexpected token: break", 50);
}
@Test
public void bug1534() {
expectGood("bug1534");
}
@Test
public void bug1936() {
expectGood("bug1936");
}
@Test
public void bug315g() {
expectGood("bug315g");
}
@Test
public void bug400g() {
expectGood("bug400g");
}
@Test
public void bug427g() {
expectGood("bug427g");
}
@Test
public void annotations() {
expectGood("annotations");
}
}