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

/// @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}');
}
