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

// 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));
}
