// Copyright (c) 2012, 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 'package:pub/src/ascii_tree.dart' as tree;
import 'package:pub/src/package.dart';
import 'package:pub/src/pubspec.dart';
import 'package:pub/src/utils.dart';
import 'package:test/test.dart';

import 'descriptor.dart';
import 'golden_file.dart';
import 'test_pub.dart';

void main() {
  setUp(() {
    forceColors = ForceColorOption.always;
  });

  tearDown(() {
    forceColors = ForceColorOption.auto;
  });
  test('tree.fromFiles no files', () {
    expect(tree.fromFiles([], showFileSizes: true), equals(''));
  });

  List<int> bytes(int size) => List.filled(size, 0);
  testWithGolden('tree.fromFiles a complex example', colors: true, (ctx) async {
    await dir(appPath, [
      libPubspec('app', '1.0.0'),
      file('TODO', bytes(10)),
      dir('example', [
        file('console_example.dart', bytes(1000)),
        file('main.dart', bytes(1024)),
        dir('web copy', [
          file('web_example.dart', bytes(1025)),
        ]),
      ]),
      dir('test', [
        file('absolute_test.dart', bytes(0)),
        file('basename_test.dart', bytes(1 << 20)),
        file('dirname_test.dart', bytes((1 << 20) + 1)),
        file('extension_test.dart', bytes(2300)),
        file('is_absolute_test.dart', bytes(2400)),
        file('is_relative_test.dart', bytes((1 << 20) * 25)),
        file('join_test.dart', bytes(1023)),
        file('normalize_test.dart', bytes((1 << 20) - 1)),
        file('relative_test.dart', bytes(100)),
        file('split_test.dart', bytes(1)),
        file('all_test.dart', bytes(100)),
        file('path_posix_test.dart', bytes(100)),
        file('path_windows_test.dart', bytes(100)),
      ]),
      file('.gitignore', bytes(100)),
      file('README.md', bytes(100)),
      dir('lib', [
        file('path.dart', bytes(100)),
      ]),
    ]).create();
    final files = Package.load(
      path(appPath),
      loadPubspec:
          Pubspec.loadRootWithSources((name) => throw UnimplementedError()),
    ).listFiles();
    ctx.expectNextSection(
      tree.fromFiles(files, baseDir: path(appPath), showFileSizes: true),
    );
  });
  test('tree.fromMap empty map', () {
    expect(tree.fromMap({}), equals(''));
  });

  testWithGolden('tree.fromMap a complex example', colors: true, (ctx) {
    final map = {
      '.gitignore': <String, Map>{},
      'README.md': <String, Map>{},
      'TODO': <String, Map>{},
      'example': {
        'console_example.dart': <String, Map>{},
        'main.dart': <String, Map>{},
        'web copy': {'web_example.dart': <String, Map>{}},
      },
      'lib': {'path.dart': <String, Map>{}},
      'pubspec.yaml': <String, Map>{},
      'test': {
        'absolute_test.dart': <String, Map>{},
        'basename_test.dart': <String, Map>{},
        'dirname_test.dart': <String, Map>{},
        'extension_test.dart': <String, Map>{},
        'is_absolute_test.dart': <String, Map>{},
        'is_relative_test.dart': <String, Map>{},
        'join_test.dart': <String, Map>{},
        'normalize_test.dart': <String, Map>{},
        'relative_test.dart': <String, Map>{},
        'split_test.dart': <String, Map>{},
      },
    };

    ctx.expectNextSection(tree.fromMap(map, startingAtTop: false));
  });
}
