// 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.

@TestOn('vm')
import 'package:path/path.dart' as p;
import 'package:test_core/src/runner/configuration.dart';
import 'package:test/test.dart';
import 'package:test_descriptor/test_descriptor.dart' as d;

void main() {
  test('should merge with a base configuration', () async {
    await d.dir('repo', [
      d.file('dart_test_base.yaml', 'filename: "test_*.dart"'),
      d.dir('pkg', [
        d.file('dart_test.yaml', '''
          include: ../dart_test_base.yaml
          concurrency: 3
        '''),
      ]),
    ]).create();

    var path = p.join(d.sandbox, 'repo', 'pkg', 'dart_test.yaml');
    var config = Configuration.load(path);
    expect(config.filename.pattern, equals('test_*.dart'));
    expect(config.concurrency, equals(3));
  });

  test('should merge fields with a base configuration', () async {
    await d.dir('repo', [
      d.file('dart_test_base.yaml', '''
        tags:
          hello:
      '''),
      d.dir('pkg', [
        d.file('dart_test.yaml', '''
          include: ../dart_test_base.yaml
          tags:
            world:
        '''),
      ]),
    ]).create();

    var path = p.join(d.sandbox, 'repo', 'pkg', 'dart_test.yaml');
    var config = Configuration.load(path);
    expect(config.knownTags, unorderedEquals(['hello', 'world']));
  });

  test('should allow an included file to include a file', () async {
    await d.dir('repo', [
      d.file('dart_test_base_base.yaml', '''
        tags:
          tag:
      '''),
      d.file('dart_test_base.yaml', '''
        include: dart_test_base_base.yaml
        filename: "test_*.dart"
      '''),
      d.dir('pkg', [
        d.file('dart_test.yaml', '''
          include: ../dart_test_base.yaml
          concurrency: 3
        '''),
      ]),
    ]).create();

    var path = p.join(d.sandbox, 'repo', 'pkg', 'dart_test.yaml');
    var config = Configuration.load(path);
    expect(config.knownTags, ['tag']);
    expect(config.filename.pattern, 'test_*.dart');
    expect(config.concurrency, 3);
  });

  test('should not allow an include field in a test config context', () async {
    await d.dir('repo', [
      d.dir('pkg', [
        d.file('dart_test.yaml', r'''
          tags:
            foo:
              include: ../dart_test.yaml
        '''),
      ]),
    ]).create();

    var path = p.join(d.sandbox, 'repo', 'pkg', 'dart_test.yaml');
    expect(
        () => Configuration.load(path),
        throwsA(allOf(
            isFormatException,
            predicate((error) =>
                error.toString().contains("include isn't supported here")))));
  });

  test('should allow an include field in a runner config context', () async {
    await d.dir('repo', [
      d.dir('pkg', [
        d.file('dart_test.yaml', '''
          presets:
            bar:
              include: other_dart_test.yaml
              pause_after_load: true
        '''),
        d.file('other_dart_test.yaml', 'reporter: expanded'),
      ]),
    ]).create();

    var path = p.join(d.sandbox, 'repo', 'pkg', 'dart_test.yaml');
    var config = Configuration.load(path);
    var presetBar = config.presets['bar'];
    expect(presetBar.pauseAfterLoad, isTrue);
    expect(presetBar.reporter, 'expanded');
  });

  test('local configuration should take precedence after merging', () async {
    await d.dir('repo', [
      d.dir('pkg', [
        d.file('dart_test.yaml', '''
          include: other_dart_test.yaml
          concurrency: 5
        '''),
        d.file('other_dart_test.yaml', 'concurrency: 10'),
      ]),
    ]).create();

    var path = p.join(d.sandbox, 'repo', 'pkg', 'dart_test.yaml');
    var config = Configuration.load(path);
    expect(config.concurrency, 5);
  });

  group('gracefully handles', () {
    test('a non-string include field', () async {
      await d.dir('repo', [
        d.dir('pkg', [
          d.file('dart_test.yaml', 'include: 3'),
        ]),
      ]).create();

      var path = p.join(d.sandbox, 'repo', 'pkg', 'dart_test.yaml');
      expect(() => Configuration.load(path), throwsFormatException);
    });

    test('a non-existent included file', () async {
      await d.dir('repo', [
        d.dir('pkg', [
          d.file('dart_test.yaml', 'include: other_test.yaml'),
        ]),
      ]).create();

      var path = p.join(d.sandbox, 'repo', 'pkg', 'dart_test.yaml');
      expect(() => Configuration.load(path), throwsFormatException);
    });

    test('an include field in a test config context', () async {
      await d.dir('repo', [
        d.dir('pkg', [
          d.file('dart_test.yaml', '''
            tags:
              foo:
                include: ../dart_test.yaml
          '''),
        ]),
      ]).create();

      var path = p.join(d.sandbox, 'repo', 'pkg', 'dart_test.yaml');
      expect(() => Configuration.load(path), throwsFormatException);
    });
  });
}
