// Copyright (c) 2020, 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.

/// A set of integration tests for `dart migrate`.
import 'package:test/test.dart';

import '../utils.dart';

void main() {
  group('migrate', defineMigrateTests, timeout: longTimeout);
}

void defineMigrateTests() {
  final runPubGet = contains('Run `dart pub get`');
  final setLowerSdkConstraint = contains('Set the lower SDK constraint');

  TestProject p;

  tearDown(() async => await p?.dispose());

  test('--help', () async {
    p = project();
    var result = await p.run(['migrate', '--help']);

    expect(result.exitCode, 0);
    expect(result.stderr, isEmpty);
    expect(
      result.stdout,
      contains('Perform null safety migration on a project.'),
    );
    expect(
      result.stdout,
      contains('Usage: dart migrate [arguments] [project or directory]'),
    );
  });

  test('--help --verbose', () async {
    p = project();
    var result = await p.run(['migrate', '--help', '--verbose']);

    expect(result.exitCode, 0);
    expect(result.stderr, isEmpty);
    expect(
      result.stdout,
      contains('Perform null safety migration on a project.'),
    );
    expect(
      result.stdout,
      contains(
        'Usage: dart [vm-options] migrate [arguments] [project or directory]',
      ),
    );
  });

  test('directory implicit', () async {
    p = project(mainSrc: dartVersionFilePrefix2_9 + 'int get foo => 1;\n');
    var result =
        await p.run(['migrate', '--no-web-preview'], workingDir: p.dirPath);
    expect(result.exitCode, 0);
    expect(result.stderr, isEmpty);
    expect(result.stdout, contains('Generating migration suggestions'));
  });

  test('directory explicit', () async {
    p = project(mainSrc: dartVersionFilePrefix2_9 + 'int get foo => 1;\n');
    var result = await p.run(['migrate', '--no-web-preview', p.dirPath]);
    expect(result.exitCode, 0);
    expect(result.stderr, isEmpty);
    expect(result.stdout, contains('Generating migration suggestions'));
  });

  test('bad directory', () async {
    p = project(mainSrc: 'int get foo => 1;\n');
    var result = await p.run(['migrate', 'foo_bar_dir']);
    expect(result.exitCode, 1);
    expect(result.stderr, contains('foo_bar_dir does not exist'));
    expect(result.stdout, isEmpty);
  });

  test('pub get needs running', () async {
    p = project(mainSrc: 'import "package:foo/foo.dart";\n');
    var result = await p.run(['migrate', p.dirPath]);
    expect(result.exitCode, 1);
    expect(result.stderr, isEmpty);
    expect(result.stdout, runPubGet);
    expect(result.stdout, isNot(setLowerSdkConstraint));
  });

  test('non-pub-related error', () async {
    p = project(mainSrc: 'var missing = "semicolon"\n');
    var result = await p.run(['migrate', p.dirPath]);
    expect(result.exitCode, 1);
    expect(result.stderr, isEmpty);
    expect(result.stdout, runPubGet);
    expect(result.stdout, setLowerSdkConstraint);
  });
}
