// 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 'package:pub/src/exit_codes.dart' as exit_codes;
import 'package:test/test.dart';

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

void main() {
  test('pub get fails with a non-identifier name', () async {
    await d.dir(appPath, [
      d.pubspec({'name': 'invalid package name', 'version': '1.0.0'})
    ]).create();

    await pubGet(
        error: contains('"name" field must be a valid Dart identifier.'),
        exitCode: exit_codes.DATA);

    await d.dir(appPath, [
      // The lockfile should not be created.
      d.nothing('pubspec.lock'),
      // The "packages" directory should not have been generated.
      d.nothing('packages'),
      // The ".packages" file should not have been created.
      d.nothing('.packages'),
    ]).validate();
  });

  test('pub get fails with a reserved word name', () async {
    await d.dir(appPath, [
      d.pubspec({'name': 'return', 'version': '1.0.0'})
    ]).create();

    await pubGet(
        error: contains('"name" field may not be a Dart reserved word.'),
        exitCode: exit_codes.DATA);

    await d.dir(appPath, [
      // The lockfile should not be created.
      d.nothing('pubspec.lock'),
      // The "packages" directory should not have been generated.
      d.nothing('packages'),
      // The ".packages" file should not have been created.
      d.nothing('.packages'),
    ]).validate();
  });

  test('pub get allows a name with dotted identifiers', () async {
    await d.dir(appPath, [
      d.pubspec({'name': 'foo.bar.baz', 'version': '1.0.0'}),
      d.libDir('foo.bar.baz', 'foo.bar.baz 1.0.0')
    ]).create();

    await pubGet();

    await d.dir(appPath, [
      d.packageConfigFile(
          [d.packageConfigEntry(name: 'foo.bar.baz', path: '.')])
    ]).validate();
  });
}
