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

import 'package:pub/src/validator.dart';
import 'package:pub/src/validator/relative_version_numbering.dart';
import 'package:test/test.dart';

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

Validator validator() => RelativeVersionNumberingValidator();

Future<void> setup({required String sdkConstraint}) async {
  await d.validPackage().create();
  await d.dir(appPath, [
    d.pubspec({
      'name': 'test_pkg',
      'version': '1.0.0',
      'environment': {'sdk': sdkConstraint},
    }),
  ]).create();

  await pubGet(environment: {'_PUB_TEST_SDK_VERSION': '2.12.0'});
}

void main() {
  test('Hints about not publishing latest', () async {
    final server = await servePackages();
    server.serve(
      'test_pkg',
      '2.0.2',
    );
    await d.validPackage().create();

    await expectValidationHint('''
The latest published version is 2.0.2.
  Your version 1.0.0 is earlier than that.
''');
  });

  test('Hints incrementing more than needed', () async {
    final server = await servePackages();
    server.serve(
      'test_pkg',
      '1.0.2',
    );

    const notIncrementalHintText = '''
* The previous version is 1.0.2.
  
  It seems you are not publishing an incremental update.
  
  Consider one of:
  * 2.0.0 for a breaking release.
  * 1.1.0 for a minor release.
  * 1.0.3 for a patch release.
''';

    await d.validPackage(version: '1.0.4').create();
    await expectValidationHint(notIncrementalHintText);
    await d.validPackage(version: '1.3.0').create();
    await expectValidationHint(notIncrementalHintText);
    await d.validPackage(version: '1.1.1').create();
    await expectValidationHint(notIncrementalHintText);
  });

  test('Hints incrementing more than needed after a prerelease', () async {
    final server = await servePackages();
    server.serve(
      'test_pkg',
      '1.0.2-pre',
    );

    const notIncrementalHintText = '''
* The previous version is 1.0.2-pre.
  
  It seems you are not publishing an incremental update.
  
  Consider one of:
  * 2.0.0 for a breaking release.
  * 1.1.0 for a minor release.
  * 1.0.2 for a patch release.
''';

    await d.validPackage(version: '1.0.4').create();
    await expectValidationHint(notIncrementalHintText);
    await d.validPackage(version: '1.3.0').create();
    await expectValidationHint(notIncrementalHintText);
    await d.validPackage(version: '1.1.1').create();
    await expectValidationHint(notIncrementalHintText);
  });

  test('Hints incrementing more than after pre 1.0', () async {
    final server = await servePackages();
    server.serve(
      'test_pkg',
      '0.0.1',
    );

    const notIncrementalHintText = '''
* The previous version is 0.0.1.
  
  It seems you are not publishing an incremental update.
  
  Consider one of:
  * 1.0.0 for a first major release.
  * 0.1.0 for a breaking release.
  * 0.0.2 for a minor release.
''';

    await d.validPackage(version: '0.0.3').create();
    await expectValidationHint(notIncrementalHintText);
    await d.validPackage(version: '0.1.1').create();
    await expectValidationHint(notIncrementalHintText);
    await d.validPackage(version: '1.0.1').create();
    await expectValidationHint(notIncrementalHintText);
  });

  test('Releasing a prerelease of incremental version causes no hint',
      () async {
    final server = await servePackages();
    server.serve(
      'test_pkg',
      '1.0.0',
    );
    await d.validPackage(version: '1.0.1-dev').create();
    await expectValidation();
    await d.validPackage(version: '1.1.0-dev').create();
    await expectValidation();
    await d.validPackage(version: '2.0.0-dev').create();
    await expectValidation();
  });

  test('Releasing the prereleased version causes no hint', () async {
    final server = await servePackages();
    server.serve(
      'test_pkg',
      '1.0.0-dev',
    );
    await d.validPackage().create();
    await expectValidation();
  });

  test('Releasing a build-release causes no hint', () async {
    final server = await servePackages();
    server.serve(
      'test_pkg',
      '1.0.0',
    );
    await d.validPackage(version: '1.0.0+0').create();
    await expectValidation();
  });

  group('should consider a package valid if it', () {
    test('is opting in to null-safety with previous null-safe version',
        () async {
      final server = await servePackages();
      server.serve(
        'test_pkg',
        '0.0.1',
        pubspec: {
          'environment': {'sdk': '>=2.12.0<3.0.0'},
        },
      );

      await setup(sdkConstraint: '>=2.12.0 <3.0.0');
      await expectValidationDeprecated(validator);
    });

    test(
        'is opting in to null-safety using a pre-release of 2.12.0 '
        'with previous null-safe version', () async {
      final server = await servePackages();
      server.serve(
        'test_pkg',
        '0.0.1',
        pubspec: {
          'environment': {'sdk': '>=2.12.0<3.0.0'},
        },
      );

      await setup(sdkConstraint: '>=2.12.0-dev <3.0.0');
      await expectValidationDeprecated(validator);
    });

    test(
        'is opting in to null-safety with previous null-safe version. '
        'Even with a later non-null-safe version', () async {
      await servePackages()
        ..serve(
          'test_pkg',
          '0.0.1',
          pubspec: {
            'environment': {'sdk': '>=2.12.0<3.0.0'},
          },
        )
        ..serve(
          'test_pkg',
          '2.0.1',
          pubspec: {
            'environment': {'sdk': '>=2.9.0<3.0.0'},
          },
        );

      await setup(sdkConstraint: '>=2.12.0 <3.0.0');
      await expectValidationDeprecated(
        validator,
        hints: [
          // Nothing about null-safety
          '''
The latest published version is 2.0.1.
Your version 1.0.0 is earlier than that.'''
        ],
      );
    });

    test('is opting in to null-safety with no existing versions', () async {
      await setup(sdkConstraint: '>=2.12.0 <3.0.0');
      await servePackages();
      await expectValidationDeprecated(validator);
    });

    test(
        'opts in to null-safety, with previous stable version not-null-safe. '
        'With an in-between non-null-safe prerelease', () async {
      await servePackages()
        ..serve(
          'test_pkg',
          '0.0.1',
          pubspec: {
            'environment': {'sdk': '>=2.9.0<3.0.0'},
          },
        )
        ..serve(
          'test_pkg',
          '0.0.2-dev',
          pubspec: {
            'environment': {'sdk': '>=2.12.0<3.0.0'},
          },
        );

      await setup(sdkConstraint: '>=2.12.0 <3.0.0');
      await expectValidationDeprecated(validator);
    });
  });

  group('should warn if ', () {
    test('opts in to null-safety, with previous version not-null-safe',
        () async {
      final server = await servePackages();
      server.serve(
        'test_pkg',
        '0.0.1',
        pubspec: {
          'environment': {'sdk': '>=2.9.0<3.0.0'},
        },
      );

      await setup(sdkConstraint: '>=2.12.0 <3.0.0');
      await expectValidationDeprecated(
        validator,
        hints: [
          '''
You're about to publish a package that opts into null safety.
The previous version (0.0.1) isn't opted in.
See https://dart.dev/null-safety/migration-guide for best practices.'''
        ],
      );
    });

    test(
        'opts in to null-safety, with previous version not-null-safe. '
        'Even with a later null-safe version', () async {
      await servePackages()
        ..serve(
          'test_pkg',
          '0.0.1',
          pubspec: {
            'environment': {'sdk': '>=2.9.0<3.0.0'},
          },
        )
        ..serve(
          'test_pkg',
          '2.0.0',
          pubspec: {
            'environment': {'sdk': '>=2.12.0<3.0.0'},
          },
        );

      await setup(sdkConstraint: '>=2.12.0 <3.0.0');
      await expectValidationDeprecated(
        validator,
        hints: [
          '''
The latest published version is 2.0.0.
Your version 1.0.0 is earlier than that.''',
          '''
You're about to publish a package that opts into null safety.
The previous version (0.0.1) isn't opted in.
See https://dart.dev/null-safety/migration-guide for best practices.'''
        ],
      );
    });

    test(
        'is opting in to null-safety with previous null-safe stable version. '
        'with an in-between non-null-safe prerelease', () async {
      await servePackages()
        ..serve(
          'test_pkg',
          '0.0.1',
          pubspec: {
            'environment': {'sdk': '>=2.12.0<3.0.0'},
          },
        )
        ..serve(
          'test_pkg',
          '0.0.2-dev',
          pubspec: {
            'environment': {'sdk': '>=2.9.0<3.0.0'},
          },
        );

      await setup(sdkConstraint: '>=2.12.0 <3.0.0');
      await expectValidationDeprecated(
        validator,
        hints: [
          '''
You're about to publish a package that opts into null safety.
The previous version (0.0.2-dev) isn't opted in.
See https://dart.dev/null-safety/migration-guide for best practices.'''
        ],
      );
    });

    test(
        'is opting in to null-safety with no existing stable versions. '
        'With a previous non-null-safe prerelease', () async {
      await setup(sdkConstraint: '>=2.12.0 <3.0.0');
      final server = await servePackages();
      server.serve(
        'test_pkg',
        '0.0.2-dev',
        pubspec: {
          'environment': {'sdk': '>=2.9.0<3.0.0'},
        },
      );
      await expectValidationDeprecated(
        validator,
        hints: [
          '''
You're about to publish a package that opts into null safety.
The previous version (0.0.2-dev) isn't opted in.
See https://dart.dev/null-safety/migration-guide for best practices.'''
        ],
      );
    });
  });
}
