// 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({
        'foo': {'path': '../foo'}
      })
    ]).create();

    await ctx.runExecutablesTest();
  });

  testWithGolden('lists executables only from immediate dependencies',
      (ctx) async {
    await d.dir(appPath, [
      d.appPubspec({
        '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({
        '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();
  });
}
