// 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 expect, group, test; 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('')); expect(prettyPrint(null), equals('')); expect(prettyPrint(() => 12), matches(r'')); }); 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', ]"), ); }); 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 = [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("{: 'qux'}"), ); }); test('containing a matcher value', () { expect( prettyPrint({'foo': endsWith('qux')}), equals("{'foo': }"), ); }); 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(""), ); }); test('with a custom [toString]', () { expect( prettyPrint(CustomToString()), equals('CustomToString:'), ); }); test('with a custom [toString] and a private name', () { expect( prettyPrint(_PrivateName()), equals('_PrivateName:'), ); }); }); group('with an iterable', () { test("that's not a list", () { expect( prettyPrint([1, 2, 3, 4].map((n) => n * 2)), equals('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:'); }); }