// Copyright (c) 2018, 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_semver/pub_semver.dart';
import 'package:test/test.dart';

import 'test_utils.dart';

void main() {
  test('minimal set values', () {
    var value = parse({'name': 'sample'});
    expect(value.name, 'sample');
    expect(value.version, isNull);
    expect(value.description, isNull);
    expect(value.homepage, isNull);
    // ignore: deprecated_member_use
    expect(value.author, isNull);
    expect(value.authors, isEmpty);
    expect(value.environment, isEmpty);
    expect(value.documentation, isNull);
    expect(value.dependencies, isEmpty);
    expect(value.devDependencies, isEmpty);
    expect(value.dependencyOverrides, isEmpty);
  });

  test('all fields set', () {
    var version = new Version.parse('1.2.3');
    var sdkConstraint = new VersionConstraint.parse('>=2.0.0-dev.54 <3.0.0');
    var value = parse({
      'name': 'sample',
      'version': version.toString(),
      'author': 'name@example.com',
      'environment': {'sdk': sdkConstraint.toString()},
      'description': 'description',
      'homepage': 'homepage',
      'documentation': 'documentation'
    });
    expect(value.name, 'sample');
    expect(value.version, version);
    expect(value.description, 'description');
    expect(value.homepage, 'homepage');
    // ignore: deprecated_member_use
    expect(value.author, 'name@example.com');
    expect(value.authors, ['name@example.com']);
    expect(value.environment, hasLength(1));
    expect(value.environment, containsPair('sdk', sdkConstraint));
    expect(value.documentation, 'documentation');
    expect(value.dependencies, isEmpty);
    expect(value.devDependencies, isEmpty);
    expect(value.dependencyOverrides, isEmpty);
  });

  test('environment values can be null', () {
    var value = parse({
      'name': 'sample',
      'environment': {'sdk': null}
    });
    expect(value.name, 'sample');
    expect(value.environment, hasLength(1));
    expect(value.environment, containsPair('sdk', isNull));
  });

  group('author, authors', () {
    test('one author', () {
      var value = parse({'name': 'sample', 'author': 'name@example.com'});
      // ignore: deprecated_member_use
      expect(value.author, 'name@example.com');
      expect(value.authors, ['name@example.com']);
    });

    test('one author, via authors', () {
      var value = parse({
        'name': 'sample',
        'authors': ['name@example.com']
      });
      // ignore: deprecated_member_use
      expect(value.author, 'name@example.com');
      expect(value.authors, ['name@example.com']);
    });

    test('many authors', () {
      var value = parse({
        'name': 'sample',
        'authors': ['name@example.com', 'name2@example.com']
      });
      // ignore: deprecated_member_use
      expect(value.author, isNull);
      expect(value.authors, ['name@example.com', 'name2@example.com']);
    });

    test('author and authors', () {
      var value = parse({
        'name': 'sample',
        'author': 'name@example.com',
        'authors': ['name2@example.com']
      });
      // ignore: deprecated_member_use
      expect(value.author, isNull);
      expect(value.authors, ['name@example.com', 'name2@example.com']);
    });

    test('duplicate author values', () {
      var value = parse({
        'name': 'sample',
        'author': 'name@example.com',
        'authors': ['name@example.com', 'name@example.com']
      });
      // ignore: deprecated_member_use
      expect(value.author, 'name@example.com');
      expect(value.authors, ['name@example.com']);
    });
  });

  group('invalid', () {
    test('null', () {
      expect(() => parse(null), throwsArgumentError);
    });
    test('empty string', () {
      expect(() => parse(''), throwsArgumentError);
    });
    test('array', () {
      expectParseThrows([], r'''
line 1, column 1: Does not represent a YAML map.
[]
^^''');
    });

    test('missing name', () {
      expectParseThrows({}, r'''
line 1, column 1: "name" cannot be empty.
{}
^^''');
    });

    test('"dart" is an invalid environment key', () {
      expectParseThrows({
        'name': 'sample',
        'environment': {'dart': 'cool'}
      }, r'''
line 4, column 3: Use "sdk" to for Dart SDK constraints.
  "dart": "cool"
  ^^^^^^''');
    });

    test('environment values cannot be int', () {
      expectParseThrows({
        'name': 'sample',
        'environment': {'sdk': 42}
      }, r'''
line 4, column 10: `42` is not a String.
  "sdk": 42
         ^^^''');
    });

    test('version', () {
      expectParseThrows({'name': 'sample', 'version': 'invalid'}, r'''
line 3, column 13: Could not parse "invalid".
 "version": "invalid"
            ^^^^^^^^^''');
    });

    test('invalid environment value', () {
      expectParseThrows({
        'name': 'sample',
        'environment': {'sdk': 'silly'}
      }, r'''
line 4, column 10: Could not parse version "silly". Unknown text at "silly".
  "sdk": "silly"
         ^^^^^^^''');
    });
  });
}
