// 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 '../descriptor.dart' as d;
import '../golden_file.dart';
import '../test_pub.dart';

void main() {
  testWithGolden(
      'pub upgrade --major-versions does not update major versions in example/',
      (ctx) async {
    await servePackages((b) => b
      ..serve('foo', '1.0.0')
      ..serve('foo', '2.0.0')
      ..serve('bar', '1.0.0')
      ..serve('bar', '2.0.0'));
    await d.dir(appPath, [
      d.pubspec({
        'name': 'myapp',
        'dev_dependencies': {'bar': '^1.0.0'}
      }),
      d.dir('example', [
        d.pubspec({
          'name': 'app_example',
          'dependencies': {
            'bar': 'any',
            'foo': '^1.0.0',
            'myapp': {'path': '..'}
          }
        })
      ])
    ]).create();

    await ctx.run(['upgrade', '--major-versions', '--example']);
    await ctx.run(['upgrade', '--major-versions', '--directory', 'example']);
  });

  testWithGolden(
      'pub upgrade --null-safety does not update null-safety of dependencies in example/',
      (ctx) async {
    await servePackages((b) => b
      ..serve('foo', '1.0.0', pubspec: {
        'environment': {'sdk': '>=2.7.0 <3.0.0'},
      })
      ..serve('foo', '2.0.0', pubspec: {
        'environment': {'sdk': '>=2.12.0 <3.0.0'},
      })
      ..serve('bar', '1.0.0', pubspec: {
        'environment': {'sdk': '>=2.7.0 <3.0.0'},
      })
      ..serve('bar', '2.0.0', pubspec: {
        'environment': {'sdk': '>=2.12.0 <3.0.0'},
      }));
    await d.dir(appPath, [
      d.pubspec({
        'name': 'myapp',
        'dev_dependencies': {'bar': '^1.0.0'},
        'environment': {'sdk': '>=2.12.0 <3.0.0'},
      }),
      d.dir('example', [
        d.pubspec({
          'name': 'app_example',
          'environment': {'sdk': '>=2.12.0 <3.0.0'},
          'dependencies': {
            'foo': '^1.0.0',
            // This will make the implicit upgrade of the example folder fail:
            'bar': '^1.0.0',
            'myapp': {'path': '..'}
          }
        })
      ])
    ]).create();

    await ctx.run(
      ['upgrade', '--null-safety', '--example'],
      environment: {'_PUB_TEST_SDK_VERSION': '2.13.0'},
    );

    await ctx.run(
      ['upgrade', '--null-safety', '--directory', 'example'],
      environment: {'_PUB_TEST_SDK_VERSION': '2.13.0'},
    );
  });
}
