diff --git a/ExcelDna.Testing/Examples/InProcessTests.cs b/ExcelDna.Testing/Examples/InProcessTests.cs
index 19f9f05..da2fed0 100644
--- a/ExcelDna.Testing/Examples/InProcessTests.cs
+++ b/ExcelDna.Testing/Examples/InProcessTests.cs
@@ -63,7 +63,7 @@ public void AsyncFunctionTest()
Assert.Equal("Completed", targetRange.Value);
}
- [ExcelFact(Workbook = "", AddIn = @"..\..\..\..\ExampleAddinNET6\bin\Debug\net6.0-windows\ExampleAddinNET6-AddIn")]
+ [ExcelFact(Workbook = "", AddIn = @"..\..\..\..\ExampleAddinNET6\bin\Debug\net6.0-windows\ExampleAddinNET6-AddIn", SafeMode = true)]
public void FunctionTestNET6()
{
Range targetRange = (ExcelDna.Testing.Util.Workbook.Sheets[1] as Worksheet).Range["A1"];
diff --git a/ExcelDna.Testing/ExcelDna.Testing/ExcelFactAttribute.cs b/ExcelDna.Testing/ExcelDna.Testing/ExcelFactAttribute.cs
index 9f79b7b..8dd8461 100644
--- a/ExcelDna.Testing/ExcelDna.Testing/ExcelFactAttribute.cs
+++ b/ExcelDna.Testing/ExcelDna.Testing/ExcelFactAttribute.cs
@@ -16,5 +16,8 @@ public class ExcelFactAttribute : FactAttribute, ITestSettings
///
public string AddIn { get; set; }
+
+ ///
+ public bool SafeMode { get; set; }
}
}
diff --git a/ExcelDna.Testing/ExcelDna.Testing/ExcelFactDiscoverer.cs b/ExcelDna.Testing/ExcelDna.Testing/ExcelFactDiscoverer.cs
index a7d24c9..52b34b2 100644
--- a/ExcelDna.Testing/ExcelDna.Testing/ExcelFactDiscoverer.cs
+++ b/ExcelDna.Testing/ExcelDna.Testing/ExcelFactDiscoverer.cs
@@ -24,7 +24,8 @@ private static ExcelTestSettings GetSettings(ITestMethod testMethod)
return new ExcelTestSettings(
GetSetting(testMethod, nameof(ExcelFactAttribute.OutOfProcess)),
GetSetting(testMethod, nameof(ExcelFactAttribute.Workbook)),
- GetSetting(testMethod, nameof(ExcelFactAttribute.AddIn)));
+ GetSetting(testMethod, nameof(ExcelFactAttribute.AddIn)),
+ GetSetting(testMethod, nameof(ExcelFactAttribute.SafeMode)));
}
private static T GetSetting(ITestMethod testMethod, string name)
diff --git a/ExcelDna.Testing/ExcelDna.Testing/ExcelRunner.cs b/ExcelDna.Testing/ExcelDna.Testing/ExcelRunner.cs
index 15508a5..73f02e5 100644
--- a/ExcelDna.Testing/ExcelDna.Testing/ExcelRunner.cs
+++ b/ExcelDna.Testing/ExcelDna.Testing/ExcelRunner.cs
@@ -13,13 +13,19 @@ public ExcelRunner()
excelDetected = excelDetector.TryFindLatestExcel(out excelExePath) && excelDetector.TryFindExcelBitness(excelExePath, out bitness);
}
- public Process Start(string addinAssemblyPath, IEnumerable addins)
+ public Process Start(string addinAssemblyPath, IEnumerable addins, bool safeMode = false)
{
if (!excelDetected)
throw new ApplicationException("Can't find an installed version of Excel.");
string addinAssemblyDirectory = Path.GetDirectoryName(addinAssemblyPath);
string arguments = "";
+
+ if (safeMode)
+ {
+ arguments += "/safe ";
+ }
+
foreach (string externalAddinRelativePath in addins)
{
arguments += Quote(GetXllPath(addinAssemblyDirectory, externalAddinRelativePath, bitness)) + " ";
diff --git a/ExcelDna.Testing/ExcelDna.Testing/ExcelTestAssemblyRunner.cs b/ExcelDna.Testing/ExcelDna.Testing/ExcelTestAssemblyRunner.cs
index 6cf44e0..744bf58 100644
--- a/ExcelDna.Testing/ExcelDna.Testing/ExcelTestAssemblyRunner.cs
+++ b/ExcelDna.Testing/ExcelDna.Testing/ExcelTestAssemblyRunner.cs
@@ -35,14 +35,17 @@ public ExcelTestAssemblyRunner(ITestAssembly testAssembly, IEnumerable RunTestCollectionsAsync(IMessageBus messageBus, CancellationTokenSource cancellationTokenSource)
{
IEnumerable localTestCases = TestCases.Except(TestCases.OfType());
- IEnumerable excelInProcessTestCases = TestCases.OfType().Where(i => !i.Settings.OutOfProcess);
+ IEnumerable excelInProcessTestCases = TestCases.OfType().Where(i => !i.Settings.OutOfProcess && !i.Settings.SafeMode);
+ IEnumerable excelInProcessSafeTestCases = TestCases.OfType().Where(i => !i.Settings.OutOfProcess && i.Settings.SafeMode);
IEnumerable excelOutOfProcessTestCases = TestCases.OfType().Where(i => i.Settings.OutOfProcess);
var result = await LocalRunTestCasesAsync(localTestCases, messageBus, cancellationTokenSource);
if (excelOutOfProcessTestCases.Count() > 0)
result.Aggregate(await COMRunTestCasesAsync(excelOutOfProcessTestCases, messageBus, cancellationTokenSource));
if (excelInProcessTestCases.Count() > 0)
- result.Aggregate(await RemoteRunTestCasesAsync(excelInProcessTestCases, messageBus, cancellationTokenSource));
+ result.Aggregate(await RemoteRunTestCasesAsync(excelInProcessTestCases, messageBus, cancellationTokenSource, false));
+ if (excelInProcessSafeTestCases.Count() > 0)
+ result.Aggregate(await RemoteRunTestCasesAsync(excelInProcessSafeTestCases, messageBus, cancellationTokenSource, true));
CleanupReferences();
@@ -58,13 +61,13 @@ private async Task LocalRunTestCasesAsync(IEnumerable RemoteRunTestCasesAsync(IEnumerable testCases, IMessageBus messageBus, CancellationTokenSource cancellationTokenSource)
+ private async Task RemoteRunTestCasesAsync(IEnumerable testCases, IMessageBus messageBus, CancellationTokenSource cancellationTokenSource, bool safeMode)
{
RunSummary result = new RunSummary();
try
{
ExcelStartupEvent.Create();
- Process excelProcess = excelRunner.Start(testAssembly.Assembly.AssemblyPath, GetAddins(testCases));
+ Process excelProcess = excelRunner.Start(testAssembly.Assembly.AssemblyPath, GetAddins(testCases), safeMode);
if (!ExcelStartupEvent.Wait(30000))
throw new System.ApplicationException("Excel startup failed.");
diff --git a/ExcelDna.Testing/ExcelDna.Testing/ExcelTestCase.cs b/ExcelDna.Testing/ExcelDna.Testing/ExcelTestCase.cs
index 98b004d..3571a59 100644
--- a/ExcelDna.Testing/ExcelDna.Testing/ExcelTestCase.cs
+++ b/ExcelDna.Testing/ExcelDna.Testing/ExcelTestCase.cs
@@ -35,6 +35,7 @@ public override void Serialize(IXunitSerializationInfo info)
info.AddValue(nameof(testSettings.OutOfProcess), testSettings.OutOfProcess);
info.AddValue(nameof(testSettings.Workbook), testSettings.Workbook);
info.AddValue(nameof(testSettings.AddIn), testSettings.AddIn);
+ info.AddValue(nameof(testSettings.SafeMode), testSettings.SafeMode);
}
public override void Deserialize(IXunitSerializationInfo info)
@@ -43,7 +44,8 @@ public override void Deserialize(IXunitSerializationInfo info)
testSettings = new ExcelTestSettings(
info.GetValue(nameof(testSettings.OutOfProcess)),
info.GetValue(nameof(testSettings.Workbook)),
- info.GetValue(nameof(testSettings.AddIn)));
+ info.GetValue(nameof(testSettings.AddIn)),
+ info.GetValue(nameof(testSettings.SafeMode)));
}
public string SerializeToString()
diff --git a/ExcelDna.Testing/ExcelDna.Testing/ExcelTestSettings.cs b/ExcelDna.Testing/ExcelDna.Testing/ExcelTestSettings.cs
index 44f66b3..adbd94d 100644
--- a/ExcelDna.Testing/ExcelDna.Testing/ExcelTestSettings.cs
+++ b/ExcelDna.Testing/ExcelDna.Testing/ExcelTestSettings.cs
@@ -2,11 +2,12 @@
{
public class ExcelTestSettings : ITestSettings
{
- public ExcelTestSettings(bool outOfProcess, string workbook, string addin)
+ public ExcelTestSettings(bool outOfProcess, string workbook, string addin, bool safeMode = false)
{
OutOfProcess = outOfProcess;
Workbook = workbook;
AddIn = addin;
+ SafeMode = safeMode;
}
public bool OutOfProcess { get; set; }
@@ -14,5 +15,7 @@ public ExcelTestSettings(bool outOfProcess, string workbook, string addin)
public string Workbook { get; set; }
public string AddIn { get; set; }
+
+ public bool SafeMode { get; set; }
}
}
diff --git a/ExcelDna.Testing/ExcelDna.Testing/ExcelTestSettingsAttribute.cs b/ExcelDna.Testing/ExcelDna.Testing/ExcelTestSettingsAttribute.cs
index d93a282..27387eb 100644
--- a/ExcelDna.Testing/ExcelDna.Testing/ExcelTestSettingsAttribute.cs
+++ b/ExcelDna.Testing/ExcelDna.Testing/ExcelTestSettingsAttribute.cs
@@ -14,5 +14,8 @@ public class ExcelTestSettingsAttribute : Attribute, ITestSettings
///
public string AddIn { get; set; }
+
+ ///
+ public bool SafeMode { get; set; }
}
}
diff --git a/ExcelDna.Testing/ExcelDna.Testing/ITestSettings.cs b/ExcelDna.Testing/ExcelDna.Testing/ITestSettings.cs
index 54ba645..fd82ef3 100644
--- a/ExcelDna.Testing/ExcelDna.Testing/ITestSettings.cs
+++ b/ExcelDna.Testing/ExcelDna.Testing/ITestSettings.cs
@@ -16,5 +16,10 @@ internal interface ITestSettings
/// A relative path to .xll add-in to load. Without bitness and .xll extension.
///
string AddIn { get; set; }
+
+ ///
+ /// Whether to start Excel in safe mode using the /safe command-line switch.
+ ///
+ bool SafeMode { get; set; }
}
}