added main classes

This commit is contained in:
2023-11-27 20:41:39 +04:00
parent bae0e7b4a0
commit c17e15ef1e
15 changed files with 4069 additions and 0 deletions

View File

@@ -0,0 +1,55 @@
namespace Raliway.Tests.EnsureExtensions;
public class Satisfy
{
[Fact]
public void WhenRequirementWasSatisfied_ShouldBeSuccessful()
{
var result = Ensure.That(69)
.Satisfies(i => i < 100)
.Result();
Assert.True(result.IsSuccess);
Assert.Equal(69, result.Value);
}
[Fact]
public void WhenRequirementWasNotSatisfied_ShouldBeFailureWithDefaultError()
{
var error = Error.New(Ensure.DefaultErrorType, "Value {69} does not satisfy the requirement.");
var result = Ensure.That(69)
.Satisfies(i => i > 100)
.Result();
Assert.True(result.IsFailure);
Assert.Equal(error, result.Error);
}
[Fact]
public void WhenAllRequirementsWasSatisfied_ShouldBeSuccessful()
{
var result = Ensure.That<string?>("69")
.NotNull()
.NotEmpty()
.NotWhitespace()
.Satisfies(s => s == "69")
.Result();
Assert.True(result.IsSuccess);
Assert.Equal("69", result.Value);
}
[Fact]
public void WhenAnyRequirementWasNotSatisfied_ShouldBeFailureWithFirstError()
{
var error = Error.New(Ensure.DefaultErrorType, "Value {(string?)\" \"} is empty or consists exclusively of white-space characters.");
var result = Ensure.That((string?)" ")
.NotNull()
.NotEmpty()
.NotWhitespace()
.Satisfies(s => s == "69")
.Result();
Assert.True(result.IsFailure);
Assert.Equal(error, result.Error);
}
}

View File

@@ -0,0 +1,45 @@
namespace Railway.Tests.Errors;
public class Serialization
{
[Fact]
public void WhenSerializingManyErrors()
{
// Given
Error many_errors = new ManyErrors(new Error[]{
new ExpectedError("err1", "msg1"){
ExtensionData = {
["ext"] = "ext_value"
}
},
new ExceptionalError(new Exception("msg2")),
});
// When
var result = JsonSerializer.Serialize(many_errors);
// Then
Assert.Equal(
expected: "[{\"$$err\":0,\"Type\":\"err1\",\"Message\":\"msg1\",\"ext\":\"ext_value\"},{\"$$err\":1,\"Type\":\"Exception\",\"Message\":\"msg2\"}]",
result);
}
[Fact]
public void WhenDeserializingManyErrors()
{
// Given
var json = "[{\"$$err\":0,\"Type\":\"err1\",\"Message\":\"msg1\",\"ext\":\"ext_value\"},{\"$$err\":1,\"Type\":\"Exception\",\"Message\":\"msg2\"}]";
// When
var result = JsonSerializer.Deserialize<Error[]>(json);
// Then
Assert.True(result?.Length == 2);
Assert.Equal(
expected: new ManyErrors(new Error[]{
new ExpectedError("err1", "msg1"),
new ExceptionalError(new Exception("msg2")),
}),
result
);
Assert.Equal(
expected: "ext_value",
result[0].ExtensionData["ext"].ToString());
}
}

View File

@@ -0,0 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<AssemblyName>Just.Railway.Tests</AssemblyName>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="xunit" Version="2.6.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="6.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Railway\Railway.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,142 @@
namespace Raliway.Tests.Results;
public class GeneralUsage
{
[Fact]
public void TwoResultCombination_WhenThereIsAnError()
{
// Given
var result1 = Result.Success(1);
var result2 = Result.Failure(Error.New("some error"));
// When
var result = Result.Combine(result1, result2);
// Then
Assert.True(result.IsFailure);
Assert.Equal(result2.Error, result.Error);
}
[Fact]
public void TwoResultCombination_WhenThereAreTwoErrors()
{
// Given
var result1 = Result.Failure<byte>(Error.New("1"));
var result2 = Result.Failure(Error.New("2"));
// When
var result = Result.Combine(result1, result2);
// Then
Assert.True(result.IsFailure);
Assert.Equal(result1.Error + result2.Error, result.Error);
}
[Fact]
public void TwoResultCombination_WhenThereIsNoError()
{
// Given
var result1 = Result.Success(1);
var result2 = Result.Success(3.14);
// When
var result = Result.Combine(result1, result2);
// Then
Assert.True(result.IsSuccess);
}
[Fact]
public void ThreeResultCombination_WhenThereIsAnError()
{
// Given
var result1 = Result.Success(1);
var result2 = Result.Success(3.14);
var result3 = Result.Failure(Error.New("some error"));
// When
Result<(int, double)> result = Result.Combine(result1, result2, result3);
// Then
Assert.True(result.IsFailure);
Assert.Equal(result3.Error, result.Error);
}
[Fact]
public void ThreeResultCombination_WhenThereAreTwoErrors()
{
// Given
var result1 = Result.Failure<int?>(Error.New("1"));
var result2 = Result.Success(3.14);
var result3 = Result.Failure(Error.New("3"));
// When
Result<(int?, double)> result = Result.Combine(result1, result2, result3);
// Then
Assert.True(result.IsFailure);
Assert.Equal(result1.Error + result3.Error, result.Error);
}
[Fact]
public void ThreeResultCombination_WhenThereIsNoError()
{
// Given
var result1 = Result.Success(1);
var result2 = Result.Success(3.14);
var result3 = Result.Success();
// When
var result = Result.Combine(result1, result2, result3);
// Then
Assert.True(result.IsSuccess);
}
[Fact]
public void ChainedResultExtensions_WhenThereIsNoError()
{
// Given
// When
var result = Result.Success()
.Append(() => Result.Success(1))
.Append("test")
.Map((i, s) => $"{s}_{i}")
.Append("some")
.Bind((s1, s2) => Result.Success(string.Join(';', s1, s2)))
.Match(
onSuccess: s => s.ToUpper(),
onFailure: _ =>
{
Assert.Fail();
return "";
}
);
Assert.Equal("TEST_1;SOME", result);
}
[Fact]
public void ChainedResultExtensions_WhenThereIsAnError()
{
// Given
// When
var error = Error.New("test");
var result = Result.Success()
.Append(() => Result.Failure<int>(error))
.Append("test")
.Map((i, s) =>
{
Assert.Fail();
return Result.Success("");
})
.Append("some")
.Bind((s1, s2) =>
{
Assert.Fail();
return Result.Success("");
})
.Match(
onSuccess: _ =>
{
Assert.Fail();
return "";
},
onFailure: err =>
{
Assert.Equal(error, err);
return "satisfied";
}
);
// Then
Assert.Equal("satisfied", result);
}
}

3
Raliway.Tests/Usings.cs Normal file
View File

@@ -0,0 +1,3 @@
global using System.Text.Json;
global using Xunit;
global using Just.Railway;