// Copyright (c) 2023, 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:path/path.dart' as p;
import 'package:test/test.dart';

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

void main() {
  test('Gives hint when solve failure concerns a pinned flutter package',
      () async {
    await d.dir('flutter', [
      d.dir('packages', [
        d.dir(
          'flutter_foo',
          [
            d.libPubspec('flutter_foo', '0.0.1', deps: {'tool': '1.0.0'}),
          ],
        ),
      ]),
      d.flutterVersion('1.2.3'),
    ]).create();
    await servePackages()
      ..serve('bar', '1.0.0', deps: {'tool': '^2.0.0'})
      ..serve('tool', '1.0.0')
      ..serve('tool', '2.0.0');

    await d.appDir(
      dependencies: {
        'bar': 'any',
        'flutter_foo': {'sdk': 'flutter'},
      },
    ).create();
    await pubGet(
      environment: {'FLUTTER_ROOT': p.join(d.sandbox, 'flutter')},
      error: contains(
        'Note: tool is pinned to version 1.0.0 by '
        'flutter_foo from the flutter SDK.',
      ),
    );
  });

  test('Gives hint when solve failure concerns a pinned flutter package',
      () async {
    await d.dir('flutter', [
      d.dir('packages', [
        d.dir(
          'flutter_foo',
          [
            d.libPubspec('flutter_foo', '0.0.1', deps: {'tool': '1.0.0'}),
          ],
        ),
      ]),
      d.flutterVersion('1.2.3'),
    ]).create();
    await servePackages()
      ..serve('tool', '1.0.0', deps: {'bar': '^2.0.0'})
      ..serve('bar', '1.0.0');

    await d.appDir(
      dependencies: {
        'bar': 'any',
        'flutter_foo': {'sdk': 'flutter'},
      },
    ).create();
    await pubGet(
      environment: {'FLUTTER_ROOT': p.join(d.sandbox, 'flutter')},
      error: contains(
        'Note: tool is pinned to version 1.0.0 by '
        'flutter_foo from the flutter SDK.',
      ),
    );
  });
}
