// 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:test/test.dart';

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

void main() {
  test('warns if resolution is mixed mode', () async {
    await servePackages(
      (builder) => builder.serve(
        'foo',
        '1.2.3',
        pubspec: {
          'environment': {
            'sdk': '>=2.9.0 <3.0.0',
          }
        },
      ),
    );

    await d.dir(appPath, [
      d.pubspec({
        'name': 'my_app',
        'environment': {
          'sdk': '>=2.12.0 <3.0.0',
        },
        'dependencies': {'foo': 'any'}
      })
    ]).create();

    await pubGet(
        warning: contains(
            'The package resolution is not fully migrated to null-safety.\n\n'
            'package:foo is not opted into null safety in its pubspec.yaml:'),
        environment: {'_PUB_TEST_SDK_VERSION': '2.12.0'});
  });

  test('warns if resolution is mixed mode, single file opt out in dependency',
      () async {
    await servePackages(
      (builder) => builder.serve(
        'foo',
        '1.2.3',
        pubspec: {
          'environment': {
            'sdk': '>=2.12.0 <3.0.0',
          }
        },
        contents: [
          d.dir('lib', [d.file('foo.dart', '// @dart = 2.9')])
        ],
      ),
    );

    await d.dir(appPath, [
      d.pubspec({
        'name': 'my_app',
        'environment': {
          'sdk': '>=2.12.0 <3.0.0',
        },
        'dependencies': {'foo': 'any'}
      })
    ]).create();

    await pubGet(
        warning: contains(
            'The package resolution is not fully migrated to null-safety.\n\n'
            'package:foo/foo.dart is opting out of null safety:'),
        environment: {'_PUB_TEST_SDK_VERSION': '2.12.0'});
  });

  test('warns if resolution is mixed mode, single file opt out in main package',
      () async {
    await d.dir(appPath, [
      d.pubspec({
        'name': 'my_app',
        'environment': {
          'sdk': '>=2.12.0 <3.0.0',
        },
      }),
      d.dir('lib', [d.file('foo.dart', '// @dart = 2.9')])
    ]).create();

    await pubGet(
        warning: contains(
            'The package resolution is not fully migrated to null-safety.\n\n'
            'package:my_app/foo.dart is opting out of null safety:'),
        environment: {'_PUB_TEST_SDK_VERSION': '2.12.0'});
  });

  test('No warning if main package is not opted in', () async {
    await servePackages(
      (builder) => builder.serve(
        'foo',
        '1.2.3',
        pubspec: {
          'environment': {
            'sdk': '>=2.12.0 <3.0.0',
          }
        },
        contents: [
          d.dir('lib', [d.file('foo.dart', '// @dart = 2.9')])
        ],
      ),
    );

    await d.dir(appPath, [
      d.pubspec({
        'name': 'my_app',
        'environment': {
          'sdk': '>=2.9.0 <3.0.0',
        },
        'dependencies': {'foo': 'any'}
      })
    ]).create();

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