transcendental-lisp/test/scanner/LispScannerTypeTester.java

132 lines
4.2 KiB
Java
Raw Normal View History

package scanner;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.io.InputStream;
import org.junit.Test;
import scanner.Token.Type;
import testutils.TestUtilities;
public class LispScannerTypeTester {
@Test
public void givenEmptyFile_returnsCorrectTokenTypes() throws IOException {
String input = "";
Token.Type[] expectedTypes = {};
assertTokenTypesMatch(input, expectedTypes);
}
@Test(expected = RuntimeException.class)
public void givenBadCharacter_ThrowsException() throws IOException {
String input = "[";
Token.Type[] expectedTypes = {};
assertTokenTypesMatch(input, expectedTypes);
}
@Test
public void givenNil_returnsCorrectTokenTypes() throws IOException {
String input = "()";
Token.Type[] expectedTypes = { Type.LEFT_PAREN, Type.RIGHT_PAREN };
assertTokenTypesMatch(input, expectedTypes);
}
@Test
public void givenListOfNumbers_returnsCorrectTokenTypes() throws IOException {
String input = "(1 2)";
Token.Type[] expectedTypes = { Type.LEFT_PAREN, Type.NUMBER, Type.NUMBER, Type.RIGHT_PAREN };
assertTokenTypesMatch(input, expectedTypes);
}
@Test
public void givenString_returnsCorrectTokenTypes() throws IOException {
String input = "\"string\"";
Token.Type[] expectedTypes = { Type.STRING };
assertTokenTypesMatch(input, expectedTypes);
}
@Test
public void givenStringWithEscapedDoubleQuote_returnsCorrectTokenTypes() throws IOException {
String input = "\"string \n hi \\\" bye\"";
Token.Type[] expectedTypes = { Type.STRING };
assertTokenTypesMatch(input, expectedTypes);
}
@Test
public void givenStringWithEscapedDoubleQuoteAndComment_returnsCorrectTokenTypes() throws IOException {
String input = "\"string \n hi \\\" ; bye\"";
Token.Type[] expectedTypes = { Type.STRING };
assertTokenTypesMatch(input, expectedTypes);
}
@Test(expected = RuntimeException.class)
public void givenUnterminatedString_ThrowsException() throws IOException {
String input = "\"oh no!";
Token.Type[] expectedTypes = { Type.STRING };
assertTokenTypesMatch(input, expectedTypes);
}
@Test
public void givenIdentifier_returnsCorrectTokenTypes() throws IOException {
String input = "abcdefgHIJKLMNOP1234";
Token.Type[] expectedTypes = { Type.IDENTIFIER };
assertTokenTypesMatch(input, expectedTypes);
}
@Test
public void givenSingleDigitNumber_returnsCorrectTokenTypes() throws IOException {
String input = "1";
Token.Type[] expectedTypes = { Type.NUMBER };
assertTokenTypesMatch(input, expectedTypes);
}
@Test
public void givenMultipleDigitNumber_returnsCorrectTokenTypes() throws IOException {
String input = "1234567890";
Token.Type[] expectedTypes = { Type.NUMBER };
assertTokenTypesMatch(input, expectedTypes);
}
@Test
public void givenQuote_returnsCorrectTokenTypes() throws IOException {
String input = "'";
Token.Type[] expectedTypes = { Type.QUOTE_MARK };
assertTokenTypesMatch(input, expectedTypes);
}
@Test
public void givenFunctionCall_returnsCorrectTokenTypes() throws IOException {
String input = "(defun myFunction (x)\n (print x))";
Token.Type[] expectedTypes = { Type.LEFT_PAREN, Type.IDENTIFIER, Type.IDENTIFIER, Type.LEFT_PAREN,
Type.IDENTIFIER, Type.RIGHT_PAREN, Type.LEFT_PAREN, Type.IDENTIFIER,
Type.IDENTIFIER, Type.RIGHT_PAREN, Type.RIGHT_PAREN };
assertTokenTypesMatch(input, expectedTypes);
}
private void assertTokenTypesMatch(String input, Token.Type[] expectedTypeList) throws IOException {
InputStream stringInputStream = TestUtilities.createInputStreamFromString(input);
LispScanner lispScanner = new LispScanner(stringInputStream, "stringInputStream");
for (Token.Type expectedType : expectedTypeList)
assertEquals(expectedType, lispScanner.nextToken().getType());
assertEquals(Token.Type.EOF, lispScanner.nextToken().getType());
}
}