
// @dart = 2.9
 // 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 toEncodable parameter,
/// creates object with specified toEncodable
/// @author sgrekhov@unipro.ru

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

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

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

 dynamic toEncodable(object) {
   if (object is A) {
     return "A encoded by toEncodable";
   }
   if (object is C) {
     return "C encoded by toEncodable";
   }
   return "Another encoded by toEncodable";
 }

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

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

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

   check(encoder, new A(), '"A encoded by toEncodable"');
   check(encoder, new C(), '"C encoded by toEncodable"');
   check(encoder, [new C(), new A()],
       '["C encoded by toEncodable","A encoded by toEncodable"]');
   // Map with not a string keys
   check(
       encoder, {new C(): new A()}, '"Another encoded by toEncodable"');

   // Map with a string keys
   check(encoder, {"x": new A()}, '{"x":"A encoded by toEncodable"}');
 }
