package project.scangen.test;
import org.junit.Test;
import project.scangen.ScannerGenerator;
import project.scangen.tokenizer.Token;
import project.scangen.tokenizer.Tokenizer;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
public class ScannerGeneratorTest {
private class ScannerGeneratorTestCase {
public final String spec, input, output;
public ScannerGeneratorTestCase(final String spec, final String input, final String output) {
this.spec = spec;
this.input = input;
this.output = output;
}
}
private final List<ScannerGeneratorTestCase> testCases = new ArrayList<ScannerGeneratorTestCase>() {{
add(new ScannerGeneratorTestCase(
"\n$DIGIT 0",
"000",
"DIGIT 0\nDIGIT 0\nDIGIT 0\n"
));
add(new ScannerGeneratorTestCase(
"$DIGIT [0-3]\n$CHAR [a-c]\n\n$INT $DIGIT+\n$WORD $CHAR+",
"abc 12 3cba0",
"WORD abc\nINT 12\nINT 3\nWORD cba\nINT 0\n"
));
add(new ScannerGeneratorTestCase(
"$DIGIT [0-9]\n$NON-ZERO [^0] IN $DIGIT\n$CHAR [a-z]\n\n" +
"$INT $NON-ZERO $DIGIT*\n$VAR $CHAR ($CHAR | $DIGIT)*",
"123 0123 6abc abc67",
"INT 123\nINT 123\nINT 6\nVAR abc\nVAR abc67\n"
));
add(new ScannerGeneratorTestCase(
"\n$A-SINGLE-DOT .",
".",
"A-SINGLE-DOT .\n"
));
add(new ScannerGeneratorTestCase(
"$OPEN-PAREN [(]\n$CLOSE-PAREN [)]\n\n$SOMETHING $OPEN-PAREN $CLOSE-PAREN",
"()()",
"SOMETHING ()\nSOMETHING ()\n"
));
add(new ScannerGeneratorTestCase(
"$ASCII [ -~]\n$NOQUOTE [^\"] IN $ASCII\n\n$STRING \" ($NOQUOTE)* \"",
"\"Hello, world!\" \"(file.txt)\"",
"STRING \"Hello, world!\"\nSTRING \"(file.txt)\"\n"
));
}};
private void runScannerGeneratorTest(ScannerGeneratorTestCase testCase) {
InputStream specInputStream = new ByteArrayInputStream(testCase.spec.getBytes());
InputStream inputInputStream = new ByteArrayInputStream(testCase.input.getBytes());
ScannerGenerator scannerGenerator = new ScannerGenerator(specInputStream, inputInputStream);
Tokenizer tokenizer = scannerGenerator.generateTokenizer();
StringBuilder sb = new StringBuilder();
for (Token token : tokenizer) {
sb.append(token).append("\n");
}
assertEquals(testCase.output, sb.toString());
}
@Test
public void testScannerGenerator() {
for (ScannerGeneratorTestCase testCase : testCases) {
runScannerGeneratorTest(testCase);
}
}
}