// Copyright (c) 2014, 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/validator.dart';
import 'package:pub/src/validator/sdk_constraint.dart';
import 'package:test/test.dart';

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

Validator sdkConstraint() => SdkConstraintValidator();

void main() {
  group('should consider a package valid if it', () {
    test('has no SDK constraint', () async {
      await d.validPackage().create();
      await expectValidationDeprecated(sdkConstraint);
    });

    test('has an SDK constraint without ^', () async {
      await d.dir(
        appPath,
        [d.libPubspec('test_pkg', '1.0.0', sdk: '>=1.8.0 <2.0.0')],
      ).create();
      await expectValidationDeprecated(sdkConstraint);
    });

    test('has an SDK constraint with ^', () async {
      await d.dir(
        appPath,
        [d.libPubspec('test_pkg', '1.0.0', sdk: '^1.8.0')],
      ).create();
      await expectValidationDeprecated(sdkConstraint);
    });

    test('depends on a pre-release Dart SDK from a pre-release', () async {
      await d.dir(appPath, [
        d.libPubspec('test_pkg', '1.0.0-dev.1', sdk: '>=1.8.0-dev.1 <2.0.0')
      ]).create();
      await expectValidationDeprecated(sdkConstraint);
    });

    test(
        'has a Flutter SDK constraint with an appropriate Dart SDK '
        'constraint', () async {
      await d.dir(appPath, [
        d.pubspec({
          'name': 'test_pkg',
          'version': '1.0.0',
          'environment': {'sdk': '>=1.19.0 <2.0.0', 'flutter': '^1.2.3'}
        })
      ]).create();
      await expectValidationDeprecated(sdkConstraint);
    });

    test(
        'has a Fuchsia SDK constraint with an appropriate Dart SDK '
        'constraint', () async {
      await d.dir(appPath, [
        d.pubspec({
          'name': 'test_pkg',
          'version': '1.0.0-dev.1',
          'environment': {'sdk': '>=2.0.0-dev.51.0 <2.0.0', 'fuchsia': '^1.2.3'}
        })
      ]).create();
      await expectValidationDeprecated(sdkConstraint);
    });
  });

  group('should consider a package invalid if it', () {
    test('has no upper bound SDK constraint', () async {
      await d.dir(
        appPath,
        [d.libPubspec('test_pkg', '1.0.0', sdk: '>=1.8.0')],
      ).create();
      await expectValidationDeprecated(
        sdkConstraint,
        errors: anyElement(contains('should have an upper bound constraint')),
      );
    });

    test('has no SDK constraint', () async {
      await d.dir(appPath, [
        d.rawPubspec({
          'name': 'test_pkg',
          'version': '1.0.0',
        }),
      ]).create();
      await expectValidationDeprecated(
        sdkConstraint,
        errors: anyElement(contains('should have an upper bound constraint')),
      );
    });

    test('depends on a pre-release sdk from a non-pre-release', () async {
      await d.dir(appPath, [
        d.libPubspec('test_pkg', '1.0.0', sdk: '>=1.8.0-dev.1 <2.0.0')
      ]).create();
      await expectValidationDeprecated(
        sdkConstraint,
        warnings: anyElement(
          contains(
            'consider publishing the package as a pre-release instead',
          ),
        ),
      );
    });

    test(
        'Gives a hint if package has a <3.0.0 constraint that is interpreted as <4.0.0',
        () async {
      await d.dir(appPath, [
        d.rawPubspec({
          'name': 'test_pkg',
          'version': '1.0.0',
          'environment': {'sdk': '^2.19.0'}
        })
      ]).create();
      await expectValidationDeprecated(
        sdkConstraint,
        hints: anyElement(
          '''
The declared SDK constraint is '^2.19.0', this is interpreted as '>=2.19.0 <4.0.0'.

Consider updating the SDK constraint to:

environment:
  sdk: '>=2.19.0 <4.0.0'
''',
        ),
      );
    });
  });
}
