// 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:compiler/src/scanner/utf8_bytes_scanner.dart';
import 'package:compiler/src/tokens/precedence_constants.dart';
import 'package:compiler/src/tokens/token.dart';
import 'package:compiler/src/util/characters.dart';
import 'dart:typed_data';

Token scan(List<int> bytes) {
  List<int> zeroTerminated = new Uint8List(bytes.length + 1);
  zeroTerminated.setRange(0, bytes.length, bytes);
  zeroTerminated[bytes.length] = 0;
  return new Utf8BytesScanner.fromBytes(zeroTerminated).tokenize();
}

Token scanUTF8(List<int> bytes) {
  int l = bytes.length;
  List<int> stringLiteral = new Uint8List(l + 3);
  stringLiteral[0] = 0x27; // single quote
  stringLiteral[l+1] = 0x27; // single quote
  // The bytes given to the scanner must be 0-terminated.
  stringLiteral[l+2] = $EOF;
  for (int i = 0; i < l; i++) {
    stringLiteral[i+1] = bytes[i];
  }
  return new Utf8BytesScanner.fromBytes(stringLiteral).tokenize();
}

bool isRunningOnJavaScript() => identical(1, 1.0);

main() {
  // Google favorite: "Îñţérñåţîöñåļîžåţîờñ".
  Token token = scanUTF8([0xc3, 0x8e, 0xc3, 0xb1, 0xc5, 0xa3, 0xc3, 0xa9, 0x72,
                          0xc3, 0xb1, 0xc3, 0xa5, 0xc5, 0xa3, 0xc3, 0xae, 0xc3,
                          0xb6, 0xc3, 0xb1, 0xc3, 0xa5, 0xc4, 0xbc, 0xc3, 0xae,
                          0xc5, 0xbe, 0xc3, 0xa5, 0xc5, 0xa3, 0xc3, 0xae, 0xe1,
                          0xbb, 0x9d, 0xc3, 0xb1]);
  Expect.stringEquals("'Îñţérñåţîöñåļîžåţîờñ'", token.value);

  // Blueberry porridge in Danish: "blåbærgrød".
  token = scanUTF8([0x62, 0x6c, 0xc3, 0xa5, 0x62, 0xc3, 0xa6, 0x72, 0x67, 0x72,
                    0xc3, 0xb8, 0x64]);
  Expect.stringEquals("'blåbærgrød'", token.value);

  // "சிவா அணாமாைல", that is "Siva Annamalai" in Tamil.
  token = scanUTF8([0xe0, 0xae, 0x9a, 0xe0, 0xae, 0xbf, 0xe0, 0xae, 0xb5, 0xe0,
                    0xae, 0xbe, 0x20, 0xe0, 0xae, 0x85, 0xe0, 0xae, 0xa3, 0xe0,
                    0xae, 0xbe, 0xe0, 0xae, 0xae, 0xe0, 0xae, 0xbe, 0xe0, 0xaf,
                    0x88, 0xe0, 0xae, 0xb2]);
  Expect.stringEquals("'சிவா அணாமாைல'", token.value);

  // "िसवा अणामालै", that is "Siva Annamalai" in Devanagari.
  token = scanUTF8([0xe0, 0xa4, 0xbf, 0xe0, 0xa4, 0xb8, 0xe0, 0xa4, 0xb5, 0xe0,
                    0xa4, 0xbe, 0x20, 0xe0, 0xa4, 0x85, 0xe0, 0xa4, 0xa3, 0xe0,
                    0xa4, 0xbe, 0xe0, 0xa4, 0xae, 0xe0, 0xa4, 0xbe, 0xe0, 0xa4,
                    0xb2, 0xe0, 0xa5, 0x88]);
  Expect.stringEquals("'िसवा अणामालै'", token.value);

  if (!isRunningOnJavaScript()) {
    // DESERET CAPITAL LETTER BEE, unicode 0x10412(0xD801+0xDC12)
    // UTF-8: F0 90 90 92
    token = scanUTF8([0xf0, 0x90, 0x90, 0x92]);
    Expect.stringEquals("'𐐒'", token.value);
  } else {
    print('Skipping non-BMP character test');
  }

  // Regression test for issue 1761.
  // "#!"
  token = scan([0x23, 0x21]);
  Expect.equals(token.info, EOF_INFO); // Treated as a comment.

  // Regression test for issue 1761.
  // "#! Hello, World!"
  token = scan([0x23, 0x21, 0x20, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20,
                0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21]);
  Expect.equals(token.info, EOF_INFO); // Treated as a comment.
}
