refactor: remove static methods from generic type and move to non-generic static class.
This commit is contained in:
@@ -3,6 +3,6 @@
|
||||
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageVersion Include="TUnit" Version="0.73.0" />
|
||||
<PackageVersion Include="TUnit" Version="1.23.7" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
<Project>
|
||||
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />
|
||||
</Project>
|
||||
@@ -6,6 +6,7 @@ public class ErrorTests
|
||||
public async Task Constructor_WhenCalled_ItShouldSetCode()
|
||||
{
|
||||
var error = new Error("code", "message");
|
||||
|
||||
await Assert.That(error.Code).IsEqualTo("code");
|
||||
}
|
||||
|
||||
@@ -13,6 +14,7 @@ public class ErrorTests
|
||||
public async Task Constructor_WhenCalled_ItShouldSetMessage()
|
||||
{
|
||||
var error = new Error("code", "message");
|
||||
|
||||
await Assert.That(error.Message).IsEqualTo("message");
|
||||
}
|
||||
|
||||
@@ -21,6 +23,7 @@ public class ErrorTests
|
||||
{
|
||||
var metadata = new Dictionary<string, object> { { "key", "value" } };
|
||||
var error = new Error("code", "message", metadata);
|
||||
|
||||
await Assert.That(error.Metadata!.Count).IsEqualTo(1);
|
||||
await Assert.That(error.Metadata["key"]).IsEqualTo("value");
|
||||
}
|
||||
@@ -29,7 +32,8 @@ public class ErrorTests
|
||||
public async Task Constructor_WhenCalledWithNullMetadata_ItShouldSetMetadataToNull()
|
||||
{
|
||||
var error = new Error("code", "message", null);
|
||||
await Assert.That(error.Metadata!).IsNull();
|
||||
|
||||
await Assert.That(error.Metadata).IsNull();
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -37,6 +41,7 @@ public class ErrorTests
|
||||
{
|
||||
var error1 = new Error("code", "message");
|
||||
var error2 = new Error("code", "message");
|
||||
|
||||
await Assert.That(error1).IsEqualTo(error2);
|
||||
}
|
||||
|
||||
@@ -45,6 +50,7 @@ public class ErrorTests
|
||||
{
|
||||
var error1 = new Error("code1", "message");
|
||||
var error2 = new Error("code2", "message");
|
||||
|
||||
await Assert.That(error1 == error2).IsFalse();
|
||||
}
|
||||
|
||||
@@ -52,6 +58,7 @@ public class ErrorTests
|
||||
public async Task Error_WhenCreated_ItShouldImplementIError()
|
||||
{
|
||||
var error = new Error("code", "message");
|
||||
|
||||
await Assert.That(error).IsAssignableTo<IError>();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,42 +7,49 @@ public class ResultAsyncExtensionsTests
|
||||
[Test]
|
||||
public async Task MapAsync_WhenResultIsSuccess_ItShouldInvokeAsyncAction()
|
||||
{
|
||||
var result = Result<Unit, Error>.Ok(default);
|
||||
var result = Result.Ok<Unit, Error>(default);
|
||||
var invoked = false;
|
||||
|
||||
await result.MapAsync(_ => { invoked = true; return Task.CompletedTask; });
|
||||
|
||||
await Assert.That(invoked).IsTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task MapAsync_WhenResultIsFailure_ItShouldSkipAsyncAction()
|
||||
{
|
||||
var result = Result<Unit, Error>.Fail(new Error("code", "message"));
|
||||
var result = Result.Fail<Unit, Error>(new Error("code", "message"));
|
||||
var invoked = false;
|
||||
|
||||
await result.MapAsync(_ => { invoked = true; return Task.CompletedTask; });
|
||||
|
||||
await Assert.That(invoked).IsFalse();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task MapAsync_WhenCalled_ItShouldReturnOriginalResult()
|
||||
{
|
||||
var result = Result<Unit, Error>.Ok(default);
|
||||
var result = Result.Ok<Unit, Error>(default);
|
||||
var mapped = await result.MapAsync(_ => Task.CompletedTask);
|
||||
|
||||
await Assert.That(mapped.IsSuccess).IsTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task BindAsync_WhenResultIsSuccess_ItShouldInvokeBinderAndReturnResult()
|
||||
{
|
||||
var result = Result<Unit, Error>.Ok(default);
|
||||
var bound = await result.BindAsync(_ => Task.FromResult(Result<Unit, Error>.Fail(new Error("new_error", "new message"))));
|
||||
var result = Result.Ok<Unit, Error>(default);
|
||||
var bound = await result.BindAsync(_ => Task.FromResult(Result.Fail<Unit, Error>(new Error("new_error", "new message"))));
|
||||
|
||||
await Assert.That(bound.IsFailure).IsTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task BindAsync_WhenResultIsFailure_ItShouldReturnOriginalResult()
|
||||
{
|
||||
var result = Result<Unit, Error>.Fail(new Error("code", "message"));
|
||||
var bound = await result.BindAsync(_ => Task.FromResult(Result<Unit, Error>.Ok(default)));
|
||||
var result = Result.Fail<Unit, Error>(new Error("code", "message"));
|
||||
var bound = await result.BindAsync(_ => Task.FromResult(Result.Ok<Unit, Error>(default)));
|
||||
|
||||
await Assert.That(bound.IsFailure).IsTrue();
|
||||
await Assert.That(bound.Error.Code).IsEqualTo("code");
|
||||
}
|
||||
@@ -50,16 +57,18 @@ public class ResultAsyncExtensionsTests
|
||||
[Test]
|
||||
public async Task MatchAsync_WhenResultIsSuccess_ItShouldReturnOnSuccessValue()
|
||||
{
|
||||
var result = Result<Unit, Error>.Ok(default);
|
||||
var result = Result.Ok<Unit, Error>(default);
|
||||
var matched = await result.MatchAsync(_ => Task.FromResult("success"), _ => Task.FromResult("failure"));
|
||||
|
||||
await Assert.That(matched).IsEqualTo("success");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task MatchAsync_WhenResultIsFailure_ItShouldReturnOnFailureValue()
|
||||
{
|
||||
var result = Result<Unit, Error>.Fail(new Error("code", "message"));
|
||||
var result = Result.Fail<Unit, Error>(new Error("code", "message"));
|
||||
var matched = await result.MatchAsync(_ => Task.FromResult("success"), e => Task.FromResult(e.Code));
|
||||
|
||||
await Assert.That(matched).IsEqualTo("code");
|
||||
}
|
||||
|
||||
@@ -67,6 +76,7 @@ public class ResultAsyncExtensionsTests
|
||||
public async Task TryAsync_WhenActionSucceeds_ItShouldReturnOk()
|
||||
{
|
||||
var result = await ResultAsyncExtensions.TryAsync(() => Task.CompletedTask);
|
||||
|
||||
await Assert.That(result.IsSuccess).IsTrue();
|
||||
}
|
||||
|
||||
@@ -74,6 +84,7 @@ public class ResultAsyncExtensionsTests
|
||||
public async Task TryAsync_WhenActionThrowsException_ItShouldReturnFailWithUnexpectedError()
|
||||
{
|
||||
var result = await ResultAsyncExtensions.TryAsync(() => throw new InvalidOperationException("test error"));
|
||||
|
||||
await Assert.That(result.IsFailure).IsTrue();
|
||||
await Assert.That(result.Error.Code).IsEqualTo("UnexpectedError");
|
||||
}
|
||||
@@ -82,8 +93,10 @@ public class ResultAsyncExtensionsTests
|
||||
public async Task TryAsync_WhenActionThrowsException_ItShouldUseCustomError()
|
||||
{
|
||||
var result = await ResultAsyncExtensions.TryAsync(
|
||||
() => throw new InvalidOperationException("test"),
|
||||
ex => new Error("custom", ex.Message));
|
||||
() => throw new InvalidOperationException("test"),
|
||||
ex => new Error("custom", ex.Message)
|
||||
);
|
||||
|
||||
await Assert.That(result.IsFailure).IsTrue();
|
||||
await Assert.That(result.Error.Code).IsEqualTo("custom");
|
||||
}
|
||||
@@ -91,8 +104,9 @@ public class ResultAsyncExtensionsTests
|
||||
[Test]
|
||||
public async Task MapAsync_WhenResultIsSuccess_ItShouldTransformValue()
|
||||
{
|
||||
var result = Result<int, Error>.Ok(5);
|
||||
var result = Result.Ok<int, Error>(5);
|
||||
var mapped = await result.MapAsync(async n => (await Task.FromResult(n)).ToString(CultureInfo.InvariantCulture));
|
||||
|
||||
await Assert.That(mapped.IsSuccess).IsTrue();
|
||||
await Assert.That(mapped.Value).IsEqualTo("5");
|
||||
}
|
||||
@@ -101,8 +115,9 @@ public class ResultAsyncExtensionsTests
|
||||
public async Task MapAsync_WhenResultIsFailure_ItShouldPropagateError()
|
||||
{
|
||||
var error = new Error("code", "message");
|
||||
var result = Result<int, Error>.Fail(error);
|
||||
var result = Result.Fail<int, Error>(error);
|
||||
var mapped = await result.MapAsync(async n => (await Task.FromResult(n)).ToString(CultureInfo.InvariantCulture));
|
||||
|
||||
await Assert.That(mapped.IsFailure).IsTrue();
|
||||
await Assert.That(mapped.Error).IsEqualTo(error);
|
||||
}
|
||||
@@ -110,8 +125,9 @@ public class ResultAsyncExtensionsTests
|
||||
[Test]
|
||||
public async Task BindAsync_WhenResultIsSuccess_ItShouldChainToBinderResult()
|
||||
{
|
||||
var result = Result<int, Error>.Ok(5);
|
||||
var bound = await result.BindAsync(async n => await Task.FromResult(Result<string, Error>.Ok(n.ToString(CultureInfo.InvariantCulture))));
|
||||
var result = Result.Ok<int, Error>(5);
|
||||
var bound = await result.BindAsync(async n => await Task.FromResult(Result.Ok<string, Error>(n.ToString(CultureInfo.InvariantCulture))));
|
||||
|
||||
await Assert.That(bound.IsSuccess).IsTrue();
|
||||
await Assert.That(bound.Value).IsEqualTo("5");
|
||||
}
|
||||
@@ -120,8 +136,9 @@ public class ResultAsyncExtensionsTests
|
||||
public async Task BindAsync_WhenResultIsFailure_ItShouldPropagateError()
|
||||
{
|
||||
var error = new Error("code", "message");
|
||||
var result = Result<int, Error>.Fail(error);
|
||||
var bound = await result.BindAsync(async n => await Task.FromResult(Result<string, Error>.Ok(n.ToString(CultureInfo.InvariantCulture))));
|
||||
var result = Result.Fail<int, Error>(error);
|
||||
var bound = await result.BindAsync(async n => await Task.FromResult(Result.Ok<string, Error>(n.ToString(CultureInfo.InvariantCulture))));
|
||||
|
||||
await Assert.That(bound.IsFailure).IsTrue();
|
||||
await Assert.That(bound.Error).IsEqualTo(error);
|
||||
}
|
||||
@@ -129,20 +146,24 @@ public class ResultAsyncExtensionsTests
|
||||
[Test]
|
||||
public async Task MatchAsyncGeneric_WhenResultIsSuccess_ItShouldReturnOnSuccessValue()
|
||||
{
|
||||
var result = Result<string, Error>.Ok("test");
|
||||
var result = Result.Ok<string, Error>("test");
|
||||
var matched = await result.MatchAsync(
|
||||
v => Task.FromResult(v.Length),
|
||||
_ => Task.FromResult(0));
|
||||
v => Task.FromResult(v.Length),
|
||||
_ => Task.FromResult(0)
|
||||
);
|
||||
|
||||
await Assert.That(matched).IsEqualTo(4);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task MatchAsyncGeneric_WhenResultIsFailure_ItShouldReturnOnFailureValue()
|
||||
{
|
||||
var result = Result<string, Error>.Fail(new Error("code", "message"));
|
||||
var result = Result.Fail<string, Error>(new Error("code", "message"));
|
||||
var matched = await result.MatchAsync(
|
||||
v => Task.FromResult(v.Length),
|
||||
_ => Task.FromResult(-1));
|
||||
v => Task.FromResult(v.Length),
|
||||
_ => Task.FromResult(-1)
|
||||
);
|
||||
|
||||
await Assert.That(matched).IsEqualTo(-1);
|
||||
}
|
||||
|
||||
@@ -150,6 +171,7 @@ public class ResultAsyncExtensionsTests
|
||||
public async Task TryAsync_WhenFuncSucceeds_ItShouldReturnOkWithValue()
|
||||
{
|
||||
var result = await ResultAsyncExtensions.TryAsync(async () => await Task.FromResult(42));
|
||||
|
||||
await Assert.That(result.IsSuccess).IsTrue();
|
||||
await Assert.That(result.Value).IsEqualTo(42);
|
||||
}
|
||||
@@ -158,6 +180,7 @@ public class ResultAsyncExtensionsTests
|
||||
public async Task TryAsync_WhenFuncThrowsException_ItShouldReturnFailWithUnexpectedError()
|
||||
{
|
||||
var result = await ResultAsyncExtensions.TryAsync<int>(() => throw new InvalidOperationException("test error"));
|
||||
|
||||
await Assert.That(result.IsFailure).IsTrue();
|
||||
await Assert.That(result.Error.Code).IsEqualTo("UnexpectedError");
|
||||
}
|
||||
@@ -166,8 +189,10 @@ public class ResultAsyncExtensionsTests
|
||||
public async Task TryAsync_WhenFuncThrowsException_ItShouldUseCustomError()
|
||||
{
|
||||
var result = await ResultAsyncExtensions.TryAsync<int>(
|
||||
() => throw new InvalidOperationException("test"),
|
||||
ex => new Error("custom", ex.Message));
|
||||
() => throw new InvalidOperationException("test"),
|
||||
ex => new Error("custom", ex.Message)
|
||||
);
|
||||
|
||||
await Assert.That(result.IsFailure).IsTrue();
|
||||
await Assert.That(result.Error.Code).IsEqualTo("custom");
|
||||
}
|
||||
|
||||
@@ -7,7 +7,8 @@ public class ResultTTests
|
||||
[Test]
|
||||
public async Task Ok_WhenCalledWithValue_ItShouldReturnSuccessResult()
|
||||
{
|
||||
var result = Result<string, Error>.Ok("test");
|
||||
var result = Result.Ok<string, Error>("test");
|
||||
|
||||
await Assert.That(result.IsSuccess).IsTrue();
|
||||
await Assert.That(result.IsFailure).IsFalse();
|
||||
await Assert.That(result.Value).IsEqualTo("test");
|
||||
@@ -17,24 +18,25 @@ public class ResultTTests
|
||||
public async Task Fail_WhenCalled_ItShouldReturnFailureResult()
|
||||
{
|
||||
var error = new Error("code", "message");
|
||||
var result = Result<string, Error>.Fail(error);
|
||||
var result = Result.Fail<string, Error>(error);
|
||||
|
||||
await Assert.That(result.IsFailure).IsTrue();
|
||||
await Assert.That(result.IsSuccess).IsFalse();
|
||||
await Assert.That(result.Error).IsEqualTo(error);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Value_WhenResultIsFailure_ItShouldThrowInvalidOperationException()
|
||||
public void Value_WhenResultIsFailure_ItShouldThrowInvalidOperationException()
|
||||
{
|
||||
var result = Result<string, Error>.Fail(new Error("code", "message"));
|
||||
var result = Result.Fail<string, Error>(new Error("code", "message"));
|
||||
|
||||
Assert.Throws<InvalidOperationException>(() => _ = result.Value);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Error_WhenResultIsSuccess_ItShouldThrowInvalidOperationException()
|
||||
public void Error_WhenResultIsSuccess_ItShouldThrowInvalidOperationException()
|
||||
{
|
||||
var result = Result<string, Error>.Ok("test");
|
||||
var result = Result.Ok<string, Error>("test");
|
||||
|
||||
Assert.Throws<InvalidOperationException>(() => _ = result.Error);
|
||||
}
|
||||
@@ -43,6 +45,7 @@ public class ResultTTests
|
||||
public async Task ImplicitConversion_FromValue_ItShouldReturnSuccessResult()
|
||||
{
|
||||
Result<string, Error> result = "test";
|
||||
|
||||
await Assert.That(result.IsSuccess).IsTrue();
|
||||
await Assert.That(result.Value).IsEqualTo("test");
|
||||
}
|
||||
@@ -52,6 +55,7 @@ public class ResultTTests
|
||||
{
|
||||
var error = new Error("code", "message");
|
||||
Result<string, Error> result = error;
|
||||
|
||||
await Assert.That(result.IsFailure).IsTrue();
|
||||
await Assert.That(result.Error).IsEqualTo(error);
|
||||
}
|
||||
@@ -59,8 +63,9 @@ public class ResultTTests
|
||||
[Test]
|
||||
public async Task Map_WhenResultIsSuccess_ItShouldTransformValue()
|
||||
{
|
||||
var result = Result<int, Error>.Ok(5);
|
||||
var result = Result.Ok<int, Error>(5);
|
||||
var mapped = result.Map(n => n.ToString(CultureInfo.InvariantCulture));
|
||||
|
||||
await Assert.That(mapped.IsSuccess).IsTrue();
|
||||
await Assert.That(mapped.Value).IsEqualTo("5");
|
||||
}
|
||||
@@ -69,8 +74,9 @@ public class ResultTTests
|
||||
public async Task Map_WhenResultIsFailure_ItShouldPropagateError()
|
||||
{
|
||||
var error = new Error("code", "message");
|
||||
var result = Result<int, Error>.Fail(error);
|
||||
var result = Result.Fail<int, Error>(error);
|
||||
var mapped = result.Map(n => n.ToString(CultureInfo.InvariantCulture));
|
||||
|
||||
await Assert.That(mapped.IsFailure).IsTrue();
|
||||
await Assert.That(mapped.Error).IsEqualTo(error);
|
||||
}
|
||||
@@ -79,8 +85,9 @@ public class ResultTTests
|
||||
public async Task MapError_WhenResultIsFailure_ItShouldTransformError()
|
||||
{
|
||||
var originalError = new Error("original", "original message");
|
||||
var result = Result<int, Error>.Fail(originalError);
|
||||
var result = Result.Fail<int, Error>(originalError);
|
||||
var transformed = result.MapError(e => new Error("transformed", e.Message));
|
||||
|
||||
await Assert.That(transformed.IsFailure).IsTrue();
|
||||
await Assert.That(transformed.Error.Code).IsEqualTo("transformed");
|
||||
}
|
||||
@@ -88,8 +95,9 @@ public class ResultTTests
|
||||
[Test]
|
||||
public async Task MapError_WhenResultIsSuccess_ItShouldReturnUnchanged()
|
||||
{
|
||||
var result = Result<int, Error>.Ok(5);
|
||||
var result = Result.Ok<int, Error>(5);
|
||||
var mapped = result.MapError(e => new Error("transformed", e.Message));
|
||||
|
||||
await Assert.That(mapped.IsSuccess).IsTrue();
|
||||
await Assert.That(mapped.Value).IsEqualTo(5);
|
||||
}
|
||||
@@ -97,8 +105,9 @@ public class ResultTTests
|
||||
[Test]
|
||||
public async Task Bind_WhenResultIsSuccess_ItShouldChainToBinderResult()
|
||||
{
|
||||
var result = Result<int, Error>.Ok(5);
|
||||
var bound = result.Bind(n => Result<string, Error>.Ok(n.ToString(CultureInfo.InvariantCulture)));
|
||||
var result = Result.Ok<int, Error>(5);
|
||||
var bound = result.Bind(n => Result.Ok<string, Error>(n.ToString(CultureInfo.InvariantCulture)));
|
||||
|
||||
await Assert.That(bound.IsSuccess).IsTrue();
|
||||
await Assert.That(bound.Value).IsEqualTo("5");
|
||||
}
|
||||
@@ -107,8 +116,9 @@ public class ResultTTests
|
||||
public async Task Bind_WhenResultIsFailure_ItShouldPropagateError()
|
||||
{
|
||||
var error = new Error("code", "message");
|
||||
var result = Result<int, Error>.Fail(error);
|
||||
var bound = result.Bind(n => Result<string, Error>.Ok(n.ToString(CultureInfo.InvariantCulture)));
|
||||
var result = Result.Fail<int, Error>(error);
|
||||
var bound = result.Bind(n => Result.Ok<string, Error>(n.ToString(CultureInfo.InvariantCulture)));
|
||||
|
||||
await Assert.That(bound.IsFailure).IsTrue();
|
||||
await Assert.That(bound.Error).IsEqualTo(error);
|
||||
}
|
||||
@@ -116,8 +126,9 @@ public class ResultTTests
|
||||
[Test]
|
||||
public async Task Bind_WhenResultIsSuccess_ItShouldReturnBinderFailureResult()
|
||||
{
|
||||
var result = Result<int, Error>.Ok(5);
|
||||
var bound = result.Bind(_ => Result<string, Error>.Fail(new Error("bind_error", "bound failed")));
|
||||
var result = Result.Ok<int, Error>(5);
|
||||
var bound = result.Bind(_ => Result.Fail<string, Error>(new Error("bind_error", "bound failed")));
|
||||
|
||||
await Assert.That(bound.IsFailure).IsTrue();
|
||||
await Assert.That(bound.Error.Code).IsEqualTo("bind_error");
|
||||
}
|
||||
@@ -125,25 +136,29 @@ public class ResultTTests
|
||||
[Test]
|
||||
public async Task Match_WhenResultIsSuccess_ItShouldReturnOnSuccessValue()
|
||||
{
|
||||
var result = Result<string, Error>.Ok("test");
|
||||
var result = Result.Ok<string, Error>("test");
|
||||
var matched = result.Match(v => v.Length, _ => 0);
|
||||
|
||||
await Assert.That(matched).IsEqualTo(4);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Match_WhenResultIsFailure_ItShouldReturnOnFailureValue()
|
||||
{
|
||||
var result = Result<string, Error>.Fail(new Error("code", "message"));
|
||||
var result = Result.Fail<string, Error>(new Error("code", "message"));
|
||||
var matched = result.Match(v => v.Length, e => -1);
|
||||
|
||||
await Assert.That(matched).IsEqualTo(-1);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Match_WhenResultIsSuccess_ItShouldInvokeOnSuccess()
|
||||
{
|
||||
var result = Result<string, Error>.Ok("test");
|
||||
var result = Result.Ok<string, Error>("test");
|
||||
var invoked = false;
|
||||
|
||||
result.Match(v => { invoked = true; }, _ => { });
|
||||
|
||||
await Assert.That(invoked).IsTrue();
|
||||
}
|
||||
|
||||
@@ -151,16 +166,19 @@ public class ResultTTests
|
||||
public async Task Match_WhenResultIsFailure_ItShouldInvokeOnFailure()
|
||||
{
|
||||
var error = new Error("code", "message");
|
||||
var result = Result<string, Error>.Fail(error);
|
||||
var result = Result.Fail<string, Error>(error);
|
||||
var invoked = false;
|
||||
|
||||
result.Match(_ => { }, e => { invoked = true; });
|
||||
|
||||
await Assert.That(invoked).IsTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Try_WhenFuncSucceeds_ItShouldReturnOkWithValue()
|
||||
{
|
||||
var result = Result<int, Error>.Try(() => 42);
|
||||
var result = Result.Try<int, Error>(() => 42);
|
||||
|
||||
await Assert.That(result.IsSuccess).IsTrue();
|
||||
await Assert.That(result.Value).IsEqualTo(42);
|
||||
}
|
||||
@@ -168,7 +186,8 @@ public class ResultTTests
|
||||
[Test]
|
||||
public async Task Try_WhenFuncThrowsException_ItShouldReturnFailWithUnexpectedError()
|
||||
{
|
||||
var result = Result<int, Error>.Try(() => throw new InvalidOperationException("test error"));
|
||||
var result = Result.Try<int, Error>(() => throw new InvalidOperationException("test error"));
|
||||
|
||||
await Assert.That(result.IsFailure).IsTrue();
|
||||
await Assert.That(result.Error.Code).IsEqualTo("UnexpectedError");
|
||||
}
|
||||
@@ -176,7 +195,8 @@ public class ResultTTests
|
||||
[Test]
|
||||
public async Task Try_WhenFuncThrowsException_ItShouldUseCustomError()
|
||||
{
|
||||
var result = Result<int, Error>.Try(() => throw new InvalidOperationException("test"), ex => new Error("custom", ex.Message));
|
||||
var result = Result.Try<int, Error>(() => throw new InvalidOperationException("test"), ex => new Error("custom", ex.Message));
|
||||
|
||||
await Assert.That(result.IsFailure).IsTrue();
|
||||
await Assert.That(result.Error.Code).IsEqualTo("custom");
|
||||
}
|
||||
|
||||
@@ -5,7 +5,8 @@ public class ResultTests
|
||||
[Test]
|
||||
public async Task Ok_WhenCalled_ItShouldReturnSuccessResult()
|
||||
{
|
||||
var result = Result<Unit, Error>.Ok(default);
|
||||
var result = Result.Ok<Unit, Error>(default);
|
||||
|
||||
await Assert.That(result.IsSuccess).IsTrue();
|
||||
await Assert.That(result.IsFailure).IsFalse();
|
||||
}
|
||||
@@ -14,16 +15,17 @@ public class ResultTests
|
||||
public async Task Fail_WhenCalled_ItShouldReturnFailureResult()
|
||||
{
|
||||
var error = new Error("code", "message");
|
||||
var result = Result<Unit, Error>.Fail(error);
|
||||
var result = Result.Fail<Unit, Error>(error);
|
||||
|
||||
await Assert.That(result.IsSuccess).IsFalse();
|
||||
await Assert.That(result.IsFailure).IsTrue();
|
||||
await Assert.That(result.Error).IsEqualTo(error);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Error_WhenResultIsSuccess_ItShouldThrowInvalidOperationException()
|
||||
public void Error_WhenResultIsSuccess_ItShouldThrowInvalidOperationException()
|
||||
{
|
||||
Assert.Throws<InvalidOperationException>(() => _ = Result<Unit, Error>.Ok(default).Error);
|
||||
Assert.Throws<InvalidOperationException>(() => _ = Result.Ok<Unit, Error>(default).Error);
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -31,6 +33,7 @@ public class ResultTests
|
||||
{
|
||||
var error = new Error("code", "message");
|
||||
Result<Unit, Error> result = error;
|
||||
|
||||
await Assert.That(result.IsFailure).IsTrue();
|
||||
await Assert.That(result.Error).IsEqualTo(error);
|
||||
}
|
||||
@@ -38,42 +41,49 @@ public class ResultTests
|
||||
[Test]
|
||||
public async Task Map_WhenResultIsSuccess_ItShouldInvokeAction()
|
||||
{
|
||||
var result = Result<Unit, Error>.Ok(default);
|
||||
var result = Result.Ok<Unit, Error>(default);
|
||||
var invoked = false;
|
||||
|
||||
result.Map(_ => invoked = true);
|
||||
|
||||
await Assert.That(invoked).IsTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Map_WhenResultIsFailure_ItShouldSkipAction()
|
||||
{
|
||||
var result = Result<Unit, Error>.Fail(new Error("code", "message"));
|
||||
var result = Result.Fail<Unit, Error>(new Error("code", "message"));
|
||||
var invoked = false;
|
||||
|
||||
result.Map(_ => invoked = true);
|
||||
|
||||
await Assert.That(invoked).IsFalse();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Map_WhenCalled_ItShouldReturnOriginalResult()
|
||||
{
|
||||
var result = Result<Unit, Error>.Ok(default);
|
||||
var result = Result.Ok<Unit, Error>(default);
|
||||
var mapped = result.Map(_ => { });
|
||||
|
||||
await Assert.That(mapped.IsSuccess).IsTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Bind_WhenResultIsSuccess_ItShouldInvokeBinder()
|
||||
{
|
||||
var result = Result<Unit, Error>.Ok(default);
|
||||
var bound = result.Bind(_ => Result<Unit, Error>.Ok(default));
|
||||
var result = Result.Ok<Unit, Error>(default);
|
||||
var bound = result.Bind(_ => Result.Ok<Unit, Error>(default));
|
||||
|
||||
await Assert.That(bound.IsSuccess).IsTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Bind_WhenResultIsFailure_ItShouldReturnOriginalResult()
|
||||
{
|
||||
var result = Result<Unit, Error>.Fail(new Error("code", "message"));
|
||||
var bound = result.Bind(_ => Result<Unit, Error>.Ok(default));
|
||||
var result = Result.Fail<Unit, Error>(new Error("code", "message"));
|
||||
var bound = result.Bind(_ => Result.Ok<Unit, Error>(default));
|
||||
|
||||
await Assert.That(bound.IsFailure).IsTrue();
|
||||
await Assert.That(bound.Error).IsEqualTo(result.Error);
|
||||
}
|
||||
@@ -81,33 +91,38 @@ public class ResultTests
|
||||
[Test]
|
||||
public async Task Bind_WhenResultIsSuccess_ItShouldReturnBinderResult()
|
||||
{
|
||||
var result = Result<Unit, Error>.Ok(default);
|
||||
var bound = result.Bind(_ => Result<Unit, Error>.Fail(new Error("new_error", "new message")));
|
||||
var result = Result.Ok<Unit, Error>(default);
|
||||
var bound = result.Bind(_ => Result.Fail<Unit, Error>(new Error("new_error", "new message")));
|
||||
|
||||
await Assert.That(bound.IsFailure).IsTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Match_WhenResultIsSuccess_ItShouldReturnOnSuccessValue()
|
||||
{
|
||||
var result = Result<Unit, Error>.Ok(default);
|
||||
var result = Result.Ok<Unit, Error>(default);
|
||||
var matched = result.Match(_ => "success", _ => "failure");
|
||||
|
||||
await Assert.That(matched).IsEqualTo("success");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Match_WhenResultIsFailure_ItShouldReturnOnFailureValue()
|
||||
{
|
||||
var result = Result<Unit, Error>.Fail(new Error("code", "message"));
|
||||
var result = Result.Fail<Unit, Error>(new Error("code", "message"));
|
||||
var matched = result.Match(_ => "success", e => e.Code);
|
||||
|
||||
await Assert.That(matched).IsEqualTo("code");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Match_WhenResultIsSuccess_ItShouldInvokeOnSuccess()
|
||||
{
|
||||
var result = Result<Unit, Error>.Ok(default);
|
||||
var result = Result.Ok<Unit, Error>(default);
|
||||
var invoked = false;
|
||||
|
||||
result.Match(_ => invoked = true, _ => { });
|
||||
|
||||
await Assert.That(invoked).IsTrue();
|
||||
}
|
||||
|
||||
@@ -115,23 +130,27 @@ public class ResultTests
|
||||
public async Task Match_WhenResultIsFailure_ItShouldInvokeOnFailure()
|
||||
{
|
||||
var error = new Error("code", "message");
|
||||
var result = Result<Unit, Error>.Fail(error);
|
||||
var result = Result.Fail<Unit, Error>(error);
|
||||
var invoked = false;
|
||||
|
||||
result.Match(_ => { }, e => invoked = true);
|
||||
|
||||
await Assert.That(invoked).IsTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Try_WhenActionSucceeds_ItShouldReturnOk()
|
||||
{
|
||||
var result = Result<Unit, Error>.Try(() => default(Unit));
|
||||
var result = Result.Try<Unit, Error>(() => default);
|
||||
|
||||
await Assert.That(result.IsSuccess).IsTrue();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task Try_WhenActionThrowsException_ItShouldReturnFailWithUnexpectedError()
|
||||
{
|
||||
var result = Result<Unit, Error>.Try(() => throw new Exception("test error"));
|
||||
var result = Result.Try<Unit, Error>(() => throw new Exception("test error"));
|
||||
|
||||
await Assert.That(result.IsFailure).IsTrue();
|
||||
await Assert.That(result.Error.Code).IsEqualTo("UnexpectedError");
|
||||
}
|
||||
@@ -139,7 +158,8 @@ public class ResultTests
|
||||
[Test]
|
||||
public async Task Try_WhenActionThrowsException_ItShouldUseCustomError()
|
||||
{
|
||||
var result = Result<Unit, Error>.Try(() => throw new Exception("test"), ex => new Error("custom", ex.Message));
|
||||
var result = Result.Try<Unit, Error>(() => throw new Exception("test"), ex => new Error("custom", ex.Message));
|
||||
|
||||
await Assert.That(result.IsFailure).IsTrue();
|
||||
await Assert.That(result.Error.Code).IsEqualTo("custom");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user