Ejemplo n.º 1
0
        public IEnumerable <IXunitTestCase> Discover(ITestFrameworkDiscoveryOptions discoveryOptions, ITestMethod testMethod, IAttributeInfo factAttribute)
        {
            var defaultMethodDisplay = discoveryOptions.MethodDisplayOrDefault();

            if (testMethod.Method.GetParameters().Any())
            {
                return(new IXunitTestCase[] {
                    new ExecutionErrorTestCase(_messageSink, defaultMethodDisplay, testMethod, "[VsixFact] methods are not allowed to have parameters.")
                });
            }
            else
            {
                var vsix      = testMethod.GetVsixAttribute(factAttribute);
                var testCases = new List <IXunitTestCase>();

                if (vsix.VisualStudioVersions == null)
                {
                    testCases.Add(new XunitSkippedDataRowTestCase(
                                      _messageSink, defaultMethodDisplay, testMethod,
                                      string.Format(
                                          CultureInfo.CurrentCulture,
                                          "Cannot execute test for specified {0}={1} because {2}={3} and {4}={5}.",
                                          nameof(IVsixAttribute.VisualStudioVersions),
                                          string.Join(",", factAttribute.GetNamedArgument <string[]>(nameof(IVsixAttribute.VisualStudioVersions))),
                                          nameof(IVsixAttribute.MinimumVisualStudioVersion),
                                          vsix.MinimumVisualStudioVersion,
                                          nameof(IVsixAttribute.MaximumVisualStudioVersion),
                                          vsix.MaximumVisualStudioVersion)));
                }
                else
                {
                    // Add invalid VS versions.
                    testCases.AddRange(vsix.VisualStudioVersions
                                       .Where(version => !VsVersions.InstalledVersions.Contains(version))
                                       .Select(v => new ExecutionErrorTestCase(_messageSink, defaultMethodDisplay, testMethod,
                                                                               string.Format("Cannot execute test for specified {0}={1} because there is no VSSDK installed for that version.", nameof(IVsixAttribute.VisualStudioVersions), v))));

                    testCases.AddRange(vsix.VisualStudioVersions
                                       .Where(version => VsVersions.InstalledVersions.Contains(version))
                                       .Select(version => new VsixTestCase(_messageSink, defaultMethodDisplay, testMethod, version, vsix.RootSuffix, vsix.NewIdeInstance, vsix.TimeoutSeconds, vsix.RecycleOnFailure, vsix.RunOnUIThread)));
                }

                return(testCases);
            }
        }
Ejemplo n.º 2
0
        public IEnumerable <IXunitTestCase> Discover(ITestFrameworkDiscoveryOptions discoveryOptions, ITestMethod testMethod, IAttributeInfo theoryAttribute)
        {
            // Special case Skip, because we want a single Skip (not one per data item); plus, a skipped test may
            // not actually have any data (which is quasi-legal, since it's skipped).
            var skipReason = theoryAttribute.GetInitializedArgument <string>("Skip");

            if (skipReason != null)
            {
                return new[] { new XunitTestCase(_diagnosticMessageSink, discoveryOptions.MethodDisplayOrDefault(), testMethod) }
            }
            ;

            var vsix            = testMethod.GetVsixAttribute(theoryAttribute);
            var validVsVersions = vsix.VisualStudioVersions.Where(v => VsVersions.InstalledVersions.Contains(v)).ToArray();

            // We always pre-enumerate theories, since that's how we build the concrete test cases.
            try
            {
                var dataAttributes = testMethod.Method.GetCustomAttributes(typeof(DataAttribute));

                var results = new List <IXunitTestCase>();

                foreach (var dataAttribute in dataAttributes)
                {
                    var discovererAttribute = dataAttribute.GetCustomAttributes(typeof(DataDiscovererAttribute)).First();
                    var discoverer          = ExtensibilityPointFactory.GetDataDiscoverer(_diagnosticMessageSink, discovererAttribute);
                    if (!discoverer.SupportsDiscoveryEnumeration(dataAttribute, testMethod.Method))
                    {
                        return(CreateTestCasesForTheory(discoveryOptions, testMethod, validVsVersions, vsix).ToArray());
                    }

                    // GetData may return null, but that's okay; we'll let the NullRef happen and then catch it
                    // down below so that we get the composite test case.
                    foreach (var dataRow in discoverer.GetData(dataAttribute, testMethod.Method))
                    {
                        // Determine whether we can serialize the test case, since we need a way to uniquely
                        // identify a test and serialization is the best way to do that. If it's not serializable,
                        // this will throw and we will fall back to a single theory test case that gets its data at runtime.
                        if (!SerializationHelper.IsSerializable(dataRow))
                        {
                            return(CreateTestCasesForTheory(discoveryOptions, testMethod, validVsVersions, vsix).ToArray());
                        }

                        var testCases = CreateTestCasesForDataRow(discoveryOptions, testMethod, validVsVersions, vsix, dataRow);
                        results.AddRange(testCases);
                    }
                }

                if (results.Count == 0)
                {
                    results.Add(new ExecutionErrorTestCase(_diagnosticMessageSink,
                                                           discoveryOptions.MethodDisplayOrDefault(),
                                                           testMethod,
                                                           $"No data found for {testMethod.TestClass.Class.Name}.{testMethod.Method.Name}"));
                }

                // Add invalid VS versions.
                results.AddRange(vsix.VisualStudioVersions
                                 .Where(version => !VsVersions.InstalledVersions.Contains(version))
                                 .Select(version => new ExecutionErrorTestCase(_diagnosticMessageSink, discoveryOptions.MethodDisplayOrDefault(), testMethod,
                                                                               string.Format("Cannot execute test for specified {0}={1} because there is no VSSDK installed for that version.", nameof(IVsixAttribute.VisualStudioVersions), version))));

                return(results);
            }
            catch { }  // If something goes wrong, fall through to return just the XunitTestCase

            return(CreateTestCasesForTheory(discoveryOptions, testMethod, validVsVersions, vsix).ToArray());
        }