Skip to content

Commit

Permalink
Add ResourceManager overloads to Verify.Operation method
Browse files Browse the repository at this point in the history
  • Loading branch information
AArnott committed Dec 20, 2024
1 parent d81263b commit baa04ce
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 0 deletions.
68 changes: 68 additions & 0 deletions src/Validation/Verify.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,74 @@ public static void Operation([DoesNotReturnIf(false)] bool condition, string unf

#endif

/// <inheritdoc cref="Operation(bool, ResourceManager, string, object?)" path="/summary"/>
/// <inheritdoc cref="Operation(bool, ResourceManager, string, object?)" path="/exception"/>
/// <inheritdoc cref="Operation(bool, ResourceManager, string, object?)" path="/remarks"/>
/// <param name="condition"><inheritdoc cref="Operation(bool, ResourceManager, string, object?[])" path="/param[@name='condition']"/></param>
/// <param name="resourceManager"><inheritdoc cref="Operation(bool, ResourceManager, string, object?[])" path="/param[@name='resourceManager']"/></param>
/// <param name="resourceName"><inheritdoc cref="Operation(bool, ResourceManager, string, object?[])" path="/param[@name='unformattedMessageResourceName']"/></param>
[DebuggerStepThrough]
public static void Operation([DoesNotReturnIf(false)] bool condition, ResourceManager resourceManager, string resourceName)
{
Requires.NotNull(resourceManager, nameof(resourceManager));
if (!condition)
{
throw new InvalidOperationException(resourceManager.GetString(resourceName, CultureInfo.CurrentCulture));
}
}

/// <inheritdoc cref="Operation(bool, ResourceManager, string, object?, object?)"/>
[DebuggerStepThrough]
public static void Operation([DoesNotReturnIf(false)] bool condition, ResourceManager resourceManager, string unformattedMessageResourceName, object? arg1)
{
Requires.NotNull(resourceManager, nameof(resourceManager));
if (!condition)
{
throw new InvalidOperationException(PrivateErrorHelpers.Format(resourceManager.GetString(unformattedMessageResourceName, CultureInfo.CurrentCulture)!, arg1));
}
}

/// <inheritdoc cref="Operation(bool, ResourceManager, string, object?[])" path="/summary"/>
/// <inheritdoc cref="Operation(bool, ResourceManager, string, object?[])" path="/exception"/>
/// <inheritdoc cref="Operation(bool, ResourceManager, string, object?[])" path="/remarks"/>
/// <param name="condition"><inheritdoc cref="Operation(bool, ResourceManager, string, object?[])" path="/param[@name='condition']"/></param>
/// <param name="resourceManager"><inheritdoc cref="Operation(bool, ResourceManager, string, object?[])" path="/param[@name='resourceManager']"/></param>
/// <param name="unformattedMessageResourceName"><inheritdoc cref="Operation(bool, ResourceManager, string, object?[])" path="/param[@name='unformattedMessageResourceName']"/></param>
/// <param name="arg1">The first formatting argument.</param>
/// <param name="arg2">The second formatting argument.</param>
[DebuggerStepThrough]
public static void Operation([DoesNotReturnIf(false)] bool condition, ResourceManager resourceManager, string unformattedMessageResourceName, object? arg1, object? arg2)
{
Requires.NotNull(resourceManager, nameof(resourceManager));
if (!condition)
{
throw new InvalidOperationException(PrivateErrorHelpers.Format(resourceManager.GetString(unformattedMessageResourceName, CultureInfo.CurrentCulture)!, arg1, arg2));
}
}

/// <summary>
/// Throws an <see cref="InvalidOperationException"/> if a condition is false.
/// </summary>
/// <param name="condition">The condition to check.</param>
/// <param name="resourceManager">The resource manager from which to retrieve the exception message. For example: <c>Strings.ResourceManager</c>.</param>
/// <param name="unformattedMessageResourceName">The name of the string resource to obtain for the exception message. For example: <c>nameof(Strings.SomeError)</c>.</param>
/// <param name="args">The formatting arguments.</param>
/// <remarks>
/// This overload allows only loading a localized string in the error condition as an optimization in perf critical sections over the simpler
/// to use <see cref="Operation(bool, string?)"/> overload.
/// </remarks>
/// <exception cref="ArgumentNullException">Thrown if <paramref name="resourceManager"/> is <see langword="null"/>.</exception>
/// <exception cref="InvalidOperationException">Thrown if <paramref name="condition"/> is <see langword="false"/>.</exception>
[DebuggerStepThrough]
public static void Operation([DoesNotReturnIf(false)] bool condition, ResourceManager resourceManager, string unformattedMessageResourceName, params object?[] args)
{
Requires.NotNull(resourceManager, nameof(resourceManager));
if (!condition)
{
throw new InvalidOperationException(PrivateErrorHelpers.Format(resourceManager.GetString(unformattedMessageResourceName, CultureInfo.CurrentCulture)!, args));
}
}

/// <summary>
/// Throws an <see cref="InvalidOperationException"/> if a condition is false.
/// </summary>
Expand Down
17 changes: 17 additions & 0 deletions test/Validation.Tests/VerifyTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,23 @@ public void Operation()
Assert.Throws<InvalidOperationException>(() => Verify.Operation(false, "throw", "arg1", "arg2", "arg3"));
}

[Fact]
public void Operation_ResourceManager()
{
AssertThrows(TestStrings.GetResourceString(TestStrings.SomeError), c => Verify.Operation(c, TestStrings.ResourceManager, TestStrings.SomeError));
AssertThrows(TestStrings.FormatSomeError1Arg("A"), c => Verify.Operation(c, TestStrings.ResourceManager, TestStrings.SomeError1Arg, "A"));
AssertThrows(TestStrings.FormatSomeError2Args("A", "B"), c => Verify.Operation(c, TestStrings.ResourceManager, TestStrings.SomeError2Args, "A", "B"));
AssertThrows(TestStrings.FormatSomeError3Args("A", "B", "C"), c => Verify.Operation(c, TestStrings.ResourceManager, TestStrings.SomeError3Args, "A", "B", "C"));

static void AssertThrows(string? expectedMessage, Action<bool> action)
{
action(true);

InvalidOperationException actual = Assert.Throws<InvalidOperationException>(() => action(false));
Assert.Equal(expectedMessage, actual.Message);
}
}

[Fact]
public void OperationWithHelp()
{
Expand Down

0 comments on commit baa04ce

Please sign in to comment.