public void If_the_task_graph_resolver_throws_a_exception_it_should_add_a_error_message()
        {
            var validator = CreateInstance<CheckForCircularDependencies>();
            var tasks = new[]
            {
                new RegisteredTask(typeof(ExampleTask0))
            };

            A.CallTo(() => Fake<ITaskGraphResolver>().Resolve(tasks[0])).Throws(new CircularTaskDependencyDetectedException(tasks[0], tasks[0]));
            var result = validator.Validate(tasks);

            CollectionAssert.IsNotEmpty(result);
        }
        public void If_all_dependencies_are_registered_no_error_message_should_be_generated()
        {
            var validator = new CheckForUnregisteredDependencies();

            var tasks = new[]
            {
                new RegisteredTask(typeof (ExampleTask1)) {DependsOn = new[] {nameof(ExampleTask2)}},
                new RegisteredTask(typeof (ExampleTask2))
            };

            var errors = validator.Validate(tasks);

            Assert.IsEmpty(errors);
        }
        public void If_a_task_depends_on_an_unregistered_task_it_should_generate_a_error_message()
        {
            var validator = new CheckForUnregisteredDependencies();

            var tasks = new[]
            {
                new RegisteredTask(typeof (ExampleTask1)) {DependsOn = new[] {nameof (ExampleTask2)}}
            };

            var errors = validator.Validate(tasks);

            Assert.IsNotEmpty(errors);
            Assert.IsTrue(errors[0].Contains($"\"{nameof(ExampleTask1)}\"") && errors[0].Contains($"\"{nameof(ExampleTask2)}\""));
        }
        public void Every_task_should_be_resolved_by_the_task_graph_resolver()
        {
            var validator = CreateInstance<CheckForCircularDependencies>();

            var tasks = new[]
            {
                new RegisteredTask(typeof(ExampleTask0)), 
                new RegisteredTask(typeof(ExampleTask1))
            };
            validator.Validate(tasks);

            A.CallTo(() => Fake<ITaskGraphResolver>().Resolve(tasks[0])).MustHaveHappened();
            A.CallTo(() => Fake<ITaskGraphResolver>().Resolve(tasks[1])).MustHaveHappened();
        }
        public void If_two_default_tasks_are_given_an_error_message_should_be_generated()
        {
            var validator = new CheckForDefaultTask();
            var tasks = new[]
            {
                new RegisteredTask(typeof(ExampleTask0)) {IsDefault = true},
                new RegisteredTask(typeof(ExampleTask1)) {IsDefault = true}

            };

            var erros = validator.Validate(tasks);

            Assert.IsNotEmpty(erros);
        }
        public void If_a_circular_dependency_was_detected_it_should_raise_a_exception()
        {
            var tasks = new[]
            {
                new RegisteredTask(typeof (ExampleTask1)) {DependsOn = new[] {nameof(ExampleTask2)}},
                new RegisteredTask(typeof (ExampleTask2)) {DependsOn = new[] {nameof(ExampleTask3)}},
                new RegisteredTask(typeof (ExampleTask3)) {DependsOn = new[] {nameof(ExampleTask4)}},
                new RegisteredTask(typeof (ExampleTask4)) {DependsOn = new[] {nameof(ExampleTask1)}}
            };

            var registration = A.Fake<ITaskRegistration>();
            A.CallTo(() => registration.Tasks).Returns(tasks);
            var resolver = new TaskGraphResolver(registration);

            var taskToResolve = tasks[0];

            Assert.Throws<CircularTaskDependencyDetectedException>(() => resolver.Resolve(taskToResolve));
        }
        public void It_should_resolve_the_dependency_graph()
        {
            var tasks = new[]
            {
                new RegisteredTask(typeof (ExampleTask1)) { DependsOn = new[] {nameof(ExampleTask2), nameof(ExampleTask3)} },
                new RegisteredTask(typeof (ExampleTask2)) {DependsOn = new[] {nameof(ExampleTask4)}},
                new RegisteredTask(typeof (ExampleTask3)) {DependsOn = new[] {nameof(ExampleTask4)}},
                new RegisteredTask(typeof (ExampleTask4))
            };

            var registration = A.Fake<ITaskRegistration>();
            A.CallTo(() => registration.Tasks).Returns(tasks);
            var resolver = new TaskGraphResolver(registration);

            var taskToResolve = tasks[0];
            var result = resolver.Resolve(taskToResolve);
            
            CollectionAssert.AreEqual(new[] {tasks[3], tasks[1], tasks[2], tasks[0]}, result);
        }