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

@TestOn('vm')
library;

import 'dart:io';

import 'package:pub/src/exit_codes.dart' as exit_codes;
import 'package:pub/src/exit_codes.dart';
import 'package:pub/src/path.dart';
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: ['--no-example']);
        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...
Downloading packages...
Got dependencies!
Resolving dependencies in `$dotExample`...
Downloading packages...
Got dependencies in `$dotExample`.'''
                  : '''
Resolving dependencies... 
Downloading packages...
No dependencies changed.
Resolving dependencies in `$dotExample`...
Downloading packages...
Got dependencies in `$dotExample`.''',
        );
        expect(lockFile.existsSync(), true);
        expect(exampleLockFile.existsSync(), true);
      },
    );

    test('Failures are not summarized', () 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(
          'Error on line 1, column 9 of example${p.separator}pubspec.yaml',
        ),
        exitCode: DATA,
      );
      await pubGet(
        args: ['--directory', dotExample],
        error: contains(
          'Error on line 1, column 9 of example${p.separator}pubspec.yaml',
        ),
        exitCode: exit_codes.DATA,
      );
    });
  });
}
