// Copyright (c) 2013, 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.

library unicode_tests;

// Google favorite: "Îñţérñåţîöñåļîžåţîờñ".
const INTER_BYTES = const [
  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,
];
const INTER_STRING = "Îñţérñåţîöñåļîžåţîờñ";

// Blueberry porridge in Danish: "blåbærgrød".
const BLUEBERRY_BYTES = const [
  0x62,
  0x6c,
  0xc3,
  0xa5,
  0x62,
  0xc3,
  0xa6,
  0x72,
  0x67,
  0x72,
  0xc3,
  0xb8,
  0x64,
];
const BLUEBERRY_STRING = "blåbærgrød";

// "சிவா அணாமாைல", that is "Siva Annamalai" in Tamil.
const SIVA_BYTES1 = const [
  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,
];
const SIVA_STRING1 = "சிவா அணாமாைல";

// "िसवा अणामालै", that is "Siva Annamalai" in Devanagari.
const SIVA_BYTES2 = const [
  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,
];
const SIVA_STRING2 = "िसवा अणामालै";

// DESERET CAPITAL LETTER BEE, unicode 0x10412(0xD801+0xDC12)
// UTF-8: F0 90 90 92
const BEE_BYTES = const [0xf0, 0x90, 0x90, 0x92];
const BEE_STRING = "𐐒";

const DIGIT_BYTES = const [0x35];
const DIGIT_STRING = "5";

const ASCII_BYTES = const [
  0x61,
  0x62,
  0x63,
  0x64,
  0x65,
  0x66,
  0x67,
  0x68,
  0x69,
  0x6A,
  0x6B,
  0x6C,
  0x6D,
  0x6E,
  0x6F,
  0x70,
  0x71,
  0x72,
  0x73,
  0x74,
  0x75,
  0x76,
  0x77,
  0x78,
  0x79,
  0x7A,
];
const ASCII_STRING = "abcdefghijklmnopqrstuvwxyz";

const BIGGEST_ASCII_BYTES = const [0x7F];
const BIGGEST_ASCII_STRING = "\x7F";

const SMALLEST_2_UTF8_UNIT_BYTES = const [0xC2, 0x80];
const SMALLEST_2_UTF8_UNIT_STRING = "\u{80}";

const BIGGEST_2_UTF8_UNIT_BYTES = const [0xDF, 0xBF];
const BIGGEST_2_UTF8_UNIT_STRING = "\u{7FF}";

const SMALLEST_3_UTF8_UNIT_BYTES = const [0xE0, 0xA0, 0x80];
const SMALLEST_3_UTF8_UNIT_STRING = "\u{800}";

const BIGGEST_3_UTF8_UNIT_BYTES = const [0xEF, 0xBF, 0xBF];
const BIGGEST_3_UTF8_UNIT_STRING = "\u{FFFF}";

const SMALLEST_4_UTF8_UNIT_BYTES = const [0xF0, 0x90, 0x80, 0x80];
const SMALLEST_4_UTF8_UNIT_STRING = "\u{10000}";

const BIGGEST_4_UTF8_UNIT_BYTES = const [0xF4, 0x8F, 0xBF, 0xBF];
const BIGGEST_4_UTF8_UNIT_STRING = "\u{10FFFF}";

const _TEST_PAIRS = const [
  const [const <int>[], ""],
  const [INTER_BYTES, INTER_STRING],
  const [BLUEBERRY_BYTES, BLUEBERRY_STRING],
  const [SIVA_BYTES1, SIVA_STRING1],
  const [SIVA_BYTES2, SIVA_STRING2],
  const [BEE_BYTES, BEE_STRING],
  const [DIGIT_BYTES, DIGIT_STRING],
  const [ASCII_BYTES, ASCII_STRING],
  const [BIGGEST_ASCII_BYTES, BIGGEST_ASCII_STRING],
  const [SMALLEST_2_UTF8_UNIT_BYTES, SMALLEST_2_UTF8_UNIT_STRING],
  const [BIGGEST_2_UTF8_UNIT_BYTES, BIGGEST_2_UTF8_UNIT_STRING],
  const [SMALLEST_3_UTF8_UNIT_BYTES, SMALLEST_3_UTF8_UNIT_STRING],
  const [BIGGEST_3_UTF8_UNIT_BYTES, BIGGEST_3_UTF8_UNIT_STRING],
  const [SMALLEST_4_UTF8_UNIT_BYTES, SMALLEST_4_UTF8_UNIT_STRING],
  const [BIGGEST_4_UTF8_UNIT_BYTES, BIGGEST_4_UTF8_UNIT_STRING],
];

List<List> _expandTestPairs() {
  assert(2 == BEE_STRING.length);
  var tests = <List>[];
  tests.addAll(_TEST_PAIRS);
  tests.addAll(
    _TEST_PAIRS.map((test) {
      var bytes = test[0] as List<int>;
      var string = test[1] as String;
      var longBytes = <int>[];
      var longString = "";
      for (int i = 0; i < 100; i++) {
        longBytes.addAll(bytes);
        longString += string;
      }
      return [longBytes, longString];
    }),
  );
  return tests;
}

final List UNICODE_TESTS = _expandTestPairs();
