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

/// @assertion List<int> convert(Object object)
/// Convert object into UTF-8 encoded JSON.
/// @description Checks that objects are converted into UTF-8 encoded JSON by
/// calling their toEncodable
/// @author sgrekhov@unipro.ru

import "dart:convert";
import "../../../Utils/expect.dart";
import "../JsonDecoder/table1.lib.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(JsonUtf8Encoder encoder, var object, var expected) {
  List<int> encoded = encoder.convert(object);
  Expect.listEquals(utf8.encode(expected), encoded);
}

main() {
  JsonUtf8Encoder encoder = new JsonUtf8Encoder(null, toEncodable);

  check(encoder, new A(), '"A encoded by toEncodable"');
  check(encoder, new C(), '"C encoded by toEncodable"');
  check(encoder, [new C(), new A()],
      '["C encoded by toEncodable","A encoded by toEncodable"]');
  // Map with not a string keys
  check(
      encoder, {new C(): new A()}, '"Another encoded by toEncodable"');

  // Map with a string keys
  check(encoder, {"x": new A()}, '{"x":"A encoded by toEncodable"}');
}
