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

import 'package:path/path.dart' as p;
import 'package:pub/src/exit_codes.dart' as exit_codes;
import 'package:test/test.dart';

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

final dotExample = p.join('.', 'example');

void main() {
  forBothPubGetAndUpgrade((command) {
    test(
        'pub ${command.name} --example also retrieves dependencies in example/',
        () async {
      await d.dir(appPath, [
        d.appPubspec(),
        d.dir('example', [
          d.pubspec({
            'name': 'app_example',
            'dependencies': {
              'myapp': {'path': '..'}
            }
          })
        ])
      ]).create();

      await pubCommand(command, args: []);
      final lockFile = File(p.join(d.sandbox, appPath, 'pubspec.lock'));
      final exampleLockFile = File(
        p.join(d.sandbox, appPath, 'example', 'pubspec.lock'),
      );

      expect(lockFile.existsSync(), true);
      expect(exampleLockFile.existsSync(), false);
      await pubCommand(
        command,
        args: ['--example'],
        output: command.name == 'get'
            ? '''
Resolving dependencies... 
Got dependencies!
Resolving dependencies in $dotExample...
Got dependencies in $dotExample.'''
            : '''
Resolving dependencies... 
No dependencies changed.
Resolving dependencies in $dotExample...
Got dependencies in $dotExample.''',
      );
      expect(lockFile.existsSync(), true);
      expect(exampleLockFile.existsSync(), true);
    });

    test('Failures are met with a suggested command', () async {
      await d.dir(appPath, [
        d.appPubspec(),
        d.dir('example', [
          d.pubspec({
            'name': 'broken name',
            'dependencies': {
              'myapp': {'path': '..'}
            }
          })
        ])
      ]).create();
      await pubGet(
        args: ['--example'],
        error: contains(
          'Resolving dependencies in $dotExample failed. For details run `dart pub get --directory $dotExample`',
        ),
        exitCode: 1,
      );
      await pubGet(
        args: ['--directory', dotExample],
        error: contains(
          'Error on line 1, column 9 of example${p.separator}pubspec.yaml',
        ),
        exitCode: exit_codes.DATA,
      );
    });
  });
}
