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

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