private FeatureTestRun RunTestWithDependencyHandling(ICollection <FeatureTestRun> runs, MethodInfo test, Type adapterType, MethodInfo[] allTests)
        {
            var run = runs.SingleOrDefault(r => r.Method == test && r.AdapterType == adapterType);

            if (run != null) // already run as a dependency?
            {
                return(run);
            }

            var dependencies = test.GetCustomAttributes <DependsOnFeatureAttribute>();
            var requiredRuns = new List <FeatureTestRun>();

            foreach (var dependency in dependencies)
            {
                var dependencyDeclaringType = dependency.DeclaringType ?? test.DeclaringType;
                var requiredTest            = allTests.SingleOrDefault(t => t.Name == dependency.MethodName && t.DeclaringType == dependencyDeclaringType);
                if (requiredTest == null)
                {
                    throw new InvalidOperationException(string.Format("Could not find test '{0}' in type '{1}' (referenced by [FeatureDependsOn]).", dependency.MethodName, dependencyDeclaringType.Name));
                }

                var requiredRun = this.RunTestWithDependencyHandling(runs, requiredTest, adapterType, allTests);
                requiredRuns.Add(requiredRun);
            }

            run = new FeatureTestRun(test, adapterType, this.RunTestAsync(test, adapterType, requiredRuns));
            runs.Add(run);

            return(run);
        }
        private FeatureTestRun RunTestWithDependencyHandling(ICollection<FeatureTestRun> runs, MethodInfo test, Type adapterType, MethodInfo[] allTests) {
            var run = runs.SingleOrDefault(r => r.Method == test && r.AdapterType == adapterType);
            if (run != null) // already run as a dependency?
                return run;
            
            var dependencies = test.GetCustomAttributes<DependsOnFeatureAttribute>();
            var requiredRuns = new List<FeatureTestRun>();
            foreach (var dependency in dependencies) {
                var dependencyDeclaringType = dependency.DeclaringType ?? test.DeclaringType;
                var requiredTest = allTests.SingleOrDefault(t => t.Name == dependency.MethodName && t.DeclaringType == dependencyDeclaringType);
                if (requiredTest == null)
                    throw new InvalidOperationException(string.Format("Could not find test '{0}' in type '{1}' (referenced by [FeatureDependsOn]).", dependency.MethodName, dependencyDeclaringType.Name));

                var requiredRun = this.RunTestWithDependencyHandling(runs, requiredTest, adapterType, allTests);
                requiredRuns.Add(requiredRun);
            }

            run = new FeatureTestRun(test, adapterType, this.RunTestAsync(test, adapterType, requiredRuns));
            runs.Add(run);

            return run;
        }