// 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.

// @dart=2.10

import 'package:test/test.dart';

import '../descriptor.dart' as d;
import '../test_pub.dart';

Future<void> expectValidation(error, int exitCode) async {
  await runPub(
    error: error,
    args: ['publish', '--dry-run'],
    environment: {'_PUB_TEST_SDK_VERSION': '2.12.0'},
    workingDirectory: d.path(appPath),
    exitCode: exitCode,
  );
}

Future<void> setup({
  String flutterConstraint,
}) async {
  final fakeFlutterRoot =
      d.dir('fake_flutter_root', [d.file('version', '1.23.0')]);
  await fakeFlutterRoot.create();
  await d.validPackage.create();
  await d.dir(appPath, [
    d.pubspec({
      'name': 'test_pkg',
      'description':
          'A just long enough decription to fit the requirement of 60 characters',
      'homepage': 'https://example.com/',
      'version': '1.0.0',
      'environment': {
        'sdk': '>=2.9.0 <3.0.0',
        if (flutterConstraint != null) 'flutter': flutterConstraint
      },
    }),
  ]).create();
  await pubGet(environment: {
    '_PUB_TEST_SDK_VERSION': '2.12.0',
    'FLUTTER_ROOT': fakeFlutterRoot.io.path
  });
}

void main() {
  test('No warning with no flutter constraint', () async {
    await setup();
    await expectValidation(contains('Package has 0 warnings.'), 0);
  });
  test('No warning with no flutter upper bound', () async {
    await setup(flutterConstraint: '>=1.20.0');
    await expectValidation(contains('Package has 0 warnings.'), 0);
  });
  test('Warn when upper bound', () async {
    await setup(flutterConstraint: '>=1.20.0 <=2.0.0');
    await expectValidation(
        allOf([
          contains(
              'You can replace that with just the lower bound: `>=1.20.0`.'),
          contains('Package has 1 warning.'),
        ]),
        65);
  });
  test('Warn when only upper bound', () async {
    await setup(flutterConstraint: '<2.0.0');
    await expectValidation(
        allOf([
          contains('You can replace the constraint with `any`.'),
          contains('Package has 1 warning.'),
        ]),
        65);
  });
}
