// 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:utf/utf.dart';

const String testKoreanCharSubset = """
가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛
개객갞갟갠갡갢갣갤갥갦갧갨갩갪갫갬갭갮갯갰갱갲갳갴갵갶갷
갸갹갺갻갼갽갾갿걀걁걂걃걄걅걆걇걈걉걊걋걌걍걎걏걐걑걒걓""";

const String testHanTwice = "二";

const List<int> testKoreanCharSubsetUtf32beBom = const<int>[
    0x00, 0x00, 0xfe, 0xff, 0x00, 0x00, 0xac, 0x00,
    0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 0xac, 0x02,
    0x00, 0x00, 0xac, 0x03, 0x00, 0x00, 0xac, 0x04,
    0x00, 0x00, 0xac, 0x05, 0x00, 0x00, 0xac, 0x06,
    0x00, 0x00, 0xac, 0x07, 0x00, 0x00, 0xac, 0x08,
    0x00, 0x00, 0xac, 0x09, 0x00, 0x00, 0xac, 0x0a,
    0x00, 0x00, 0xac, 0x0b, 0x00, 0x00, 0xac, 0x0c,
    0x00, 0x00, 0xac, 0x0d, 0x00, 0x00, 0xac, 0x0e,
    0x00, 0x00, 0xac, 0x0f, 0x00, 0x00, 0xac, 0x10,
    0x00, 0x00, 0xac, 0x11, 0x00, 0x00, 0xac, 0x12,
    0x00, 0x00, 0xac, 0x13, 0x00, 0x00, 0xac, 0x14,
    0x00, 0x00, 0xac, 0x15, 0x00, 0x00, 0xac, 0x16,
    0x00, 0x00, 0xac, 0x17, 0x00, 0x00, 0xac, 0x18,
    0x00, 0x00, 0xac, 0x19, 0x00, 0x00, 0xac, 0x1a,
    0x00, 0x00, 0xac, 0x1b, 0x00, 0x00, 0x00, 0x0a,
    0x00, 0x00, 0xac, 0x1c, 0x00, 0x00, 0xac, 0x1d,
    0x00, 0x00, 0xac, 0x1e, 0x00, 0x00, 0xac, 0x1f,
    0x00, 0x00, 0xac, 0x20, 0x00, 0x00, 0xac, 0x21,
    0x00, 0x00, 0xac, 0x22, 0x00, 0x00, 0xac, 0x23,
    0x00, 0x00, 0xac, 0x24, 0x00, 0x00, 0xac, 0x25,
    0x00, 0x00, 0xac, 0x26, 0x00, 0x00, 0xac, 0x27,
    0x00, 0x00, 0xac, 0x28, 0x00, 0x00, 0xac, 0x29,
    0x00, 0x00, 0xac, 0x2a, 0x00, 0x00, 0xac, 0x2b,
    0x00, 0x00, 0xac, 0x2c, 0x00, 0x00, 0xac, 0x2d,
    0x00, 0x00, 0xac, 0x2e, 0x00, 0x00, 0xac, 0x2f,
    0x00, 0x00, 0xac, 0x30, 0x00, 0x00, 0xac, 0x31,
    0x00, 0x00, 0xac, 0x32, 0x00, 0x00, 0xac, 0x33,
    0x00, 0x00, 0xac, 0x34, 0x00, 0x00, 0xac, 0x35,
    0x00, 0x00, 0xac, 0x36, 0x00, 0x00, 0xac, 0x37,
    0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0xac, 0x38,
    0x00, 0x00, 0xac, 0x39, 0x00, 0x00, 0xac, 0x3a,
    0x00, 0x00, 0xac, 0x3b, 0x00, 0x00, 0xac, 0x3c,
    0x00, 0x00, 0xac, 0x3d, 0x00, 0x00, 0xac, 0x3e,
    0x00, 0x00, 0xac, 0x3f, 0x00, 0x00, 0xac, 0x40,
    0x00, 0x00, 0xac, 0x41, 0x00, 0x00, 0xac, 0x42,
    0x00, 0x00, 0xac, 0x43, 0x00, 0x00, 0xac, 0x44,
    0x00, 0x00, 0xac, 0x45, 0x00, 0x00, 0xac, 0x46,
    0x00, 0x00, 0xac, 0x47, 0x00, 0x00, 0xac, 0x48,
    0x00, 0x00, 0xac, 0x49, 0x00, 0x00, 0xac, 0x4a,
    0x00, 0x00, 0xac, 0x4b, 0x00, 0x00, 0xac, 0x4c,
    0x00, 0x00, 0xac, 0x4d, 0x00, 0x00, 0xac, 0x4e,
    0x00, 0x00, 0xac, 0x4f, 0x00, 0x00, 0xac, 0x50,
    0x00, 0x00, 0xac, 0x51, 0x00, 0x00, 0xac, 0x52,
    0x00, 0x00, 0xac, 0x53];

const List<int> testKoreanCharSubsetUtf32le = const<int>[
    0x00, 0xac, 0x00, 0x00, 0x01, 0xac, 0x00, 0x00,
    0x02, 0xac, 0x00, 0x00, 0x03, 0xac, 0x00, 0x00,
    0x04, 0xac, 0x00, 0x00, 0x05, 0xac, 0x00, 0x00,
    0x06, 0xac, 0x00, 0x00, 0x07, 0xac, 0x00, 0x00,
    0x08, 0xac, 0x00, 0x00, 0x09, 0xac, 0x00, 0x00,
    0x0a, 0xac, 0x00, 0x00, 0x0b, 0xac, 0x00, 0x00,
    0x0c, 0xac, 0x00, 0x00, 0x0d, 0xac, 0x00, 0x00,
    0x0e, 0xac, 0x00, 0x00, 0x0f, 0xac, 0x00, 0x00,
    0x10, 0xac, 0x00, 0x00, 0x11, 0xac, 0x00, 0x00,
    0x12, 0xac, 0x00, 0x00, 0x13, 0xac, 0x00, 0x00,
    0x14, 0xac, 0x00, 0x00, 0x15, 0xac, 0x00, 0x00,
    0x16, 0xac, 0x00, 0x00, 0x17, 0xac, 0x00, 0x00,
    0x18, 0xac, 0x00, 0x00, 0x19, 0xac, 0x00, 0x00,
    0x1a, 0xac, 0x00, 0x00, 0x1b, 0xac, 0x00, 0x00,
    0x0a, 0x00, 0x00, 0x00, 0x1c, 0xac, 0x00, 0x00,
    0x1d, 0xac, 0x00, 0x00, 0x1e, 0xac, 0x00, 0x00,
    0x1f, 0xac, 0x00, 0x00, 0x20, 0xac, 0x00, 0x00,
    0x21, 0xac, 0x00, 0x00, 0x22, 0xac, 0x00, 0x00,
    0x23, 0xac, 0x00, 0x00, 0x24, 0xac, 0x00, 0x00,
    0x25, 0xac, 0x00, 0x00, 0x26, 0xac, 0x00, 0x00,
    0x27, 0xac, 0x00, 0x00, 0x28, 0xac, 0x00, 0x00,
    0x29, 0xac, 0x00, 0x00, 0x2a, 0xac, 0x00, 0x00,
    0x2b, 0xac, 0x00, 0x00, 0x2c, 0xac, 0x00, 0x00,
    0x2d, 0xac, 0x00, 0x00, 0x2e, 0xac, 0x00, 0x00,
    0x2f, 0xac, 0x00, 0x00, 0x30, 0xac, 0x00, 0x00,
    0x31, 0xac, 0x00, 0x00, 0x32, 0xac, 0x00, 0x00,
    0x33, 0xac, 0x00, 0x00, 0x34, 0xac, 0x00, 0x00,
    0x35, 0xac, 0x00, 0x00, 0x36, 0xac, 0x00, 0x00,
    0x37, 0xac, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00,
    0x38, 0xac, 0x00, 0x00, 0x39, 0xac, 0x00, 0x00,
    0x3a, 0xac, 0x00, 0x00, 0x3b, 0xac, 0x00, 0x00,
    0x3c, 0xac, 0x00, 0x00, 0x3d, 0xac, 0x00, 0x00,
    0x3e, 0xac, 0x00, 0x00, 0x3f, 0xac, 0x00, 0x00,
    0x40, 0xac, 0x00, 0x00, 0x41, 0xac, 0x00, 0x00,
    0x42, 0xac, 0x00, 0x00, 0x43, 0xac, 0x00, 0x00,
    0x44, 0xac, 0x00, 0x00, 0x45, 0xac, 0x00, 0x00,
    0x46, 0xac, 0x00, 0x00, 0x47, 0xac, 0x00, 0x00,
    0x48, 0xac, 0x00, 0x00, 0x49, 0xac, 0x00, 0x00,
    0x4a, 0xac, 0x00, 0x00, 0x4b, 0xac, 0x00, 0x00,
    0x4c, 0xac, 0x00, 0x00, 0x4d, 0xac, 0x00, 0x00,
    0x4e, 0xac, 0x00, 0x00, 0x4f, 0xac, 0x00, 0x00,
    0x50, 0xac, 0x00, 0x00, 0x51, 0xac, 0x00, 0x00,
    0x52, 0xac, 0x00, 0x00, 0x53, 0xac, 0x00, 0x00];

void main() {
  testUtf32BytesToString();
  testEncodeToUtf32();
  testIterableMethods();
}

void testEncodeToUtf32() {
  Expect.listEquals([], encodeUtf32le(""), "no input"); // TODO(dcarlson) skip bom on empty?
  Expect.listEquals(testKoreanCharSubsetUtf32beBom,
      encodeUtf32(testKoreanCharSubset),
      "encode UTF-32(BE by default) Korean");
  Expect.listEquals(testKoreanCharSubsetUtf32le,
      encodeUtf32le(testKoreanCharSubset),
      "encode UTF-32(LE by default) Korean");
}

void testUtf32BytesToString() {
  Expect.stringEquals("", decodeUtf32([]), "no input");
  Expect.stringEquals("\ufffd", decodeUtf32([0]), "single byte");
  Expect.stringEquals("\ufffd", decodeUtf32([0, 0, 0x4e]),
      "short a byte");
  Expect.stringEquals("\u4e8c\ufffd", decodeUtf32([0, 0, 0x4e, 0x8c, 0]),
      "extra byte");

  Expect.stringEquals(testHanTwice, decodeUtf32([0, 0, 0x4e, 0x8c]),
      "twice variation 1");
  Expect.stringEquals(testHanTwice,
      decodeUtf32([0, 0, 0xfe, 0xff, 0, 0, 0x4e, 0x8c]),
      "twice variation 2");
  Expect.stringEquals(testHanTwice,
      decodeUtf32([0xff, 0xfe, 0, 0, 0x8c, 0x4e, 0, 0]),
      "twice variation 3");

  Expect.stringEquals(testHanTwice, decodeUtf32be([0, 0, 0x4e, 0x8c]),
      "twice variation 4");
  Expect.stringEquals(testHanTwice,
      decodeUtf32be([0, 0, 0xfe, 0xff, 0, 0, 0x4e, 0x8c]),
      "twice variation 5");

  Expect.stringEquals(testHanTwice, decodeUtf32le([0x8c, 0x4e, 0, 0]),
      "twice variation 6");
  Expect.stringEquals(testHanTwice,
      decodeUtf32le([0xff, 0xfe, 0, 0, 0x8c, 0x4e, 0, 0]),
      "twice variation 7");

  Expect.stringEquals(testKoreanCharSubset,
      decodeUtf32(testKoreanCharSubsetUtf32beBom),
      "UTF-32BE Korean");
}

void testIterableMethods() {
  // empty input
  Expect.isFalse(decodeUtf32AsIterable([]).iterator.moveNext());

  IterableUtf32Decoder koreanDecoder =
    decodeUtf32AsIterable(testKoreanCharSubsetUtf32beBom);
  // get the first character
  Expect.equals(testKoreanCharSubset.codeUnits[0], koreanDecoder.first);
  // get the whole translation using the Iterable interface
  Expect.stringEquals(testKoreanCharSubset,
      new String.fromCharCodes(new List<int>.from(koreanDecoder)));

  // specify types
  Expect.equals(44032, (new List<int>
      .from(decodeUtf32beAsIterable(testKoreanCharSubsetUtf32beBom)))[0]);
  Expect.equals(44032, (new List<int>
      .from(decodeUtf32leAsIterable(testKoreanCharSubsetUtf32le)))[0]);
  bool stripBom = false;
  Expect.equals(UNICODE_BOM, (new List<int>
      .from(decodeUtf32beAsIterable(testKoreanCharSubsetUtf32beBom,
          0, null, stripBom)))[0]);
}
