// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import "package:expect/expect.dart";
import 'package:front_end/src/fasta/scanner.dart';

Token scan(String text) =>
    new StringScanner(text, includeComments: true).tokenize();

check(String text) {
  Token token = scan(text);
  while (token.kind != EOF_TOKEN) {
    Expect.equals(token.lexeme.length, token.charCount);

    var start = token.charOffset;
    var end = token.charOffset + token.charCount;

    Expect.isTrue(start < text.length,
        'start=$start < text.length=${text.length}: $text');

    Expect.isTrue(
        end <= text.length, 'end=$end <= text.length=${text.length}: $text');

    Expect.isTrue(start <= end, 'start=$end <= end=$end: $text');

    var substring = text.substring(start, end);

    Expect.stringEquals(
        token.lexeme,
        substring,
        'token.value=${token.lexeme} == '
        'text.substring(start,end)=${substring}: $text');

    print('$text: [$start,$end]:$token');

    token = token.next;
  }
}

main() {
  check('foo'); // identifier
  check('\'\''); // empty string
  check('\'foo\''); // simple string
  check('\'\$foo\''); // interpolation, identifier
  check('\'\${foo}\''); // interpolation, expression

  check('//'); // single line comment
  check('/**/'); // multi line comment
}
