// Copyright (c) 2012, 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.

library check_sdk_test;

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

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

main() {
  initConfig();

  for (var command in ["install", "update"]) {
    var success = new RegExp(r"Dependencies installed!$");
    if (command == "update") {
      success = new RegExp(r"Dependencies updated!$");
    }

    integration("gives a friendly message if there are no constraints", () {
      d.dir(appPath, [
        d.pubspec({"name": "myapp"}),
      ]).create();

      schedulePub(args: [command], output: success);
    });

    integration("gives an error if the root package does not match", () {
      d.dir(appPath, [
        d.pubspec({
          "name": "myapp",
          "environment": {"sdk": ">2.0.0"}
        })
      ]).create();

      schedulePub(args: [command],
          error:
            """
            Some packages that were installed are not compatible with your SDK version 0.1.2+3 and may not work:
            - 'myapp' requires >2.0.0

            You may be able to resolve this by upgrading to the latest Dart SDK
            or adding a version constraint to use an older version of a package.
            """);
    });

    integration("gives an error if some dependencies do not match", () {
      // Using a path source, but this should be true of all sources.
      d.dir("foo", [
        d.libPubspec("foo", "0.0.1", sdk: ">0.1.3"),
        d.libDir("foo")
      ]).create();
      d.dir("bar", [
        d.libPubspec("bar", "0.0.1", sdk: ">0.1.1"),
        d.libDir("bar")
      ]).create();

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

      schedulePub(args: [command],
          error:
            """
            Some packages that were installed are not compatible with your SDK version 0.1.2+3 and may not work:
            - 'myapp' requires >2.0.0
            - 'foo' requires >0.1.3

            You may be able to resolve this by upgrading to the latest Dart SDK
            or adding a version constraint to use an older version of a package.
            """);
    });

    integration("gives an error if a transitive dependency doesn't match", () {
      // Using a path source, but this should be true of all sources.
      d.dir("foo", [
        d.libPubspec("foo", "0.0.1", deps: [
          {"path": "../bar"}
        ]),
        d.libDir("foo")
      ]).create();
      d.dir("bar", [
        d.libPubspec("bar", "0.0.1", sdk: "<0.1.1"),
        d.libDir("bar")
      ]).create();

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

      schedulePub(args: [command],
          error:
            """
            Some packages that were installed are not compatible with your SDK version 0.1.2+3 and may not work:
            - 'bar' requires <0.1.1

            You may be able to resolve this by upgrading to the latest Dart SDK
            or adding a version constraint to use an older version of a package.
            """);
    });

    integration("handles a circular dependency on the root package", () {
      // Using a path source, but this should be true of all sources.
      d.dir("foo", [
        d.libPubspec("foo", "0.0.1", sdk: ">3.0.0", deps: [
          {"path": "../myapp"}
        ]),
        d.libDir("foo")
      ]).create();

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

      schedulePub(args: [command],
          error:
            """
            Some packages that were installed are not compatible with your SDK version 0.1.2+3 and may not work:
            - 'myapp' requires >2.0.0
            - 'foo' requires >3.0.0

            You may be able to resolve this by upgrading to the latest Dart SDK
            or adding a version constraint to use an older version of a package.
            """);
    });
  }
}
