// Copyright (c) 2013, 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 Object encode(Object value, {toEncodable(object)})
/// Converts value to a JSON string.
/// If value contains objects that are not directly encodable to a JSON string
/// (a value that is not a number, boolean, string, null, list or a map with
/// string keys), the toEncodable function is used to convert it to an object
/// that must be directly encodable.
/// If toEncodable is omitted, it defaults to calling .toJson() on the
/// unencodable object.
/// @description Checks that if a value is any other type than num, String, bool,
/// Null, List, or Map, a "toJson()" method is invoked on the object and the
/// result, which must be a directly serializable value, is serialized instead of
/// the original value.
/// @author kaigorodov

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

class S1 {
  Object? a;
  Object? b;
  
  S1(this.a, this.b);
  
  List toJson() {
    return [a, b];
  }
}

class S2 {
  Object? a;
  Object? b;
  
  S2(this.a, this.b);
  
  Map toJson() => {a: b};
}

List<List<Object>> table = [
  [new S1(1234, "1234"), '[1234,"1234"]'],
  [new S1(null, []), '[null,[]]'],
  [new S1(1.234, {}), '[1.234,{}]'],
  [new S2("1.234", {}), '{"1.234":{}}'],
  [new S2("key2", [null, 1.1]),
   '{"key2":[null,1.1]}'],
];

main() {
  JsonCodec codec = new JsonCodec();

  for (List<Object?> pair in table) {
    String? res = codec.encode(pair[0]);
    Expect.equals(pair[1], res);
  }
}
