// 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.

/// @assertion ChunkedConversionSink<Object> startChunkedConversion(
///  Sink<String> sink
///  )
/// Starts a chunked conversion.
/// ...
/// It is an error to invoke add more than once on the returned sink.
/// @description Checks that it is an error to invoke add more than once on the
/// returned sink.
/// @author sgrekhov@unipro.ru

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

check(data) {
  JsonEncoder encoder = new JsonEncoder();
  Sink<String> outSink = new ChunkedConversionSink.withCallback((chunks) {
    Expect.equals(encoder.convert(data), chunks2string(chunks));
  });
  var inSink = encoder.startChunkedConversion(outSink);
  inSink.add(data);
  Expect.throws(() {inSink.add(data);});
  Expect.throws(() {inSink.add(null);});
  inSink.close();
}

String chunks2string(List<String> data) {
  StringBuffer sb = new StringBuffer();
  Iterator it = data.iterator;
  while (it.moveNext()) {
    sb.write(it.current);
  }
  return sb.toString();
}

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({"й": " ф "});
}
