SelectTestFrameworksForCodeElementsImpl( IEnumerable <ComponentHandle <ITestFramework, TestFrameworkTraits> > filteredTestFrameworkHandlesWithoutFallback, TestFrameworkFallbackMode testFrameworkFallbackMode, TestFrameworkOptions testFrameworkOptions, IEnumerable <ICodeElementInfo> codeElements) { var selections = new Dictionary <object, TestFrameworkSelection>(); var partitions = new MultiMap <TestFrameworkSelection, ICodeElementInfo>(); foreach (var codeElement in codeElements) { IAssemblyInfo assembly = ReflectionUtils.GetAssembly(codeElement); if (assembly != null) { IList <AssemblyName> assemblyReferences = assembly.GetReferencedAssemblies(); bool supported = false; foreach (var testFrameworkHandle in filteredTestFrameworkHandlesWithoutFallback) { if (testFrameworkHandle.GetTraits().IsFrameworkCompatibleWithAssemblyReferences(assemblyReferences)) { TestFrameworkSelection selection = GetOrCreateSelectionIfAbsent( selections, testFrameworkHandle, () => new TestFrameworkSelection(testFrameworkHandle, testFrameworkOptions, false)); partitions.Add(selection, codeElement); supported = true; } } if (!supported) { TestFrameworkSelection selection = GetFallbackSelection(selections, assemblyReferences, filteredTestFrameworkHandlesWithoutFallback, testFrameworkOptions, testFrameworkFallbackMode); if (selection != null) { partitions.Add(selection, codeElement); } } } } return(partitions); }
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); }
SelectTestFrameworksForFilesImpl( IEnumerable <ComponentHandle <ITestFramework, TestFrameworkTraits> > filteredTestFrameworkHandlesWithoutFallback, TestFrameworkFallbackMode testFrameworkFallbackMode, TestFrameworkOptions testFrameworkOptions, IEnumerable <FileInfo> files) { var selections = new Dictionary <object, TestFrameworkSelection>(); var partitions = new MultiMap <TestFrameworkSelection, FileInfo>(); foreach (var file in files) { try { bool supported = false; IList <AssemblyName> assemblyReferences = null; using (var fileInspector = new LazyFileInspector(file)) { FileType fileType = fileTypeManager.IdentifyFileType(fileInspector); foreach (var testFrameworkHandle in filteredTestFrameworkHandlesWithoutFallback) { TestFrameworkTraits traits = testFrameworkHandle.GetTraits(); if (!traits.IsFrameworkCompatibleWithFileType(fileType, fileTypeManager)) { continue; } // If the file is an assembly, then filter further by assembly references. if (fileType.IsSameOrSubtypeOf(fileTypeManager.GetFileTypeById("Assembly"))) { if (assemblyReferences == null) { assemblyReferences = GetAssemblyReferences(fileInspector); } if (!traits.IsFrameworkCompatibleWithAssemblyReferences(assemblyReferences)) { continue; } } TestFrameworkSelection selection = GetOrCreateSelectionIfAbsent( selections, testFrameworkHandle, () => new TestFrameworkSelection(testFrameworkHandle, testFrameworkOptions, false)); partitions.Add(selection, file); supported = true; } } if (!supported) { TestFrameworkSelection selection = GetFallbackSelection(selections, assemblyReferences, filteredTestFrameworkHandlesWithoutFallback, testFrameworkOptions, testFrameworkFallbackMode); if (selection != null) { partitions.Add(selection, file); } } } catch (IOException exception) { logger.Log(LogSeverity.Error, string.Format("Skipping file '{0}' due to IO error.", file.FullName), exception); } catch (UnauthorizedAccessException exception) { logger.Log(LogSeverity.Error, string.Format("Skipping file '{0}' due to security error", file.FullName), exception); } } return(partitions); }