transcendental-lisp/test/scanner/LispScannerTypeTester.java

195 lines
5.9 KiB
Java
Raw Normal View History

package scanner;
2016-12-11 11:23:44 -05:00
import static org.junit.Assert.*;
import java.io.InputStream;
import org.junit.Test;
import error.ErrorManager;
import scanner.LispScanner.UnterminatedStringException;
import testutils.TestUtilities;
import token.Token.Type;
import token.TokenFactory.BadCharacterException;
public class LispScannerTypeTester {
2016-12-12 14:57:34 -05:00
private void assertTokenTypesMatch(String input, Type[] expectedTypeList) {
InputStream stringInputStream = TestUtilities.createInputStreamFromString(input);
LispScanner lispScanner = new LispScanner(stringInputStream, "testFile");
for (Type expectedType : expectedTypeList)
assertEquals(expectedType, lispScanner.getNextToken().getType());
assertEquals(Type.EOF, lispScanner.getNextToken().getType());
}
@Test
2016-12-11 11:23:44 -05:00
public void givenEmptyFile_ReturnsCorrectTypes() {
String input = "";
2016-12-12 14:57:34 -05:00
Type[] expectedTypes = {};
assertTokenTypesMatch(input, expectedTypes);
}
@Test(expected = BadCharacterException.class)
2016-12-11 11:23:44 -05:00
public void givenBadCharacter_ThrowsException() {
String input = "[";
2016-12-12 14:57:34 -05:00
Type[] expectedTypes = {};
assertTokenTypesMatch(input, expectedTypes);
}
@Test
public void givenBadCharacter_ExceptionContainsCorrectSeverity() {
String input = "abc\ndef[";
2016-12-12 14:57:34 -05:00
Type[] expectedTypes = { Type.IDENTIFIER, Type.IDENTIFIER };
try {
assertTokenTypesMatch(input, expectedTypes);
} catch (BadCharacterException e) {
assertTrue(e.getSeverity() < ErrorManager.CRITICAL_LEVEL);
}
}
@Test
public void givenBadCharacter_ExceptionContainsMessage() {
String input = "abc\ndef[";
2016-12-12 14:57:34 -05:00
Type[] expectedTypes = { Type.IDENTIFIER, Type.IDENTIFIER };
try {
assertTokenTypesMatch(input, expectedTypes);
} catch (BadCharacterException e) {
String message = e.getMessage();
assertNotNull(message);
assertTrue(message.length() > 0);
}
}
@Test
2016-12-11 11:23:44 -05:00
public void givenNil_ReturnsCorrectTypes() {
String input = "()";
2016-12-12 14:57:34 -05:00
Type[] expectedTypes = { Type.LEFT_PAREN, Type.RIGHT_PAREN };
assertTokenTypesMatch(input, expectedTypes);
}
@Test
2016-12-11 11:23:44 -05:00
public void givenListOfNumbers_ReturnsCorrectTypes() {
String input = "(1 2)";
2016-12-12 14:57:34 -05:00
Type[] expectedTypes = { Type.LEFT_PAREN, Type.NUMBER, Type.NUMBER, Type.RIGHT_PAREN };
assertTokenTypesMatch(input, expectedTypes);
}
@Test
2016-12-11 11:23:44 -05:00
public void givenString_ReturnsCorrectTypes() {
String input = "\"string\"";
2016-12-12 14:57:34 -05:00
Type[] expectedTypes = { Type.STRING };
assertTokenTypesMatch(input, expectedTypes);
}
@Test
2016-12-11 11:23:44 -05:00
public void givenStringWithEscapedDoubleQuote_ReturnsCorrectTypes() {
String input = "\"string \n hi \\\" bye\"";
2016-12-12 14:57:34 -05:00
Type[] expectedTypes = { Type.STRING };
assertTokenTypesMatch(input, expectedTypes);
}
@Test
2016-12-11 11:23:44 -05:00
public void givenStringWithEscapedDoubleQuoteAndComment_ReturnsCorrectTypes() {
String input = "\"string \n hi \\\" ; bye\"";
2016-12-12 14:57:34 -05:00
Type[] expectedTypes = { Type.STRING };
assertTokenTypesMatch(input, expectedTypes);
}
@Test(expected = UnterminatedStringException.class)
2016-12-11 11:23:44 -05:00
public void givenUnterminatedString_ThrowsException() {
String input = "\"oh no!";
2016-12-12 14:57:34 -05:00
Type[] expectedTypes = { Type.STRING };
assertTokenTypesMatch(input, expectedTypes);
}
@Test()
2016-12-11 11:23:44 -05:00
public void givenUnterminatedString_ExceptionHasCorrectSeverity() {
String input = "\"oh no!";
2016-12-12 14:57:34 -05:00
Type[] expectedTypes = { Type.STRING };
try {
assertTokenTypesMatch(input, expectedTypes);
} catch (LispScanner.UnterminatedStringException e) {
assertTrue(e.getSeverity() < ErrorManager.CRITICAL_LEVEL);
}
}
@Test()
2016-12-11 11:23:44 -05:00
public void givenUnterminatedString_ExceptionContainsMessage() {
String input = "\"oh no!";
2016-12-12 14:57:34 -05:00
Type[] expectedTypes = { Type.STRING };
try {
assertTokenTypesMatch(input, expectedTypes);
} catch (LispScanner.UnterminatedStringException e) {
String message = e.getMessage();
assertNotNull(message);
assertTrue(message.length() > 0);
}
}
@Test
2016-12-11 11:23:44 -05:00
public void givenIdentifier_ReturnsCorrectTypes() {
String input = "abcdefgHIJKLMNOP1234";
2016-12-12 14:57:34 -05:00
Type[] expectedTypes = { Type.IDENTIFIER };
assertTokenTypesMatch(input, expectedTypes);
}
@Test
2016-12-11 11:23:44 -05:00
public void givenSingleDigitNumber_ReturnsCorrectTypes() {
String input = "1";
2016-12-12 14:57:34 -05:00
Type[] expectedTypes = { Type.NUMBER };
assertTokenTypesMatch(input, expectedTypes);
}
@Test
2016-12-11 11:23:44 -05:00
public void givenMultipleDigitNumber_ReturnsCorrectTypes() {
String input = "1234567890";
2016-12-12 14:57:34 -05:00
Type[] expectedTypes = { Type.NUMBER };
assertTokenTypesMatch(input, expectedTypes);
}
@Test
2016-12-11 11:23:44 -05:00
public void givenQuote_ReturnsCorrectTypes() {
String input = "'";
2016-12-12 14:57:34 -05:00
Type[] expectedTypes = { Type.QUOTE_MARK };
assertTokenTypesMatch(input, expectedTypes);
}
@Test
2016-12-11 11:23:44 -05:00
public void givenManyTypesWithNoWhitespace_ReturnsCorrectTypes() {
String input = "xxx\"hi\"999()'aaa";
2016-12-12 14:57:34 -05:00
Type[] expectedTypes = { Type.IDENTIFIER, Type.STRING, Type.NUMBER, Type.LEFT_PAREN, Type.RIGHT_PAREN,
Type.QUOTE_MARK, Type.IDENTIFIER };
assertTokenTypesMatch(input, expectedTypes);
}
@Test
2016-12-11 11:23:44 -05:00
public void givenFunctionCall_ReturnsCorrectTypes() {
String input = "(defun myFunction (x)\n (print x))";
2016-12-12 14:57:34 -05:00
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);
}
}