From 7b9497ddaaf6c51c652543c8319641a408b5350e Mon Sep 17 00:00:00 2001 From: andrewimcclement <33556313+andrewimcclement@users.noreply.github.com> Date: Thu, 18 Apr 2024 15:25:03 +0100 Subject: [PATCH] Permit DictionaryContainsKeyValuePairConstraint to take in a null value (fix CS8604) (#4689) * Permit DictionaryContainsKeyValuePairConstraint to take in a null value, matching the nullability of DictionaryEntry. * Fix up nullability of DictionaryContainsValueConstraint to permit `object?` instead of `object`. * Add some basic tests that null values can be found in dictionaries by DictionaryContains(Key)ValueConstraint. * Update DictionaryContainsKeyValueConstraintTests.cs to use [TestCase] instead of [Theory]. * Update DictionaryContainsValueConstraintTests.cs to replace use of [Theory] with [TestCase]. --------- Co-authored-by: Andrew McClement --- .../Constraints/ConstraintExpression.cs | 2 +- .../DictionaryContainsKeyConstraint.cs | 4 ++-- ...DictionaryContainsKeyValuePairConstraint.cs | 2 +- src/NUnitFramework/framework/Contains.cs | 2 +- src/NUnitFramework/framework/Does.cs | 2 +- ...ictionaryContainsKeyValueConstraintTests.cs | 18 ++++++++++-------- .../DictionaryContainsValueConstraintTests.cs | 9 +++++---- 7 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/NUnitFramework/framework/Constraints/ConstraintExpression.cs b/src/NUnitFramework/framework/Constraints/ConstraintExpression.cs index 634693e944..536d89fe5a 100644 --- a/src/NUnitFramework/framework/Constraints/ConstraintExpression.cs +++ b/src/NUnitFramework/framework/Constraints/ConstraintExpression.cs @@ -734,7 +734,7 @@ public DictionaryContainsKeyConstraint ContainKey(object expected) /// presence of a particular value in the Dictionary value collection. /// /// The value to be matched in the Dictionary value collection - public DictionaryContainsValueConstraint ContainValue(object expected) + public DictionaryContainsValueConstraint ContainValue(object? expected) { return Append(new DictionaryContainsValueConstraint(expected)); } diff --git a/src/NUnitFramework/framework/Constraints/DictionaryContainsKeyConstraint.cs b/src/NUnitFramework/framework/Constraints/DictionaryContainsKeyConstraint.cs index c88bb34f58..2263def147 100644 --- a/src/NUnitFramework/framework/Constraints/DictionaryContainsKeyConstraint.cs +++ b/src/NUnitFramework/framework/Constraints/DictionaryContainsKeyConstraint.cs @@ -51,9 +51,9 @@ public DictionaryContainsKeyConstraint(object expected) /// Returns a new DictionaryContainsKeyValuePairConstraint checking for the /// presence of a particular key-value-pair in the dictionary. /// - public DictionaryContainsKeyValuePairConstraint WithValue(object expectedValue) + public DictionaryContainsKeyValuePairConstraint WithValue(object? expectedValue) { - return (DictionaryContainsKeyValuePairConstraint)Instead.Append(new DictionaryContainsKeyValuePairConstraint(Expected, expectedValue)); + return Instead.Append(new DictionaryContainsKeyValuePairConstraint(Expected, expectedValue)); } private bool Matches(object? actual) diff --git a/src/NUnitFramework/framework/Constraints/DictionaryContainsKeyValuePairConstraint.cs b/src/NUnitFramework/framework/Constraints/DictionaryContainsKeyValuePairConstraint.cs index 495cfe49c2..5022c90c54 100644 --- a/src/NUnitFramework/framework/Constraints/DictionaryContainsKeyValuePairConstraint.cs +++ b/src/NUnitFramework/framework/Constraints/DictionaryContainsKeyValuePairConstraint.cs @@ -19,7 +19,7 @@ public sealed class DictionaryContainsKeyValuePairConstraint : CollectionItemsEq /// /// Construct a DictionaryContainsKeyValuePairConstraint /// - public DictionaryContainsKeyValuePairConstraint(object key, object value) + public DictionaryContainsKeyValuePairConstraint(object key, object? value) { _expected = new DictionaryEntry(key, value); } diff --git a/src/NUnitFramework/framework/Contains.cs b/src/NUnitFramework/framework/Contains.cs index cbe45b3294..7c06bb939e 100644 --- a/src/NUnitFramework/framework/Contains.cs +++ b/src/NUnitFramework/framework/Contains.cs @@ -41,7 +41,7 @@ public static DictionaryContainsKeyConstraint Key(object expected) /// Returns a new DictionaryContainsValueConstraint checking for the /// presence of a particular value in the dictionary. /// - public static DictionaryContainsValueConstraint Value(object expected) + public static DictionaryContainsValueConstraint Value(object? expected) { return new DictionaryContainsValueConstraint(expected); } diff --git a/src/NUnitFramework/framework/Does.cs b/src/NUnitFramework/framework/Does.cs index 435e002bb3..222135b3e1 100644 --- a/src/NUnitFramework/framework/Does.cs +++ b/src/NUnitFramework/framework/Does.cs @@ -71,7 +71,7 @@ public static DictionaryContainsKeyConstraint ContainKey(object expected) /// presence of a particular value in the Dictionary value collection. /// /// The value to be matched in the Dictionary value collection - public static DictionaryContainsValueConstraint ContainValue(object expected) + public static DictionaryContainsValueConstraint ContainValue(object? expected) { return Contains.Value(expected); } diff --git a/src/NUnitFramework/tests/Constraints/DictionaryContainsKeyValueConstraintTests.cs b/src/NUnitFramework/tests/Constraints/DictionaryContainsKeyValueConstraintTests.cs index 30426387b6..e9bc3da559 100644 --- a/src/NUnitFramework/tests/Constraints/DictionaryContainsKeyValueConstraintTests.cs +++ b/src/NUnitFramework/tests/Constraints/DictionaryContainsKeyValueConstraintTests.cs @@ -10,12 +10,13 @@ namespace NUnit.Framework.Tests.Constraints [TestFixture] public class DictionaryContainsKeyValuePairConstraintTests { - [Test] - public void SucceedsWhenKeyValuePairIsPresent() + [TestCase("Universe")] + [TestCase(null)] + public void SucceedsWhenKeyValuePairIsPresent(string? expectedValue) { - var dictionary = new Dictionary { { "Hello", "World" }, { "Hi", "Universe" }, { "Hola", "Mundo" } }; + var dictionary = new Dictionary { { "Hello", "World" }, { "Hi", expectedValue }, { "Hola", "Mundo" } }; - Assert.That(dictionary, new DictionaryContainsKeyValuePairConstraint("Hi", "Universe")); + Assert.That(dictionary, new DictionaryContainsKeyValuePairConstraint("Hi", expectedValue)); } [Test] @@ -38,11 +39,12 @@ public void FailsWhenValueIsMissing() Assert.That(act, Throws.Exception.TypeOf()); } - [Test] - public void SucceedsWhenPairIsPresentUsingContainKeyWithValue() + [TestCase("Mundo")] + [TestCase(null)] + public void SucceedsWhenPairIsPresentUsingContainKeyWithValue(string? expectedValue) { - var dictionary = new Dictionary { { "Hello", "World" }, { "Hola", "Mundo" } }; - Assert.That(dictionary, Does.ContainKey("Hola").WithValue("Mundo")); + var dictionary = new Dictionary { { "Hello", "World" }, { "Hola", expectedValue } }; + Assert.That(dictionary, Does.ContainKey("Hola").WithValue(expectedValue)); } [Test] diff --git a/src/NUnitFramework/tests/Constraints/DictionaryContainsValueConstraintTests.cs b/src/NUnitFramework/tests/Constraints/DictionaryContainsValueConstraintTests.cs index 8a7d0ddd52..c7d42e9982 100644 --- a/src/NUnitFramework/tests/Constraints/DictionaryContainsValueConstraintTests.cs +++ b/src/NUnitFramework/tests/Constraints/DictionaryContainsValueConstraintTests.cs @@ -28,11 +28,12 @@ public void FailsWhenValueIsMissing() Assert.That(act, Throws.Exception.TypeOf()); } - [Test] - public void SucceedsWhenValueIsPresentUsingContainValue() + [TestCase("Mundo")] + [TestCase(null)] + public void SucceedsWhenValueIsPresentUsingContainValue(string? expectedValue) { - var dictionary = new Dictionary { { "Hello", "World" }, { "Hola", "Mundo" } }; - Assert.That(dictionary, Does.ContainValue("Mundo")); + var dictionary = new Dictionary { { "Hello", "World" }, { "Hola", expectedValue } }; + Assert.That(dictionary, Does.ContainValue(expectedValue)); } [Test]