protected override IList <TestPart> GetTestPartsImpl(IReflectionPolicy reflectionPolicy, ICodeElementInfo codeElement) { bool copied = false; IList <TestPart> combinedTestParts = null; ForEachDriver(testFrameworkManager.SelectTestFrameworksForCodeElementsImpl( testFrameworkHandles, testFrameworkFallbackMode, testFrameworkOptions, new[] { codeElement }), (driver, items, driverCount) => { IList <TestPart> testParts = driver.GetTestParts(reflectionPolicy, codeElement); if (testParts.Count != 0) { if (combinedTestParts == null) { combinedTestParts = testParts; } else { if (!copied) { combinedTestParts = new List <TestPart>(combinedTestParts); copied = true; } GenericCollectionUtils.AddAll(testParts, combinedTestParts); } } return(false); }); return(combinedTestParts ?? EmptyArray <TestPart> .Instance); }
private bool ForEachDriver <T>(MultiMap <TestFrameworkSelection, T> testFrameworkPartitions, Func <ITestDriver, IList <T>, int, bool> func) where T : class { var testDriverPartitions = new Dictionary <TestDriverFactory, TestDriverData <T> >(); foreach (var testFrameworkPartition in testFrameworkPartitions) { if (testFrameworkPartition.Value.Count != 0) { TestFrameworkSelection testFrameworkSelection = testFrameworkPartition.Key; ComponentHandle <ITestFramework, TestFrameworkTraits> testFrameworkHandle = testFrameworkSelection.TestFrameworkHandle; TestDriverFactory testDriverFactory = testFrameworkHandle.GetComponent().GetTestDriverFactory(); TestDriverData <T> testDriverData; if (!testDriverPartitions.TryGetValue(testDriverFactory, out testDriverData)) { testDriverData = new TestDriverData <T>(testFrameworkSelection.TestFrameworkOptions); testDriverPartitions.Add(testDriverFactory, testDriverData); } else { testDriverData.ItemIndex = new HashSet <T>(ReferentialEqualityComparer <T> .Instance); GenericCollectionUtils.AddAll(testDriverData.Items, testDriverData.ItemIndex); } testDriverData.TestFrameworkHandles.Add(testFrameworkHandle); foreach (var item in testFrameworkPartition.Value) { if (testDriverData.ItemIndex == null) { testDriverData.Items.Add(item); } else if (!testDriverData.ItemIndex.Contains(item)) { testDriverData.Items.Add(item); testDriverData.ItemIndex.Add(item); } } } } int testDriverCount = testDriverPartitions.Count; foreach (var testDriverPartition in testDriverPartitions) { TestDriverFactory testDriverFactory = testDriverPartition.Key; TestDriverData <T> testDriverData = testDriverPartition.Value; try { ITestDriver driver = testDriverFactory(testDriverData.TestFrameworkHandles, testDriverData.TestFrameworkOptions, logger); if (func(driver, testDriverData.Items, testDriverCount)) { return(true); } } catch (Exception ex) { //UnhandledExceptionPolicy.Report("An unhandled exception occurred while invoking a test driver.", ex); throw new ModelException("An exception occurred while invoking a test driver.", ex); } } return(false); }