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

// Note: This test relies on LF line endings in the source file.
// It requires an entry in the .gitattributes file.

library json_pretty_test;

import 'dart:convert';

import "package:expect/expect.dart";

void _testIndentWithNullChar() {
  var encoder = const JsonEncoder.withIndent('\x00');
  var encoded = encoder.convert([
    [],
    [[]]
  ]);
  Expect.equals("[\n\x00[],\n\x00[\n\x00\x00[]\n\x00]\n]", encoded);
}

void main() {
  _testIndentWithNullChar();

  _expect(null, 'null');

  _expect([
    [],
    [[]]
  ], '''
[
  [],
  [
    []
  ]
]''');

  _expect([1, 2, 3, 4], '''
[
  1,
  2,
  3,
  4
]''');

  _expect([true, null, 'hello', 42.42], '''
[
  true,
  null,
  "hello",
  42.42
]''');

  _expect({"hello": [], "goodbye": {}}, '''{
  "hello": [],
  "goodbye": {}
}''');

  _expect([
    "test",
    1,
    2,
    33234.324,
    true,
    false,
    null,
    {
      "test1": "test2",
      "test3": "test4",
      "grace": 5,
      "shanna": [0, 1, 2]
    },
    {
      "lib": "app.dart",
      "src": ["foo.dart", "bar.dart"]
    }
  ], '''[
  "test",
  1,
  2,
  33234.324,
  true,
  false,
  null,
  {
    "test1": "test2",
    "test3": "test4",
    "grace": 5,
    "shanna": [
      0,
      1,
      2
    ]
  },
  {
    "lib": "app.dart",
    "src": [
      "foo.dart",
      "bar.dart"
    ]
  }
]''');
}

void _expect(Object object, String expected) {
  var encoder = const JsonEncoder.withIndent('  ');
  var prettyOutput = encoder.convert(object);

  Expect.equals(expected, prettyOutput);

  encoder = const JsonEncoder.withIndent('');

  var flatOutput = encoder.convert(object);

  var flatExpected = const LineSplitter()
      .convert(expected)
      .map((line) => line.trimLeft())
      .join('\n');

  Expect.equals(flatExpected, flatOutput);

  var compactOutput = json.encode(object);

  encoder = const JsonEncoder.withIndent(null);
  Expect.equals(compactOutput, encoder.convert(object));

  var prettyDecoded = json.decode(prettyOutput);

  Expect.equals(compactOutput, json.encode(prettyDecoded));
}
