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

import 'dart:convert';

import 'package:expect/expect.dart';

main() {
  final RAW = '["122ç",50,50,231]';
  final ENCODED = const [
    91,
    34,
    49,
    50,
    50,
    195,
    167,
    34,
    44,
    53,
    48,
    44,
    53,
    48,
    44,
    50,
    51,
    49,
    93,
  ];
  Expect.listEquals(ENCODED, utf8.encode(RAW));
  Expect.equals(RAW, utf8.decode(ENCODED));

  Expect.listEquals([], utf8.encode(""));
  Expect.equals("", utf8.decode([]));

  final JSON_ENCODED = RAW;
  Expect.equals(JSON_ENCODED, json.encode(["122ç", 50, 50, 231]));
  Expect.listEquals(["122ç", 50, 50, 231], json.decode(JSON_ENCODED));

  // Test that the reviver is passed to the decoder.
  var decoded = json.decode(
    '{"p": 5}',
    reviver: (dynamic k, dynamic v) {
      if (k == null) return v;
      return v * 2;
    },
  );
  Expect.equals(10, decoded["p"]);
  var jsonWithReviver = new JsonCodec.withReviver((dynamic k, dynamic v) {
    if (k == null) return v;
    return v * 2;
  });
  decoded = jsonWithReviver.decode('{"p": 5}');
  Expect.equals(10, decoded["p"]);

  // Test example from comments.
  final JSON_TO_BYTES = json.fuse(utf8);
  List<int> bytes = JSON_TO_BYTES.encode(["json-object"]);
  decoded = JSON_TO_BYTES.decode(bytes);
  Expect.isTrue(decoded is List);
  Expect.equals("json-object", (decoded as List)[0]);
}
