 // 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 JsonUtf8Encoder([
///  String indent,
///  dynamic toEncodable(
///  object
///  ),
///  int bufferSize = DEFAULT_BUFFER_SIZE
///  ])
/// Create converter.
///
/// If indent is non-null, the converter attempts to "pretty-print" the JSON,
/// and uses indent as the indentation. Otherwise the result has no whitespace
/// outside of string literals. If indent contains characters that are not valid
/// JSON whitespace characters, the result will not be valid JSON. JSON
/// whitespace characters are space (U+0020), tab (U+0009), line feed (U+000a)
/// and carriage return (U+000d) (ECMA 404).
///
/// The bufferSize is the size of the internal buffers used to collect UTF-8 code
/// units. If using startChunkedConversion, it will be the size of the chunks.
///
/// The JSON encoder handles numbers, strings, booleans, null, lists and maps
/// directly.
///
/// Any other object is attempted converted by toEncodable to an object that is
/// of one of the convertible types.
///
/// If toEncodable is omitted, it defaults to calling .toJson() on the object.
/// @description Checks that this constructor, called with indent parameter,
/// creates object with default appropriate indent
/// @author sgrekhov@unipro.ru

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

class A {
  Object toJson() => 42;
}

class C {
  String toJson() => "C: this is JSON";
}

check(JsonUtf8Encoder encoder, var object, var expected) {
  var encoded = encoder.convert(object);
  Expect.listEquals(utf8.encode(expected.toString()), encoded);
}

main() {
  JsonUtf8Encoder encoder = new JsonUtf8Encoder(null);

  check(encoder, 1, "1");
  check(encoder, 3.14, "3.14");
  check(encoder, null, "null");
  check(encoder, "str", '"str"');
  check(encoder, true, 'true');
  check(encoder, false, 'false');
  check(encoder, [1, 2, 3], "[1,2,3]");
  check(encoder, {"a": "b"}, '{"a":"b"}');
  check(encoder, new A(), new A().toJson());
  check(encoder, new C(), '"' + new C().toJson() + '"');

  encoder = new JsonUtf8Encoder(" ");

  check(encoder, 1, "1");
  check(encoder, 3.14, "3.14");
  check(encoder, null, "null");
  check(encoder, "str", '"str"');
  check(encoder, true, 'true');
  check(encoder, false, 'false');
  check(encoder, [1, 2, 3], "[\n 1,\n 2,\n 3\n]");
  check(encoder, {"a": "b"}, '{\n "a": "b"\n}');
  check(encoder, new A(), new A().toJson());
  check(encoder, new C(), '"' + new C().toJson() + '"');

  encoder = new JsonUtf8Encoder(" й ");

  check(encoder, 1, "1");
  check(encoder, 3.14, "3.14");
  check(encoder, null, "null");
  check(encoder, "str", '"str"');
  check(encoder, true, 'true');
  check(encoder, false, 'false');
  check(encoder, [1, 2, 3], "[\n й 1,\n й 2,\n й 3\n]");
  check(encoder, {"a": "b"}, '{\n й "a": "b"\n}');
  check(encoder, new A(), new A().toJson());
  check(encoder, new C(), '"' + new C().toJson() + '"');
}
