// Copyright (c) 2014, 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

library json_tests;

import 'package:expect/expect.dart';
import 'dart:convert';

class A {
  final x;
  A(this.x);
}

toEncodable(Object a) => {"A": (a as A).x};
reviver(key, value) {
  if (value is Map && value.length == 1 && value["A"] != null) {
    return new A(value["A"]);
  }
  return value;
}

const extendedJson =
    const JsonCodec(toEncodable: toEncodable, reviver: reviver);

main() {
  var encoded = extendedJson.encode([
    new A(0),
    {"2": new A(1)}
  ]);
  Expect.equals('[{"A":0},{"2":{"A":1}}]', encoded);
  var decoded = extendedJson.decode(encoded);
  Expect.isTrue(decoded is List);
  Expect.equals(2, decoded.length);
  Expect.isTrue(decoded[0] is A);
  Expect.equals(0, decoded[0].x);
  Expect.isTrue(decoded[1] is Map);
  Expect.isNotNull(decoded[1]["2"]);
  Expect.isTrue(decoded[1]["2"] is A);
  Expect.equals(1, decoded[1]["2"].x);

  var a = extendedJson.decode(extendedJson.encode(new A(499)));
  Expect.isTrue(a is A);
  Expect.equals(499, a.x);

  testInvalidMap();
}

void testInvalidMap() {
  var map = {"a": 42, "b": 42, 37: 42}; // Non-string key.
  var enc = new JsonEncoder((_) => "fixed");
  var res = enc.convert(map);
  Expect.equals('"fixed"', res);

  enc = new JsonEncoder.withIndent(" ", (_) => "fixed");
  res = enc.convert(map);
  Expect.equals('"fixed"', res);
}
