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

// Test that the fused UTF-8/JSON decoder accepts a leading BOM.
library test;

import "package:expect/expect.dart";
import "dart:convert";

void main() {
  for (var parse in [parseFuse, parseSequence, parseChunked]) {
    // Sanity checks.
    Expect.isTrue(parse('true'.codeUnits.toList()));
    Expect.isFalse(parse('false'.codeUnits.toList()));
    Expect.equals(123, parse('123'.codeUnits.toList()));
    Expect.listEquals([42], parse('[42]'.codeUnits.toList()) as List);
    Expect.mapEquals({"x": 42}, parse('{"x":42}'.codeUnits.toList()) as Map);

    // String (0x22 = ") with UTF-8 encoded Unicode characters.
    Expect.equals(
        "A\xff\u1234\u{65555}",
        parse([
          0x22,
          0x41,
          0xc3,
          0xbf,
          0xe1,
          0x88,
          0xb4,
          0xf1,
          0xa5,
          0x95,
          0x95,
          0x22
        ]));

    // BOM followed by true.
    Expect.isTrue(parse([0xEF, 0xBB, 0xBF, 0x74, 0x72, 0x75, 0x65]));
  }

  // Do not accept BOM in non-UTF-8 decoder.
  Expect.throws<FormatException>(
      () => new JsonDecoder().convert("\xEF\xBB\xBFtrue"));
  Expect.throws<FormatException>(() => new JsonDecoder().convert("\uFEFFtrue"));

  // Only accept BOM first.
  Expect.throws<FormatException>(
      () => parseFuse(" \xEF\xBB\xBFtrue".codeUnits.toList()));
  // Only accept BOM first.
  Expect.throws<FormatException>(
      () => parseFuse(" true\xEF\xBB\xBF".codeUnits.toList()));

  Expect.throws<FormatException>(
      () => parseFuse(" [\xEF\xBB\xBF]".codeUnits.toList()));

  // Regression test for dartbug.com/46205
  // Bug occurs in sound null safe mode only.
  Expect.isNull(parseFuse("null".codeUnits.toList()));
}

Object? parseFuse(List<int> text) {
  return new Utf8Decoder().fuse(new JsonDecoder()).convert(text);
}

Object? parseSequence(List<int> text) {
  return new JsonDecoder().convert(new Utf8Decoder().convert(text));
}

Object? parseChunked(List<int> text) {
  var result;
  var sink = new Utf8Decoder().fuse(new JsonDecoder()).startChunkedConversion(
      new ChunkedConversionSink.withCallback((List<Object?> values) {
    result = values[0];
  }));
  for (var i = 0; i < text.length; i++) {
    sink.add([text[i]]);
  }
  sink.close();
  return result;
}
