// 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 pubspec_test;

import 'package:unittest/unittest.dart';

import '../lib/src/pubspec.dart';
import '../lib/src/source.dart';
import '../lib/src/source_registry.dart';
import '../lib/src/version.dart';
import 'test_pub.dart';

class MockSource extends Source {
  final String name = "mock";
  final bool shouldCache = false;
  dynamic parseDescription(String filePath, description,
                           {bool fromLockFile: false}) {
    if (description != 'ok') throw new FormatException('Bad');
    return description;
  }
  String packageName(description) => 'foo';
}

main() {
  initConfig();
  group('parse()', () {
    var sources = new SourceRegistry();
    sources.register(new MockSource());

    expectFormatError(String pubspec) {
      expect(() => new Pubspec.parse(null, pubspec, sources),
          throwsFormatException);
    }

    test("allows a version constraint for dependencies", () {
      var pubspec = new Pubspec.parse(null, '''
dependencies:
  foo:
    mock: ok
    version: ">=1.2.3 <3.4.5"
''', sources);

      var foo = pubspec.dependencies[0];
      expect(foo.name, equals('foo'));
      expect(foo.constraint.allows(new Version(1, 2, 3)), isTrue);
      expect(foo.constraint.allows(new Version(1, 2, 5)), isTrue);
      expect(foo.constraint.allows(new Version(3, 4, 5)), isFalse);
    });

    test("allows an empty dependencies map", () {
      var pubspec = new Pubspec.parse(null, '''
dependencies:
''', sources);

      expect(pubspec.dependencies, isEmpty);
    });

    test("allows a version constraint for dev dependencies", () {
      var pubspec = new Pubspec.parse(null, '''
dev_dependencies:
  foo:
    mock: ok
    version: ">=1.2.3 <3.4.5"
''', sources);

      var foo = pubspec.devDependencies[0];
      expect(foo.name, equals('foo'));
      expect(foo.constraint.allows(new Version(1, 2, 3)), isTrue);
      expect(foo.constraint.allows(new Version(1, 2, 5)), isTrue);
      expect(foo.constraint.allows(new Version(3, 4, 5)), isFalse);
    });

    test("allows an empty dev dependencies map", () {
      var pubspec = new Pubspec.parse(null, '''
dev_dependencies:
''', sources);

      expect(pubspec.devDependencies, isEmpty);
    });

    test("allows an unknown source", () {
      var pubspec = new Pubspec.parse(null, '''
dependencies:
  foo:
    unknown: blah
''', sources);

      var foo = pubspec.dependencies[0];
      expect(foo.name, equals('foo'));
      expect(foo.source, equals('unknown'));
    });

    test("throws if a package is in dependencies and dev_dependencies", () {
      expectFormatError('''
dependencies:
  foo:
    mock: ok
dev_dependencies:
  foo:
    mock: ok
''');
    });

    test("throws if it dependes on itself", () {
      expectFormatError('''
name: myapp
dependencies:
  myapp:
    mock: ok
''');
    });

    test("throws if it has a dev dependency on itself", () {
      expectFormatError('''
name: myapp
dev_dependencies:
  myapp:
    mock: ok
''');
    });

    test("throws if the description isn't valid", () {
      expectFormatError('''
dependencies:
  foo:
    mock: bad
''');
    });

    test("throws if dependency version is not a string", () {
      expectFormatError('''
dependencies:
  foo:
    mock: ok
    version: 1.2
''');
    });

    test("throws if version is not a version constraint", () {
      expectFormatError('''
dependencies:
  foo:
    mock: ok
    version: not constraint
''');
    });

    test("throws if 'name' is not a string", () {
      expectFormatError('name: [not, a, string]');
    });

    test("throws if version is not a string", () {
      expectFormatError('''
version: 1.0
''');
    });

    test("throws if version is not a version", () {
      expectFormatError('''
version: not version
''');
    });

    test("throws if 'homepage' is not a string", () {
      expectFormatError('homepage:');
      expectFormatError('homepage: [not, a, string]');
    });

    test("throws if 'homepage' doesn't have an HTTP scheme", () {
      new Pubspec.parse(null, 'homepage: http://ok.com', sources);
      new Pubspec.parse(null, 'homepage: https://also-ok.com', sources);

      expectFormatError('homepage: ftp://badscheme.com');
      expectFormatError('homepage: javascript:alert("!!!")');
      expectFormatError('homepage: data:image/png;base64,somedata');
      expectFormatError('homepage: no-scheme.com');
    });

    test("throws if 'documentation' is not a string", () {
      expectFormatError('documentation:');
      expectFormatError('documentation: [not, a, string]');
    });

    test("throws if 'documentation' doesn't have an HTTP scheme", () {
      new Pubspec.parse(null, 'documentation: http://ok.com', sources);
      new Pubspec.parse(null, 'documentation: https://also-ok.com', sources);

      expectFormatError('documentation: ftp://badscheme.com');
      expectFormatError('documentation: javascript:alert("!!!")');
      expectFormatError('documentation: data:image/png;base64,somedata');
      expectFormatError('documentation: no-scheme.com');
    });

    test("throws if 'authors' is not a string or a list of strings", () {
      new Pubspec.parse(null, 'authors: ok fine', sources);
      new Pubspec.parse(null, 'authors: [also, ok, fine]', sources);

      expectFormatError('authors: 123');
      expectFormatError('authors: {not: {a: string}}');
      expectFormatError('authors: [ok, {not: ok}]');
    });

    test("throws if 'author' is not a string", () {
      new Pubspec.parse(null, 'author: ok fine', sources);

      expectFormatError('author: 123');
      expectFormatError('author: {not: {a: string}}');
      expectFormatError('author: [not, ok]');
    });

    test("throws if both 'author' and 'authors' are present", () {
      expectFormatError('{author: abe, authors: ted}');
    });

    test("throws if a transformer isn't a string or map", () {
      expectFormatError('{transformers: 12}');
      expectFormatError('{transformers: [12]}');
    });

    test("throws if a transformer's configuration isn't a map", () {
      expectFormatError('{transformers: {pkg: 12}}');
    });

    test("allows comment-only files", () {
      var pubspec = new Pubspec.parse(null, '''
# No external dependencies yet
# Including for completeness
# ...and hoping the spec expands to include details about author, version, etc
# See http://www.dartlang.org/docs/pub-package-manager/ for details
''', sources);
      expect(pubspec.version, equals(Version.none));
      expect(pubspec.dependencies, isEmpty);
    });

    group("environment", () {
      test("defaults to any SDK constraint if environment is omitted", () {
        var pubspec = new Pubspec.parse(null, '', sources);
        expect(pubspec.environment.sdkVersion, equals(VersionConstraint.any));
      });

      test("allows an empty environment map", () {
        var pubspec = new Pubspec.parse(null, '''
environment:
''', sources);
        expect(pubspec.environment.sdkVersion, equals(VersionConstraint.any));
      });

      test("throws if the environment value isn't a map", () {
        expectFormatError('''
environment: []
''');
      });

      test("allows a version constraint for the sdk", () {
        var pubspec = new Pubspec.parse(null, '''
environment:
  sdk: ">=1.2.3 <2.3.4"
''', sources);
        expect(pubspec.environment.sdkVersion,
            equals(new VersionConstraint.parse(">=1.2.3 <2.3.4")));
      });

      test("throws if the sdk isn't a string", () {
        expectFormatError('''
environment:
  sdk: []
''');
      });

    test("throws if the sdk is not a string", () {
      expectFormatError('''
environment:
  sdk: 1.0
''');
    });

      test("throws if the sdk isn't a valid version constraint", () {
        expectFormatError('''
environment:
  sdk: "oopies"
''');
      });
    });
  });
}
