// 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 '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
import '../../../sdk/lib/_internal/compiler/implementation/scanner/scanner_implementation.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.slowToString().length, token.slowCharCount);

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

    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.slowToString(), substring,
        'token.slowToString()=${token.slowToString()} == '
        '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
}
