From d345c726bca188a37ed157a57d68946c528d64ad Mon Sep 17 00:00:00 2001
From: Rob Prouse <rob@prouse.org>
Date: Thu, 27 Apr 2017 22:14:42 -0400
Subject: [PATCH] Fixes OmniSharp/omnisharp-vscode#1434

---
 src/NUnitTestAdapter/AdapterSettings.cs       |  8 ++----
 .../AdapterSettingsTests.cs                   | 20 ++++---------
 .../Fakes/FakeDiscoveryContext.cs             | 13 ++++-----
 .../Fakes/FakeRunContext.cs                   |  4 +++
 .../TestDiscoveryTests.cs                     | 28 +++++++++++++++----
 5 files changed, 41 insertions(+), 32 deletions(-)

diff --git a/src/NUnitTestAdapter/AdapterSettings.cs b/src/NUnitTestAdapter/AdapterSettings.cs
index c1105ad1..1b5fb8ef 100644
--- a/src/NUnitTestAdapter/AdapterSettings.cs
+++ b/src/NUnitTestAdapter/AdapterSettings.cs
@@ -82,15 +82,13 @@ public void Load(IDiscoveryContext context)
             if (context == null)
                 throw new ArgumentNullException("context", "Load called with null context");
 
-            Load(context.RunSettings.SettingsXml);
+            Load(context?.RunSettings?.SettingsXml);
         }
 
         public void Load(string settingsXml)
         {
-            if (settingsXml == null)
-                throw new ArgumentNullException("settingsXml", "Load called with null XML string");
-            if (settingsXml == string.Empty)
-                throw new ArgumentException("settingsXml", "Load called with empty XML string");
+            if (string.IsNullOrEmpty(settingsXml))
+                settingsXml = "<RunSettings />";
 
             // Visual Studio already gives a good error message if the .runsettings
             // file is poorly formed, so we don't need to do anything more.
diff --git a/src/NUnitTestAdapterTests/AdapterSettingsTests.cs b/src/NUnitTestAdapterTests/AdapterSettingsTests.cs
index 3957a816..50df5556 100644
--- a/src/NUnitTestAdapterTests/AdapterSettingsTests.cs
+++ b/src/NUnitTestAdapterTests/AdapterSettingsTests.cs
@@ -24,22 +24,12 @@ public void NullContextThrowsException()
             Assert.That(() => _settings.Load((IDiscoveryContext)null), Throws.ArgumentNullException);
         }
 
-        [Test]
-        public void NullStringThrowsException()
-        {
-            Assert.That(() => _settings.Load((string)null), Throws.ArgumentNullException);
-        }
-
-        [Test]
-        public void EmptyStringThrowsException()
-        {
-            Assert.That(() => _settings.Load(string.Empty), Throws.ArgumentException);
-        }
-
-        [Test]
-        public void DefaultSettings()
+        [TestCase(null)]
+        [TestCase("")]
+        [TestCase("<RunSettings />")]
+        public void DefaultSettings(string xml)
         {
-            _settings.Load("<RunSettings/>");
+            _settings.Load(xml);
             Assert.That(_settings.MaxCpuCount, Is.EqualTo(-1));
             Assert.Null(_settings.ResultsDirectory);
             Assert.Null(_settings.TargetFrameworkVersion);
diff --git a/src/NUnitTestAdapterTests/Fakes/FakeDiscoveryContext.cs b/src/NUnitTestAdapterTests/Fakes/FakeDiscoveryContext.cs
index e7dd6086..abc12bd9 100644
--- a/src/NUnitTestAdapterTests/Fakes/FakeDiscoveryContext.cs
+++ b/src/NUnitTestAdapterTests/Fakes/FakeDiscoveryContext.cs
@@ -21,22 +21,21 @@
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 // ***********************************************************************
 
-using System;
-using System.Collections.Generic;
-using Microsoft.VisualStudio.TestPlatform.ObjectModel;
 using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter;
 
 namespace NUnit.VisualStudio.TestAdapter.Tests.Fakes
 {
     class FakeDiscoveryContext : IDiscoveryContext
     {
-        #region IDiscoveryContextMembers
-
-        IRunSettings IDiscoveryContext.RunSettings
+        public FakeDiscoveryContext(IRunSettings runSettings)
         {
-            get { return new FakeRunSettings(); }
+            RunSettings = runSettings;
         }
 
+        #region IDiscoveryContextMembers
+
+        public IRunSettings RunSettings { get; private set; }
+
         #endregion
     }
 }
diff --git a/src/NUnitTestAdapterTests/Fakes/FakeRunContext.cs b/src/NUnitTestAdapterTests/Fakes/FakeRunContext.cs
index bded4669..22f1e0b6 100644
--- a/src/NUnitTestAdapterTests/Fakes/FakeRunContext.cs
+++ b/src/NUnitTestAdapterTests/Fakes/FakeRunContext.cs
@@ -30,6 +30,10 @@ namespace NUnit.VisualStudio.TestAdapter.Tests.Fakes
 {
     class FakeRunContext : FakeDiscoveryContext, IRunContext
     {
+        public FakeRunContext() : base(new FakeRunSettings())
+        {
+        }
+
         #region IRunContext Members
 
         bool IRunContext.InIsolation
diff --git a/src/NUnitTestAdapterTests/TestDiscoveryTests.cs b/src/NUnitTestAdapterTests/TestDiscoveryTests.cs
index 0cc3663a..72732a16 100644
--- a/src/NUnitTestAdapterTests/TestDiscoveryTests.cs
+++ b/src/NUnitTestAdapterTests/TestDiscoveryTests.cs
@@ -32,8 +32,19 @@
 namespace NUnit.VisualStudio.TestAdapter.Tests
 {
     using Fakes;
+    using System.Collections;
+
+    internal static class TestDiscoveryDataProvider
+    {
+        public static IEnumerable<IDiscoveryContext> TestDiscoveryData()
+        {
+            yield return new FakeDiscoveryContext(null);
+            yield return new FakeDiscoveryContext(new FakeRunSettings());
+        }
+    }
 
     [Category("TestDiscovery")]
+    [TestFixtureSource(typeof(TestDiscoveryDataProvider), nameof(TestDiscoveryDataProvider.TestDiscoveryData))]
     public class TestDiscoveryTests : ITestCaseDiscoverySink
     {
         static readonly string MockAssemblyPath = 
@@ -43,6 +54,13 @@ public class TestDiscoveryTests : ITestCaseDiscoverySink
 
         private static ITestDiscoverer nunittestDiscoverer;
 
+        private IDiscoveryContext _context;
+
+        public TestDiscoveryTests(IDiscoveryContext context)
+        {
+            _context = context;
+        }
+
         [OneTimeSetUp]
         public void LoadMockassembly()
         {
@@ -57,7 +75,7 @@ public void LoadMockassembly()
             nunittestDiscoverer = ((ITestDiscoverer)new NUnit3TestDiscoverer());
             nunittestDiscoverer.DiscoverTests(
                 new[] { MockAssemblyPath}, 
-                new FakeDiscoveryContext(), 
+                _context, 
                 new MessageLoggerStub(), 
                 this);
         }
@@ -106,15 +124,15 @@ public class EmptyAssemblyDiscoveryTests : ITestCaseDiscoverySink
             Path.Combine(TestContext.CurrentContext.TestDirectory, "empty-assembly.dll");
 
         private static ITestDiscoverer nunittestDiscoverer;
-
-        [Test]
-        public void VerifyLoading()
+        
+        [TestCaseSource(typeof(TestDiscoveryDataProvider), nameof(TestDiscoveryDataProvider.TestDiscoveryData))]
+        public void VerifyLoading(IDiscoveryContext context)
         {
             // Load the NUnit empty-assembly.dll once for this test
             nunittestDiscoverer = ((ITestDiscoverer)new NUnit3TestDiscoverer());
             nunittestDiscoverer.DiscoverTests(
                 new[] { EmptyAssemblyPath}, 
-                new FakeDiscoveryContext(), 
+                context, 
                 new MessageLoggerStub(), 
                 this);
         }