// 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';
import 'package:front_end/src/fasta/scanner/characters.dart';
import 'package:front_end/src/fasta/scanner/precedence.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(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(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.lexeme);

  // 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.lexeme);

  // "சிவா அணாமாைல", 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.lexeme);

  // "िसवा अणामालै", 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.lexeme);

  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.lexeme);
  } else {
    print('Skipping non-BMP character test');
  }

  // Regression test for issue 1761.
  // "#!"
  token = scan([0x23, 0x21]);
  Expect.equals(token.info, SCRIPT_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, SCRIPT_INFO); // Treated as a comment.
}
