// Copyright (c) 2016, 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 '../descriptor.dart' as d;
import '../golden_file.dart';
import '../test_pub.dart';

const _validMain = 'main() {}';
const _invalidMain = 'main() {';

extension on GoldenTestContext {
  Future<void> runExecutablesTest() async {
    await pubGet();

    await tree();

    await run(['deps', '--executables']);
    await run(['deps', '--executables', '--dev']);
    await run(['deps', '--json']);
  }
}

void main() {
  testWithGolden('skips non-Dart executables', (ctx) async {
    await d.dir(appPath, [
      d.appPubspec(),
      d.dir('bin', [d.file('foo.py'), d.file('bar.sh')])
    ]).create();

    await ctx.runExecutablesTest();
  });

  testWithGolden('lists Dart executables, without entrypoints', (ctx) async {
    await d.dir(appPath, [
      d.appPubspec(),
      d.dir(
        'bin',
        [d.file('foo.dart', _validMain), d.file('bar.dart', _invalidMain)],
      )
    ]).create();

    await ctx.runExecutablesTest();
  });

  testWithGolden('skips executables in sub directories', (ctx) async {
    await d.dir(appPath, [
      d.appPubspec(),
      d.dir('bin', [
        d.file('foo.dart', _validMain),
        d.dir('sub', [d.file('bar.dart', _validMain)])
      ])
    ]).create();

    await ctx.runExecutablesTest();
  });

  testWithGolden('lists executables from a dependency', (ctx) async {
    await d.dir('foo', [
      d.libPubspec('foo', '1.0.0'),
      d.dir('bin', [d.file('bar.dart', _validMain)])
    ]).create();

    await d.dir(appPath, [
      d.appPubspec(dependencies: {
        'foo': {'path': '../foo'}
      })
    ]).create();

    await ctx.runExecutablesTest();
  });

  testWithGolden('lists executables only from immediate dependencies',
      (ctx) async {
    await d.dir(appPath, [
      d.appPubspec(dependencies: {
        'foo': {'path': '../foo'}
      })
    ]).create();

    await d.dir('foo', [
      d.libPubspec('foo', '1.0.0', deps: {
        'baz': {'path': '../baz'}
      }),
      d.dir('bin', [d.file('bar.dart', _validMain)])
    ]).create();

    await d.dir('baz', [
      d.libPubspec('baz', '1.0.0'),
      d.dir('bin', [d.file('qux.dart', _validMain)])
    ]).create();

    await ctx.runExecutablesTest();
  });

  testWithGolden('applies formatting before printing executables', (ctx) async {
    await d.dir(appPath, [
      d.appPubspec(dependencies: {
        'foo': {'path': '../foo'},
        'bar': {'path': '../bar'}
      }),
      d.dir('bin', [d.file('myapp.dart', _validMain)])
    ]).create();

    await d.dir('foo', [
      d.libPubspec('foo', '1.0.0'),
      d.dir('bin',
          [d.file('baz.dart', _validMain), d.file('foo.dart', _validMain)])
    ]).create();

    await d.dir('bar', [
      d.libPubspec('bar', '1.0.0'),
      d.dir('bin', [d.file('qux.dart', _validMain)])
    ]).create();

    await ctx.runExecutablesTest();
  });

  testWithGolden('dev dependencies', (ctx) async {
    await d.dir('foo', [
      d.libPubspec('foo', '1.0.0'),
      d.dir('bin', [d.file('bar.dart', _validMain)])
    ]).create();

    await d.dir(appPath, [
      d.pubspec({
        'name': 'myapp',
        'dev_dependencies': {
          'foo': {'path': '../foo'}
        }
      })
    ]).create();

    await ctx.runExecutablesTest();
  });

  testWithGolden('overriden dependencies executables', (ctx) async {
    await d.dir('foo-1.0', [
      d.libPubspec('foo', '1.0.0'),
      d.dir('bin', [d.file('bar.dart', _validMain)])
    ]).create();

    await d.dir('foo-2.0', [
      d.libPubspec('foo', '2.0.0'),
      d.dir('bin',
          [d.file('bar.dart', _validMain), d.file('baz.dart', _validMain)])
    ]).create();

    await d.dir(appPath, [
      d.pubspec({
        'name': 'myapp',
        'dependencies': {
          'foo': {'path': '../foo-1.0'}
        },
        'dependency_overrides': {
          'foo': {'path': '../foo-2.0'}
        }
      })
    ]).create();

    await ctx.runExecutablesTest();
  });
}
