/*
 * 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 String convert(Object o)
 * Converts the given object o to its JSON representation.
 * Directly serializable values are num, String, bool, and Null, as well as some
 * List and Map values. For List, the elements must all be serializable. For
 * Map, the keys must be String and the values must be serializable. If a value
 * is any other type is attempted serialized, the conversion function provided
 * in the constructor is invoked with the object as argument and the result,
 * which must be a directly serializable value, is serialized instead of the
 * original value.

 * If the conversion throws, or returns a value that is not directly
 * serializable, a JsonUnsupportedObjectError exception is thrown.
 * If the call throws, the error is caught and stored in the
 * JsonUnsupportedObjectError's cause field.

 * If a List or Map contains a reference to itself, directly or through other
 * lists or maps, it cannot be serialized and a JsonCyclicError is thrown.

 * Json Objects should not change during serialization.
 * If an object is serialized more than once, stringify is allowed to cache the
 * JSON text for it. I.e., if an object changes after it is first serialized,
 * the new values may or may not be reflected in the result.
 * @description Checks that num, String, bool, Null, List, and Map values are
 * serialized correctly.
 * @author kaigorodov
 */
import "dart:convert";
import "../../../Utils/expect.dart";
import "../JsonDecoder/table1.lib.dart";

main() {
  for (List<Object?> pair in table) {
    JsonEncoder enc = new JsonEncoder();
    String res = enc.convert(pair[0]);
    Expect.equals(pair[1], res);
  }
}
