// 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:collection';

import 'package:matcher/matcher.dart';
import 'package:matcher/src/pretty_print.dart';
import 'package:test/test.dart' show group, test, expect;

import 'test_utils.dart';

class DefaultToString {}

class CustomToString {
  @override
  String toString() => 'string representation';
}

class _PrivateName {
  @override
  String toString() => 'string representation';
}

class _PrivateNameIterable extends IterableMixin {
  @override
  Iterator get iterator => [1, 2, 3].iterator;
}

void main() {
  test('with primitive objects', () {
    expect(prettyPrint(12), equals('<12>'));
    expect(prettyPrint(12.13), equals('<12.13>'));
    expect(prettyPrint(true), equals('<true>'));
    expect(prettyPrint(null), equals('<null>'));
    expect(prettyPrint(() => 12), matches(r'<Closure.*>'));
  });

  group('with a string', () {
    test('containing simple characters', () {
      expect(prettyPrint('foo'), equals("'foo'"));
    });

    test('containing newlines', () {
      expect(
          prettyPrint('foo\nbar\nbaz'),
          equals("'foo\\n'\n"
              "  'bar\\n'\n"
              "  'baz'"));
    });

    test('containing escapable characters', () {
      expect(prettyPrint("foo\rbar\tbaz'qux\v"),
          equals(r"'foo\rbar\tbaz\'qux\v'"));
    });
  });

  group('with an iterable', () {
    test('containing primitive objects', () {
      expect(prettyPrint([1, true, 'foo']), equals("[1, true, 'foo']"));
    });

    test('containing a multiline string', () {
      expect(
          prettyPrint(['foo', 'bar\nbaz\nbip', 'qux']),
          equals('[\n'
              "  'foo',\n"
              "  'bar\\n'\n"
              "    'baz\\n'\n"
              "    'bip',\n"
              "  'qux'\n"
              ']'));
    });

    test('containing a matcher', () {
      expect(prettyPrint(['foo', endsWith('qux')]),
          equals("['foo', <a string ending with 'qux'>]"));
    });

    test("that's under maxLineLength", () {
      expect(prettyPrint([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxLineLength: 30),
          equals('[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'));
    });

    test("that's over maxLineLength", () {
      expect(
          prettyPrint([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxLineLength: 29),
          equals('[\n'
              '  0,\n'
              '  1,\n'
              '  2,\n'
              '  3,\n'
              '  4,\n'
              '  5,\n'
              '  6,\n'
              '  7,\n'
              '  8,\n'
              '  9\n'
              ']'));
    });

    test('factors indentation into maxLineLength', () {
      expect(
          prettyPrint([
            'foo\nbar',
            [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
          ], maxLineLength: 30),
          equals('[\n'
              "  'foo\\n'\n"
              "    'bar',\n"
              '  [\n'
              '    0,\n'
              '    1,\n'
              '    2,\n'
              '    3,\n'
              '    4,\n'
              '    5,\n'
              '    6,\n'
              '    7,\n'
              '    8,\n'
              '    9\n'
              '  ]\n'
              ']'));
    });

    test("that's under maxItems", () {
      expect(prettyPrint([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxItems: 10),
          equals('[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'));
    });

    test("that's over maxItems", () {
      expect(prettyPrint([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxItems: 9),
          equals('[0, 1, 2, 3, 4, 5, 6, 7, ...]'));
    });

    test("that's recursive", () {
      var list = <dynamic>[1, 2, 3];
      list.add(list);
      expect(prettyPrint(list), equals('[1, 2, 3, (recursive)]'));
    });
  });

  group('with a map', () {
    test('containing primitive objects', () {
      expect(prettyPrint({'foo': 1, 'bar': true}),
          equals("{'foo': 1, 'bar': true}"));
    });

    test('containing a multiline string key', () {
      expect(
          prettyPrint({'foo\nbar': 1, 'bar': true}),
          equals('{\n'
              "  'foo\\n'\n"
              "    'bar': 1,\n"
              "  'bar': true\n"
              '}'));
    });

    test('containing a multiline string value', () {
      expect(
          prettyPrint({'foo': 'bar\nbaz', 'qux': true}),
          equals('{\n'
              "  'foo': 'bar\\n'\n"
              "    'baz',\n"
              "  'qux': true\n"
              '}'));
    });

    test('containing a multiline string key/value pair', () {
      expect(
          prettyPrint({'foo\nbar': 'baz\nqux'}),
          equals('{\n'
              "  'foo\\n'\n"
              "    'bar': 'baz\\n'\n"
              "    'qux'\n"
              '}'));
    });

    test('containing a matcher key', () {
      expect(prettyPrint({endsWith('bar'): 'qux'}),
          equals("{<a string ending with 'bar'>: 'qux'}"));
    });

    test('containing a matcher value', () {
      expect(prettyPrint({'foo': endsWith('qux')}),
          equals("{'foo': <a string ending with 'qux'>}"));
    });

    test("that's under maxLineLength", () {
      expect(prettyPrint({'0': 1, '2': 3, '4': 5, '6': 7}, maxLineLength: 32),
          equals("{'0': 1, '2': 3, '4': 5, '6': 7}"));
    });

    test("that's over maxLineLength", () {
      expect(
          prettyPrint({'0': 1, '2': 3, '4': 5, '6': 7}, maxLineLength: 31),
          equals('{\n'
              "  '0': 1,\n"
              "  '2': 3,\n"
              "  '4': 5,\n"
              "  '6': 7\n"
              '}'));
    });

    test('factors indentation into maxLineLength', () {
      expect(
          prettyPrint([
            'foo\nbar',
            {'0': 1, '2': 3, '4': 5, '6': 7}
          ], maxLineLength: 32),
          equals('[\n'
              "  'foo\\n'\n"
              "    'bar',\n"
              '  {\n'
              "    '0': 1,\n"
              "    '2': 3,\n"
              "    '4': 5,\n"
              "    '6': 7\n"
              '  }\n'
              ']'));
    });

    test("that's under maxItems", () {
      expect(prettyPrint({'0': 1, '2': 3, '4': 5, '6': 7}, maxItems: 4),
          equals("{'0': 1, '2': 3, '4': 5, '6': 7}"));
    });

    test("that's over maxItems", () {
      expect(prettyPrint({'0': 1, '2': 3, '4': 5, '6': 7}, maxItems: 3),
          equals("{'0': 1, '2': 3, ...}"));
    });
  });
  group('with an object', () {
    test('with a default [toString]', () {
      expect(prettyPrint(DefaultToString()),
          equals("<Instance of 'DefaultToString'>"));
    });

    test('with a custom [toString]', () {
      expect(prettyPrint(CustomToString()),
          equals('CustomToString:<string representation>'));
    });

    test('with a custom [toString] and a private name', () {
      expect(prettyPrint(_PrivateName()),
          equals('_PrivateName:<string representation>'));
    });
  });

  group('with an iterable', () {
    test("that's not a list", () {
      expect(
          prettyPrint([1, 2, 3, 4].map((n) => n * 2)),
          equals(isDart2
              ? 'MappedListIterable<int, int>:[2, 4, 6, 8]'
              : 'MappedListIterable:[2, 4, 6, 8]'));
    });

    test("that's not a list and has a private name", () {
      expect(prettyPrint(_PrivateNameIterable()),
          equals('_PrivateNameIterable:[1, 2, 3]'));
    });
  });

  test('Type', () {
    expect(prettyPrint(''.runtimeType), 'Type:<String>');
  });
}
