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);
        }