// This code was auto-generated, is not intended to be edited, and is subject to
// significant change. Please see the README file for more information.

library engine.scanner_test;

import 'dart:collection';
import 'package:analyzer-experimental/src/generated/java_core.dart';
import 'package:analyzer-experimental/src/generated/java_engine.dart';
import 'package:analyzer-experimental/src/generated/java_junit.dart';
import 'package:analyzer-experimental/src/generated/source.dart';
import 'package:analyzer-experimental/src/generated/error.dart';
import 'package:analyzer-experimental/src/generated/scanner.dart';
import 'package:unittest/unittest.dart' as _ut;
import 'test_support.dart';

class CharBufferScannerTest extends AbstractScannerTest {
  Token scan(String source, GatheringErrorListener listener) {
    CharBuffer buffer = CharBuffer.wrap(source);
    CharBufferScanner scanner = new CharBufferScanner(null, buffer, listener);
    Token result = scanner.tokenize();
    listener.setLineInfo(new TestSource(), scanner.lineStarts);
    return result;
  }
  static dartSuite() {
    _ut.group('CharBufferScannerTest', () {
      _ut.test('test_ampersand', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_ampersand);
      });
      _ut.test('test_ampersand_ampersand', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_ampersand_ampersand);
      });
      _ut.test('test_ampersand_eq', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_ampersand_eq);
      });
      _ut.test('test_at', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_at);
      });
      _ut.test('test_backping', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_backping);
      });
      _ut.test('test_backslash', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_backslash);
      });
      _ut.test('test_bang', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_bang);
      });
      _ut.test('test_bang_eq', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_bang_eq);
      });
      _ut.test('test_bar', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_bar);
      });
      _ut.test('test_bar_bar', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_bar_bar);
      });
      _ut.test('test_bar_eq', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_bar_eq);
      });
      _ut.test('test_caret', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_caret);
      });
      _ut.test('test_caret_eq', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_caret_eq);
      });
      _ut.test('test_close_curly_bracket', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_close_curly_bracket);
      });
      _ut.test('test_close_paren', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_close_paren);
      });
      _ut.test('test_close_quare_bracket', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_close_quare_bracket);
      });
      _ut.test('test_colon', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_colon);
      });
      _ut.test('test_comma', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_comma);
      });
      _ut.test('test_comment_multi', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_comment_multi);
      });
      _ut.test('test_comment_multi_unterminated', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_comment_multi_unterminated);
      });
      _ut.test('test_comment_nested', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_comment_nested);
      });
      _ut.test('test_comment_single', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_comment_single);
      });
      _ut.test('test_double_both_E', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_double_both_E);
      });
      _ut.test('test_double_both_e', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_double_both_e);
      });
      _ut.test('test_double_fraction', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_double_fraction);
      });
      _ut.test('test_double_fraction_D', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_double_fraction_D);
      });
      _ut.test('test_double_fraction_E', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_double_fraction_E);
      });
      _ut.test('test_double_fraction_Ed', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_double_fraction_Ed);
      });
      _ut.test('test_double_fraction_d', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_double_fraction_d);
      });
      _ut.test('test_double_fraction_e', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_double_fraction_e);
      });
      _ut.test('test_double_fraction_ed', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_double_fraction_ed);
      });
      _ut.test('test_double_missingDigitInExponent', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_double_missingDigitInExponent);
      });
      _ut.test('test_double_whole_D', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_double_whole_D);
      });
      _ut.test('test_double_whole_E', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_double_whole_E);
      });
      _ut.test('test_double_whole_Ed', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_double_whole_Ed);
      });
      _ut.test('test_double_whole_d', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_double_whole_d);
      });
      _ut.test('test_double_whole_e', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_double_whole_e);
      });
      _ut.test('test_double_whole_ed', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_double_whole_ed);
      });
      _ut.test('test_eq', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_eq);
      });
      _ut.test('test_eq_eq', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_eq_eq);
      });
      _ut.test('test_gt', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_gt);
      });
      _ut.test('test_gt_eq', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_gt_eq);
      });
      _ut.test('test_gt_gt', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_gt_gt);
      });
      _ut.test('test_gt_gt_eq', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_gt_gt_eq);
      });
      _ut.test('test_hash', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_hash);
      });
      _ut.test('test_hexidecimal', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_hexidecimal);
      });
      _ut.test('test_hexidecimal_missingDigit', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_hexidecimal_missingDigit);
      });
      _ut.test('test_identifier', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_identifier);
      });
      _ut.test('test_illegalChar', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_illegalChar);
      });
      _ut.test('test_index', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_index);
      });
      _ut.test('test_index_eq', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_index_eq);
      });
      _ut.test('test_int', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_int);
      });
      _ut.test('test_int_initialZero', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_int_initialZero);
      });
      _ut.test('test_keyword_abstract', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_abstract);
      });
      _ut.test('test_keyword_as', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_as);
      });
      _ut.test('test_keyword_assert', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_assert);
      });
      _ut.test('test_keyword_break', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_break);
      });
      _ut.test('test_keyword_case', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_case);
      });
      _ut.test('test_keyword_catch', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_catch);
      });
      _ut.test('test_keyword_class', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_class);
      });
      _ut.test('test_keyword_const', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_const);
      });
      _ut.test('test_keyword_continue', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_continue);
      });
      _ut.test('test_keyword_default', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_default);
      });
      _ut.test('test_keyword_do', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_do);
      });
      _ut.test('test_keyword_dynamic', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_dynamic);
      });
      _ut.test('test_keyword_else', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_else);
      });
      _ut.test('test_keyword_export', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_export);
      });
      _ut.test('test_keyword_extends', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_extends);
      });
      _ut.test('test_keyword_factory', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_factory);
      });
      _ut.test('test_keyword_false', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_false);
      });
      _ut.test('test_keyword_final', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_final);
      });
      _ut.test('test_keyword_finally', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_finally);
      });
      _ut.test('test_keyword_for', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_for);
      });
      _ut.test('test_keyword_get', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_get);
      });
      _ut.test('test_keyword_if', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_if);
      });
      _ut.test('test_keyword_implements', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_implements);
      });
      _ut.test('test_keyword_import', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_import);
      });
      _ut.test('test_keyword_in', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_in);
      });
      _ut.test('test_keyword_is', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_is);
      });
      _ut.test('test_keyword_library', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_library);
      });
      _ut.test('test_keyword_new', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_new);
      });
      _ut.test('test_keyword_null', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_null);
      });
      _ut.test('test_keyword_operator', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_operator);
      });
      _ut.test('test_keyword_part', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_part);
      });
      _ut.test('test_keyword_return', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_return);
      });
      _ut.test('test_keyword_set', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_set);
      });
      _ut.test('test_keyword_static', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_static);
      });
      _ut.test('test_keyword_super', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_super);
      });
      _ut.test('test_keyword_switch', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_switch);
      });
      _ut.test('test_keyword_this', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_this);
      });
      _ut.test('test_keyword_throw', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_throw);
      });
      _ut.test('test_keyword_true', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_true);
      });
      _ut.test('test_keyword_try', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_try);
      });
      _ut.test('test_keyword_typedef', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_typedef);
      });
      _ut.test('test_keyword_var', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_var);
      });
      _ut.test('test_keyword_void', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_void);
      });
      _ut.test('test_keyword_while', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_while);
      });
      _ut.test('test_keyword_with', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_keyword_with);
      });
      _ut.test('test_lt', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_lt);
      });
      _ut.test('test_lt_eq', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_lt_eq);
      });
      _ut.test('test_lt_lt', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_lt_lt);
      });
      _ut.test('test_lt_lt_eq', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_lt_lt_eq);
      });
      _ut.test('test_minus', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_minus);
      });
      _ut.test('test_minus_eq', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_minus_eq);
      });
      _ut.test('test_minus_minus', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_minus_minus);
      });
      _ut.test('test_openSquareBracket', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_openSquareBracket);
      });
      _ut.test('test_open_curly_bracket', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_open_curly_bracket);
      });
      _ut.test('test_open_paren', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_open_paren);
      });
      _ut.test('test_open_square_bracket', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_open_square_bracket);
      });
      _ut.test('test_percent', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_percent);
      });
      _ut.test('test_percent_eq', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_percent_eq);
      });
      _ut.test('test_period', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_period);
      });
      _ut.test('test_periodAfterNumberNotIncluded_identifier', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_periodAfterNumberNotIncluded_identifier);
      });
      _ut.test('test_periodAfterNumberNotIncluded_period', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_periodAfterNumberNotIncluded_period);
      });
      _ut.test('test_period_period', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_period_period);
      });
      _ut.test('test_period_period_period', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_period_period_period);
      });
      _ut.test('test_plus', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_plus);
      });
      _ut.test('test_plus_eq', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_plus_eq);
      });
      _ut.test('test_plus_plus', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_plus_plus);
      });
      _ut.test('test_question', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_question);
      });
      _ut.test('test_scriptTag_withArgs', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_scriptTag_withArgs);
      });
      _ut.test('test_scriptTag_withSpace', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_scriptTag_withSpace);
      });
      _ut.test('test_scriptTag_withoutSpace', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_scriptTag_withoutSpace);
      });
      _ut.test('test_semicolon', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_semicolon);
      });
      _ut.test('test_slash', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_slash);
      });
      _ut.test('test_slash_eq', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_slash_eq);
      });
      _ut.test('test_star', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_star);
      });
      _ut.test('test_star_eq', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_star_eq);
      });
      _ut.test('test_startAndEnd', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_startAndEnd);
      });
      _ut.test('test_string_multi_double', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_multi_double);
      });
      _ut.test('test_string_multi_interpolation_block', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_multi_interpolation_block);
      });
      _ut.test('test_string_multi_interpolation_identifier', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_multi_interpolation_identifier);
      });
      _ut.test('test_string_multi_single', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_multi_single);
      });
      _ut.test('test_string_multi_unterminated', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_multi_unterminated);
      });
      _ut.test('test_string_raw_multi_double', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_raw_multi_double);
      });
      _ut.test('test_string_raw_multi_single', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_raw_multi_single);
      });
      _ut.test('test_string_raw_multi_unterminated', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_raw_multi_unterminated);
      });
      _ut.test('test_string_raw_simple_double', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_raw_simple_double);
      });
      _ut.test('test_string_raw_simple_single', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_raw_simple_single);
      });
      _ut.test('test_string_raw_simple_unterminated_eof', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_raw_simple_unterminated_eof);
      });
      _ut.test('test_string_raw_simple_unterminated_eol', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_raw_simple_unterminated_eol);
      });
      _ut.test('test_string_simple_double', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_simple_double);
      });
      _ut.test('test_string_simple_escapedDollar', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_simple_escapedDollar);
      });
      _ut.test('test_string_simple_interpolation_block', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_simple_interpolation_block);
      });
      _ut.test('test_string_simple_interpolation_blockWithNestedMap', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_simple_interpolation_blockWithNestedMap);
      });
      _ut.test('test_string_simple_interpolation_firstAndLast', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_simple_interpolation_firstAndLast);
      });
      _ut.test('test_string_simple_interpolation_identifier', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_simple_interpolation_identifier);
      });
      _ut.test('test_string_simple_single', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_simple_single);
      });
      _ut.test('test_string_simple_unterminated_eof', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_simple_unterminated_eof);
      });
      _ut.test('test_string_simple_unterminated_eol', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_string_simple_unterminated_eol);
      });
      _ut.test('test_tilde', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_tilde);
      });
      _ut.test('test_tilde_slash', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_tilde_slash);
      });
      _ut.test('test_tilde_slash_eq', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_tilde_slash_eq);
      });
      _ut.test('test_unclosedPairInInterpolation', () {
        final __test = new CharBufferScannerTest();
        runJUnitTest(__test, __test.test_unclosedPairInInterpolation);
      });
    });
  }
}
/**
 * Instances of the class {@code 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) {
    StringBuffer builder = new StringBuffer();
    validateStream(builder, token);
    if (builder.length > 0) {
      JUnitTestCase.fail(builder.toString());
    }
  }
  void validateStream(StringBuffer 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 type23 = currentToken.type;
      if (identical(type23, TokenType.OPEN_CURLY_BRACKET) || identical(type23, TokenType.OPEN_PAREN) || identical(type23, TokenType.OPEN_SQUARE_BRACKET) || identical(type23, TokenType.STRING_INTERPOLATION_EXPRESSION)) {
        if (currentToken is! BeginToken) {
          builder.add("\r\nExpected BeginToken, found ");
          builder.add(currentToken.runtimeType.toString());
          builder.add(" ");
          writeToken(builder, currentToken);
        }
      }
      int currentStart = currentToken.offset;
      int currentLength = currentToken.length;
      int currentEnd = currentStart + currentLength - 1;
      if (currentStart <= previousEnd) {
        builder.add("\r\nInvalid token sequence: ");
        writeToken(builder, previousToken);
        builder.add(" followed by ");
        writeToken(builder, currentToken);
      }
      previousEnd = currentEnd;
      previousToken = currentToken;
      currentToken = currentToken.next;
    }
  }
  void writeToken(StringBuffer builder, Token token) {
    builder.add("[");
    builder.add(token.type);
    builder.add(", '");
    builder.add(token.lexeme);
    builder.add("', ");
    builder.add(token.offset);
    builder.add(", ");
    builder.add(token.length);
    builder.add("]");
  }
}
class TokenTypeTest extends EngineTestCase {
  void test_isOperator() {
    JUnitTestCase.assertTrue(TokenType.AMPERSAND.isOperator());
    JUnitTestCase.assertTrue(TokenType.AMPERSAND_AMPERSAND.isOperator());
    JUnitTestCase.assertTrue(TokenType.AMPERSAND_EQ.isOperator());
    JUnitTestCase.assertTrue(TokenType.BANG.isOperator());
    JUnitTestCase.assertTrue(TokenType.BANG_EQ.isOperator());
    JUnitTestCase.assertTrue(TokenType.BAR.isOperator());
    JUnitTestCase.assertTrue(TokenType.BAR_BAR.isOperator());
    JUnitTestCase.assertTrue(TokenType.BAR_EQ.isOperator());
    JUnitTestCase.assertTrue(TokenType.CARET.isOperator());
    JUnitTestCase.assertTrue(TokenType.CARET_EQ.isOperator());
    JUnitTestCase.assertTrue(TokenType.EQ.isOperator());
    JUnitTestCase.assertTrue(TokenType.EQ_EQ.isOperator());
    JUnitTestCase.assertTrue(TokenType.GT.isOperator());
    JUnitTestCase.assertTrue(TokenType.GT_EQ.isOperator());
    JUnitTestCase.assertTrue(TokenType.GT_GT.isOperator());
    JUnitTestCase.assertTrue(TokenType.GT_GT_EQ.isOperator());
    JUnitTestCase.assertTrue(TokenType.INDEX.isOperator());
    JUnitTestCase.assertTrue(TokenType.INDEX_EQ.isOperator());
    JUnitTestCase.assertTrue(TokenType.IS.isOperator());
    JUnitTestCase.assertTrue(TokenType.LT.isOperator());
    JUnitTestCase.assertTrue(TokenType.LT_EQ.isOperator());
    JUnitTestCase.assertTrue(TokenType.LT_LT.isOperator());
    JUnitTestCase.assertTrue(TokenType.LT_LT_EQ.isOperator());
    JUnitTestCase.assertTrue(TokenType.MINUS.isOperator());
    JUnitTestCase.assertTrue(TokenType.MINUS_EQ.isOperator());
    JUnitTestCase.assertTrue(TokenType.MINUS_MINUS.isOperator());
    JUnitTestCase.assertTrue(TokenType.PERCENT.isOperator());
    JUnitTestCase.assertTrue(TokenType.PERCENT_EQ.isOperator());
    JUnitTestCase.assertTrue(TokenType.PERIOD_PERIOD.isOperator());
    JUnitTestCase.assertTrue(TokenType.PLUS.isOperator());
    JUnitTestCase.assertTrue(TokenType.PLUS_EQ.isOperator());
    JUnitTestCase.assertTrue(TokenType.PLUS_PLUS.isOperator());
    JUnitTestCase.assertTrue(TokenType.QUESTION.isOperator());
    JUnitTestCase.assertTrue(TokenType.SLASH.isOperator());
    JUnitTestCase.assertTrue(TokenType.SLASH_EQ.isOperator());
    JUnitTestCase.assertTrue(TokenType.STAR.isOperator());
    JUnitTestCase.assertTrue(TokenType.STAR_EQ.isOperator());
    JUnitTestCase.assertTrue(TokenType.TILDE.isOperator());
    JUnitTestCase.assertTrue(TokenType.TILDE_SLASH.isOperator());
    JUnitTestCase.assertTrue(TokenType.TILDE_SLASH_EQ.isOperator());
  }
  void test_isUserDefinableOperator() {
    JUnitTestCase.assertTrue(TokenType.AMPERSAND.isUserDefinableOperator());
    JUnitTestCase.assertTrue(TokenType.BAR.isUserDefinableOperator());
    JUnitTestCase.assertTrue(TokenType.CARET.isUserDefinableOperator());
    JUnitTestCase.assertTrue(TokenType.EQ_EQ.isUserDefinableOperator());
    JUnitTestCase.assertTrue(TokenType.GT.isUserDefinableOperator());
    JUnitTestCase.assertTrue(TokenType.GT_EQ.isUserDefinableOperator());
    JUnitTestCase.assertTrue(TokenType.GT_GT.isUserDefinableOperator());
    JUnitTestCase.assertTrue(TokenType.INDEX.isUserDefinableOperator());
    JUnitTestCase.assertTrue(TokenType.INDEX_EQ.isUserDefinableOperator());
    JUnitTestCase.assertTrue(TokenType.LT.isUserDefinableOperator());
    JUnitTestCase.assertTrue(TokenType.LT_EQ.isUserDefinableOperator());
    JUnitTestCase.assertTrue(TokenType.LT_LT.isUserDefinableOperator());
    JUnitTestCase.assertTrue(TokenType.MINUS.isUserDefinableOperator());
    JUnitTestCase.assertTrue(TokenType.PERCENT.isUserDefinableOperator());
    JUnitTestCase.assertTrue(TokenType.PLUS.isUserDefinableOperator());
    JUnitTestCase.assertTrue(TokenType.SLASH.isUserDefinableOperator());
    JUnitTestCase.assertTrue(TokenType.STAR.isUserDefinableOperator());
    JUnitTestCase.assertTrue(TokenType.TILDE.isUserDefinableOperator());
    JUnitTestCase.assertTrue(TokenType.TILDE_SLASH.isUserDefinableOperator());
  }
  static dartSuite() {
    _ut.group('TokenTypeTest', () {
      _ut.test('test_isOperator', () {
        final __test = new TokenTypeTest();
        runJUnitTest(__test, __test.test_isOperator);
      });
      _ut.test('test_isUserDefinableOperator', () {
        final __test = new TokenTypeTest();
        runJUnitTest(__test, __test.test_isUserDefinableOperator);
      });
    });
  }
}
/**
 * The class {@code TokenFactory} defines utility methods that can be used to create tokens.
 */
class TokenFactory {
  static Token token(Keyword keyword) => new KeywordToken(keyword, 0);
  static Token token2(String lexeme) => new StringToken(TokenType.STRING, lexeme, 0);
  static Token token3(TokenType type) => new Token(type, 0);
  static Token token4(TokenType type, String lexeme) => new StringToken(type, lexeme, 0);
  /**
   * Prevent the creation of instances of this class.
   */
  TokenFactory() {
  }
}
class KeywordStateTest extends JUnitTestCase {
  void test_KeywordState() {
    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 syntax3 = keywords[i].syntax;
      textToTest[i] = syntax3;
      textToTest[i + keywordCount] = "${syntax3}x";
      textToTest[i + keywordCount * 2] = syntax3.substring(0, syntax3.length - 1);
    }
    KeywordState firstState = KeywordState.KEYWORD_STATE;
    for (int i = 0; i < textToTest.length; i++) {
      String text = textToTest[i];
      int index = 0;
      int length10 = text.length;
      KeywordState state = firstState;
      while (index < length10 && state != null) {
        state = state.next(text.codeUnitAt(index));
        index++;
      }
      if (i < keywordCount) {
        JUnitTestCase.assertNotNull(state);
        JUnitTestCase.assertNotNull(state.keyword());
        JUnitTestCase.assertEquals(keywords[i], state.keyword());
      } else if (i < keywordCount * 2) {
        JUnitTestCase.assertNull(state);
      } else {
        JUnitTestCase.assertNotNull(state);
      }
    }
  }
  static dartSuite() {
    _ut.group('KeywordStateTest', () {
      _ut.test('test_KeywordState', () {
        final __test = new KeywordStateTest();
        runJUnitTest(__test, __test.test_KeywordState);
      });
    });
  }
}
class StringScannerTest extends AbstractScannerTest {
  void test_setSourceStart() {
    int offsetDelta = 42;
    GatheringErrorListener listener = new GatheringErrorListener();
    StringScanner scanner = new StringScanner(null, "a", listener);
    scanner.setSourceStart(3, 9, offsetDelta);
    scanner.tokenize();
    List<int> lineStarts2 = scanner.lineStarts;
    JUnitTestCase.assertNotNull(lineStarts2);
    JUnitTestCase.assertEquals(3, lineStarts2.length);
    JUnitTestCase.assertEquals(33, lineStarts2[2]);
  }
  Token scan(String source, GatheringErrorListener listener) {
    StringScanner scanner = new StringScanner(null, source, listener);
    Token result = scanner.tokenize();
    listener.setLineInfo(new TestSource(), scanner.lineStarts);
    return result;
  }
  static dartSuite() {
    _ut.group('StringScannerTest', () {
      _ut.test('test_ampersand', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_ampersand);
      });
      _ut.test('test_ampersand_ampersand', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_ampersand_ampersand);
      });
      _ut.test('test_ampersand_eq', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_ampersand_eq);
      });
      _ut.test('test_at', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_at);
      });
      _ut.test('test_backping', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_backping);
      });
      _ut.test('test_backslash', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_backslash);
      });
      _ut.test('test_bang', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_bang);
      });
      _ut.test('test_bang_eq', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_bang_eq);
      });
      _ut.test('test_bar', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_bar);
      });
      _ut.test('test_bar_bar', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_bar_bar);
      });
      _ut.test('test_bar_eq', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_bar_eq);
      });
      _ut.test('test_caret', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_caret);
      });
      _ut.test('test_caret_eq', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_caret_eq);
      });
      _ut.test('test_close_curly_bracket', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_close_curly_bracket);
      });
      _ut.test('test_close_paren', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_close_paren);
      });
      _ut.test('test_close_quare_bracket', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_close_quare_bracket);
      });
      _ut.test('test_colon', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_colon);
      });
      _ut.test('test_comma', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_comma);
      });
      _ut.test('test_comment_multi', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_comment_multi);
      });
      _ut.test('test_comment_multi_unterminated', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_comment_multi_unterminated);
      });
      _ut.test('test_comment_nested', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_comment_nested);
      });
      _ut.test('test_comment_single', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_comment_single);
      });
      _ut.test('test_double_both_E', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_double_both_E);
      });
      _ut.test('test_double_both_e', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_double_both_e);
      });
      _ut.test('test_double_fraction', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_double_fraction);
      });
      _ut.test('test_double_fraction_D', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_double_fraction_D);
      });
      _ut.test('test_double_fraction_E', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_double_fraction_E);
      });
      _ut.test('test_double_fraction_Ed', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_double_fraction_Ed);
      });
      _ut.test('test_double_fraction_d', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_double_fraction_d);
      });
      _ut.test('test_double_fraction_e', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_double_fraction_e);
      });
      _ut.test('test_double_fraction_ed', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_double_fraction_ed);
      });
      _ut.test('test_double_missingDigitInExponent', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_double_missingDigitInExponent);
      });
      _ut.test('test_double_whole_D', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_double_whole_D);
      });
      _ut.test('test_double_whole_E', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_double_whole_E);
      });
      _ut.test('test_double_whole_Ed', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_double_whole_Ed);
      });
      _ut.test('test_double_whole_d', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_double_whole_d);
      });
      _ut.test('test_double_whole_e', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_double_whole_e);
      });
      _ut.test('test_double_whole_ed', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_double_whole_ed);
      });
      _ut.test('test_eq', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_eq);
      });
      _ut.test('test_eq_eq', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_eq_eq);
      });
      _ut.test('test_gt', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_gt);
      });
      _ut.test('test_gt_eq', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_gt_eq);
      });
      _ut.test('test_gt_gt', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_gt_gt);
      });
      _ut.test('test_gt_gt_eq', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_gt_gt_eq);
      });
      _ut.test('test_hash', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_hash);
      });
      _ut.test('test_hexidecimal', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_hexidecimal);
      });
      _ut.test('test_hexidecimal_missingDigit', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_hexidecimal_missingDigit);
      });
      _ut.test('test_identifier', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_identifier);
      });
      _ut.test('test_illegalChar', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_illegalChar);
      });
      _ut.test('test_index', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_index);
      });
      _ut.test('test_index_eq', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_index_eq);
      });
      _ut.test('test_int', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_int);
      });
      _ut.test('test_int_initialZero', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_int_initialZero);
      });
      _ut.test('test_keyword_abstract', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_abstract);
      });
      _ut.test('test_keyword_as', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_as);
      });
      _ut.test('test_keyword_assert', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_assert);
      });
      _ut.test('test_keyword_break', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_break);
      });
      _ut.test('test_keyword_case', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_case);
      });
      _ut.test('test_keyword_catch', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_catch);
      });
      _ut.test('test_keyword_class', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_class);
      });
      _ut.test('test_keyword_const', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_const);
      });
      _ut.test('test_keyword_continue', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_continue);
      });
      _ut.test('test_keyword_default', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_default);
      });
      _ut.test('test_keyword_do', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_do);
      });
      _ut.test('test_keyword_dynamic', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_dynamic);
      });
      _ut.test('test_keyword_else', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_else);
      });
      _ut.test('test_keyword_export', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_export);
      });
      _ut.test('test_keyword_extends', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_extends);
      });
      _ut.test('test_keyword_factory', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_factory);
      });
      _ut.test('test_keyword_false', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_false);
      });
      _ut.test('test_keyword_final', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_final);
      });
      _ut.test('test_keyword_finally', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_finally);
      });
      _ut.test('test_keyword_for', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_for);
      });
      _ut.test('test_keyword_get', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_get);
      });
      _ut.test('test_keyword_if', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_if);
      });
      _ut.test('test_keyword_implements', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_implements);
      });
      _ut.test('test_keyword_import', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_import);
      });
      _ut.test('test_keyword_in', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_in);
      });
      _ut.test('test_keyword_is', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_is);
      });
      _ut.test('test_keyword_library', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_library);
      });
      _ut.test('test_keyword_new', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_new);
      });
      _ut.test('test_keyword_null', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_null);
      });
      _ut.test('test_keyword_operator', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_operator);
      });
      _ut.test('test_keyword_part', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_part);
      });
      _ut.test('test_keyword_return', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_return);
      });
      _ut.test('test_keyword_set', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_set);
      });
      _ut.test('test_keyword_static', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_static);
      });
      _ut.test('test_keyword_super', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_super);
      });
      _ut.test('test_keyword_switch', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_switch);
      });
      _ut.test('test_keyword_this', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_this);
      });
      _ut.test('test_keyword_throw', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_throw);
      });
      _ut.test('test_keyword_true', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_true);
      });
      _ut.test('test_keyword_try', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_try);
      });
      _ut.test('test_keyword_typedef', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_typedef);
      });
      _ut.test('test_keyword_var', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_var);
      });
      _ut.test('test_keyword_void', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_void);
      });
      _ut.test('test_keyword_while', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_while);
      });
      _ut.test('test_keyword_with', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_keyword_with);
      });
      _ut.test('test_lt', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_lt);
      });
      _ut.test('test_lt_eq', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_lt_eq);
      });
      _ut.test('test_lt_lt', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_lt_lt);
      });
      _ut.test('test_lt_lt_eq', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_lt_lt_eq);
      });
      _ut.test('test_minus', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_minus);
      });
      _ut.test('test_minus_eq', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_minus_eq);
      });
      _ut.test('test_minus_minus', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_minus_minus);
      });
      _ut.test('test_openSquareBracket', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_openSquareBracket);
      });
      _ut.test('test_open_curly_bracket', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_open_curly_bracket);
      });
      _ut.test('test_open_paren', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_open_paren);
      });
      _ut.test('test_open_square_bracket', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_open_square_bracket);
      });
      _ut.test('test_percent', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_percent);
      });
      _ut.test('test_percent_eq', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_percent_eq);
      });
      _ut.test('test_period', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_period);
      });
      _ut.test('test_periodAfterNumberNotIncluded_identifier', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_periodAfterNumberNotIncluded_identifier);
      });
      _ut.test('test_periodAfterNumberNotIncluded_period', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_periodAfterNumberNotIncluded_period);
      });
      _ut.test('test_period_period', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_period_period);
      });
      _ut.test('test_period_period_period', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_period_period_period);
      });
      _ut.test('test_plus', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_plus);
      });
      _ut.test('test_plus_eq', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_plus_eq);
      });
      _ut.test('test_plus_plus', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_plus_plus);
      });
      _ut.test('test_question', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_question);
      });
      _ut.test('test_scriptTag_withArgs', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_scriptTag_withArgs);
      });
      _ut.test('test_scriptTag_withSpace', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_scriptTag_withSpace);
      });
      _ut.test('test_scriptTag_withoutSpace', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_scriptTag_withoutSpace);
      });
      _ut.test('test_semicolon', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_semicolon);
      });
      _ut.test('test_setSourceStart', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_setSourceStart);
      });
      _ut.test('test_slash', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_slash);
      });
      _ut.test('test_slash_eq', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_slash_eq);
      });
      _ut.test('test_star', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_star);
      });
      _ut.test('test_star_eq', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_star_eq);
      });
      _ut.test('test_startAndEnd', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_startAndEnd);
      });
      _ut.test('test_string_multi_double', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_multi_double);
      });
      _ut.test('test_string_multi_interpolation_block', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_multi_interpolation_block);
      });
      _ut.test('test_string_multi_interpolation_identifier', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_multi_interpolation_identifier);
      });
      _ut.test('test_string_multi_single', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_multi_single);
      });
      _ut.test('test_string_multi_unterminated', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_multi_unterminated);
      });
      _ut.test('test_string_raw_multi_double', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_raw_multi_double);
      });
      _ut.test('test_string_raw_multi_single', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_raw_multi_single);
      });
      _ut.test('test_string_raw_multi_unterminated', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_raw_multi_unterminated);
      });
      _ut.test('test_string_raw_simple_double', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_raw_simple_double);
      });
      _ut.test('test_string_raw_simple_single', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_raw_simple_single);
      });
      _ut.test('test_string_raw_simple_unterminated_eof', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_raw_simple_unterminated_eof);
      });
      _ut.test('test_string_raw_simple_unterminated_eol', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_raw_simple_unterminated_eol);
      });
      _ut.test('test_string_simple_double', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_simple_double);
      });
      _ut.test('test_string_simple_escapedDollar', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_simple_escapedDollar);
      });
      _ut.test('test_string_simple_interpolation_block', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_simple_interpolation_block);
      });
      _ut.test('test_string_simple_interpolation_blockWithNestedMap', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_simple_interpolation_blockWithNestedMap);
      });
      _ut.test('test_string_simple_interpolation_firstAndLast', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_simple_interpolation_firstAndLast);
      });
      _ut.test('test_string_simple_interpolation_identifier', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_simple_interpolation_identifier);
      });
      _ut.test('test_string_simple_single', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_simple_single);
      });
      _ut.test('test_string_simple_unterminated_eof', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_simple_unterminated_eof);
      });
      _ut.test('test_string_simple_unterminated_eol', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_string_simple_unterminated_eol);
      });
      _ut.test('test_tilde', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_tilde);
      });
      _ut.test('test_tilde_slash', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_tilde_slash);
      });
      _ut.test('test_tilde_slash_eq', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_tilde_slash_eq);
      });
      _ut.test('test_unclosedPairInInterpolation', () {
        final __test = new StringScannerTest();
        runJUnitTest(__test, __test.test_unclosedPairInInterpolation);
      });
    });
  }
}
abstract class AbstractScannerTest extends JUnitTestCase {
  void test_ampersand() {
    assertToken(TokenType.AMPERSAND, "&");
  }
  void test_ampersand_ampersand() {
    assertToken(TokenType.AMPERSAND_AMPERSAND, "&&");
  }
  void test_ampersand_eq() {
    assertToken(TokenType.AMPERSAND_EQ, "&=");
  }
  void test_at() {
    assertToken(TokenType.AT, "@");
  }
  void test_backping() {
    assertToken(TokenType.BACKPING, "`");
  }
  void test_backslash() {
    assertToken(TokenType.BACKSLASH, "\\");
  }
  void test_bang() {
    assertToken(TokenType.BANG, "!");
  }
  void test_bang_eq() {
    assertToken(TokenType.BANG_EQ, "!=");
  }
  void test_bar() {
    assertToken(TokenType.BAR, "|");
  }
  void test_bar_bar() {
    assertToken(TokenType.BAR_BAR, "||");
  }
  void test_bar_eq() {
    assertToken(TokenType.BAR_EQ, "|=");
  }
  void test_caret() {
    assertToken(TokenType.CARET, "^");
  }
  void test_caret_eq() {
    assertToken(TokenType.CARET_EQ, "^=");
  }
  void test_close_curly_bracket() {
    assertToken(TokenType.CLOSE_CURLY_BRACKET, "}");
  }
  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_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_d() {
    assertToken(TokenType.DOUBLE, ".123d");
  }
  void test_double_fraction_D() {
    assertToken(TokenType.DOUBLE, ".123D");
  }
  void test_double_fraction_e() {
    assertToken(TokenType.DOUBLE, ".123e4");
  }
  void test_double_fraction_E() {
    assertToken(TokenType.DOUBLE, ".123E4");
  }
  void test_double_fraction_ed() {
    assertToken(TokenType.DOUBLE, ".123e4d");
  }
  void test_double_fraction_Ed() {
    assertToken(TokenType.DOUBLE, ".123E4d");
  }
  void test_double_missingDigitInExponent() {
    assertError(ScannerErrorCode.MISSING_DIGIT, 1, "1e");
  }
  void test_double_whole_d() {
    assertToken(TokenType.DOUBLE, "12d");
  }
  void test_double_whole_D() {
    assertToken(TokenType.DOUBLE, "12D");
  }
  void test_double_whole_e() {
    assertToken(TokenType.DOUBLE, "12e4");
  }
  void test_double_whole_E() {
    assertToken(TokenType.DOUBLE, "12E4");
  }
  void test_double_whole_ed() {
    assertToken(TokenType.DOUBLE, "12e4d");
  }
  void test_double_whole_Ed() {
    assertToken(TokenType.DOUBLE, "12E4d");
  }
  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() {
    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() {
    assertKeywordToken("assert");
  }
  void test_keyword_break() {
    assertKeywordToken("break");
  }
  void test_keyword_case() {
    assertKeywordToken("case");
  }
  void test_keyword_catch() {
    assertKeywordToken("catch");
  }
  void test_keyword_class() {
    assertKeywordToken("class");
  }
  void test_keyword_const() {
    assertKeywordToken("const");
  }
  void test_keyword_continue() {
    assertKeywordToken("continue");
  }
  void test_keyword_default() {
    assertKeywordToken("default");
  }
  void test_keyword_do() {
    assertKeywordToken("do");
  }
  void test_keyword_dynamic() {
    assertKeywordToken("dynamic");
  }
  void test_keyword_else() {
    assertKeywordToken("else");
  }
  void test_keyword_export() {
    assertKeywordToken("export");
  }
  void test_keyword_extends() {
    assertKeywordToken("extends");
  }
  void test_keyword_factory() {
    assertKeywordToken("factory");
  }
  void test_keyword_false() {
    assertKeywordToken("false");
  }
  void test_keyword_final() {
    assertKeywordToken("final");
  }
  void test_keyword_finally() {
    assertKeywordToken("finally");
  }
  void test_keyword_for() {
    assertKeywordToken("for");
  }
  void test_keyword_get() {
    assertKeywordToken("get");
  }
  void test_keyword_if() {
    assertKeywordToken("if");
  }
  void test_keyword_implements() {
    assertKeywordToken("implements");
  }
  void test_keyword_import() {
    assertKeywordToken("import");
  }
  void test_keyword_in() {
    assertKeywordToken("in");
  }
  void test_keyword_is() {
    assertKeywordToken("is");
  }
  void test_keyword_library() {
    assertKeywordToken("library");
  }
  void test_keyword_new() {
    assertKeywordToken("new");
  }
  void test_keyword_null() {
    assertKeywordToken("null");
  }
  void test_keyword_operator() {
    assertKeywordToken("operator");
  }
  void test_keyword_part() {
    assertKeywordToken("part");
  }
  void test_keyword_return() {
    assertKeywordToken("return");
  }
  void test_keyword_set() {
    assertKeywordToken("set");
  }
  void test_keyword_static() {
    assertKeywordToken("static");
  }
  void test_keyword_super() {
    assertKeywordToken("super");
  }
  void test_keyword_switch() {
    assertKeywordToken("switch");
  }
  void test_keyword_this() {
    assertKeywordToken("this");
  }
  void test_keyword_throw() {
    assertKeywordToken("throw");
  }
  void test_keyword_true() {
    assertKeywordToken("true");
  }
  void test_keyword_try() {
    assertKeywordToken("try");
  }
  void test_keyword_typedef() {
    assertKeywordToken("typedef");
  }
  void test_keyword_var() {
    assertKeywordToken("var");
  }
  void test_keyword_void() {
    assertKeywordToken("void");
  }
  void test_keyword_while() {
    assertKeywordToken("while");
  }
  void test_keyword_with() {
    assertKeywordToken("with");
  }
  void test_lt() {
    assertToken(TokenType.LT, "<");
  }
  void test_lt_eq() {
    assertToken(TokenType.LT_EQ, "<=");
  }
  void test_lt_lt() {
    assertToken(TokenType.LT_LT, "<<");
  }
  void test_lt_lt_eq() {
    assertToken(TokenType.LT_LT_EQ, "<<=");
  }
  void test_minus() {
    assertToken(TokenType.MINUS, "-");
  }
  void test_minus_eq() {
    assertToken(TokenType.MINUS_EQ, "-=");
  }
  void test_minus_minus() {
    assertToken(TokenType.MINUS_MINUS, "--");
  }
  void test_open_curly_bracket() {
    assertToken(TokenType.OPEN_CURLY_BRACKET, "{");
  }
  void test_open_paren() {
    assertToken(TokenType.OPEN_PAREN, "(");
  }
  void test_open_square_bracket() {
    assertToken(TokenType.OPEN_SQUARE_BRACKET, "[");
  }
  void test_openSquareBracket() {
    assertToken(TokenType.OPEN_SQUARE_BRACKET, "[");
  }
  void test_percent() {
    assertToken(TokenType.PERCENT, "%");
  }
  void test_percent_eq() {
    assertToken(TokenType.PERCENT_EQ, "%=");
  }
  void test_period() {
    assertToken(TokenType.PERIOD, ".");
  }
  void test_period_period() {
    assertToken(TokenType.PERIOD_PERIOD, "..");
  }
  void test_period_period_period() {
    assertToken(TokenType.PERIOD_PERIOD_PERIOD, "...");
  }
  void test_periodAfterNumberNotIncluded_identifier() {
    assertTokens("42.isEven()", [new StringToken(TokenType.INT, "42", 0), new Token(TokenType.PERIOD, 2), new StringToken(TokenType.IDENTIFIER, "isEven", 3), new Token(TokenType.OPEN_PAREN, 9), new Token(TokenType.CLOSE_PAREN, 10)]);
  }
  void test_periodAfterNumberNotIncluded_period() {
    assertTokens("42..isEven()", [new StringToken(TokenType.INT, "42", 0), new Token(TokenType.PERIOD_PERIOD, 2), new StringToken(TokenType.IDENTIFIER, "isEven", 4), new Token(TokenType.OPEN_PAREN, 10), new Token(TokenType.CLOSE_PAREN, 11)]);
  }
  void test_plus() {
    assertToken(TokenType.PLUS, "+");
  }
  void test_plus_eq() {
    assertToken(TokenType.PLUS_EQ, "+=");
  }
  void test_plus_plus() {
    assertToken(TokenType.PLUS_PLUS, "++");
  }
  void test_question() {
    assertToken(TokenType.QUESTION, "?");
  }
  void test_scriptTag_withArgs() {
    assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart -debug");
  }
  void test_scriptTag_withoutSpace() {
    assertToken(TokenType.SCRIPT_TAG, "#!/bin/dart");
  }
  void test_scriptTag_withSpace() {
    assertToken(TokenType.SCRIPT_TAG, "#! /bin/dart");
  }
  void test_semicolon() {
    assertToken(TokenType.SEMICOLON, ";");
  }
  void test_slash() {
    assertToken(TokenType.SLASH, "/");
  }
  void test_slash_eq() {
    assertToken(TokenType.SLASH_EQ, "/=");
  }
  void test_star() {
    assertToken(TokenType.STAR, "*");
  }
  void test_star_eq() {
    assertToken(TokenType.STAR_EQ, "*=");
  }
  void test_startAndEnd() {
    Token token = scan2("a");
    Token previous3 = token.previous;
    JUnitTestCase.assertEquals(token, previous3.next);
    JUnitTestCase.assertEquals(previous3, previous3.previous);
    Token next7 = token.next;
    JUnitTestCase.assertEquals(next7, next7.next);
    JUnitTestCase.assertEquals(token, next7.previous);
  }
  void test_string_multi_double() {
    assertToken(TokenType.STRING, "\"\"\"multi-line\nstring\"\"\"");
  }
  void test_string_multi_interpolation_block() {
    assertTokens("\"Hello \${name}!\"", [new StringToken(TokenType.STRING, "\"Hello ", 0), new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 7), new StringToken(TokenType.IDENTIFIER, "name", 9), new Token(TokenType.CLOSE_CURLY_BRACKET, 13), new StringToken(TokenType.STRING, "!\"", 14)]);
  }
  void test_string_multi_interpolation_identifier() {
    assertTokens("\"Hello \$name!\"", [new StringToken(TokenType.STRING, "\"Hello ", 0), new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 7), new StringToken(TokenType.IDENTIFIER, "name", 8), new StringToken(TokenType.STRING, "!\"", 12)]);
  }
  void test_string_multi_single() {
    assertToken(TokenType.STRING, "'''string'''");
  }
  void test_string_multi_unterminated() {
    assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "'''string");
  }
  void test_string_raw_multi_double() {
    assertToken(TokenType.STRING, "r\"\"\"string\"\"\"");
  }
  void test_string_raw_multi_single() {
    assertToken(TokenType.STRING, "r'''string'''");
  }
  void test_string_raw_multi_unterminated() {
    assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9, "r'''string");
  }
  void test_string_raw_simple_double() {
    assertToken(TokenType.STRING, "r\"string\"");
  }
  void test_string_raw_simple_single() {
    assertToken(TokenType.STRING, "r'string'");
  }
  void test_string_raw_simple_unterminated_eof() {
    assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "r'string");
  }
  void test_string_raw_simple_unterminated_eol() {
    assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "r'string\n");
  }
  void test_string_simple_double() {
    assertToken(TokenType.STRING, "\"string\"");
  }
  void test_string_simple_escapedDollar() {
    assertToken(TokenType.STRING, "'a\\\$b'");
  }
  void test_string_simple_interpolation_block() {
    assertTokens("'Hello \${name}!'", [new StringToken(TokenType.STRING, "'Hello ", 0), new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 7), new StringToken(TokenType.IDENTIFIER, "name", 9), new Token(TokenType.CLOSE_CURLY_BRACKET, 13), new StringToken(TokenType.STRING, "!'", 14)]);
  }
  void test_string_simple_interpolation_blockWithNestedMap() {
    assertTokens("'a \${f({'b' : 'c'})} d'", [new StringToken(TokenType.STRING, "'a ", 0), new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 3), new StringToken(TokenType.IDENTIFIER, "f", 5), new Token(TokenType.OPEN_PAREN, 6), new Token(TokenType.OPEN_CURLY_BRACKET, 7), new StringToken(TokenType.STRING, "'b'", 8), new Token(TokenType.COLON, 12), new StringToken(TokenType.STRING, "'c'", 14), new Token(TokenType.CLOSE_CURLY_BRACKET, 17), new Token(TokenType.CLOSE_PAREN, 18), new Token(TokenType.CLOSE_CURLY_BRACKET, 19), new StringToken(TokenType.STRING, " d'", 20)]);
  }
  void test_string_simple_interpolation_firstAndLast() {
    assertTokens("'\$greeting \$name'", [new StringToken(TokenType.STRING, "'", 0), new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1), new StringToken(TokenType.IDENTIFIER, "greeting", 2), new StringToken(TokenType.STRING, " ", 10), new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 11), new StringToken(TokenType.IDENTIFIER, "name", 12), new StringToken(TokenType.STRING, "'", 16)]);
  }
  void test_string_simple_interpolation_identifier() {
    assertTokens("'Hello \$name!'", [new StringToken(TokenType.STRING, "'Hello ", 0), new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 7), new StringToken(TokenType.IDENTIFIER, "name", 8), new StringToken(TokenType.STRING, "!'", 12)]);
  }
  void test_string_simple_single() {
    assertToken(TokenType.STRING, "'string'");
  }
  void test_string_simple_unterminated_eof() {
    assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6, "'string");
  }
  void test_string_simple_unterminated_eol() {
    assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "'string\r");
  }
  void test_tilde() {
    assertToken(TokenType.TILDE, "~");
  }
  void test_tilde_slash() {
    assertToken(TokenType.TILDE_SLASH, "~/");
  }
  void test_tilde_slash_eq() {
    assertToken(TokenType.TILDE_SLASH_EQ, "~/=");
  }
  void test_unclosedPairInInterpolation() {
    GatheringErrorListener listener = new GatheringErrorListener();
    scan("'\${(}'", listener);
  }
  Token scan(String source, GatheringErrorListener listener);
  void assertComment(TokenType commentType, String source) {
    Token token = scan2(source);
    JUnitTestCase.assertNotNull(token);
    JUnitTestCase.assertEquals(TokenType.EOF, token.type);
    Token comment = token.precedingComments;
    JUnitTestCase.assertNotNull(comment);
    JUnitTestCase.assertEquals(commentType, comment.type);
    JUnitTestCase.assertEquals(0, comment.offset);
    JUnitTestCase.assertEquals(source.length, comment.length);
    JUnitTestCase.assertEquals(source, comment.lexeme);
  }
  /**
   * Assert that scanning the given source produces an error with the given code.
   * @param illegalCharacter
   * @param i
   * @param source the source to be scanned to produce the error
   */
  void assertError(ScannerErrorCode expectedError, int expectedOffset, String source) {
    GatheringErrorListener listener = new GatheringErrorListener();
    scan(source, listener);
    listener.assertErrors([new AnalysisError.con2(null, expectedOffset, 1, expectedError, [(source.codeUnitAt(expectedOffset) as int)])]);
  }
  /**
   * Assert that when scanned the given source contains a single keyword token with the same lexeme
   * as the original source.
   * @param source the source to be scanned
   */
  void assertKeywordToken(String source) {
    Token token = scan2(source);
    JUnitTestCase.assertNotNull(token);
    JUnitTestCase.assertEquals(TokenType.KEYWORD, token.type);
    JUnitTestCase.assertEquals(0, token.offset);
    JUnitTestCase.assertEquals(source.length, token.length);
    JUnitTestCase.assertEquals(source, token.lexeme);
    Object value3 = token.value();
    JUnitTestCase.assertTrue(value3 is Keyword);
    JUnitTestCase.assertEquals(source, ((value3 as Keyword)).syntax);
    token = scan2(" ${source} ");
    JUnitTestCase.assertNotNull(token);
    JUnitTestCase.assertEquals(TokenType.KEYWORD, token.type);
    JUnitTestCase.assertEquals(1, token.offset);
    JUnitTestCase.assertEquals(source.length, token.length);
    JUnitTestCase.assertEquals(source, token.lexeme);
    value3 = token.value();
    JUnitTestCase.assertTrue(value3 is Keyword);
    JUnitTestCase.assertEquals(source, ((value3 as Keyword)).syntax);
    JUnitTestCase.assertEquals(TokenType.EOF, token.next.type);
  }
  /**
   * Assert that the token scanned from the given source has the expected type.
   * @param expectedType the expected type of the token
   * @param source the source to be scanned to produce the actual token
   */
  Token assertToken(TokenType expectedType, String source) {
    Token originalToken = scan2(source);
    JUnitTestCase.assertNotNull(originalToken);
    JUnitTestCase.assertEquals(expectedType, originalToken.type);
    JUnitTestCase.assertEquals(0, originalToken.offset);
    JUnitTestCase.assertEquals(source.length, originalToken.length);
    JUnitTestCase.assertEquals(source, originalToken.lexeme);
    if (identical(expectedType, TokenType.SCRIPT_TAG)) {
      return originalToken;
    } else if (identical(expectedType, TokenType.SINGLE_LINE_COMMENT)) {
      Token tokenWithSpaces = scan2(" ${source}");
      JUnitTestCase.assertNotNull(tokenWithSpaces);
      JUnitTestCase.assertEquals(expectedType, tokenWithSpaces.type);
      JUnitTestCase.assertEquals(1, tokenWithSpaces.offset);
      JUnitTestCase.assertEquals(source.length, tokenWithSpaces.length);
      JUnitTestCase.assertEquals(source, tokenWithSpaces.lexeme);
      return originalToken;
    }
    Token tokenWithSpaces = scan2(" ${source} ");
    JUnitTestCase.assertNotNull(tokenWithSpaces);
    JUnitTestCase.assertEquals(expectedType, tokenWithSpaces.type);
    JUnitTestCase.assertEquals(1, tokenWithSpaces.offset);
    JUnitTestCase.assertEquals(source.length, tokenWithSpaces.length);
    JUnitTestCase.assertEquals(source, tokenWithSpaces.lexeme);
    JUnitTestCase.assertEquals(TokenType.EOF, originalToken.next.type);
    return originalToken;
  }
  /**
   * Assert that when scanned the given source contains a sequence of tokens identical to the given
   * tokens.
   * @param source the source to be scanned
   * @param expectedTokens the tokens that are expected to be in the source
   */
  void assertTokens(String source, List<Token> expectedTokens) {
    Token token = scan2(source);
    JUnitTestCase.assertNotNull(token);
    for (int i = 0; i < expectedTokens.length; i++) {
      Token expectedToken = expectedTokens[i];
      JUnitTestCase.assertEqualsMsg("Wrong type for token ${i}", expectedToken.type, token.type);
      JUnitTestCase.assertEqualsMsg("Wrong offset for token ${i}", expectedToken.offset, token.offset);
      JUnitTestCase.assertEqualsMsg("Wrong length for token ${i}", expectedToken.length, token.length);
      JUnitTestCase.assertEqualsMsg("Wrong lexeme for token ${i}", expectedToken.lexeme, token.lexeme);
      token = token.next;
      JUnitTestCase.assertNotNull(token);
    }
    JUnitTestCase.assertEquals(TokenType.EOF, token.type);
  }
  Token scan2(String source) {
    GatheringErrorListener listener = new GatheringErrorListener();
    Token token = scan(source, listener);
    listener.assertNoErrors();
    return token;
  }
}
main() {
  CharBufferScannerTest.dartSuite();
  KeywordStateTest.dartSuite();
  StringScannerTest.dartSuite();
  TokenTypeTest.dartSuite();
}