// Copyright (c) 2011, 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 'dart:json' as json;
import 'dart:html';
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';

main() {
  useHtmlConfiguration();
  test('Parse', () {
    // Scalars.
    expect(json.parse(' 5 '), equals(5));
    expect(json.parse(' -42 '), equals(-42));
    expect(json.parse(' 3e0 '), equals(3));
    expect(json.parse(' 3.14 '), equals(3.14));
    expect(json.parse('true '), isTrue);
    expect(json.parse(' false'), isFalse);
    expect(json.parse(' null '), isNull);
    expect(json.parse('\n\rnull\t'), isNull);
    expect(json.parse(' "hi there\\" bob" '), equals('hi there" bob'));
    expect(json.parse(' "" '), isEmpty);

    // Lists.
    expect(json.parse(' [] '), isEmpty);
    expect(json.parse('[ ]'), isEmpty);
    expect(json.parse(' [3, -4.5, true, "hi", false] '),
      equals([3, -4.5, true, 'hi', false]));
    // Nulls are tricky.
    expect(json.parse('[null]'), orderedEquals([null]));
    expect(json.parse(' [3, -4.5, null, true, "hi", false] '),
      equals([3, -4.5, null, true, 'hi', false]));
    expect(json.parse('[[null]]'), equals([[null]]));
    expect(json.parse(' [ [3], [], [null], ["hi", true]] '),
      equals([[3], [], [null], ['hi', true]]));

    // Maps.
    expect(json.parse(' {} '), isEmpty);
    expect(json.parse('{ }'), isEmpty);

    expect(json.parse(
        ' {"x":3, "y": -4.5,  "z" : "hi","u" : true, "v": false } '),
        equals({"x":3, "y": -4.5,  "z" : "hi", "u" : true, "v": false }));

    expect(json.parse(' {"x":3, "y": -4.5,  "z" : "hi" } '),
        equals({"x":3, "y": -4.5,  "z" : "hi" }));

    expect(json.parse(' {"y": -4.5,  "z" : "hi" ,"x":3 } '),
        equals({"y": -4.5,  "z" : "hi" ,"x":3 }));

    expect(json.parse('{ " hi bob " :3, "": 4.5}'),
        equals({ " hi bob " :3, "": 4.5}));

    expect(json.parse(' { "x" : { } } '), equals({ 'x' : {}}));
    expect(json.parse('{"x":{}}'), equals({ 'x' : {}}));

    // Nulls are tricky.
    expect(json.parse('{"w":null}'), equals({ 'w' : null}));

    expect(json.parse('{"x":{"w":null}}'), equals({"x":{"w":null}}));

    expect(json.parse(' {"x":3, "y": -4.5,  "z" : "hi",'
                   '"w":null, "u" : true, "v": false } '),
        equals({"x":3, "y": -4.5,  "z" : "hi",
                   "w":null, "u" : true, "v": false }));

    expect(json.parse('{"x": {"a":3, "b": -4.5}, "y":[{}], '
                   '"z":"hi","w":{"c":null,"d":true}, "v":null}'),
        equals({"x": {"a":3, "b": -4.5}, "y":[{}],
                   "z":"hi","w":{"c":null,"d":true}, "v":null}));

  test('stringify', () {
    // Scalars.
    expect(json.stringify(5), equals('5'));
    expect(json.stringify(-42), equals('-42'));
    // Dart does not guarantee a formatting for doubles,
    // so reparse and compare to the original.
    validateRoundTrip(3.14);
    expect(json.stringify(true), equals('true'));
    expect(json.stringify(false), equals('false'));
    expect(json.stringify(null), equals('null'));
    expect(json.stringify(' hi there" bob '), equals('" hi there\\" bob "'));
    expect(json.stringify('hi\\there'), equals('"hi\\\\there"'));
    // TODO(devoncarew): these tests break the dartium build
    //expect(json.stringify('hi\nthere'), equals('"hi\\nthere"'));
    //expect(json.stringify('hi\r\nthere'), equals('"hi\\r\\nthere"'));
    expect(json.stringify(''), equals('""'));

    // Lists.
    expect(json.stringify([]), equals('[]'));
    expect(json.stringify(new List(0)), equals('[]'));
    expect(json.stringify(new List(3)), equals('[null,null,null]'));
    validateRoundTrip([3, -4.5, null, true, 'hi', false]);
    expect(json.stringify([[3], [], [null], ['hi', true]]),
      equals('[[3],[],[null],["hi",true]]'));

    // Maps.
    expect(json.stringify({}), equals('{}'));
    expect(json.stringify(new Map()), equals('{}'));
    expect(json.stringify({'x':{}}), equals('{"x":{}}'));
    expect(json.stringify({'x':{'a':3}}), equals('{"x":{"a":3}}'));

    // Dart does not guarantee an order on the keys
    // of a map literal, so reparse and compare to the original Map.
    validateRoundTrip(
        {'x':3, 'y':-4.5, 'z':'hi', 'w':null, 'u':true, 'v':false});
    validateRoundTrip({"x":3, "y":-4.5, "z":'hi'});
    validateRoundTrip({' hi bob ':3, '':4.5});
    validateRoundTrip(
        {'x':{'a':3, 'b':-4.5}, 'y':[{}], 'z':'hi', 'w':{'c':null, 'd':true},
                  'v':null});

    expect(json.stringify(new ToJson(4)), "4");
    expect(json.stringify(new ToJson([4, "a"])), '[4,"a"]');
    expect(json.stringify(new ToJson([4, new ToJson({"x":42})])),
           '[4,{"x":42}]');

    Expect.throws(() {
      json.stringify([new ToJson(new ToJson(4))]);
    });

    Expect.throws(() {
      json.stringify([new Object()]);
    });

  });

  test('stringify throws if argument cannot be converted', () {
    /**
     * Checks that we get an exception (rather than silently returning null) if
     * we try to stringify something that cannot be converted to json.
     */
    expect(() => json.stringify(new TestClass()), throws);
    });
  });
}

class TestClass {
  int x;
  String y;

  TestClass() : x = 3, y = 'joe' { }
}

class ToJson {
  final object;
  const ToJson(this.object);
  toJson() => object;
}

/**
 * Checks that the argument can be converted to a JSON string and
 * back, and produce something equivalent to the argument.
 */
validateRoundTrip(expected) {
  expect(json.parse(json.stringify(expected)), equals(expected));
}


