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

library json_tests;

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

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

Object? toEncodable(dynamic 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);
}
