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

/**
 * @assertionconst JsonEncoder.withIndent(
 *  String indent, [
 *  dynamic toEncodable(
 *  nonSerializable
 *  )
 *  ])
 * Creates a JSON encoder that creates multi-line JSON.
 * The encoding of elements of lists and maps are indented and put on separate
 * lines. The indent string is prepended to these elements, once for each level
 * of indentation.
 *
 * If indent is null, the output is encoded as a single line.
 *
 * 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 not null indent
 * parameter and toEncodable creates a JSON encoder that creates multi-line
 * JSON.
 * @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(JsonEncoder encoder, var object, var expected) {
  String encoded = encoder.convert(object);
  Expect.equals(expected, encoded);
}

main() {
  JsonEncoder encoder = new JsonEncoder.withIndent("--", toEncodable);

  check(encoder, new A(), '"A encoded by toEncodable"');
  check(encoder, new C(), '"C encoded by 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], "[\n--1,\n--2,\n--3\n]");
  check(encoder, {"a": "b"}, '{\n--"a": "b"\n}');
}
