// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// @dart = 2.8

import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/build_system/build_system.dart';
import 'package:flutter_tools/src/build_system/exceptions.dart';
import 'package:flutter_tools/src/globals.dart' as globals;

import '../../src/common.dart';

void main() {
  test('Exceptions', () {
    final MissingInputException missingInputException = MissingInputException(
        <File>[globals.fs.file('foo'), globals.fs.file('bar')], 'example');
    final CycleException cycleException = CycleException(<Target>{
      TestTarget()..name = 'foo',
      TestTarget()..name = 'bar',
    });
    final InvalidPatternException invalidPatternException = InvalidPatternException(
      'ABC'
    );
    final MissingOutputException missingOutputException = MissingOutputException(
      <File>[ globals.fs.file('foo'), globals.fs.file('bar') ],
      'example',
    );
    final MisplacedOutputException misplacedOutputException = MisplacedOutputException(
      'foo',
      'example',
    );
    final MissingDefineException missingDefineException = MissingDefineException(
      'foobar',
      'example',
    );

    expect(
        missingInputException.toString(),
        'foo, bar were declared as an inputs, '
        'but did not exist. Check the definition of target:example for errors');
    expect(
        cycleException.toString(),
        'Dependency cycle detected in build: foo -> bar',
    );
    expect(
        invalidPatternException.toString(),
        'The pattern "ABC" is not valid',
    );
    expect(
        missingOutputException.toString(),
        'foo, bar were declared as outputs, but were not generated by the '
        'action. Check the definition of target:example for errors',
    );
    expect(
        misplacedOutputException.toString(),
        'Target example produced an output at foo which is outside of the '
        'current build or project directory',
    );
    expect(
        missingDefineException.toString(),
        'Target example required define foobar but it was not provided',
    );
  });
}

class TestTarget extends Target {
  TestTarget([this._build]);

  final Future<void> Function(Environment environment) _build;

  @override
  Future<void> build(Environment environment) => _build(environment);

  @override
  List<Target> dependencies = <Target>[];

  @override
  List<Source> inputs = <Source>[];

  @override
  String name = 'test';

  @override
  List<Source> outputs = <Source>[];
}
