Skip to content

Commit 257be61

Browse files
authored
Dev (#10)
* - add Orleans tests * - add inheritance serialization tests * - rename file, cleanup code * - bump version
1 parent 33e3e9c commit 257be61

23 files changed

+676
-4
lines changed

Diff for: .github/workflows/release.yml

+4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ env:
1111
FLUENTVALIDATIONPROJECTNAME: "ModResults.FluentValidation"
1212

1313
CORETESTSPROJECTNAME: "ModResults.Tests"
14+
ORLEANSTESTSPROJECTNAME: "ModResults.Orleans.Tests"
1415

1516
jobs:
1617
build:
@@ -45,6 +46,9 @@ jobs:
4546
- name: Test
4647
run: dotnet test ${{ env.CORETESTSPROJECTNAME }} --no-restore --verbosity normal
4748
working-directory: tests
49+
- name: Test
50+
run: dotnet test ${{ env.ORLEANSTESTSPROJECTNAME }} --no-restore --verbosity normal
51+
working-directory: tests
4852

4953
- name: Package nuget core
5054
run: dotnet pack ${{ env.COREPROJECTNAME }} --configuration Release --no-build -o:package

Diff for: Directory.Build.props

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@
1818
<PackageLicenseExpression>MIT</PackageLicenseExpression>
1919
<PackageRequireLicenseAcceptance>True</PackageRequireLicenseAcceptance>
2020

21-
<Version>0.4.0</Version>
21+
<Version>0.4.1</Version>
2222
</PropertyGroup>
2323
</Project>

Diff for: ModResults.sln

+7-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{ACF9
99
EndProject
1010
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{C680AD94-D5CB-4D15-B910-D9911821ABD7}"
1111
ProjectSection(SolutionItems) = preProject
12-
.github\workflows\push.yml = .github\workflows\push.yml
1312
.github\workflows\release.yml = .github\workflows\release.yml
1413
EndProjectSection
1514
EndProject
@@ -33,6 +32,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{FCF7ABBA
3332
EndProject
3433
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModResults.Tests", "tests\ModResults.Tests\ModResults.Tests.csproj", "{1B04631D-CDA1-44F9-B80E-8DB8406458E9}"
3534
EndProject
35+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModResults.Orleans.Tests", "tests\ModResults.Orleans.Tests\ModResults.Orleans.Tests.csproj", "{CB78743D-D4E6-4DF5-81C9-6966898B9A1B}"
36+
EndProject
3637
Global
3738
GlobalSection(SolutionConfigurationPlatforms) = preSolution
3839
Debug|Any CPU = Debug|Any CPU
@@ -59,6 +60,10 @@ Global
5960
{1B04631D-CDA1-44F9-B80E-8DB8406458E9}.Debug|Any CPU.Build.0 = Debug|Any CPU
6061
{1B04631D-CDA1-44F9-B80E-8DB8406458E9}.Release|Any CPU.ActiveCfg = Release|Any CPU
6162
{1B04631D-CDA1-44F9-B80E-8DB8406458E9}.Release|Any CPU.Build.0 = Release|Any CPU
63+
{CB78743D-D4E6-4DF5-81C9-6966898B9A1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
64+
{CB78743D-D4E6-4DF5-81C9-6966898B9A1B}.Debug|Any CPU.Build.0 = Debug|Any CPU
65+
{CB78743D-D4E6-4DF5-81C9-6966898B9A1B}.Release|Any CPU.ActiveCfg = Release|Any CPU
66+
{CB78743D-D4E6-4DF5-81C9-6966898B9A1B}.Release|Any CPU.Build.0 = Release|Any CPU
6267
EndGlobalSection
6368
GlobalSection(SolutionProperties) = preSolution
6469
HideSolutionNode = FALSE
@@ -70,6 +75,7 @@ Global
7075
{67104946-4262-4DF3-A800-67435A8E7B68} = {EF5E500D-5674-442A-9031-86FC6566A2D6}
7176
{064DF5F9-C20B-4D31-98B7-C8B69562FF11} = {EF5E500D-5674-442A-9031-86FC6566A2D6}
7277
{1B04631D-CDA1-44F9-B80E-8DB8406458E9} = {FCF7ABBA-E00C-438F-B755-D0A1EC92EB73}
78+
{CB78743D-D4E6-4DF5-81C9-6966898B9A1B} = {FCF7ABBA-E00C-438F-B755-D0A1EC92EB73}
7379
EndGlobalSection
7480
GlobalSection(ExtensibilityGlobals) = postSolution
7581
SolutionGuid = {0F45E2EB-11CB-4ADE-AAC3-7000FBCDF49E}

Diff for: tests/ModResults.Orleans.Tests/ClusterCollection.cs

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace ModResults.Orleans.Tests;
2+
3+
[CollectionDefinition(Name)]
4+
public sealed class ClusterCollection : ICollectionFixture<ClusterFixture>
5+
{
6+
public const string Name = nameof(ClusterCollection);
7+
}

Diff for: tests/ModResults.Orleans.Tests/ClusterFixture.cs

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using Orleans.TestingHost;
2+
3+
namespace ModResults.Orleans.Tests;
4+
public sealed class ClusterFixture : IDisposable
5+
{
6+
public TestCluster Cluster { get; } = new TestClusterBuilder().Build();
7+
8+
public ClusterFixture() => Cluster.Deploy();
9+
10+
void IDisposable.Dispose() => Cluster.StopAllSilos();
11+
}

Diff for: tests/ModResults.Orleans.Tests/ErrorChild.cs

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
namespace ModResults.Orleans.Tests;
2+
3+
[GenerateSerializer]
4+
internal class ErrorChild : Error
5+
{
6+
[Id(0)]
7+
public string Extra { get; init; }
8+
9+
public ErrorChild(string errorMessage, string? code, string extra) : base(errorMessage, code: code)
10+
{
11+
Extra = extra;
12+
}
13+
}

Diff for: tests/ModResults.Orleans.Tests/FactChild.cs

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace ModResults.Orleans.Tests;
2+
3+
[GenerateSerializer]
4+
internal class FactChild : Fact
5+
{
6+
[Id(0)]
7+
public string Extra { get; init; }
8+
public FactChild(string message, string? code, string extra) : base(message, code)
9+
{
10+
Extra = extra;
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace ModResults.Orleans.Tests;
2+
internal interface IInheritanceSerializationGrain : IGrainWithIntegerKey
3+
{
4+
Task<ErrorChild> GetErrorChild(string message, string? code, string extra);
5+
Task<FactChild> GetFactChild(string message, string? code, string extra);
6+
Task<WarningChild> GetWarningChild(string message, string? code, string extra);
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
namespace ModResults.Orleans.Tests;
2+
3+
internal interface IResultOfTSerializationGrain : IGrainWithIntegerKey
4+
{
5+
Task<Result<ValueClass>> FailedResultWithValueClass();
6+
Task<Result<ValueRecord>> FailedResultWithValueRecord();
7+
Task<Result<ValueStruct>> FailedResultWithValueStruct();
8+
Task<Result<ValueClass>> OkResultWithValueClass();
9+
Task<Result<ValueRecord>> OkResultWithValueRecord();
10+
Task<Result<ValueStruct>> OkResultWithValueStruct();
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace ModResults.Orleans.Tests;
2+
internal interface IResultSerializationGrain : IGrainWithIntegerKey
3+
{
4+
Task<Result> OkResult();
5+
Task<Result> FailedResult();
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
namespace ModResults.Orleans.Tests;
2+
internal class InheritanceSerializationGrain : IInheritanceSerializationGrain
3+
{
4+
public Task<ErrorChild> GetErrorChild(string message, string? code, string extra)
5+
{
6+
//Arrange
7+
var error = new ErrorChild(message, code, extra);
8+
9+
//Act
10+
return Task.FromResult(error);
11+
}
12+
13+
public Task<FactChild> GetFactChild(string message, string? code, string extra)
14+
{
15+
//Arrange
16+
var fact = new FactChild(message, code, extra);
17+
//Act
18+
return Task.FromResult(fact);
19+
}
20+
21+
public Task<WarningChild> GetWarningChild(string message, string? code, string extra)
22+
{
23+
//Arrange
24+
var warning = new WarningChild(message, code, extra);
25+
//Act
26+
return Task.FromResult(warning);
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using Orleans.TestingHost;
2+
3+
namespace ModResults.Orleans.Tests;
4+
5+
[Collection(ClusterCollection.Name)]
6+
public class InheritanceSerializationTests
7+
{
8+
private readonly TestCluster _cluster;
9+
10+
public InheritanceSerializationTests(ClusterFixture fixture)
11+
{
12+
_cluster = fixture.Cluster;
13+
}
14+
15+
[Fact]
16+
public async Task WarningInheritanceAsync()
17+
{
18+
// Arrange
19+
var testGrain = _cluster.GrainFactory.GetGrain<IInheritanceSerializationGrain>(0);
20+
// Act
21+
var warning = await testGrain.GetWarningChild("Warning Message", "Warning Code", "Warning Extra");
22+
23+
// Assert
24+
Assert.Equal("Warning Message", warning.Message);
25+
Assert.NotEqual("Warning message", warning.Message);
26+
Assert.Equal("Warning Code", warning.Code);
27+
Assert.NotEqual("Warning code", warning.Code);
28+
Assert.Equal("Warning Extra", warning.Extra);
29+
Assert.NotEqual("Warning extra", warning.Extra);
30+
}
31+
32+
[Fact]
33+
public async Task ErrorInheritanceAsync()
34+
{
35+
// Arrange
36+
var testGrain = _cluster.GrainFactory.GetGrain<IInheritanceSerializationGrain>(0);
37+
// Act
38+
var error = await testGrain.GetErrorChild("Error Message", "Error Code", "Error Extra");
39+
40+
// Assert
41+
Assert.Equal("Error Message", error.Message);
42+
Assert.NotEqual("Error message", error.Message);
43+
Assert.Equal("Error Code", error.Code);
44+
Assert.NotEqual("Error code", error.Code);
45+
Assert.Equal("Error Extra", error.Extra);
46+
Assert.NotEqual("Error extra", error.Extra);
47+
}
48+
49+
[Fact]
50+
public async Task FactInheritanceAsync()
51+
{
52+
// Arrange
53+
var testGrain = _cluster.GrainFactory.GetGrain<IInheritanceSerializationGrain>(0);
54+
// Act
55+
var fact = await testGrain.GetFactChild("Fact Message", "Fact Code", "Fact Extra");
56+
57+
// Assert
58+
Assert.Equal("Fact Message", fact.Message);
59+
Assert.NotEqual("Fact message", fact.Message);
60+
Assert.Equal("Fact Code", fact.Code);
61+
Assert.NotEqual("Fact code", fact.Code);
62+
Assert.Equal("Fact Extra", fact.Extra);
63+
Assert.NotEqual("Fact extra", fact.Extra);
64+
}
65+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net8.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
8+
<IsPackable>false</IsPackable>
9+
<IsTestProject>true</IsTestProject>
10+
</PropertyGroup>
11+
12+
<ItemGroup>
13+
<PackageReference Include="coverlet.collector" Version="6.0.0" />
14+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
15+
<PackageReference Include="Microsoft.Orleans.TestingHost" Version="9.0.1" />
16+
<PackageReference Include="xunit" Version="2.5.3" />
17+
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
18+
</ItemGroup>
19+
20+
<ItemGroup>
21+
<ProjectReference Include="..\..\src\ModResults.Orleans\ModResults.Orleans.csproj" />
22+
</ItemGroup>
23+
24+
<ItemGroup>
25+
<Using Include="Xunit" />
26+
</ItemGroup>
27+
28+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+

2+
namespace ModResults.Orleans.Tests;
3+
internal class ResultOfTSerializationGrain : IResultOfTSerializationGrain
4+
{
5+
private readonly Fact fact1, fact2, fact3;
6+
private readonly Warning warning1, warning2, warning3;
7+
private readonly Error error1, error2, error3, error4, error5;
8+
9+
public ResultOfTSerializationGrain()
10+
{
11+
fact1 = new Fact();
12+
fact2 = new Fact("Fact 2", "F2");
13+
fact3 = new Fact("Fact 3", "F3");
14+
warning1 = new Warning();
15+
warning2 = new Warning("Warning 2", "W2");
16+
warning3 = new Warning("Warning 3", "W3");
17+
error1 = new Error();
18+
error2 = new Error("Error 2", code: "E2");
19+
error3 = new Error("Error 3", code: "E3");
20+
error4 = new Error(new InvalidOperationException("Error 4"));
21+
error5 = new Error(new ApplicationException("Error 5", new ArgumentException("Error 5 Inner")));
22+
}
23+
24+
public Task<Result<ValueClass>> FailedResultWithValueClass()
25+
{
26+
// Arrange
27+
var facts = new List<Fact> { fact3 };
28+
var warnings = new List<Warning> { warning1, warning2, warning3 };
29+
var errors = new List<Error> { error1, error2, error3, error4, error5 };
30+
var resultOfTOriginal = new Result<ValueClass>(
31+
false,
32+
null,
33+
new Failure(FailureType.Error, errors),
34+
new Statements(facts, warnings));
35+
36+
//Act
37+
return Task.FromResult(resultOfTOriginal);
38+
}
39+
40+
public Task<Result<ValueRecord>> FailedResultWithValueRecord()
41+
{
42+
// Arrange
43+
var facts = new List<Fact> { fact1, fact2 };
44+
var warnings = new List<Warning> { warning1 };
45+
var errors = new List<Error> { error1, error2, error5 };
46+
var resultOfTOriginal = new Result<ValueRecord>(
47+
false,
48+
null,
49+
new Failure(FailureType.Unspecified, errors),
50+
new Statements(facts, warnings));
51+
52+
//Act
53+
return Task.FromResult(resultOfTOriginal);
54+
}
55+
56+
public Task<Result<ValueStruct>> FailedResultWithValueStruct()
57+
{
58+
// Arrange
59+
var facts = new List<Fact> { fact1, fact2, fact3 };
60+
var warnings = new List<Warning> { warning1, warning2 };
61+
var errors = new List<Error> { error2, error5 };
62+
var resultOfTOriginal = new Result<ValueStruct>(
63+
false,
64+
default,
65+
new Failure(FailureType.Unavailable, errors),
66+
new Statements(facts, warnings));
67+
68+
//Act
69+
return Task.FromResult(resultOfTOriginal);
70+
}
71+
72+
public Task<Result<ValueClass>> OkResultWithValueClass()
73+
{
74+
// Arrange
75+
var facts = new List<Fact> { fact3, fact2, fact1 };
76+
var warnings = new List<Warning> { warning1, warning3 };
77+
var resultOfTOriginal = Result<ValueClass>.Ok(
78+
new ValueClass() { Number = 42, String = "Meaning of life." })
79+
.WithFacts(facts)
80+
.WithWarnings(warnings);
81+
82+
//Act
83+
return Task.FromResult(resultOfTOriginal);
84+
}
85+
86+
public Task<Result<ValueRecord>> OkResultWithValueRecord()
87+
{
88+
// Arrange
89+
var facts = new List<Fact> { fact3, fact2 };
90+
var warnings = new List<Warning> { warning1, warning3 };
91+
var resultOfTOriginal = Result<ValueRecord>.Ok(new(42, "Meaning of life."))
92+
.WithFacts(facts)
93+
.WithWarnings(warnings);
94+
95+
//Act
96+
return Task.FromResult(resultOfTOriginal);
97+
}
98+
99+
public Task<Result<ValueStruct>> OkResultWithValueStruct()
100+
{
101+
// Arrange
102+
var facts = new List<Fact> { fact3, fact2, fact1 };
103+
var warnings = new List<Warning> { warning1, warning3 };
104+
var statements = new Statements(facts, warnings);
105+
var resultOfTOriginal = Result<ValueStruct>.Ok(
106+
new ValueStruct() { Number = 42, String = "Meaning of life." })
107+
.WithStatements(statements);
108+
109+
//Act
110+
return Task.FromResult(resultOfTOriginal);
111+
}
112+
}

0 commit comments

Comments
 (0)