diff --git a/Directory.Packages.props b/Directory.Packages.props
index e772dbb..e45cef3 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -11,7 +11,7 @@
-
+
diff --git a/build.cake b/build.cake
index 7eb2060..ab02548 100644
--- a/build.cake
+++ b/build.cake
@@ -1,5 +1,5 @@
// Load the recipe
-#load nuget:?package=NUnit.Cake.Recipe&version=2.0.0-beta.4.11
+#load nuget:?package=NUnit.Cake.Recipe&version=2.0.0-beta.5
// Comment out above line and uncomment below for local tests of recipe changes
//#load ../NUnit.Cake.Recipe/recipe/*.cake
diff --git a/src/NUnit.Engine.Api.Tests/TestPackageTests.cs b/src/NUnit.Engine.Api.Tests/TestPackageTests.cs
index 2c10c3b..d93eb95 100644
--- a/src/NUnit.Engine.Api.Tests/TestPackageTests.cs
+++ b/src/NUnit.Engine.Api.Tests/TestPackageTests.cs
@@ -1,6 +1,8 @@
// Copyright (c) Charlie Poole, Rob Prouse and Contributors. MIT License - see LICENSE.txt
using System.IO;
+using System.Security.Cryptography.X509Certificates;
+using NUnit.Common;
using NUnit.Framework;
namespace NUnit.Engine.Api
@@ -15,6 +17,11 @@ public class TestPackageTests
public TestPackageTests(string fileNames)
{
_fileNames = fileNames.Split(',');
+ }
+
+ [SetUp]
+ public void CreatePackage()
+ {
_package = new TestPackage(_fileNames);
}
@@ -46,11 +53,200 @@ public void HasSubPackageForEachFile()
}
}
- //[Test]
+ [Test]
public void SubPackagesHaveNoSubPackages()
{
foreach (TestPackage subPackage in _package.SubPackages)
Assert.That(subPackage.SubPackages.Count, Is.EqualTo(0));
}
+
+ [Test]
+ public void SubPackagesHaveNoSettingsInitially()
+ {
+ foreach (TestPackage subPackage in _package.SubPackages)
+ Assert.That(subPackage.Settings.Count, Is.EqualTo(0));
+ }
+
+ private static readonly PackageSetting MAX_AGENTS_42 = SettingDefinitions.MaxAgents.WithValue(42);
+ private static readonly PackageSetting MAX_AGENTS_99 = SettingDefinitions.MaxAgents.WithValue(99);
+
+ [Test]
+ public void AddStandardSettingToPackage([Values(false, true)] bool recursive)
+ {
+ _package.AddSetting(MAX_AGENTS_99, recursive);
+ Assert.That(_package.Settings.Count, Is.EqualTo(1));
+ Assert.That(_package.Settings.GetSetting(MAX_AGENTS_99.Name), Is.EqualTo(99));
+ foreach (TestPackage subPackage in _package.SubPackages)
+ {
+ Assert.That(subPackage.Settings.Count, Is.EqualTo(recursive ? 1 : 0));
+ if (recursive)
+ Assert.That(subPackage.Settings.GetSetting(MAX_AGENTS_99.Name), Is.EqualTo(99));
+ }
+ }
+
+ [TestCase("setting1", "value1", false)]
+ [TestCase("setting1", "value1", true)]
+ public void AddCustomStringSettingToPackage(string settingName, string settingValue, bool recursive)
+ {
+ _package.AddSetting(settingName, settingValue, recursive);
+ Assert.That(_package.Settings.Count, Is.EqualTo(1));
+ Assert.That(_package.Settings.GetSetting(settingName), Is.EqualTo(settingValue));
+ foreach (TestPackage subPackage in _package.SubPackages)
+ {
+ Assert.That(subPackage.Settings.Count, Is.EqualTo(recursive ? 1 : 0));
+ if (recursive)
+ Assert.That(subPackage.Settings.GetSetting(settingName), Is.EqualTo(settingValue));
+ }
+ }
+
+ [Test]
+ public void AddCustomBooleanSettingToPackage([Values(false, true)] bool recursive)
+ {
+ _package.AddSetting("setting1", true, recursive);
+ Assert.That(_package.Settings.Count, Is.EqualTo(1));
+ Assert.That(_package.Settings.GetSetting("setting1"), Is.EqualTo(true));
+ foreach (TestPackage subPackage in _package.SubPackages)
+ {
+ Assert.That(subPackage.Settings.Count, Is.EqualTo(recursive ? 1 : 0));
+ if (recursive)
+ Assert.That(subPackage.Settings.GetSetting("setting1"), Is.EqualTo(true));
+ }
+ }
+
+ [Test]
+ public void AddCustomIntSettingToPackage([Values(false, true)] bool recursive)
+ {
+ _package.AddSetting("setting1", 42, recursive);
+ Assert.That(_package.Settings.Count, Is.EqualTo(1));
+ Assert.That(_package.Settings.GetSetting("setting1"), Is.EqualTo(42));
+ foreach (TestPackage subPackage in _package.SubPackages)
+ {
+ Assert.That(subPackage.Settings.Count, Is.EqualTo(recursive ? 1 : 0));
+ if (recursive)
+ Assert.That(subPackage.Settings.GetSetting("setting1"), Is.EqualTo(42));
+ }
+ }
+
+ [Test]
+ public void ApplyStandardSettingToPackage([Values(false, true)] bool recursive)
+ {
+ _package.ApplySetting(MAX_AGENTS_99, recursive);
+ Assert.That(_package.Settings.Count, Is.EqualTo(1));
+ Assert.That(_package.Settings.GetSetting(MAX_AGENTS_99.Name), Is.EqualTo(99));
+ foreach (TestPackage subPackage in _package.SubPackages)
+ {
+ Assert.That(subPackage.Settings.Count, Is.EqualTo(recursive ? 1 : 0));
+ if (recursive)
+ Assert.That(subPackage.Settings.GetSetting(MAX_AGENTS_99.Name), Is.EqualTo(99));
+ }
+
+ _package.ApplySetting(MAX_AGENTS_42, recursive);
+ Assert.That(_package.Settings.Count, Is.EqualTo(1));
+ Assert.That(_package.Settings.GetSetting(MAX_AGENTS_42.Name), Is.EqualTo(42));
+ foreach (TestPackage subPackage in _package.SubPackages)
+ {
+ Assert.That(subPackage.Settings.Count, Is.EqualTo(recursive ? 1 : 0));
+ if (recursive)
+ Assert.That(subPackage.Settings.GetSetting(MAX_AGENTS_42.Name), Is.EqualTo(42));
+ }
+ }
+
+ [Test]
+ public void ApplyCustomStringSettingToPackage([Values(false, true)] bool recursive)
+ {
+ _package.ApplySetting("setting1", "value1", recursive);
+ Assert.That(_package.Settings.Count, Is.EqualTo(1));
+ Assert.That(_package.Settings.GetSetting("setting1"), Is.EqualTo("value1"));
+ foreach (TestPackage subPackage in _package.SubPackages)
+ {
+ Assert.That(subPackage.Settings.Count, Is.EqualTo(recursive ? 1 : 0));
+ if (recursive)
+ Assert.That(subPackage.Settings.GetSetting("setting1"), Is.EqualTo("value1"));
+ }
+
+ _package.ApplySetting("setting1", "value2", recursive);
+ Assert.That(_package.Settings.Count, Is.EqualTo(1));
+ Assert.That(_package.Settings.GetSetting("setting1"), Is.EqualTo("value2"));
+ foreach (TestPackage subPackage in _package.SubPackages)
+ {
+ Assert.That(subPackage.Settings.Count, Is.EqualTo(recursive ? 1 : 0));
+ if (recursive)
+ Assert.That(subPackage.Settings.GetSetting("setting1"), Is.EqualTo("value2"));
+ }
+ }
+
+ [Test]
+ public void ApplyCustomBooleanSettingToPackage([Values(false, true)] bool recursive)
+ {
+ _package.ApplySetting("setting1", true, recursive);
+ Assert.That(_package.Settings.Count, Is.EqualTo(1));
+ Assert.That(_package.Settings.GetSetting("setting1"), Is.EqualTo(true));
+ foreach (TestPackage subPackage in _package.SubPackages)
+ {
+ Assert.That(subPackage.Settings.Count, Is.EqualTo(recursive ? 1 : 0));
+ if (recursive)
+ Assert.That(subPackage.Settings.GetSetting("setting1"), Is.EqualTo(true));
+ }
+
+ _package.ApplySetting("setting1", false, recursive);
+ Assert.That(_package.Settings.Count, Is.EqualTo(1));
+ Assert.That(_package.Settings.GetSetting("setting1"), Is.EqualTo(false));
+ foreach (TestPackage subPackage in _package.SubPackages)
+ {
+ Assert.That(subPackage.Settings.Count, Is.EqualTo(recursive ? 1 : 0));
+ if (recursive)
+ Assert.That(subPackage.Settings.GetSetting("setting1"), Is.EqualTo(false));
+ }
+ }
+
+ [Test]
+ public void ApplyCustomIntSettingToPackage([Values(false, true)] bool recursive)
+ {
+ _package.ApplySetting("setting1", 99, recursive);
+ Assert.That(_package.Settings.Count, Is.EqualTo(1));
+ Assert.That(_package.Settings.GetSetting("setting1"), Is.EqualTo(99));
+ foreach (TestPackage subPackage in _package.SubPackages)
+ {
+ Assert.That(subPackage.Settings.Count, Is.EqualTo(recursive ? 1 : 0));
+ if (recursive)
+ Assert.That(subPackage.Settings.GetSetting("setting1"), Is.EqualTo(99));
+ }
+
+ _package.ApplySetting("setting1", 42, recursive);
+ Assert.That(_package.Settings.Count, Is.EqualTo(1));
+ Assert.That(_package.Settings.GetSetting("setting1"), Is.EqualTo(42));
+ foreach (TestPackage subPackage in _package.SubPackages)
+ {
+ Assert.That(subPackage.Settings.Count, Is.EqualTo(recursive ? 1 : 0));
+ if (recursive)
+ Assert.That(subPackage.Settings.GetSetting("setting1"), Is.EqualTo(42));
+ }
+ }
+
+ [Test]
+ public void RemoveStandardSettingFromPackage([Values(false, true)] bool recursive)
+ {
+ _package.AddSetting(MAX_AGENTS_99, recursive);
+ Assert.That(_package.Settings.Count, Is.EqualTo(1));
+ _package.RemoveSetting(MAX_AGENTS_99.Name, recursive);
+ Assert.That(_package.Settings.Count, Is.EqualTo(0));
+ foreach (TestPackage subPackage in _package.SubPackages)
+ {
+ Assert.That(subPackage.Settings.Count, Is.EqualTo(0));
+ }
+ }
+
+ [Test]
+ public void RemoveCustomSettingFromPackage([Values(false, true)] bool recursive)
+ {
+ _package.AddSetting("setting1", "value1", recursive);
+ Assert.That(_package.Settings.Count, Is.EqualTo(1));
+ _package.RemoveSetting("setting1", recursive);
+ Assert.That(_package.Settings.Count, Is.EqualTo(0));
+ foreach (TestPackage subPackage in _package.SubPackages)
+ {
+ Assert.That(subPackage.Settings.Count, Is.EqualTo(0));
+ }
+ }
}
}
diff --git a/src/NUnit.Engine.Api/NUnit.Engine.Api.csproj b/src/NUnit.Engine.Api/NUnit.Engine.Api.csproj
index 5b1ebfc..9faa687 100644
--- a/src/NUnit.Engine.Api/NUnit.Engine.Api.csproj
+++ b/src/NUnit.Engine.Api/NUnit.Engine.Api.csproj
@@ -1,19 +1,23 @@
-
- NUnit.Engine
- net462;netstandard2.0
- true
-
+
+ NUnit.Engine
+ net462;netstandard2.0
+ true
+
-
- NUnit.Engine.Api
- NUnit Engine API ($(TargetFramework))
- Defines the interfaces used by runners and engine extensions to access the NUnit Engine. Not normally needed by direct users who simply want to run tests.
-
+
+
+
+
+
+ NUnit.Engine.Api
+ NUnit Engine API ($(TargetFramework))
+ Defines the interfaces used by runners and engine extensions to access the NUnit Engine. Not normally needed by direct users who simply want to run tests.
+
-
-
-
+
+
+
diff --git a/src/NUnit.Engine.Api/PackageSettings.cs b/src/NUnit.Engine.Api/PackageSettings.cs
index 0d7e509..48bb2b1 100644
--- a/src/NUnit.Engine.Api/PackageSettings.cs
+++ b/src/NUnit.Engine.Api/PackageSettings.cs
@@ -65,7 +65,7 @@ public T GetValueOrDefault(SettingDefinition definition)
/// Adds a setting to the list directly.
///
/// A PackageSetting instance
- public void Add(PackageSetting setting) => _settings.Add(setting.Name, setting);
+ internal void Add(PackageSetting setting) => _settings.Add(setting.Name, setting);
///
/// Creates and adds a setting to the list, specified by the name and a string value.
@@ -73,7 +73,7 @@ public T GetValueOrDefault(SettingDefinition definition)
///
/// The name of the setting.
/// The corresponding value to set.
- public void Add(string name, string value)
+ internal void Add(string name, string value)
{
var definition = SettingDefinitions.Lookup(name);
@@ -90,7 +90,7 @@ public void Add(string name, string value)
///
/// The name of the setting.
/// The corresponding value to set.
- public void Add(string name, bool value)
+ internal void Add(string name, bool value)
{
var definition = SettingDefinitions.Lookup(name);
@@ -106,7 +106,7 @@ public void Add(string name, bool value)
///
/// The name of the setting.
/// The corresponding value to set.
- public void Add(string name, int value)
+ internal void Add(string name, int value)
{
var definition = SettingDefinitions.Lookup(name);
@@ -120,14 +120,14 @@ public void Add(string name, int value)
///
/// Adds or replaces a setting to the list.
///
- public void Set(PackageSetting setting) => _settings[setting.Name] = setting;
+ internal void Set(PackageSetting setting) => _settings[setting.Name] = setting;
///
/// Adds or replaces a setting to the list.
///
/// The name of the setting.
/// The corresponding value to set.
- public void Set(string name, T value)
+ internal void Set(string name, T value)
where T : notnull
{
Set(new PackageSetting(name, value));
@@ -137,7 +137,7 @@ public void Set(string name, T value)
/// Remove a setting
///
/// The setting to remove
- public void Remove(SettingDefinition setting)
+ internal void Remove(SettingDefinition setting)
{
_settings.Remove(setting.Name);
}
@@ -146,7 +146,7 @@ public void Remove(SettingDefinition setting)
/// Remove a setting
///
/// The name of the setting to remove
- public void Remove(string settingName)
+ internal void Remove(string settingName)
{
_settings.Remove(settingName);
}
diff --git a/src/NUnit.Engine.Api/TestPackage.cs b/src/NUnit.Engine.Api/TestPackage.cs
index 085cb99..1e38790 100644
--- a/src/NUnit.Engine.Api/TestPackage.cs
+++ b/src/NUnit.Engine.Api/TestPackage.cs
@@ -137,7 +137,7 @@ public void AddSubPackage(TestPackage subPackage)
foreach (var setting in Settings)
if (!subPackage.Settings.HasSetting(setting.Name))
- subPackage.AddSetting(setting);
+ subPackage.AddSetting(setting, true);
}
///
@@ -154,9 +154,10 @@ public TestPackage AddSubPackage(string packageName)
}
///
- /// Add a setting to a package and all of its subpackages.
+ /// Add a setting to a package and optionally to all of its subpackages.
///
/// The setting to be added
+ /// A flag indicating whether the setting should be added to all subpackages recursively
///
/// Once a package is created, subpackages may have been created
/// as well. If you add a setting directly to the Settings dictionary
@@ -164,18 +165,22 @@ public TestPackage AddSubPackage(string packageName)
/// used when the settings are intended to be reflected to all the
/// subpackages under the package.
///
- public void AddSetting(PackageSetting setting)
+ public void AddSetting(PackageSetting setting, bool recursive)
{
Settings.Add(setting);
- foreach (var subPackage in SubPackages)
- subPackage.AddSetting(setting);
+ if (recursive)
+ {
+ foreach (var subPackage in SubPackages)
+ subPackage.AddSetting(setting, true);
+ }
}
///
- /// Create and add a custom string setting to a package and all of its subpackages.
+ /// Create and add a custom string setting to a package and optionally to all of its subpackages.
///
/// The name of the setting.
/// The corresponding value to set.
+ /// A flag indicating whether the setting should be added to all subpackages recursively
///
/// Once a package is created, subpackages may have been created
/// as well. If you add a setting directly to the Settings dictionary
@@ -183,16 +188,17 @@ public void AddSetting(PackageSetting setting)
/// used when the settings are intended to be reflected to all the
/// subpackages under the package.
///
- public void AddSetting(string name, string value)
+ public void AddSetting(string name, string value, bool recursive)
{
- AddSetting(new PackageSetting(name, value));
+ AddSetting(new PackageSetting(name, value), recursive);
}
///
- /// Create and add a custom boolean setting to a package and all of its subpackages.
+ /// Create and add a custom boolean setting to a package and optionally to all of its subpackages.
///
/// The name of the setting.
/// The corresponding value to set.
+ /// A flag indicating whether the setting should be added to all subpackages recursively
///
/// Once a package is created, subpackages may have been created
/// as well. If you add a setting directly to the Settings dictionary
@@ -200,16 +206,17 @@ public void AddSetting(string name, string value)
/// used when the settings are intended to be reflected to all the
/// subpackages under the package.
///
- public void AddSetting(string name, bool value)
+ public void AddSetting(string name, bool value, bool recursive)
{
- AddSetting(new PackageSetting(name, value));
+ AddSetting(new PackageSetting(name, value), recursive);
}
///
- /// Create and add a custom int setting to a package and all of its subpackages.
+ /// Create and add a custom int setting to a package and optionally to all of its subpackages.
///
/// The name of the setting.
/// The corresponding value to set.
+ /// A flag indicating whether the setting should be added to all subpackages recursively
///
/// Once a package is created, subpackages may have been created
/// as well. If you add a setting directly to the Settings dictionary
@@ -217,9 +224,82 @@ public void AddSetting(string name, bool value)
/// used when the settings are intended to be reflected to all the
/// subpackages under the package.
///
- public void AddSetting(string name, int value)
+ public void AddSetting(string name, int value, bool recursive)
+ {
+ AddSetting(new PackageSetting(name, value), recursive);
+ }
+
+ ///
+ /// Apply a setting to a package and optionally to all of its subpackages.
+ ///
+ /// The setting to be applied
+ /// A flag indicating whether the setting should be applied to all subpackages recursively
+ public void ApplySetting(PackageSetting setting, bool recursive)
+ {
+ Settings.Set(setting);
+ if (recursive)
+ {
+ foreach (var subPackage in SubPackages)
+ subPackage.ApplySetting(setting, true);
+ }
+ }
+
+ ///
+ /// Apply a custom string setting to a package and optionally to all of its subpackages.
+ ///
+ /// The name of the setting.
+ /// The corresponding value to set.
+ /// A flag indicating whether the setting should be added to all subpackages recursively
+ public void ApplySetting(string name, string value, bool recursive)
+ {
+ ApplySetting(new PackageSetting(name, value), recursive);
+ }
+
+ ///
+ /// Create and add a custom boolean setting to a package and optionally to all of its subpackages.
+ ///
+ /// The name of the setting.
+ /// The corresponding value to set.
+ /// A flag indicating whether the setting should be added to all subpackages recursively
+ public void ApplySetting(string name, bool value, bool recursive)
{
- AddSetting(new PackageSetting(name, value));
+ ApplySetting(new PackageSetting(name, value), recursive);
+ }
+
+ ///
+ /// Create and add a custom int setting to a package and optionally to all of its subpackages.
+ ///
+ /// The name of the setting.
+ /// The corresponding value to set.
+ /// A flag indicating whether the setting should be added to all subpackages recursively
+ public void ApplySetting(string name, int value, bool recursive)
+ {
+ ApplySetting(new PackageSetting(name, value), recursive);
+ }
+
+ ///
+ /// Remove a setting from this package and, optionally, from all subpackages.
+ ///
+ /// The setting to remove.
+ /// If true, remove the setting recursively from all subpackages.
+ public void RemoveSetting(PackageSetting setting, bool recursive)
+ {
+ RemoveSetting(setting.Name, recursive);
+ }
+
+ ///
+ /// Remove a setting from this package and, optionally, from all subpackages.
+ ///
+ /// The name of the setting to remove.
+ /// If true, remove the setting recursively from all subpackages.
+ public void RemoveSetting(string name, bool recursive)
+ {
+ Settings.Remove(name);
+ if (recursive)
+ {
+ foreach (var subPackage in SubPackages)
+ subPackage.RemoveSetting(name, true);
+ }
}
///