// 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)})
/// If the object does not support "toJson()" method, throws, or returns a value
/// that is not directly serializable,
/// a JsonUnsupportedObjectError exception is thrown.
/// If the call throws (including the case where there is no nullary "toJson"
/// method, the error is caught and stored in the JsonUnsupportedObjectError's
/// cause field.
/// @description Checks that if "toJson()" method throws,
/// the error is caught and stored in the JsonUnsupportedObjectError's cause
/// field.
/// @author kaigorodov

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

class S1 {
  Object a = new Error();

  S1(this.a);

  Object toJson() => throw a;
}

main() {
  JsonCodec codec = new JsonCodec();
  Error e1 = new Error();
  S1 s1 = new S1(e1);
  String? res;
  Expect.throws(() { res = codec.encode(s1); },
      (e) => e is JsonUnsupportedObjectError && e.cause != null,
      "Error expected but result returned: $res");
}
