// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS d.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 d.file.

library pub_tests;

import 'dart:io';

import '../../../../pkg/scheduled_test/lib/scheduled_test.dart';

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

main() {
  initConfig();

  group('requires', () {
    integration('a pubspec', () {
      d.dir(appPath, []).create();

      schedulePub(args: ['install'],
          error: new RegExp(r'^Could not find a file named "pubspec\.yaml"'),
          exitCode: 1);
    });

    integration('a pubspec with a "name" key', () {
      d.dir(appPath, [
        d.pubspec({"dependencies": {"foo": null}})
      ]).create();

      schedulePub(args: ['install'],
          error: new RegExp(r'^pubspec.yaml is missing the required "name" '
              r'field \(e\.g\. "name: myapp"\)\.'),
          exitCode: 1);
    });
  });

  integration('adds itself to the packages', () {
    // The symlink should use the name in the pubspec, not the name of the
    // directory.
    d.dir(appPath, [
      d.pubspec({"name": "myapp_name"}),
      d.libDir('foo'),
    ]).create();

    schedulePub(args: ['install'],
        output: new RegExp(r"Dependencies installed!$"));

    d.dir(packagesPath, [
      d.dir("myapp_name", [
        d.file('foo.dart', 'main() => "foo";')
      ])
    ]).validate();
  });

  integration('does not adds itself to the packages if it has no "lib" directory', () {
    // The symlink should use the name in the pubspec, not the name of the
    // directory.
    d.dir(appPath, [
      d.pubspec({"name": "myapp_name"}),
    ]).create();

    schedulePub(args: ['install'],
        output: new RegExp(r"Dependencies installed!$"));

    d.dir(packagesPath, [
      d.nothing("myapp_name")
    ]).validate();
  });

  integration('does not add a package if it does not have a "lib" directory', () {
    // Using a path source, but this should be true of all sources.
    d.dir('foo', [
      d.libPubspec('foo', '0.0.0-not.used')
    ]).create();

    d.dir(appPath, [
      d.pubspec({"name": "myapp", "dependencies": {"foo": {"path": "../foo"}}})
    ]).create();

    schedulePub(args: ['install'],
        error: new RegExp(r'Warning: Package "foo" does not have a "lib" '
            'directory so you will not be able to import any libraries from '
            'it.'),
        output: new RegExp(r"Dependencies installed!$"));
  });

  integration('does not warn if the root package lacks a "lib" directory', () {
    d.dir(appPath, [
      d.appPubspec([])
    ]).create();

    schedulePub(args: ['install'],
        error: new RegExp(r'^\s*$'),
        output: new RegExp(r"Dependencies installed!$"));
  });

  integration('overwrites the existing packages directory', () {
    d.dir(appPath, [
      d.appPubspec([]),
      d.dir('packages', [
        d.dir('foo'),
        d.dir('myapp'),
      ]),
      d.libDir('myapp')
    ]).create();

    schedulePub(args: ['install'],
        output: new RegExp(r"Dependencies installed!$"));

    d.dir(packagesPath, [
      d.nothing('foo'),
      d.dir('myapp', [d.file('myapp.dart', 'main() => "myapp";')])
    ]).validate();
  });

  group('creates a packages directory in', () {
    integration('"test/" and its subdirectories', () {
      d.dir(appPath, [
        d.appPubspec([]),
        d.libDir('foo'),
        d.dir("test", [d.dir("subtest")])
      ]).create();

      schedulePub(args: ['install'],
          output: new RegExp(r"Dependencies installed!$"));

      d.dir(appPath, [
        d.dir("test", [
          d.dir("packages", [
            d.dir("myapp", [
              d.file('foo.dart', 'main() => "foo";')
            ])
          ]),
          d.dir("subtest", [
            d.dir("packages", [
              d.dir("myapp", [
                d.file('foo.dart', 'main() => "foo";')
              ])
            ])
          ])
        ])
      ]).validate();
    });

    integration('"example/" and its subdirectories', () {
      d.dir(appPath, [
        d.appPubspec([]),
        d.libDir('foo'),
        d.dir("example", [d.dir("subexample")])
      ]).create();

      schedulePub(args: ['install'],
          output: new RegExp(r"Dependencies installed!$"));

      d.dir(appPath, [
        d.dir("example", [
          d.dir("packages", [
            d.dir("myapp", [
              d.file('foo.dart', 'main() => "foo";')
            ])
          ]),
          d.dir("subexample", [
            d.dir("packages", [
              d.dir("myapp", [
                d.file('foo.dart', 'main() => "foo";')
              ])
            ])
          ])
        ])
      ]).validate();
    });

    integration('"tool/" and its subdirectories', () {
      d.dir(appPath, [
        d.appPubspec([]),
        d.libDir('foo'),
        d.dir("tool", [d.dir("subtool")])
      ]).create();

      schedulePub(args: ['install'],
          output: new RegExp(r"Dependencies installed!$"));

      d.dir(appPath, [
        d.dir("tool", [
          d.dir("packages", [
            d.dir("myapp", [
              d.file('foo.dart', 'main() => "foo";')
            ])
          ]),
          d.dir("subtool", [
            d.dir("packages", [
              d.dir("myapp", [
                d.file('foo.dart', 'main() => "foo";')
              ])
            ])
          ])
        ])
      ]).validate();
    });

    integration('"web/" and its subdirectories', () {
      d.dir(appPath, [
        d.appPubspec([]),
        d.libDir('foo'),
        d.dir("web", [d.dir("subweb")])
      ]).create();

      schedulePub(args: ['install'],
          output: new RegExp(r"Dependencies installed!$"));

      d.dir(appPath, [
        d.dir("web", [
          d.dir("packages", [
            d.dir("myapp", [
              d.file('foo.dart', 'main() => "foo";')
            ])
          ]),
          d.dir("subweb", [
            d.dir("packages", [
              d.dir("myapp", [
                d.file('foo.dart', 'main() => "foo";')
              ])
            ])
          ])
        ])
      ]).validate();
    });

    integration('"bin/"', () {
      d.dir(appPath, [
        d.appPubspec([]),
        d.libDir('foo'),
        d.dir("bin")
      ]).create();

      schedulePub(args: ['install'],
          output: new RegExp(r"Dependencies installed!$"));

      d.dir(appPath, [
        d.dir("bin", [
          d.dir("packages", [
            d.dir("myapp", [
              d.file('foo.dart', 'main() => "foo";')
            ])
          ])
        ])
      ]).validate();
    });
  });
}
