private void MapGallioTestCases(IEnumerable <TestData> gallioTestCases, TestFrameworkLogger logger, ITestCaseDiscoverySink discoverySink)
        {
            foreach (var gallioTestCase in gallioTestCases)
            {
                CreateTestCase(gallioTestCase, discoverySink, logger);

                if (gallioTestCase.Children.Count > 0)
                {
                    MapGallioTestCases(gallioTestCase.AllTests, logger, discoverySink);
                }
            }
        }
        private IEnumerable <TestData> GetGallioTestcases(TestFrameworkLogger frameworkLogger, IEnumerable <string> sources)
        {
            try
            {
                var testFrameworkManager = RuntimeAccessor.ServiceLocator.Resolve <ITestFrameworkManager>();
                var loader = new ReflectionOnlyAssemblyLoader();

                IList <ICodeElementInfo> assemblyInfos = sources.Select(source => LoadAssembly(source, loader)).Where(assembly => assembly != null).ToList();

                var testFrameworkSelector = new TestFrameworkSelector()
                {
                    Filter = testFrameworkHandle => testFrameworkHandle.Id != "MSTestAdapter.TestFramework" || testFrameworkHandle.Id != "NUnitAdapter.TestFramework",

                    FallbackMode = TestFrameworkFallbackMode.Approximate
                };

                ITestDriver driver = testFrameworkManager.GetTestDriver(testFrameworkSelector, frameworkLogger);
                var         testExplorationOptions = new TestExplorationOptions();

                var             tests           = new List <TestData>();
                MessageConsumer messageConsumer = new MessageConsumer()
                                                  .Handle <TestDiscoveredMessage>(message =>
                {
                    if (message.Test.IsTestCase)
                    {
                        tests.Add((message.Test));
                    }
                })
                                                  .Handle <AnnotationDiscoveredMessage>(message => message.Annotation.Log(frameworkLogger, true));

                driver.Describe(loader.ReflectionPolicy, assemblyInfos,
                                testExplorationOptions, messageConsumer, NullProgressMonitor.CreateInstance());

                bool reset = ResetCollectionForExposedTests(tests);

                if (reset)
                {
                    tests = null;
                }

                return(tests);
            }
            catch (Exception ex)
            {
                frameworkLogger.Log(LogSeverity.Error, "Gallio failed to load tests", ex);

                return(null);
            }
        }
        public void DiscoverTests(IEnumerable <string> sources, ObjectModel.Logging.IMessageLogger logger, ITestCaseDiscoverySink discoverySink)
        {
            var frameworkLogger = new TestFrameworkLogger(logger);

            try
            {
                frameworkLogger.Log(LogSeverity.Info, "Gallio starting up");

                var diaMap = new Dictionary <string, DiaSession>();

                var gallioTestscases = GetGallioTestcases(frameworkLogger, sources);
                if (gallioTestscases != null)
                {
                    frameworkLogger.Log(LogSeverity.Info, "Found " + gallioTestscases.Count().ToString());
                    MapGallioTestCases(gallioTestscases, frameworkLogger, discoverySink);
                }
            }
            catch (Exception ex)
            {
                frameworkLogger.Log(LogSeverity.Error, String.Format("Gallio: Exception discovering tests from {0}", ex));
            }
        }
        private void CreateTestCase(TestData testData, ITestCaseDiscoverySink discoverySink, TestFrameworkLogger logger)
        {
            TestCase testCase = GetTestCase(testData);

            testCase.CodeFilePath = testData.CodeLocation.Path;
            testCase.LineNumber   = testData.CodeLocation.Line;

            logger.Log(LogSeverity.Info, "Sending to the sink");

            discoverySink.SendTestCase(testCase);
        }