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

// @dart = 2.9

/// @assertion ChunkedConversionSink<Object> startChunkedConversion(
///  Sink<List<int>> sink
///  )
/// Start a chunked conversion.
///
/// Only one object can be passed into the returned sink.
/// ...
/// @description Checks that only one object can be passed into the returned sink
/// @author sgrekhov@unipro.ru

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

check(data) {
  JsonUtf8Encoder encoder = new JsonUtf8Encoder();
  bool called = false;

  Sink<List<int>> outSink = new ChunkedConversionSink.withCallback((chunks) {
    Expect.listEquals([encoder.convert(data)], chunks);
    called = true;
  });
  var inSink = encoder.startChunkedConversion(outSink);
  inSink.add(data);
  Expect.throws(() {inSink.add(data);});
  Expect.throws(() {inSink.add(null);});
  inSink.close();
  Expect.isTrue(called);
}

main() {
  check(1);
  check(3.14);
  check(null);
  check(true);
  check(false);
  check('"str"');
  check(["1", "2", "3.14"]);
  check([[1, 2, 3], {"a": "3"}]);
  check({"a": "b"});
  check({"й": " ф "});
}
