| Index: pkg/analyzer/test/generated/scanner_test.dart
|
| diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart
|
| index 9bbf199d046cd9d4fe5b0c3488af4bf67601eb9a..f36bf4b9c2709158a664b962cb2dcc5e2e7e3c8a 100644
|
| --- a/pkg/analyzer/test/generated/scanner_test.dart
|
| +++ b/pkg/analyzer/test/generated/scanner_test.dart
|
| @@ -16,55 +16,67 @@ import 'package:analyzer/src/generated/utilities_collection.dart' show TokenMap;
|
| import 'package:unittest/unittest.dart' as _ut;
|
| import 'test_support.dart';
|
|
|
| -class KeywordStateTest extends JUnitTestCase {
|
| - void test_KeywordState() {
|
| - //
|
| - // Generate the test data to be scanned.
|
| - //
|
| - List<Keyword> keywords = Keyword.values;
|
| - int keywordCount = keywords.length;
|
| - List<String> textToTest = new List<String>(keywordCount * 3);
|
| - for (int i = 0; i < keywordCount; i++) {
|
| - String syntax = keywords[i].syntax;
|
| - textToTest[i] = syntax;
|
| - textToTest[i + keywordCount] = "${syntax}x";
|
| - textToTest[i + keywordCount * 2] = syntax.substring(0, syntax.length - 1);
|
| +/**
|
| + * Instances of the class `TokenStreamValidator` are used to validate the correct construction
|
| + * of a stream of tokens.
|
| + */
|
| +class TokenStreamValidator {
|
| + /**
|
| + * Validate that the stream of tokens that starts with the given token is correct.
|
| + *
|
| + * @param token the first token in the stream of tokens to be validated
|
| + */
|
| + void validate(Token token) {
|
| + JavaStringBuilder builder = new JavaStringBuilder();
|
| + _validateStream(builder, token);
|
| + if (builder.length > 0) {
|
| + JUnitTestCase.fail(builder.toString());
|
| }
|
| - //
|
| - // Scan each of the identifiers.
|
| - //
|
| - KeywordState firstState = KeywordState.KEYWORD_STATE;
|
| - for (int i = 0; i < textToTest.length; i++) {
|
| - String text = textToTest[i];
|
| - int index = 0;
|
| - int length = text.length;
|
| - KeywordState state = firstState;
|
| - while (index < length && state != null) {
|
| - state = state.next(text.codeUnitAt(index));
|
| - index++;
|
| + }
|
| +
|
| + void _validateStream(JavaStringBuilder builder, Token token) {
|
| + if (token == null) {
|
| + return;
|
| + }
|
| + Token previousToken = null;
|
| + int previousEnd = -1;
|
| + Token currentToken = token;
|
| + while (currentToken != null && currentToken.type != TokenType.EOF) {
|
| + _validateStream(builder, currentToken.precedingComments);
|
| + TokenType type = currentToken.type;
|
| + if (type == TokenType.OPEN_CURLY_BRACKET || type == TokenType.OPEN_PAREN || type == TokenType.OPEN_SQUARE_BRACKET || type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
|
| + if (currentToken is! BeginToken) {
|
| + builder.append("\r\nExpected BeginToken, found ");
|
| + builder.append(currentToken.runtimeType.toString());
|
| + builder.append(" ");
|
| + _writeToken(builder, currentToken);
|
| + }
|
| }
|
| - if (i < keywordCount) {
|
| - // keyword
|
| - JUnitTestCase.assertNotNull(state);
|
| - JUnitTestCase.assertNotNull(state.keyword());
|
| - JUnitTestCase.assertEquals(keywords[i], state.keyword());
|
| - } else if (i < keywordCount * 2) {
|
| - // keyword + "x"
|
| - JUnitTestCase.assertNull(state);
|
| - } else {
|
| - // keyword.substring(0, keyword.length() - 1)
|
| - JUnitTestCase.assertNotNull(state);
|
| + int currentStart = currentToken.offset;
|
| + int currentLength = currentToken.length;
|
| + int currentEnd = currentStart + currentLength - 1;
|
| + if (currentStart <= previousEnd) {
|
| + builder.append("\r\nInvalid token sequence: ");
|
| + _writeToken(builder, previousToken);
|
| + builder.append(" followed by ");
|
| + _writeToken(builder, currentToken);
|
| }
|
| + previousEnd = currentEnd;
|
| + previousToken = currentToken;
|
| + currentToken = currentToken.next;
|
| }
|
| }
|
|
|
| - static dartSuite() {
|
| - _ut.group('KeywordStateTest', () {
|
| - _ut.test('test_KeywordState', () {
|
| - final __test = new KeywordStateTest();
|
| - runJUnitTest(__test, __test.test_KeywordState);
|
| - });
|
| - });
|
| + void _writeToken(JavaStringBuilder builder, Token token) {
|
| + builder.append("[");
|
| + builder.append(token.type);
|
| + builder.append(", '");
|
| + builder.append(token.lexeme);
|
| + builder.append("', ");
|
| + builder.append(token.offset);
|
| + builder.append(", ");
|
| + builder.append(token.length);
|
| + builder.append("]");
|
| }
|
| }
|
|
|
| @@ -224,298 +236,742 @@ class TokenTypeTest extends EngineTestCase {
|
| }
|
| }
|
|
|
| -/**
|
| - * The class `TokenFactory` defines utility methods that can be used to create tokens.
|
| - */
|
| -class TokenFactory {
|
| - static Token tokenFromKeyword(Keyword keyword) => new KeywordToken(keyword, 0);
|
| -
|
| - static Token tokenFromString(String lexeme) => new StringToken(TokenType.STRING, lexeme, 0);
|
| -
|
| - static Token tokenFromType(TokenType type) => new Token(type, 0);
|
| +class IncrementalScannerTest extends EngineTestCase {
|
| + /**
|
| + * The first token from the token stream resulting from parsing the original source, or
|
| + * `null` if [scan] has not been invoked.
|
| + */
|
| + Token _originalTokens;
|
|
|
| - static Token tokenFromTypeAndString(TokenType type, String lexeme) => new StringToken(type, lexeme, 0);
|
| -}
|
| + /**
|
| + * The scanner used to perform incremental scanning, or `null` if [scan] has not been
|
| + * invoked.
|
| + */
|
| + IncrementalScanner _incrementalScanner;
|
|
|
| -/**
|
| - * Instances of the class `TokenStreamValidator` are used to validate the correct construction
|
| - * of a stream of tokens.
|
| - */
|
| -class TokenStreamValidator {
|
| /**
|
| - * Validate that the stream of tokens that starts with the given token is correct.
|
| - *
|
| - * @param token the first token in the stream of tokens to be validated
|
| + * The first token from the token stream resulting from performing an incremental scan, or
|
| + * `null` if [scan] has not been invoked.
|
| */
|
| - void validate(Token token) {
|
| - JavaStringBuilder builder = new JavaStringBuilder();
|
| - _validateStream(builder, token);
|
| - if (builder.length > 0) {
|
| - JUnitTestCase.fail(builder.toString());
|
| - }
|
| - }
|
| + Token _incrementalTokens;
|
|
|
| - void _validateStream(JavaStringBuilder builder, Token token) {
|
| - if (token == null) {
|
| - return;
|
| - }
|
| - Token previousToken = null;
|
| - int previousEnd = -1;
|
| - Token currentToken = token;
|
| - while (currentToken != null && currentToken.type != TokenType.EOF) {
|
| - _validateStream(builder, currentToken.precedingComments);
|
| - TokenType type = currentToken.type;
|
| - if (type == TokenType.OPEN_CURLY_BRACKET || type == TokenType.OPEN_PAREN || type == TokenType.OPEN_SQUARE_BRACKET || type == TokenType.STRING_INTERPOLATION_EXPRESSION) {
|
| - if (currentToken is! BeginToken) {
|
| - builder.append("\r\nExpected BeginToken, found ");
|
| - builder.append(currentToken.runtimeType.toString());
|
| - builder.append(" ");
|
| - _writeToken(builder, currentToken);
|
| - }
|
| - }
|
| - int currentStart = currentToken.offset;
|
| - int currentLength = currentToken.length;
|
| - int currentEnd = currentStart + currentLength - 1;
|
| - if (currentStart <= previousEnd) {
|
| - builder.append("\r\nInvalid token sequence: ");
|
| - _writeToken(builder, previousToken);
|
| - builder.append(" followed by ");
|
| - _writeToken(builder, currentToken);
|
| - }
|
| - previousEnd = currentEnd;
|
| - previousToken = currentToken;
|
| - currentToken = currentToken.next;
|
| - }
|
| + void test_delete_identifier_beginning() {
|
| + // "abs + b;"
|
| + // "s + b;")
|
| + _scan("", "ab", "", "s + b;");
|
| + _assertTokens(-1, 1, ["s", "+", "b", ";"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void _writeToken(JavaStringBuilder builder, Token token) {
|
| - builder.append("[");
|
| - builder.append(token.type);
|
| - builder.append(", '");
|
| - builder.append(token.lexeme);
|
| - builder.append("', ");
|
| - builder.append(token.offset);
|
| - builder.append(", ");
|
| - builder.append(token.length);
|
| - builder.append("]");
|
| + void test_delete_identifier_end() {
|
| + // "abs + b;"
|
| + // "a + b;")
|
| + _scan("a", "bs", "", " + b;");
|
| + _assertTokens(-1, 1, ["a", "+", "b", ";"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
| -}
|
|
|
| -class ScannerTest extends JUnitTestCase {
|
| - void fail_incomplete_string_interpolation() {
|
| - // https://code.google.com/p/dart/issues/detail?id=18073
|
| - _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9, "\"foo \${bar", [
|
| - new StringToken(TokenType.STRING, "\"foo ", 0),
|
| - new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 5),
|
| - new StringToken(TokenType.IDENTIFIER, "bar", 7)]);
|
| + void test_delete_identifier_middle() {
|
| + // "abs + b;"
|
| + // "as + b;")
|
| + _scan("a", "b", "", "s + b;");
|
| + _assertTokens(-1, 1, ["as", "+", "b", ";"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_ampersand() {
|
| - _assertToken(TokenType.AMPERSAND, "&");
|
| + void test_delete_mergeTokens() {
|
| + // "a + b + c;"
|
| + // "ac;")
|
| + _scan("a", " + b + ", "", "c;");
|
| + _assertTokens(-1, 1, ["ac", ";"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_ampersand_ampersand() {
|
| - _assertToken(TokenType.AMPERSAND_AMPERSAND, "&&");
|
| + void test_insert_afterIdentifier1() {
|
| + // "a + b;"
|
| + // "abs + b;"
|
| + _scan("a", "", "bs", " + b;");
|
| + _assertTokens(-1, 1, ["abs", "+", "b", ";"]);
|
| + _assertReplaced(1, "+");
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_ampersand_eq() {
|
| - _assertToken(TokenType.AMPERSAND_EQ, "&=");
|
| + void test_insert_afterIdentifier2() {
|
| + // "a + b;"
|
| + // "a + by;"
|
| + _scan("a + b", "", "y", ";");
|
| + _assertTokens(1, 3, ["a", "+", "by", ";"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_at() {
|
| - _assertToken(TokenType.AT, "@");
|
| + void test_insert_beforeIdentifier() {
|
| + // "a + b;"
|
| + // "a + xb;")
|
| + _scan("a + ", "", "x", "b;");
|
| + _assertTokens(1, 3, ["a", "+", "xb", ";"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_backping() {
|
| - _assertToken(TokenType.BACKPING, "`");
|
| + void test_insert_beforeIdentifier_firstToken() {
|
| + // "a + b;"
|
| + // "xa + b;"
|
| + _scan("", "", "x", "a + b;");
|
| + _assertTokens(-1, 1, ["xa", "+", "b", ";"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_backslash() {
|
| - _assertToken(TokenType.BACKSLASH, "\\");
|
| + void test_insert_convertOneFunctionToTwo() {
|
| + // "f() {}"
|
| + // "f() => 0; g() {}"
|
| + _scan("f()", "", " => 0; g()", " {}");
|
| + _assertTokens(2, 9, ["f", "(", ")", "=>", "0", ";", "g", "(", ")", "{", "}"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_bang() {
|
| - _assertToken(TokenType.BANG, "!");
|
| - }
|
| -
|
| - void test_bang_eq() {
|
| - _assertToken(TokenType.BANG_EQ, "!=");
|
| - }
|
| -
|
| - void test_bar() {
|
| - _assertToken(TokenType.BAR, "|");
|
| + void test_insert_end() {
|
| + // "class A {}"
|
| + // "class A {} class B {}"
|
| + _scan("class A {}", "", " class B {}", "");
|
| + _assertTokens(3, 8, ["class", "A", "{", "}", "class", "B", "{", "}"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_bar_bar() {
|
| - _assertToken(TokenType.BAR_BAR, "||");
|
| + void test_insert_insideIdentifier() {
|
| + // "cob;"
|
| + // "cow.b;"
|
| + _scan("co", "", "w.", "b;");
|
| + _assertTokens(-1, 3, ["cow", ".", "b", ";"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_bar_eq() {
|
| - _assertToken(TokenType.BAR_EQ, "|=");
|
| + void test_insert_newIdentifier1() {
|
| + // "a; c;"
|
| + // "a; b c;"
|
| + _scan("a; ", "", "b", " c;");
|
| + _assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_caret() {
|
| - _assertToken(TokenType.CARET, "^");
|
| + void test_insert_newIdentifier2() {
|
| + // "a; c;"
|
| + // "a;b c;"
|
| + _scan("a;", "", "b", " c;");
|
| + _assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
|
| + _assertReplaced(1, ";");
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_caret_eq() {
|
| - _assertToken(TokenType.CARET_EQ, "^=");
|
| + void test_insert_period() {
|
| + // "a + b;"
|
| + // "a + b.;"
|
| + _scan("a + b", "", ".", ";");
|
| + _assertTokens(2, 4, ["a", "+", "b", ".", ";"]);
|
| }
|
|
|
| - void test_close_curly_bracket() {
|
| - _assertToken(TokenType.CLOSE_CURLY_BRACKET, "}");
|
| + void test_insert_period_betweenIdentifiers1() {
|
| + // "a b;"
|
| + // "a. b;"
|
| + _scan("a", "", ".", " b;");
|
| + _assertTokens(0, 2, ["a", ".", "b", ";"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_close_paren() {
|
| - _assertToken(TokenType.CLOSE_PAREN, ")");
|
| + void test_insert_period_betweenIdentifiers2() {
|
| + // "a b;"
|
| + // "a .b;"
|
| + _scan("a ", "", ".", "b;");
|
| + _assertTokens(0, 2, ["a", ".", "b", ";"]);
|
| }
|
|
|
| - void test_close_quare_bracket() {
|
| - _assertToken(TokenType.CLOSE_SQUARE_BRACKET, "]");
|
| + void test_insert_period_betweenIdentifiers3() {
|
| + // "a b;"
|
| + // "a . b;"
|
| + _scan("a ", "", ".", " b;");
|
| + _assertTokens(0, 2, ["a", ".", "b", ";"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_colon() {
|
| - _assertToken(TokenType.COLON, ":");
|
| + void test_insert_period_insideExistingIdentifier() {
|
| + // "ab;"
|
| + // "a.b;"
|
| + _scan("a", "", ".", "b;");
|
| + _assertTokens(-1, 3, ["a", ".", "b", ";"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_comma() {
|
| - _assertToken(TokenType.COMMA, ",");
|
| + void test_insert_periodAndIdentifier() {
|
| + // "a + b;"
|
| + // "a + b.x;"
|
| + _scan("a + b", "", ".x", ";");
|
| + _assertTokens(2, 5, ["a", "+", "b", ".", "x", ";"]);
|
| }
|
|
|
| - void test_comment_disabled_multi() {
|
| - Scanner scanner = new Scanner(null, new CharSequenceReader("/* comment */ "), AnalysisErrorListener.NULL_LISTENER);
|
| - scanner.preserveComments = false;
|
| - Token token = scanner.tokenize();
|
| - JUnitTestCase.assertNotNull(token);
|
| - JUnitTestCase.assertNull(token.precedingComments);
|
| + void test_insert_whitespace_beginning_beforeToken() {
|
| + // "a + b;"
|
| + // " a + b;"
|
| + _scan("", "", " ", "a + b;");
|
| + _assertTokens(0, 1, ["a", "+", "b", ";"]);
|
| + JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_comment_multi() {
|
| - _assertComment(TokenType.MULTI_LINE_COMMENT, "/* comment */");
|
| + void test_insert_whitespace_betweenTokens() {
|
| + // "a + b;"
|
| + // "a + b;"
|
| + _scan("a ", "", " ", "+ b;");
|
| + _assertTokens(1, 2, ["a", "+", "b", ";"]);
|
| + JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_comment_multi_unterminated() {
|
| - _assertError(ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT, 3, "/* x");
|
| + void test_insert_whitespace_end_afterToken() {
|
| + // "a + b;"
|
| + // "a + b; "
|
| + _scan("a + b;", "", " ", "");
|
| + _assertTokens(3, 4, ["a", "+", "b", ";"]);
|
| + JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_comment_nested() {
|
| - _assertComment(TokenType.MULTI_LINE_COMMENT, "/* comment /* within a */ comment */");
|
| + void test_insert_whitespace_end_afterWhitespace() {
|
| + // "a + b; "
|
| + // "a + b; "
|
| + _scan("a + b; ", "", " ", "");
|
| + _assertTokens(3, 4, ["a", "+", "b", ";"]);
|
| + JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_comment_single() {
|
| - _assertComment(TokenType.SINGLE_LINE_COMMENT, "// comment");
|
| + void test_insert_whitespace_withMultipleComments() {
|
| + // "//comment", "//comment2", "a + b;"
|
| + // "//comment", "//comment2", "a + b;"
|
| + _scan(EngineTestCase.createSource(["//comment", "//comment2", "a"]), "", " ", " + b;");
|
| + _assertTokens(1, 2, ["a", "+", "b", ";"]);
|
| + JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_double_both_e() {
|
| - _assertToken(TokenType.DOUBLE, "0.123e4");
|
| + void test_replace_identifier_beginning() {
|
| + // "bell + b;"
|
| + // "fell + b;")
|
| + _scan("", "b", "f", "ell + b;");
|
| + _assertTokens(-1, 1, ["fell", "+", "b", ";"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_double_both_E() {
|
| - _assertToken(TokenType.DOUBLE, "0.123E4");
|
| + void test_replace_identifier_end() {
|
| + // "bell + b;"
|
| + // "belt + b;")
|
| + _scan("bel", "l", "t", " + b;");
|
| + _assertTokens(-1, 1, ["belt", "+", "b", ";"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_double_fraction() {
|
| - _assertToken(TokenType.DOUBLE, ".123");
|
| + void test_replace_identifier_middle() {
|
| + // "first + b;"
|
| + // "frost + b;")
|
| + _scan("f", "ir", "ro", "st + b;");
|
| + _assertTokens(-1, 1, ["frost", "+", "b", ";"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_double_fraction_e() {
|
| - _assertToken(TokenType.DOUBLE, ".123e4");
|
| + void test_replace_multiple_partialFirstAndLast() {
|
| + // "aa + bb;"
|
| + // "ab * ab;")
|
| + _scan("a", "a + b", "b * a", "b;");
|
| + _assertTokens(-1, 3, ["ab", "*", "ab", ";"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_double_fraction_E() {
|
| - _assertToken(TokenType.DOUBLE, ".123E4");
|
| + void test_replace_operator_oneForMany() {
|
| + // "a + b;"
|
| + // "a * c - b;")
|
| + _scan("a ", "+", "* c -", " b;");
|
| + _assertTokens(0, 4, ["a", "*", "c", "-", "b", ";"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_double_missingDigitInExponent() {
|
| - _assertError(ScannerErrorCode.MISSING_DIGIT, 1, "1e");
|
| + void test_replace_operator_oneForOne() {
|
| + // "a + b;"
|
| + // "a * b;")
|
| + _scan("a ", "+", "*", " b;");
|
| + _assertTokens(0, 2, ["a", "*", "b", ";"]);
|
| + JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_double_whole_e() {
|
| - _assertToken(TokenType.DOUBLE, "12e4");
|
| + void test_tokenMap() {
|
| + // "main() {a + b;}"
|
| + // "main() { a + b;}"
|
| + _scan("main() {", "", " ", "a + b;}");
|
| + TokenMap tokenMap = _incrementalScanner.tokenMap;
|
| + Token oldToken = _originalTokens;
|
| + while (oldToken.type != TokenType.EOF) {
|
| + Token newToken = tokenMap.get(oldToken);
|
| + JUnitTestCase.assertNotSame(oldToken, newToken);
|
| + JUnitTestCase.assertSame(oldToken.type, newToken.type);
|
| + JUnitTestCase.assertEquals(oldToken.lexeme, newToken.lexeme);
|
| + oldToken = oldToken.next;
|
| + }
|
| + JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
|
| }
|
|
|
| - void test_double_whole_E() {
|
| - _assertToken(TokenType.DOUBLE, "12E4");
|
| + /**
|
| + * Assert that the token at the given offset was replaced with a new token having the given
|
| + * lexeme.
|
| + *
|
| + * @param tokenOffset the offset of the token being tested
|
| + * @param lexeme the expected lexeme of the new token
|
| + */
|
| + void _assertReplaced(int tokenOffset, String lexeme) {
|
| + Token oldToken = _originalTokens;
|
| + for (int i = 0; i < tokenOffset; i++) {
|
| + oldToken = oldToken.next;
|
| + }
|
| + JUnitTestCase.assertEquals(lexeme, oldToken.lexeme);
|
| + Token newToken = _incrementalScanner.tokenMap.get(oldToken);
|
| + JUnitTestCase.assertNotNull(newToken);
|
| + JUnitTestCase.assertEquals(lexeme, newToken.lexeme);
|
| + JUnitTestCase.assertNotSame(oldToken, newToken);
|
| }
|
|
|
| - void test_eq() {
|
| - _assertToken(TokenType.EQ, "=");
|
| + /**
|
| + * Assert that the result of the incremental scan matches the given list of lexemes and that the
|
| + * left and right tokens correspond to the tokens at the given indices.
|
| + *
|
| + * @param leftIndex the expected index of the left token
|
| + * @param rightIndex the expected index of the right token
|
| + * @param lexemes the expected lexemes of the resulting tokens
|
| + */
|
| + void _assertTokens(int leftIndex, int rightIndex, List<String> lexemes) {
|
| + int count = lexemes.length;
|
| + JUnitTestCase.assertTrueMsg("Invalid left index", leftIndex >= -1 && leftIndex < count);
|
| + JUnitTestCase.assertTrueMsg("Invalid right index", rightIndex >= 0 && rightIndex <= count);
|
| + Token leftToken = null;
|
| + Token rightToken = null;
|
| + Token token = _incrementalTokens;
|
| + if (leftIndex < 0) {
|
| + leftToken = token.previous;
|
| + }
|
| + for (int i = 0; i < count; i++) {
|
| + JUnitTestCase.assertEquals(lexemes[i], token.lexeme);
|
| + if (i == leftIndex) {
|
| + leftToken = token;
|
| + }
|
| + if (i == rightIndex) {
|
| + rightToken = token;
|
| + }
|
| + token = token.next;
|
| + }
|
| + if (rightIndex >= count) {
|
| + rightToken = token;
|
| + }
|
| + JUnitTestCase.assertSameMsg("Too many tokens", TokenType.EOF, token.type);
|
| + if (leftIndex >= 0) {
|
| + JUnitTestCase.assertNotNull(leftToken);
|
| + }
|
| + JUnitTestCase.assertSameMsg("Invalid left token", leftToken, _incrementalScanner.leftToken);
|
| + if (rightIndex >= 0) {
|
| + JUnitTestCase.assertNotNull(rightToken);
|
| + }
|
| + JUnitTestCase.assertSameMsg("Invalid right token", rightToken, _incrementalScanner.rightToken);
|
| }
|
|
|
| - void test_eq_eq() {
|
| - _assertToken(TokenType.EQ_EQ, "==");
|
| - }
|
| -
|
| - void test_gt() {
|
| - _assertToken(TokenType.GT, ">");
|
| + /**
|
| + * Given a description of the original and modified contents, perform an incremental scan of the
|
| + * two pieces of text. Verify that the incremental scan produced the same tokens as those that
|
| + * would be produced by a full scan of the new contents.
|
| + *
|
| + * @param prefix the unchanged text before the edit region
|
| + * @param removed the text that was removed from the original contents
|
| + * @param added the text that was added to the modified contents
|
| + * @param suffix the unchanged text after the edit region
|
| + */
|
| + void _scan(String prefix, String removed, String added, String suffix) {
|
| + //
|
| + // Compute the information needed to perform the test.
|
| + //
|
| + String originalContents = "${prefix}${removed}${suffix}";
|
| + String modifiedContents = "${prefix}${added}${suffix}";
|
| + int replaceStart = prefix.length;
|
| + Source source = new TestSource();
|
| + //
|
| + // Scan the original contents.
|
| + //
|
| + GatheringErrorListener originalListener = new GatheringErrorListener();
|
| + Scanner originalScanner = new Scanner(source, new CharSequenceReader(originalContents), originalListener);
|
| + _originalTokens = originalScanner.tokenize();
|
| + JUnitTestCase.assertNotNull(_originalTokens);
|
| + //
|
| + // Scan the modified contents.
|
| + //
|
| + GatheringErrorListener modifiedListener = new GatheringErrorListener();
|
| + Scanner modifiedScanner = new Scanner(source, new CharSequenceReader(modifiedContents), modifiedListener);
|
| + Token modifiedTokens = modifiedScanner.tokenize();
|
| + JUnitTestCase.assertNotNull(modifiedTokens);
|
| + //
|
| + // Incrementally scan the modified contents.
|
| + //
|
| + GatheringErrorListener incrementalListener = new GatheringErrorListener();
|
| + _incrementalScanner = new IncrementalScanner(source, new CharSequenceReader(modifiedContents), incrementalListener);
|
| + _incrementalTokens = _incrementalScanner.rescan(_originalTokens, replaceStart, removed.length, added.length);
|
| + //
|
| + // Validate that the results of the incremental scan are the same as the full scan of the
|
| + // modified source.
|
| + //
|
| + Token incrementalToken = _incrementalTokens;
|
| + JUnitTestCase.assertNotNull(incrementalToken);
|
| + while (incrementalToken.type != TokenType.EOF && modifiedTokens.type != TokenType.EOF) {
|
| + JUnitTestCase.assertSameMsg("Wrong type for token", modifiedTokens.type, incrementalToken.type);
|
| + JUnitTestCase.assertEqualsMsg("Wrong offset for token", modifiedTokens.offset, incrementalToken.offset);
|
| + JUnitTestCase.assertEqualsMsg("Wrong length for token", modifiedTokens.length, incrementalToken.length);
|
| + JUnitTestCase.assertEqualsMsg("Wrong lexeme for token", modifiedTokens.lexeme, incrementalToken.lexeme);
|
| + incrementalToken = incrementalToken.next;
|
| + modifiedTokens = modifiedTokens.next;
|
| + }
|
| + JUnitTestCase.assertSameMsg("Too many tokens", TokenType.EOF, incrementalToken.type);
|
| + JUnitTestCase.assertSameMsg("Not enough tokens", TokenType.EOF, modifiedTokens.type);
|
| }
|
|
|
| - void test_gt_eq() {
|
| - _assertToken(TokenType.GT_EQ, ">=");
|
| + static dartSuite() {
|
| + _ut.group('IncrementalScannerTest', () {
|
| + _ut.test('test_delete_identifier_beginning', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_delete_identifier_beginning);
|
| + });
|
| + _ut.test('test_delete_identifier_end', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_delete_identifier_end);
|
| + });
|
| + _ut.test('test_delete_identifier_middle', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_delete_identifier_middle);
|
| + });
|
| + _ut.test('test_delete_mergeTokens', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_delete_mergeTokens);
|
| + });
|
| + _ut.test('test_insert_afterIdentifier1', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_afterIdentifier1);
|
| + });
|
| + _ut.test('test_insert_afterIdentifier2', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_afterIdentifier2);
|
| + });
|
| + _ut.test('test_insert_beforeIdentifier', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_beforeIdentifier);
|
| + });
|
| + _ut.test('test_insert_beforeIdentifier_firstToken', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_beforeIdentifier_firstToken);
|
| + });
|
| + _ut.test('test_insert_convertOneFunctionToTwo', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_convertOneFunctionToTwo);
|
| + });
|
| + _ut.test('test_insert_end', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_end);
|
| + });
|
| + _ut.test('test_insert_insideIdentifier', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_insideIdentifier);
|
| + });
|
| + _ut.test('test_insert_newIdentifier1', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_newIdentifier1);
|
| + });
|
| + _ut.test('test_insert_newIdentifier2', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_newIdentifier2);
|
| + });
|
| + _ut.test('test_insert_period', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_period);
|
| + });
|
| + _ut.test('test_insert_periodAndIdentifier', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_periodAndIdentifier);
|
| + });
|
| + _ut.test('test_insert_period_betweenIdentifiers1', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers1);
|
| + });
|
| + _ut.test('test_insert_period_betweenIdentifiers2', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers2);
|
| + });
|
| + _ut.test('test_insert_period_betweenIdentifiers3', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers3);
|
| + });
|
| + _ut.test('test_insert_period_insideExistingIdentifier', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_period_insideExistingIdentifier);
|
| + });
|
| + _ut.test('test_insert_whitespace_beginning_beforeToken', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_whitespace_beginning_beforeToken);
|
| + });
|
| + _ut.test('test_insert_whitespace_betweenTokens', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_whitespace_betweenTokens);
|
| + });
|
| + _ut.test('test_insert_whitespace_end_afterToken', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_whitespace_end_afterToken);
|
| + });
|
| + _ut.test('test_insert_whitespace_end_afterWhitespace', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_whitespace_end_afterWhitespace);
|
| + });
|
| + _ut.test('test_insert_whitespace_withMultipleComments', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_insert_whitespace_withMultipleComments);
|
| + });
|
| + _ut.test('test_replace_identifier_beginning', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_replace_identifier_beginning);
|
| + });
|
| + _ut.test('test_replace_identifier_end', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_replace_identifier_end);
|
| + });
|
| + _ut.test('test_replace_identifier_middle', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_replace_identifier_middle);
|
| + });
|
| + _ut.test('test_replace_multiple_partialFirstAndLast', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_replace_multiple_partialFirstAndLast);
|
| + });
|
| + _ut.test('test_replace_operator_oneForMany', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_replace_operator_oneForMany);
|
| + });
|
| + _ut.test('test_replace_operator_oneForOne', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_replace_operator_oneForOne);
|
| + });
|
| + _ut.test('test_tokenMap', () {
|
| + final __test = new IncrementalScannerTest();
|
| + runJUnitTest(__test, __test.test_tokenMap);
|
| + });
|
| + });
|
| }
|
| +}
|
|
|
| - void test_gt_gt() {
|
| - _assertToken(TokenType.GT_GT, ">>");
|
| +class ScannerTest extends JUnitTestCase {
|
| + void fail_incomplete_string_interpolation() {
|
| + // https://code.google.com/p/dart/issues/detail?id=18073
|
| + _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9, "\"foo \${bar", [
|
| + new StringToken(TokenType.STRING, "\"foo ", 0),
|
| + new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 5),
|
| + new StringToken(TokenType.IDENTIFIER, "bar", 7)]);
|
| }
|
|
|
| - void test_gt_gt_eq() {
|
| - _assertToken(TokenType.GT_GT_EQ, ">>=");
|
| + void test_ampersand() {
|
| + _assertToken(TokenType.AMPERSAND, "&");
|
| }
|
|
|
| - void test_hash() {
|
| - _assertToken(TokenType.HASH, "#");
|
| + void test_ampersand_ampersand() {
|
| + _assertToken(TokenType.AMPERSAND_AMPERSAND, "&&");
|
| }
|
|
|
| - void test_hexidecimal() {
|
| - _assertToken(TokenType.HEXADECIMAL, "0x1A2B3C");
|
| + void test_ampersand_eq() {
|
| + _assertToken(TokenType.AMPERSAND_EQ, "&=");
|
| }
|
|
|
| - void test_hexidecimal_missingDigit() {
|
| - _assertError(ScannerErrorCode.MISSING_HEX_DIGIT, 1, "0x");
|
| + void test_at() {
|
| + _assertToken(TokenType.AT, "@");
|
| }
|
|
|
| - void test_identifier() {
|
| - _assertToken(TokenType.IDENTIFIER, "result");
|
| + void test_backping() {
|
| + _assertToken(TokenType.BACKPING, "`");
|
| }
|
|
|
| - void test_illegalChar_cyrillicLetter_middle() {
|
| - _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 5, "Shche\u0433lov");
|
| + void test_backslash() {
|
| + _assertToken(TokenType.BACKSLASH, "\\");
|
| }
|
|
|
| - void test_illegalChar_cyrillicLetter_start() {
|
| - _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0429");
|
| + void test_bang() {
|
| + _assertToken(TokenType.BANG, "!");
|
| }
|
|
|
| - void test_illegalChar_nbsp() {
|
| - _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u00A0");
|
| + void test_bang_eq() {
|
| + _assertToken(TokenType.BANG_EQ, "!=");
|
| }
|
|
|
| - void test_illegalChar_notLetter() {
|
| - _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0312");
|
| + void test_bar() {
|
| + _assertToken(TokenType.BAR, "|");
|
| }
|
|
|
| - void test_index() {
|
| - _assertToken(TokenType.INDEX, "[]");
|
| + void test_bar_bar() {
|
| + _assertToken(TokenType.BAR_BAR, "||");
|
| }
|
|
|
| - void test_index_eq() {
|
| - _assertToken(TokenType.INDEX_EQ, "[]=");
|
| + void test_bar_eq() {
|
| + _assertToken(TokenType.BAR_EQ, "|=");
|
| }
|
|
|
| - void test_int() {
|
| - _assertToken(TokenType.INT, "123");
|
| + void test_caret() {
|
| + _assertToken(TokenType.CARET, "^");
|
| }
|
|
|
| - void test_int_initialZero() {
|
| - _assertToken(TokenType.INT, "0123");
|
| + void test_caret_eq() {
|
| + _assertToken(TokenType.CARET_EQ, "^=");
|
| }
|
|
|
| - void test_keyword_abstract() {
|
| - _assertKeywordToken("abstract");
|
| + void test_close_curly_bracket() {
|
| + _assertToken(TokenType.CLOSE_CURLY_BRACKET, "}");
|
| }
|
|
|
| - void test_keyword_as() {
|
| - _assertKeywordToken("as");
|
| + void test_close_paren() {
|
| + _assertToken(TokenType.CLOSE_PAREN, ")");
|
| + }
|
| +
|
| + void test_close_quare_bracket() {
|
| + _assertToken(TokenType.CLOSE_SQUARE_BRACKET, "]");
|
| + }
|
| +
|
| + void test_colon() {
|
| + _assertToken(TokenType.COLON, ":");
|
| + }
|
| +
|
| + void test_comma() {
|
| + _assertToken(TokenType.COMMA, ",");
|
| + }
|
| +
|
| + void test_comment_disabled_multi() {
|
| + Scanner scanner = new Scanner(null, new CharSequenceReader("/* comment */ "), AnalysisErrorListener.NULL_LISTENER);
|
| + scanner.preserveComments = false;
|
| + Token token = scanner.tokenize();
|
| + JUnitTestCase.assertNotNull(token);
|
| + JUnitTestCase.assertNull(token.precedingComments);
|
| + }
|
| +
|
| + void test_comment_multi() {
|
| + _assertComment(TokenType.MULTI_LINE_COMMENT, "/* comment */");
|
| + }
|
| +
|
| + void test_comment_multi_unterminated() {
|
| + _assertError(ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT, 3, "/* x");
|
| + }
|
| +
|
| + void test_comment_nested() {
|
| + _assertComment(TokenType.MULTI_LINE_COMMENT, "/* comment /* within a */ comment */");
|
| + }
|
| +
|
| + void test_comment_single() {
|
| + _assertComment(TokenType.SINGLE_LINE_COMMENT, "// comment");
|
| + }
|
| +
|
| + void test_double_both_e() {
|
| + _assertToken(TokenType.DOUBLE, "0.123e4");
|
| + }
|
| +
|
| + void test_double_both_E() {
|
| + _assertToken(TokenType.DOUBLE, "0.123E4");
|
| + }
|
| +
|
| + void test_double_fraction() {
|
| + _assertToken(TokenType.DOUBLE, ".123");
|
| + }
|
| +
|
| + void test_double_fraction_e() {
|
| + _assertToken(TokenType.DOUBLE, ".123e4");
|
| + }
|
| +
|
| + void test_double_fraction_E() {
|
| + _assertToken(TokenType.DOUBLE, ".123E4");
|
| + }
|
| +
|
| + void test_double_missingDigitInExponent() {
|
| + _assertError(ScannerErrorCode.MISSING_DIGIT, 1, "1e");
|
| + }
|
| +
|
| + void test_double_whole_e() {
|
| + _assertToken(TokenType.DOUBLE, "12e4");
|
| + }
|
| +
|
| + void test_double_whole_E() {
|
| + _assertToken(TokenType.DOUBLE, "12E4");
|
| + }
|
| +
|
| + void test_eq() {
|
| + _assertToken(TokenType.EQ, "=");
|
| + }
|
| +
|
| + void test_eq_eq() {
|
| + _assertToken(TokenType.EQ_EQ, "==");
|
| + }
|
| +
|
| + void test_gt() {
|
| + _assertToken(TokenType.GT, ">");
|
| + }
|
| +
|
| + void test_gt_eq() {
|
| + _assertToken(TokenType.GT_EQ, ">=");
|
| + }
|
| +
|
| + void test_gt_gt() {
|
| + _assertToken(TokenType.GT_GT, ">>");
|
| + }
|
| +
|
| + void test_gt_gt_eq() {
|
| + _assertToken(TokenType.GT_GT_EQ, ">>=");
|
| + }
|
| +
|
| + void test_hash() {
|
| + _assertToken(TokenType.HASH, "#");
|
| + }
|
| +
|
| + void test_hexidecimal() {
|
| + _assertToken(TokenType.HEXADECIMAL, "0x1A2B3C");
|
| + }
|
| +
|
| + void test_hexidecimal_missingDigit() {
|
| + _assertError(ScannerErrorCode.MISSING_HEX_DIGIT, 1, "0x");
|
| + }
|
| +
|
| + void test_identifier() {
|
| + _assertToken(TokenType.IDENTIFIER, "result");
|
| + }
|
| +
|
| + void test_illegalChar_cyrillicLetter_middle() {
|
| + _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 5, "Shche\u0433lov");
|
| + }
|
| +
|
| + void test_illegalChar_cyrillicLetter_start() {
|
| + _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0429");
|
| + }
|
| +
|
| + void test_illegalChar_nbsp() {
|
| + _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u00A0");
|
| + }
|
| +
|
| + void test_illegalChar_notLetter() {
|
| + _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0312");
|
| + }
|
| +
|
| + void test_index() {
|
| + _assertToken(TokenType.INDEX, "[]");
|
| + }
|
| +
|
| + void test_index_eq() {
|
| + _assertToken(TokenType.INDEX_EQ, "[]=");
|
| + }
|
| +
|
| + void test_int() {
|
| + _assertToken(TokenType.INT, "123");
|
| + }
|
| +
|
| + void test_int_initialZero() {
|
| + _assertToken(TokenType.INT, "0123");
|
| + }
|
| +
|
| + void test_keyword_abstract() {
|
| + _assertKeywordToken("abstract");
|
| + }
|
| +
|
| + void test_keyword_as() {
|
| + _assertKeywordToken("as");
|
| }
|
|
|
| void test_keyword_assert() {
|
| @@ -1926,525 +2382,69 @@ class ScannerTest_ExpectedLocation {
|
| ScannerTest_ExpectedLocation(this._offset, this._lineNumber, this._columnNumber);
|
| }
|
|
|
| -class IncrementalScannerTest extends EngineTestCase {
|
| - /**
|
| - * The first token from the token stream resulting from parsing the original source, or
|
| - * `null` if [scan] has not been invoked.
|
| - */
|
| - Token _originalTokens;
|
| -
|
| - /**
|
| - * The scanner used to perform incremental scanning, or `null` if [scan] has not been
|
| - * invoked.
|
| - */
|
| - IncrementalScanner _incrementalScanner;
|
| -
|
| - /**
|
| - * The first token from the token stream resulting from performing an incremental scan, or
|
| - * `null` if [scan] has not been invoked.
|
| - */
|
| - Token _incrementalTokens;
|
| -
|
| - void test_delete_identifier_beginning() {
|
| - // "abs + b;"
|
| - // "s + b;")
|
| - _scan("", "ab", "", "s + b;");
|
| - _assertTokens(-1, 1, ["s", "+", "b", ";"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| +class KeywordStateTest extends JUnitTestCase {
|
| + void test_KeywordState() {
|
| + //
|
| + // Generate the test data to be scanned.
|
| + //
|
| + List<Keyword> keywords = Keyword.values;
|
| + int keywordCount = keywords.length;
|
| + List<String> textToTest = new List<String>(keywordCount * 3);
|
| + for (int i = 0; i < keywordCount; i++) {
|
| + String syntax = keywords[i].syntax;
|
| + textToTest[i] = syntax;
|
| + textToTest[i + keywordCount] = "${syntax}x";
|
| + textToTest[i + keywordCount * 2] = syntax.substring(0, syntax.length - 1);
|
| + }
|
| + //
|
| + // Scan each of the identifiers.
|
| + //
|
| + KeywordState firstState = KeywordState.KEYWORD_STATE;
|
| + for (int i = 0; i < textToTest.length; i++) {
|
| + String text = textToTest[i];
|
| + int index = 0;
|
| + int length = text.length;
|
| + KeywordState state = firstState;
|
| + while (index < length && state != null) {
|
| + state = state.next(text.codeUnitAt(index));
|
| + index++;
|
| + }
|
| + if (i < keywordCount) {
|
| + // keyword
|
| + JUnitTestCase.assertNotNull(state);
|
| + JUnitTestCase.assertNotNull(state.keyword());
|
| + JUnitTestCase.assertEquals(keywords[i], state.keyword());
|
| + } else if (i < keywordCount * 2) {
|
| + // keyword + "x"
|
| + JUnitTestCase.assertNull(state);
|
| + } else {
|
| + // keyword.substring(0, keyword.length() - 1)
|
| + JUnitTestCase.assertNotNull(state);
|
| + }
|
| + }
|
| }
|
|
|
| - void test_delete_identifier_end() {
|
| - // "abs + b;"
|
| - // "a + b;")
|
| - _scan("a", "bs", "", " + b;");
|
| - _assertTokens(-1, 1, ["a", "+", "b", ";"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| + static dartSuite() {
|
| + _ut.group('KeywordStateTest', () {
|
| + _ut.test('test_KeywordState', () {
|
| + final __test = new KeywordStateTest();
|
| + runJUnitTest(__test, __test.test_KeywordState);
|
| + });
|
| + });
|
| }
|
| +}
|
|
|
| - void test_delete_identifier_middle() {
|
| - // "abs + b;"
|
| - // "as + b;")
|
| - _scan("a", "b", "", "s + b;");
|
| - _assertTokens(-1, 1, ["as", "+", "b", ";"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| +/**
|
| + * The class `TokenFactory` defines utility methods that can be used to create tokens.
|
| + */
|
| +class TokenFactory {
|
| + static Token tokenFromKeyword(Keyword keyword) => new KeywordToken(keyword, 0);
|
|
|
| - void test_delete_mergeTokens() {
|
| - // "a + b + c;"
|
| - // "ac;")
|
| - _scan("a", " + b + ", "", "c;");
|
| - _assertTokens(-1, 1, ["ac", ";"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| + static Token tokenFromString(String lexeme) => new StringToken(TokenType.STRING, lexeme, 0);
|
|
|
| - void test_insert_afterIdentifier1() {
|
| - // "a + b;"
|
| - // "abs + b;"
|
| - _scan("a", "", "bs", " + b;");
|
| - _assertTokens(-1, 1, ["abs", "+", "b", ";"]);
|
| - _assertReplaced(1, "+");
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| + static Token tokenFromType(TokenType type) => new Token(type, 0);
|
|
|
| - void test_insert_afterIdentifier2() {
|
| - // "a + b;"
|
| - // "a + by;"
|
| - _scan("a + b", "", "y", ";");
|
| - _assertTokens(1, 3, ["a", "+", "by", ";"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_insert_beforeIdentifier() {
|
| - // "a + b;"
|
| - // "a + xb;")
|
| - _scan("a + ", "", "x", "b;");
|
| - _assertTokens(1, 3, ["a", "+", "xb", ";"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_insert_beforeIdentifier_firstToken() {
|
| - // "a + b;"
|
| - // "xa + b;"
|
| - _scan("", "", "x", "a + b;");
|
| - _assertTokens(-1, 1, ["xa", "+", "b", ";"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_insert_convertOneFunctionToTwo() {
|
| - // "f() {}"
|
| - // "f() => 0; g() {}"
|
| - _scan("f()", "", " => 0; g()", " {}");
|
| - _assertTokens(2, 9, ["f", "(", ")", "=>", "0", ";", "g", "(", ")", "{", "}"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_insert_end() {
|
| - // "class A {}"
|
| - // "class A {} class B {}"
|
| - _scan("class A {}", "", " class B {}", "");
|
| - _assertTokens(3, 8, ["class", "A", "{", "}", "class", "B", "{", "}"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_insert_insideIdentifier() {
|
| - // "cob;"
|
| - // "cow.b;"
|
| - _scan("co", "", "w.", "b;");
|
| - _assertTokens(-1, 3, ["cow", ".", "b", ";"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_insert_newIdentifier1() {
|
| - // "a; c;"
|
| - // "a; b c;"
|
| - _scan("a; ", "", "b", " c;");
|
| - _assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_insert_newIdentifier2() {
|
| - // "a; c;"
|
| - // "a;b c;"
|
| - _scan("a;", "", "b", " c;");
|
| - _assertTokens(1, 3, ["a", ";", "b", "c", ";"]);
|
| - _assertReplaced(1, ";");
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_insert_period() {
|
| - // "a + b;"
|
| - // "a + b.;"
|
| - _scan("a + b", "", ".", ";");
|
| - _assertTokens(2, 4, ["a", "+", "b", ".", ";"]);
|
| - }
|
| -
|
| - void test_insert_period_betweenIdentifiers1() {
|
| - // "a b;"
|
| - // "a. b;"
|
| - _scan("a", "", ".", " b;");
|
| - _assertTokens(0, 2, ["a", ".", "b", ";"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_insert_period_betweenIdentifiers2() {
|
| - // "a b;"
|
| - // "a .b;"
|
| - _scan("a ", "", ".", "b;");
|
| - _assertTokens(0, 2, ["a", ".", "b", ";"]);
|
| - }
|
| -
|
| - void test_insert_period_betweenIdentifiers3() {
|
| - // "a b;"
|
| - // "a . b;"
|
| - _scan("a ", "", ".", " b;");
|
| - _assertTokens(0, 2, ["a", ".", "b", ";"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_insert_period_insideExistingIdentifier() {
|
| - // "ab;"
|
| - // "a.b;"
|
| - _scan("a", "", ".", "b;");
|
| - _assertTokens(-1, 3, ["a", ".", "b", ";"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_insert_periodAndIdentifier() {
|
| - // "a + b;"
|
| - // "a + b.x;"
|
| - _scan("a + b", "", ".x", ";");
|
| - _assertTokens(2, 5, ["a", "+", "b", ".", "x", ";"]);
|
| - }
|
| -
|
| - void test_insert_whitespace_beginning_beforeToken() {
|
| - // "a + b;"
|
| - // " a + b;"
|
| - _scan("", "", " ", "a + b;");
|
| - _assertTokens(0, 1, ["a", "+", "b", ";"]);
|
| - JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_insert_whitespace_betweenTokens() {
|
| - // "a + b;"
|
| - // "a + b;"
|
| - _scan("a ", "", " ", "+ b;");
|
| - _assertTokens(1, 2, ["a", "+", "b", ";"]);
|
| - JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_insert_whitespace_end_afterToken() {
|
| - // "a + b;"
|
| - // "a + b; "
|
| - _scan("a + b;", "", " ", "");
|
| - _assertTokens(3, 4, ["a", "+", "b", ";"]);
|
| - JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_insert_whitespace_end_afterWhitespace() {
|
| - // "a + b; "
|
| - // "a + b; "
|
| - _scan("a + b; ", "", " ", "");
|
| - _assertTokens(3, 4, ["a", "+", "b", ";"]);
|
| - JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_insert_whitespace_withMultipleComments() {
|
| - // "//comment", "//comment2", "a + b;"
|
| - // "//comment", "//comment2", "a + b;"
|
| - _scan(EngineTestCase.createSource(["//comment", "//comment2", "a"]), "", " ", " + b;");
|
| - _assertTokens(1, 2, ["a", "+", "b", ";"]);
|
| - JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_replace_identifier_beginning() {
|
| - // "bell + b;"
|
| - // "fell + b;")
|
| - _scan("", "b", "f", "ell + b;");
|
| - _assertTokens(-1, 1, ["fell", "+", "b", ";"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_replace_identifier_end() {
|
| - // "bell + b;"
|
| - // "belt + b;")
|
| - _scan("bel", "l", "t", " + b;");
|
| - _assertTokens(-1, 1, ["belt", "+", "b", ";"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_replace_identifier_middle() {
|
| - // "first + b;"
|
| - // "frost + b;")
|
| - _scan("f", "ir", "ro", "st + b;");
|
| - _assertTokens(-1, 1, ["frost", "+", "b", ";"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_replace_multiple_partialFirstAndLast() {
|
| - // "aa + bb;"
|
| - // "ab * ab;")
|
| - _scan("a", "a + b", "b * a", "b;");
|
| - _assertTokens(-1, 3, ["ab", "*", "ab", ";"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_replace_operator_oneForMany() {
|
| - // "a + b;"
|
| - // "a * c - b;")
|
| - _scan("a ", "+", "* c -", " b;");
|
| - _assertTokens(0, 4, ["a", "*", "c", "-", "b", ";"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_replace_operator_oneForOne() {
|
| - // "a + b;"
|
| - // "a * b;")
|
| - _scan("a ", "+", "*", " b;");
|
| - _assertTokens(0, 2, ["a", "*", "b", ";"]);
|
| - JUnitTestCase.assertTrue(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - void test_tokenMap() {
|
| - // "main() {a + b;}"
|
| - // "main() { a + b;}"
|
| - _scan("main() {", "", " ", "a + b;}");
|
| - TokenMap tokenMap = _incrementalScanner.tokenMap;
|
| - Token oldToken = _originalTokens;
|
| - while (oldToken.type != TokenType.EOF) {
|
| - Token newToken = tokenMap.get(oldToken);
|
| - JUnitTestCase.assertNotSame(oldToken, newToken);
|
| - JUnitTestCase.assertSame(oldToken.type, newToken.type);
|
| - JUnitTestCase.assertEquals(oldToken.lexeme, newToken.lexeme);
|
| - oldToken = oldToken.next;
|
| - }
|
| - JUnitTestCase.assertFalse(_incrementalScanner.hasNonWhitespaceChange);
|
| - }
|
| -
|
| - /**
|
| - * Assert that the token at the given offset was replaced with a new token having the given
|
| - * lexeme.
|
| - *
|
| - * @param tokenOffset the offset of the token being tested
|
| - * @param lexeme the expected lexeme of the new token
|
| - */
|
| - void _assertReplaced(int tokenOffset, String lexeme) {
|
| - Token oldToken = _originalTokens;
|
| - for (int i = 0; i < tokenOffset; i++) {
|
| - oldToken = oldToken.next;
|
| - }
|
| - JUnitTestCase.assertEquals(lexeme, oldToken.lexeme);
|
| - Token newToken = _incrementalScanner.tokenMap.get(oldToken);
|
| - JUnitTestCase.assertNotNull(newToken);
|
| - JUnitTestCase.assertEquals(lexeme, newToken.lexeme);
|
| - JUnitTestCase.assertNotSame(oldToken, newToken);
|
| - }
|
| -
|
| - /**
|
| - * Assert that the result of the incremental scan matches the given list of lexemes and that the
|
| - * left and right tokens correspond to the tokens at the given indices.
|
| - *
|
| - * @param leftIndex the expected index of the left token
|
| - * @param rightIndex the expected index of the right token
|
| - * @param lexemes the expected lexemes of the resulting tokens
|
| - */
|
| - void _assertTokens(int leftIndex, int rightIndex, List<String> lexemes) {
|
| - int count = lexemes.length;
|
| - JUnitTestCase.assertTrueMsg("Invalid left index", leftIndex >= -1 && leftIndex < count);
|
| - JUnitTestCase.assertTrueMsg("Invalid right index", rightIndex >= 0 && rightIndex <= count);
|
| - Token leftToken = null;
|
| - Token rightToken = null;
|
| - Token token = _incrementalTokens;
|
| - if (leftIndex < 0) {
|
| - leftToken = token.previous;
|
| - }
|
| - for (int i = 0; i < count; i++) {
|
| - JUnitTestCase.assertEquals(lexemes[i], token.lexeme);
|
| - if (i == leftIndex) {
|
| - leftToken = token;
|
| - }
|
| - if (i == rightIndex) {
|
| - rightToken = token;
|
| - }
|
| - token = token.next;
|
| - }
|
| - if (rightIndex >= count) {
|
| - rightToken = token;
|
| - }
|
| - JUnitTestCase.assertSameMsg("Too many tokens", TokenType.EOF, token.type);
|
| - if (leftIndex >= 0) {
|
| - JUnitTestCase.assertNotNull(leftToken);
|
| - }
|
| - JUnitTestCase.assertSameMsg("Invalid left token", leftToken, _incrementalScanner.leftToken);
|
| - if (rightIndex >= 0) {
|
| - JUnitTestCase.assertNotNull(rightToken);
|
| - }
|
| - JUnitTestCase.assertSameMsg("Invalid right token", rightToken, _incrementalScanner.rightToken);
|
| - }
|
| -
|
| - /**
|
| - * Given a description of the original and modified contents, perform an incremental scan of the
|
| - * two pieces of text. Verify that the incremental scan produced the same tokens as those that
|
| - * would be produced by a full scan of the new contents.
|
| - *
|
| - * @param prefix the unchanged text before the edit region
|
| - * @param removed the text that was removed from the original contents
|
| - * @param added the text that was added to the modified contents
|
| - * @param suffix the unchanged text after the edit region
|
| - */
|
| - void _scan(String prefix, String removed, String added, String suffix) {
|
| - //
|
| - // Compute the information needed to perform the test.
|
| - //
|
| - String originalContents = "${prefix}${removed}${suffix}";
|
| - String modifiedContents = "${prefix}${added}${suffix}";
|
| - int replaceStart = prefix.length;
|
| - Source source = new TestSource();
|
| - //
|
| - // Scan the original contents.
|
| - //
|
| - GatheringErrorListener originalListener = new GatheringErrorListener();
|
| - Scanner originalScanner = new Scanner(source, new CharSequenceReader(originalContents), originalListener);
|
| - _originalTokens = originalScanner.tokenize();
|
| - JUnitTestCase.assertNotNull(_originalTokens);
|
| - //
|
| - // Scan the modified contents.
|
| - //
|
| - GatheringErrorListener modifiedListener = new GatheringErrorListener();
|
| - Scanner modifiedScanner = new Scanner(source, new CharSequenceReader(modifiedContents), modifiedListener);
|
| - Token modifiedTokens = modifiedScanner.tokenize();
|
| - JUnitTestCase.assertNotNull(modifiedTokens);
|
| - //
|
| - // Incrementally scan the modified contents.
|
| - //
|
| - GatheringErrorListener incrementalListener = new GatheringErrorListener();
|
| - _incrementalScanner = new IncrementalScanner(source, new CharSequenceReader(modifiedContents), incrementalListener);
|
| - _incrementalTokens = _incrementalScanner.rescan(_originalTokens, replaceStart, removed.length, added.length);
|
| - //
|
| - // Validate that the results of the incremental scan are the same as the full scan of the
|
| - // modified source.
|
| - //
|
| - Token incrementalToken = _incrementalTokens;
|
| - JUnitTestCase.assertNotNull(incrementalToken);
|
| - while (incrementalToken.type != TokenType.EOF && modifiedTokens.type != TokenType.EOF) {
|
| - JUnitTestCase.assertSameMsg("Wrong type for token", modifiedTokens.type, incrementalToken.type);
|
| - JUnitTestCase.assertEqualsMsg("Wrong offset for token", modifiedTokens.offset, incrementalToken.offset);
|
| - JUnitTestCase.assertEqualsMsg("Wrong length for token", modifiedTokens.length, incrementalToken.length);
|
| - JUnitTestCase.assertEqualsMsg("Wrong lexeme for token", modifiedTokens.lexeme, incrementalToken.lexeme);
|
| - incrementalToken = incrementalToken.next;
|
| - modifiedTokens = modifiedTokens.next;
|
| - }
|
| - JUnitTestCase.assertSameMsg("Too many tokens", TokenType.EOF, incrementalToken.type);
|
| - JUnitTestCase.assertSameMsg("Not enough tokens", TokenType.EOF, modifiedTokens.type);
|
| - }
|
| -
|
| - static dartSuite() {
|
| - _ut.group('IncrementalScannerTest', () {
|
| - _ut.test('test_delete_identifier_beginning', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_delete_identifier_beginning);
|
| - });
|
| - _ut.test('test_delete_identifier_end', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_delete_identifier_end);
|
| - });
|
| - _ut.test('test_delete_identifier_middle', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_delete_identifier_middle);
|
| - });
|
| - _ut.test('test_delete_mergeTokens', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_delete_mergeTokens);
|
| - });
|
| - _ut.test('test_insert_afterIdentifier1', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_afterIdentifier1);
|
| - });
|
| - _ut.test('test_insert_afterIdentifier2', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_afterIdentifier2);
|
| - });
|
| - _ut.test('test_insert_beforeIdentifier', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_beforeIdentifier);
|
| - });
|
| - _ut.test('test_insert_beforeIdentifier_firstToken', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_beforeIdentifier_firstToken);
|
| - });
|
| - _ut.test('test_insert_convertOneFunctionToTwo', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_convertOneFunctionToTwo);
|
| - });
|
| - _ut.test('test_insert_end', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_end);
|
| - });
|
| - _ut.test('test_insert_insideIdentifier', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_insideIdentifier);
|
| - });
|
| - _ut.test('test_insert_newIdentifier1', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_newIdentifier1);
|
| - });
|
| - _ut.test('test_insert_newIdentifier2', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_newIdentifier2);
|
| - });
|
| - _ut.test('test_insert_period', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_period);
|
| - });
|
| - _ut.test('test_insert_periodAndIdentifier', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_periodAndIdentifier);
|
| - });
|
| - _ut.test('test_insert_period_betweenIdentifiers1', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers1);
|
| - });
|
| - _ut.test('test_insert_period_betweenIdentifiers2', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers2);
|
| - });
|
| - _ut.test('test_insert_period_betweenIdentifiers3', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_period_betweenIdentifiers3);
|
| - });
|
| - _ut.test('test_insert_period_insideExistingIdentifier', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_period_insideExistingIdentifier);
|
| - });
|
| - _ut.test('test_insert_whitespace_beginning_beforeToken', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_whitespace_beginning_beforeToken);
|
| - });
|
| - _ut.test('test_insert_whitespace_betweenTokens', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_whitespace_betweenTokens);
|
| - });
|
| - _ut.test('test_insert_whitespace_end_afterToken', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_whitespace_end_afterToken);
|
| - });
|
| - _ut.test('test_insert_whitespace_end_afterWhitespace', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_whitespace_end_afterWhitespace);
|
| - });
|
| - _ut.test('test_insert_whitespace_withMultipleComments', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_insert_whitespace_withMultipleComments);
|
| - });
|
| - _ut.test('test_replace_identifier_beginning', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_replace_identifier_beginning);
|
| - });
|
| - _ut.test('test_replace_identifier_end', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_replace_identifier_end);
|
| - });
|
| - _ut.test('test_replace_identifier_middle', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_replace_identifier_middle);
|
| - });
|
| - _ut.test('test_replace_multiple_partialFirstAndLast', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_replace_multiple_partialFirstAndLast);
|
| - });
|
| - _ut.test('test_replace_operator_oneForMany', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_replace_operator_oneForMany);
|
| - });
|
| - _ut.test('test_replace_operator_oneForOne', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_replace_operator_oneForOne);
|
| - });
|
| - _ut.test('test_tokenMap', () {
|
| - final __test = new IncrementalScannerTest();
|
| - runJUnitTest(__test, __test.test_tokenMap);
|
| - });
|
| - });
|
| - }
|
| + static Token tokenFromTypeAndString(TokenType type, String lexeme) => new StringToken(type, lexeme, 0);
|
| }
|
|
|
| main() {
|
|
|