From 9f28d50e2decdb9c6dd1a9f3202b942b4bd8d8bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=B6rner?= Date: Sat, 24 Jan 2026 10:23:59 +0100 Subject: [PATCH 01/13] Add props file for test dependencies --- .../Turnierplan.Adapter.Test.Functional.csproj | 16 ++-------------- .../Turnierplan.App.Test.Unit.csproj | 14 +------------- .../Turnierplan.Core.Test.Unit.csproj | 14 +------------- .../Turnierplan.Dal.Test.Unit.csproj | 14 +------------- .../Turnierplan.Localization.Test.Unit.csproj | 14 +------------- .../Turnierplan.PdfRendering.Test.Unit.csproj | 14 +------------- src/Turnierplan.Test.Common.props | 15 +++++++++++++++ src/turnierplan.NET.slnx | 1 + 8 files changed, 23 insertions(+), 79 deletions(-) create mode 100644 src/Turnierplan.Test.Common.props diff --git a/src/Turnierplan.Adapter.Test.Functional/Turnierplan.Adapter.Test.Functional.csproj b/src/Turnierplan.Adapter.Test.Functional/Turnierplan.Adapter.Test.Functional.csproj index d536bec1..6c8d11d3 100644 --- a/src/Turnierplan.Adapter.Test.Functional/Turnierplan.Adapter.Test.Functional.csproj +++ b/src/Turnierplan.Adapter.Test.Functional/Turnierplan.Adapter.Test.Functional.csproj @@ -8,20 +8,8 @@ true - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - + + diff --git a/src/Turnierplan.App.Test.Unit/Turnierplan.App.Test.Unit.csproj b/src/Turnierplan.App.Test.Unit/Turnierplan.App.Test.Unit.csproj index 3fc2a059..a7aa67a2 100644 --- a/src/Turnierplan.App.Test.Unit/Turnierplan.App.Test.Unit.csproj +++ b/src/Turnierplan.App.Test.Unit/Turnierplan.App.Test.Unit.csproj @@ -8,19 +8,7 @@ true - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - + diff --git a/src/Turnierplan.Core.Test.Unit/Turnierplan.Core.Test.Unit.csproj b/src/Turnierplan.Core.Test.Unit/Turnierplan.Core.Test.Unit.csproj index c206cede..d57bf0bf 100644 --- a/src/Turnierplan.Core.Test.Unit/Turnierplan.Core.Test.Unit.csproj +++ b/src/Turnierplan.Core.Test.Unit/Turnierplan.Core.Test.Unit.csproj @@ -8,19 +8,7 @@ true - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - + diff --git a/src/Turnierplan.Dal.Test.Unit/Turnierplan.Dal.Test.Unit.csproj b/src/Turnierplan.Dal.Test.Unit/Turnierplan.Dal.Test.Unit.csproj index fc00c807..2531a38e 100644 --- a/src/Turnierplan.Dal.Test.Unit/Turnierplan.Dal.Test.Unit.csproj +++ b/src/Turnierplan.Dal.Test.Unit/Turnierplan.Dal.Test.Unit.csproj @@ -8,19 +8,7 @@ true - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - + diff --git a/src/Turnierplan.Localization.Test.Unit/Turnierplan.Localization.Test.Unit.csproj b/src/Turnierplan.Localization.Test.Unit/Turnierplan.Localization.Test.Unit.csproj index ce126c64..c8f1bbb9 100644 --- a/src/Turnierplan.Localization.Test.Unit/Turnierplan.Localization.Test.Unit.csproj +++ b/src/Turnierplan.Localization.Test.Unit/Turnierplan.Localization.Test.Unit.csproj @@ -8,19 +8,7 @@ true - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - + diff --git a/src/Turnierplan.PdfRendering.Test.Unit/Turnierplan.PdfRendering.Test.Unit.csproj b/src/Turnierplan.PdfRendering.Test.Unit/Turnierplan.PdfRendering.Test.Unit.csproj index 11a48252..e69d1554 100644 --- a/src/Turnierplan.PdfRendering.Test.Unit/Turnierplan.PdfRendering.Test.Unit.csproj +++ b/src/Turnierplan.PdfRendering.Test.Unit/Turnierplan.PdfRendering.Test.Unit.csproj @@ -8,19 +8,7 @@ true - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - + diff --git a/src/Turnierplan.Test.Common.props b/src/Turnierplan.Test.Common.props new file mode 100644 index 00000000..b2cd38d2 --- /dev/null +++ b/src/Turnierplan.Test.Common.props @@ -0,0 +1,15 @@ + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + diff --git a/src/turnierplan.NET.slnx b/src/turnierplan.NET.slnx index dd863087..718cb313 100644 --- a/src/turnierplan.NET.slnx +++ b/src/turnierplan.NET.slnx @@ -4,6 +4,7 @@ + From f6ceedfc4cd2fcc19e2602460440b8630514db08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=B6rner?= Date: Sat, 24 Jan 2026 11:12:10 +0100 Subject: [PATCH 02/13] ADd basic regression test framework --- .../Expected/MyFirstTest.out | 20 +++++ .../IRegressionTest.cs | 8 ++ .../RegressionTestBase.cs | 65 ++++++++++++++++ .../RegressionTestRunner.cs | 74 +++++++++++++++++++ .../SubjectSerializer.cs | 36 +++++++++ .../Tests/MyFirstTest.cs | 33 +++++++++ .../Turnierplan.Core.Test.Regression.csproj | 20 +++++ src/turnierplan.NET.slnx | 1 + 8 files changed, 257 insertions(+) create mode 100644 src/Turnierplan.Core.Test.Regression/Expected/MyFirstTest.out create mode 100644 src/Turnierplan.Core.Test.Regression/IRegressionTest.cs create mode 100644 src/Turnierplan.Core.Test.Regression/RegressionTestBase.cs create mode 100644 src/Turnierplan.Core.Test.Regression/RegressionTestRunner.cs create mode 100644 src/Turnierplan.Core.Test.Regression/SubjectSerializer.cs create mode 100644 src/Turnierplan.Core.Test.Regression/Tests/MyFirstTest.cs create mode 100644 src/Turnierplan.Core.Test.Regression/Turnierplan.Core.Test.Regression.csproj diff --git a/src/Turnierplan.Core.Test.Regression/Expected/MyFirstTest.out b/src/Turnierplan.Core.Test.Regression/Expected/MyFirstTest.out new file mode 100644 index 00000000..7685565d --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/Expected/MyFirstTest.out @@ -0,0 +1,20 @@ +[1] +reg_name;Private;False;0;0;0;0 + +[2] +reg_name;Private;False;0;1;0;0 + +[3] +reg_name;Private;False;0;2;0;0 + +[4] +reg_name;Private;False;0;2;1;0 + +[5] +reg_name;Private;False;0;2;1;0 + +[6] +reg_name;Private;False;0;2;1;0 + +[7] +reg_name;Private;False;0;2;1;2 \ No newline at end of file diff --git a/src/Turnierplan.Core.Test.Regression/IRegressionTest.cs b/src/Turnierplan.Core.Test.Regression/IRegressionTest.cs new file mode 100644 index 00000000..82716f5c --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/IRegressionTest.cs @@ -0,0 +1,8 @@ +namespace Turnierplan.Core.Test.Regression; + +internal interface IRegressionTest +{ + void Execute(); + + string Result { get; } +} diff --git a/src/Turnierplan.Core.Test.Regression/RegressionTestBase.cs b/src/Turnierplan.Core.Test.Regression/RegressionTestBase.cs new file mode 100644 index 00000000..582157e6 --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/RegressionTestBase.cs @@ -0,0 +1,65 @@ +using System.Text; + +namespace Turnierplan.Core.Test.Regression; + +internal abstract class RegressionTestBase : IRegressionTest + where TSubject : class +{ + private readonly StringBuilder _builder = new(); + private TSubject? _subject; + private bool _finished; + private int _saveStateIndex; + + public string Result + { + get => !_finished ? throw new InvalidOperationException("This test is not finished yet.") : field; + private set; + } = string.Empty; + + private TSubject Subject => _subject ?? throw new InvalidOperationException("This test is not currently running."); + + public void Execute() + { + if (_subject is not null) + { + throw new InvalidOperationException("This test was already executed."); + } + + _subject = CreateSubject(); + AddSaveState(); + RunSteps(); + _finished = true; + Result = _builder.ToString(); + } + + + protected abstract TSubject CreateSubject(); + + protected abstract void RunSteps(); + + protected void Step(Action step) + { + step(Subject); + + AddSaveState(); + } + + protected TResult Step(Func step) + { + var result = step(Subject); + + AddSaveState(); + + return result; + } + + private void AddSaveState() + { + _builder.Append('['); + _builder.Append(++_saveStateIndex); + _builder.Append(']'); + _builder.AppendLine(); + _builder.AppendSubject(_subject); + _builder.AppendLine(); + } +} diff --git a/src/Turnierplan.Core.Test.Regression/RegressionTestRunner.cs b/src/Turnierplan.Core.Test.Regression/RegressionTestRunner.cs new file mode 100644 index 00000000..70cd7afb --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/RegressionTestRunner.cs @@ -0,0 +1,74 @@ +using System.Reflection; +using FluentAssertions; +using Xunit; +using Xunit.Abstractions; +using Xunit.Sdk; + +namespace Turnierplan.Core.Test.Regression; + +public sealed class RegressionTestRunner(ITestOutputHelper output) +{ + private static readonly string __outputFolderName = Path.GetFullPath($"test_output/{DateTime.UtcNow.Ticks}/"); + private static readonly Type __selfType = typeof(RegressionTestRunner); + + static RegressionTestRunner() + { + if (!Directory.Exists(__outputFolderName)) + { + Directory.CreateDirectory(__outputFolderName); + } + } + + [Theory] + [RegressionTestData] + public async Task RegressionTest___When_Executed___Produces_Expected_Result(string regressionTestName) + { + var typeName = $"{__selfType.Namespace}.Tests.{regressionTestName}"; + var type = __selfType.Assembly.GetType(typeName) ?? throw new InvalidOperationException($"Test type not found: '{typeName}'"); + + if (Activator.CreateInstance(type) is not IRegressionTest regressionTest) + { + throw new InvalidOperationException($"Test type could not be instantiated found: '{typeName}'"); + } + + output.WriteLine("The test type {0} was successfully instantiated.", typeName); + + regressionTest.Execute(); + var regressionTestOutput = regressionTest.Result.TrimEnd(); + output.WriteLine("All test steps were successfully executed and the result length is {0}", regressionTestOutput.Length); + + var outputFileName = Path.Join(__outputFolderName, $"{regressionTestName}.out"); + output.WriteLine("Writing test output to: '{0}'", outputFileName); + await File.WriteAllTextAsync(outputFileName, regressionTestOutput); + + var expectedFileResourceName = $"{__selfType.Namespace}.Expected.{regressionTestName}.out"; + output.WriteLine("Expected test output file: {0}", expectedFileResourceName); + await using var expectedFileStream = __selfType.Assembly.GetManifestResourceStream(expectedFileResourceName); + + if (expectedFileStream is null) + { + throw new InvalidOperationException($"Missing expected test output: '{expectedFileResourceName}'"); + } + + using var streamReader = new StreamReader(expectedFileStream); + var expectedTestOutput = (await streamReader.ReadToEndAsync()).TrimEnd(); + output.WriteLine("Expected test output was read and has a length of {0}", expectedTestOutput.Length); + + regressionTestOutput.Should().Be(expectedTestOutput); + } + + [AttributeUsage(AttributeTargets.Method)] + private sealed class RegressionTestDataAttribute : DataAttribute + { + public override IEnumerable GetData(MethodInfo testMethod) + { + var interfaceType = typeof(IRegressionTest); + + return __selfType.Assembly + .GetTypes() + .Where(type => type.IsAssignableTo(interfaceType) && type is { IsClass: true, IsAbstract: false }) + .Select(type => type.Name) + .Select(name => new object[] { name }); + } + } +} diff --git a/src/Turnierplan.Core.Test.Regression/SubjectSerializer.cs b/src/Turnierplan.Core.Test.Regression/SubjectSerializer.cs new file mode 100644 index 00000000..329eb324 --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/SubjectSerializer.cs @@ -0,0 +1,36 @@ +using System.Text; + +namespace Turnierplan.Core.Test.Regression; + +internal static class SubjectSerializer +{ + public static void AppendSubject(this StringBuilder builder, TSubject subject) + { + switch (subject) + { + case Tournament.Tournament tournament: + AppendTournament(builder, tournament); + break; + default: + throw new InvalidOperationException($"Subject type '{typeof(TSubject).FullName}' currently not supported for serialization."); + } + } + + private static void AppendTournament(StringBuilder builder, Tournament.Tournament tournament) + { + builder.Append(tournament.Name); + builder.Append(';'); + builder.Append(tournament.Visibility); + builder.Append(';'); + builder.Append(tournament.IsPublic); + builder.Append(';'); + builder.Append(tournament.PublicPageViews); + builder.Append(';'); + builder.Append(tournament.Teams.Count); + builder.Append(';'); + builder.Append(tournament.Groups.Count); + builder.Append(';'); + builder.Append(tournament.Matches.Count); + builder.AppendLine(); + } +} diff --git a/src/Turnierplan.Core.Test.Regression/Tests/MyFirstTest.cs b/src/Turnierplan.Core.Test.Regression/Tests/MyFirstTest.cs new file mode 100644 index 00000000..4534e6d9 --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/Tests/MyFirstTest.cs @@ -0,0 +1,33 @@ +using Turnierplan.Core.Tournament; + +namespace Turnierplan.Core.Test.Regression.Tests; + +internal sealed class MyFirstTest : RegressionTestBase +{ + protected override Tournament.Tournament CreateSubject() + { + return new Tournament.Tournament(new Organization.Organization(string.Empty), "reg_name", Visibility.Private); + } + + protected override void RunSteps() + { + var team1 = Step(t => t.AddTeam("Test 1")); + var team2 = Step(t => t.AddTeam("Test 2")); + + var group1 = Step(t => t.AddGroup('A')); + + Step(t => t.AddGroupParticipant(group1, team1)); + Step(t => t.AddGroupParticipant(group1, team2)); + + Step(t => t.GenerateMatchPlan(new MatchPlanConfiguration + { + GroupRoundConfig = new GroupRoundConfig + { + GroupMatchOrder = GroupMatchOrder.Alternating, + GroupPhaseRounds = 2 + }, + FinalsRoundConfig = null, + ScheduleConfig = null + })); + } +} diff --git a/src/Turnierplan.Core.Test.Regression/Turnierplan.Core.Test.Regression.csproj b/src/Turnierplan.Core.Test.Regression/Turnierplan.Core.Test.Regression.csproj new file mode 100644 index 00000000..8a6db644 --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/Turnierplan.Core.Test.Regression.csproj @@ -0,0 +1,20 @@ + + + + + net10.0 + enable + enable + true + + + + + + + + + + + + diff --git a/src/turnierplan.NET.slnx b/src/turnierplan.NET.slnx index 718cb313..ba0e0a96 100644 --- a/src/turnierplan.NET.slnx +++ b/src/turnierplan.NET.slnx @@ -7,6 +7,7 @@ + From c84d84ec9107f29443169b96012ddbdf57fbf277 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=B6rner?= Date: Sat, 24 Jan 2026 11:23:55 +0100 Subject: [PATCH 03/13] Add first full test --- .../Expected/MyFirstTest.out | 20 - .../Tournament4Teams1Group2RoundsNoFinals.out | 506 ++++++++++++++++++ .../SubjectSerializer.cs | 130 +++++ .../Tests/MyFirstTest.cs | 33 -- .../Tournament4Teams1Group2RoundsNoFinals.cs | 55 ++ 5 files changed, 691 insertions(+), 53 deletions(-) delete mode 100644 src/Turnierplan.Core.Test.Regression/Expected/MyFirstTest.out create mode 100644 src/Turnierplan.Core.Test.Regression/Expected/Tournament4Teams1Group2RoundsNoFinals.out delete mode 100644 src/Turnierplan.Core.Test.Regression/Tests/MyFirstTest.cs create mode 100644 src/Turnierplan.Core.Test.Regression/Tests/Tournament4Teams1Group2RoundsNoFinals.cs diff --git a/src/Turnierplan.Core.Test.Regression/Expected/MyFirstTest.out b/src/Turnierplan.Core.Test.Regression/Expected/MyFirstTest.out deleted file mode 100644 index 7685565d..00000000 --- a/src/Turnierplan.Core.Test.Regression/Expected/MyFirstTest.out +++ /dev/null @@ -1,20 +0,0 @@ -[1] -reg_name;Private;False;0;0;0;0 - -[2] -reg_name;Private;False;0;1;0;0 - -[3] -reg_name;Private;False;0;2;0;0 - -[4] -reg_name;Private;False;0;2;1;0 - -[5] -reg_name;Private;False;0;2;1;0 - -[6] -reg_name;Private;False;0;2;1;0 - -[7] -reg_name;Private;False;0;2;1;2 \ No newline at end of file diff --git a/src/Turnierplan.Core.Test.Regression/Expected/Tournament4Teams1Group2RoundsNoFinals.out b/src/Turnierplan.Core.Test.Regression/Expected/Tournament4Teams1Group2RoundsNoFinals.out new file mode 100644 index 00000000..7e38e631 --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/Expected/Tournament4Teams1Group2RoundsNoFinals.out @@ -0,0 +1,506 @@ +[1] +reg_name;Private;False;0;0;0;0 + +[2] +reg_name;Private;False;0;1;0;0 +T1;Test 1;;False;0;0;0;0;0;0 + +[3] +reg_name;Private;False;0;2;0;0 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 + +[4] +reg_name;Private;False;0;3;0;0 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 + +[5] +reg_name;Private;False;0;4;0;0 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 + +[6] +reg_name;Private;False;0;4;1;0 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +G5;A;;0 + +[7] +reg_name;Private;False;0;4;1;0 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +G5;A;;1 +>1;5;1;0;0;0;0;0;0;0;0;0;0 + +[8] +reg_name;Private;False;0;4;1;0 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +G5;A;;2 +>1;5;1;0;0;0;0;0;0;0;0;0;0 +>2;5;2;0;0;0;0;0;0;0;0;0;0 + +[9] +reg_name;Private;False;0;4;1;0 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +G5;A;;3 +>1;5;1;0;0;0;0;0;0;0;0;0;0 +>2;5;2;0;0;0;0;0;0;0;0;0;0 +>3;5;3;0;0;0;0;0;0;0;0;0;0 + +[10] +reg_name;Private;False;0;4;1;0 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +G5;A;;4 +>1;5;1;0;0;0;0;0;0;0;0;0;0 +>2;5;2;0;0;0;0;0;0;0;0;0;0 +>3;5;3;0;0;0;0;0;0;0;0;0;0 +>4;5;4;0;0;0;0;0;0;0;0;0;0 + +[11] +reg_name;Private;False;0;4;1;12 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +G5;A;;4 +>1;5;1;0;0;0;0;0;0;0;0;0;0 +>2;5;2;0;0;0;0;0;0;0;0;0;0 +>3;5;3;0;0;0;0;0;0;0;0;0;0 +>4;5;4;0;0;0;0;0;0;0;0;0;0 +M6;1;0;;G5/0;G5/1;;;5;True;False;;;;;;False +M7;2;0;;G5/2;G5/3;;;5;True;False;;;;;;False +M8;3;0;;G5/0;G5/2;;;5;True;False;;;;;;False +M9;4;0;;G5/1;G5/3;;;5;True;False;;;;;;False +M10;5;0;;G5/3;G5/0;;;5;True;False;;;;;;False +M11;6;0;;G5/1;G5/2;;;5;True;False;;;;;;False +M12;7;0;;G5/1;G5/0;;;5;True;False;;;;;;False +M13;8;0;;G5/3;G5/2;;;5;True;False;;;;;;False +M14;9;0;;G5/2;G5/0;;;5;True;False;;;;;;False +M15;10;0;;G5/3;G5/1;;;5;True;False;;;;;;False +M16;11;0;;G5/0;G5/3;;;5;True;False;;;;;;False +M17;12;0;;G5/2;G5/1;;;5;True;False;;;;;;False + +[12] +reg_name;Private;False;0;4;1;12 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +G5;A;;4 +>1;5;1;0;1;0;0;0;0;0;0;0;0 +>2;5;2;0;2;0;0;0;0;0;0;0;0 +>3;5;3;0;3;0;0;0;0;0;0;0;0 +>4;5;4;0;4;0;0;0;0;0;0;0;0 +M6;1;0;;G5/0;G5/1;1;2;5;True;False;;;;;;False +M7;2;0;;G5/2;G5/3;3;4;5;True;False;;;;;;False +M8;3;0;;G5/0;G5/2;1;3;5;True;False;;;;;;False +M9;4;0;;G5/1;G5/3;2;4;5;True;False;;;;;;False +M10;5;0;;G5/3;G5/0;4;1;5;True;False;;;;;;False +M11;6;0;;G5/1;G5/2;2;3;5;True;False;;;;;;False +M12;7;0;;G5/1;G5/0;2;1;5;True;False;;;;;;False +M13;8;0;;G5/3;G5/2;4;3;5;True;False;;;;;;False +M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False +M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False +M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False +M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False + +[13] +reg_name;Private;False;0;4;1;12 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +G5;A;;4 +>1;5;1;0;1;0;0;0;0;0;0;0;0 +>2;5;2;0;2;0;0;0;0;0;0;0;0 +>3;5;3;0;3;0;0;0;0;0;0;0;0 +>4;5;4;0;4;0;0;0;0;0;0;0;0 +M6;1;0;;G5/0;G5/1;1;2;5;True;False;;False;1;0;Standard;True +M7;2;0;;G5/2;G5/3;3;4;5;True;False;;;;;;False +M8;3;0;;G5/0;G5/2;1;3;5;True;False;;;;;;False +M9;4;0;;G5/1;G5/3;2;4;5;True;False;;;;;;False +M10;5;0;;G5/3;G5/0;4;1;5;True;False;;;;;;False +M11;6;0;;G5/1;G5/2;2;3;5;True;False;;;;;;False +M12;7;0;;G5/1;G5/0;2;1;5;True;False;;;;;;False +M13;8;0;;G5/3;G5/2;4;3;5;True;False;;;;;;False +M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False +M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False +M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False +M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False + +[14] +reg_name;Private;False;0;4;1;12 +T1;Test 1;;False;1;0;1;0;0;1 +T2;Test 2;;False;0;1;0;0;1;1 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +G5;A;;4 +>1;5;1;0;1;1;0;1;0;0;3;1;1 +>2;5;2;0;4;0;1;0;0;1;0;-1;1 +>3;5;3;0;2;0;0;0;0;0;0;0;0 +>4;5;4;0;3;0;0;0;0;0;0;0;0 +M6;1;0;;G5/0;G5/1;1;2;5;True;False;;False;1;0;Standard;True +M7;2;0;;G5/2;G5/3;3;4;5;True;False;;;;;;False +M8;3;0;;G5/0;G5/2;1;3;5;True;False;;;;;;False +M9;4;0;;G5/1;G5/3;2;4;5;True;False;;;;;;False +M10;5;0;;G5/3;G5/0;4;1;5;True;False;;;;;;False +M11;6;0;;G5/1;G5/2;2;3;5;True;False;;;;;;False +M12;7;0;;G5/1;G5/0;2;1;5;True;False;;;;;;False +M13;8;0;;G5/3;G5/2;4;3;5;True;False;;;;;;False +M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False +M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False +M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False +M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False + +[15] +reg_name;Private;False;0;4;1;12 +T1;Test 1;;False;1;0;1;0;0;1 +T2;Test 2;;False;0;1;0;0;1;1 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +G5;A;;4 +>1;5;1;0;1;1;0;1;0;0;3;1;1 +>2;5;2;0;4;0;1;0;0;1;0;-1;1 +>3;5;3;0;2;0;0;0;0;0;0;0;0 +>4;5;4;0;3;0;0;0;0;0;0;0;0 +M6;1;0;;G5/0;G5/1;1;2;5;True;False;;False;1;0;Standard;True +M7;2;0;;G5/2;G5/3;3;4;5;True;False;;False;2;2;Standard;True +M8;3;0;;G5/0;G5/2;1;3;5;True;False;;;;;;False +M9;4;0;;G5/1;G5/3;2;4;5;True;False;;;;;;False +M10;5;0;;G5/3;G5/0;4;1;5;True;False;;;;;;False +M11;6;0;;G5/1;G5/2;2;3;5;True;False;;;;;;False +M12;7;0;;G5/1;G5/0;2;1;5;True;False;;;;;;False +M13;8;0;;G5/3;G5/2;4;3;5;True;False;;;;;;False +M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False +M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False +M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False +M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False + +[16] +reg_name;Private;False;0;4;1;12 +T1;Test 1;;False;1;0;1;0;0;1 +T2;Test 2;;False;0;1;0;0;1;1 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +G5;A;;4 +>1;5;1;0;1;1;0;1;0;0;3;1;1 +>2;5;2;0;4;0;1;0;0;1;0;-1;1 +>3;5;3;0;2;0;0;0;0;0;0;0;0 +>4;5;4;0;3;0;0;0;0;0;0;0;0 +M6;1;0;;G5/0;G5/1;1;2;5;True;False;;False;1;0;Standard;True +M7;2;0;;G5/2;G5/3;3;4;5;True;False;;False;2;2;Standard;True +M8;3;0;;G5/0;G5/2;1;3;5;True;False;;False;3;1;Standard;True +M9;4;0;;G5/1;G5/3;2;4;5;True;False;;;;;;False +M10;5;0;;G5/3;G5/0;4;1;5;True;False;;;;;;False +M11;6;0;;G5/1;G5/2;2;3;5;True;False;;;;;;False +M12;7;0;;G5/1;G5/0;2;1;5;True;False;;;;;;False +M13;8;0;;G5/3;G5/2;4;3;5;True;False;;;;;;False +M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False +M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False +M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False +M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False + +[17] +reg_name;Private;False;0;4;1;12 +T1;Test 1;;False;4;1;2;0;0;2 +T2;Test 2;;False;0;1;0;0;1;1 +T3;Test 3;;False;3;5;0;1;1;2 +T4;Test 4;;False;2;2;0;1;0;1 +G5;A;;4 +>1;5;1;0;1;4;1;2;0;0;6;3;2 +>2;5;2;0;4;0;1;0;0;1;0;-1;1 +>3;5;3;0;3;3;5;0;1;1;1;-2;2 +>4;5;4;0;2;2;2;0;1;0;1;0;1 +M6;1;0;;G5/0;G5/1;1;2;5;True;False;;False;1;0;Standard;True +M7;2;0;;G5/2;G5/3;3;4;5;True;False;;False;2;2;Standard;True +M8;3;0;;G5/0;G5/2;1;3;5;True;False;;False;3;1;Standard;True +M9;4;0;;G5/1;G5/3;2;4;5;True;False;;;;;;False +M10;5;0;;G5/3;G5/0;4;1;5;True;False;;;;;;False +M11;6;0;;G5/1;G5/2;2;3;5;True;False;;;;;;False +M12;7;0;;G5/1;G5/0;2;1;5;True;False;;;;;;False +M13;8;0;;G5/3;G5/2;4;3;5;True;False;;;;;;False +M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False +M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False +M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False +M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False + +[18] +reg_name;Private;False;0;4;1;12 +T1;Test 1;;False;4;1;2;0;0;2 +T2;Test 2;;False;0;1;0;0;1;1 +T3;Test 3;;False;3;5;0;1;1;2 +T4;Test 4;;False;2;2;0;1;0;1 +G5;A;;4 +>1;5;1;0;1;4;1;2;0;0;6;3;2 +>2;5;2;0;4;0;1;0;0;1;0;-1;1 +>3;5;3;0;3;3;5;0;1;1;1;-2;2 +>4;5;4;0;2;2;2;0;1;0;1;0;1 +M6;1;0;;G5/0;G5/1;1;2;5;True;False;;False;1;0;Standard;True +M7;2;0;;G5/2;G5/3;3;4;5;True;False;;False;2;2;Standard;True +M8;3;0;;G5/0;G5/2;1;3;5;True;False;;False;3;1;Standard;True +M9;4;0;;G5/1;G5/3;2;4;5;True;False;;False;4;6;Standard;True +M10;5;0;;G5/3;G5/0;4;1;5;True;False;;;;;;False +M11;6;0;;G5/1;G5/2;2;3;5;True;False;;;;;;False +M12;7;0;;G5/1;G5/0;2;1;5;True;False;;;;;;False +M13;8;0;;G5/3;G5/2;4;3;5;True;False;;;;;;False +M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False +M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False +M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False +M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False + +[19] +reg_name;Private;False;0;4;1;12 +T1;Test 1;;False;4;1;2;0;0;2 +T2;Test 2;;False;0;1;0;0;1;1 +T3;Test 3;;False;3;5;0;1;1;2 +T4;Test 4;;False;2;2;0;1;0;1 +G5;A;;4 +>1;5;1;0;1;4;1;2;0;0;6;3;2 +>2;5;2;0;4;0;1;0;0;1;0;-1;1 +>3;5;3;0;3;3;5;0;1;1;1;-2;2 +>4;5;4;0;2;2;2;0;1;0;1;0;1 +M6;1;0;;G5/0;G5/1;1;2;5;True;False;;False;1;0;Standard;True +M7;2;0;;G5/2;G5/3;3;4;5;True;False;;False;2;2;Standard;True +M8;3;0;;G5/0;G5/2;1;3;5;True;False;;False;3;1;Standard;True +M9;4;0;;G5/1;G5/3;2;4;5;True;False;;False;4;6;Standard;True +M10;5;0;;G5/3;G5/0;4;1;5;True;False;;False;0;0;Standard;True +M11;6;0;;G5/1;G5/2;2;3;5;True;False;;;;;;False +M12;7;0;;G5/1;G5/0;2;1;5;True;False;;;;;;False +M13;8;0;;G5/3;G5/2;4;3;5;True;False;;;;;;False +M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False +M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False +M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False +M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False + +[20] +reg_name;Private;False;0;4;1;12 +T1;Test 1;;False;4;1;2;0;0;2 +T2;Test 2;;False;0;1;0;0;1;1 +T3;Test 3;;False;3;5;0;1;1;2 +T4;Test 4;;False;2;2;0;1;0;1 +G5;A;;4 +>1;5;1;0;1;4;1;2;0;0;6;3;2 +>2;5;2;0;4;0;1;0;0;1;0;-1;1 +>3;5;3;0;3;3;5;0;1;1;1;-2;2 +>4;5;4;0;2;2;2;0;1;0;1;0;1 +M6;1;0;;G5/0;G5/1;1;2;5;True;False;;False;1;0;Standard;True +M7;2;0;;G5/2;G5/3;3;4;5;True;False;;False;2;2;Standard;True +M8;3;0;;G5/0;G5/2;1;3;5;True;False;;False;3;1;Standard;True +M9;4;0;;G5/1;G5/3;2;4;5;True;False;;False;4;6;Standard;True +M10;5;0;;G5/3;G5/0;4;1;5;True;False;;False;0;0;Standard;True +M11;6;0;;G5/1;G5/2;2;3;5;True;False;;False;2;2;Standard;True +M12;7;0;;G5/1;G5/0;2;1;5;True;False;;;;;;False +M13;8;0;;G5/3;G5/2;4;3;5;True;False;;;;;;False +M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False +M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False +M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False +M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False + +[21] +reg_name;Private;False;0;4;1;12 +T1;Test 1;;False;4;1;2;0;0;2 +T2;Test 2;;False;0;1;0;0;1;1 +T3;Test 3;;False;3;5;0;1;1;2 +T4;Test 4;;False;2;2;0;1;0;1 +G5;A;;4 +>1;5;1;0;1;4;1;2;0;0;6;3;2 +>2;5;2;0;4;0;1;0;0;1;0;-1;1 +>3;5;3;0;3;3;5;0;1;1;1;-2;2 +>4;5;4;0;2;2;2;0;1;0;1;0;1 +M6;1;0;;G5/0;G5/1;1;2;5;True;False;;False;1;0;Standard;True +M7;2;0;;G5/2;G5/3;3;4;5;True;False;;False;2;2;Standard;True +M8;3;0;;G5/0;G5/2;1;3;5;True;False;;False;3;1;Standard;True +M9;4;0;;G5/1;G5/3;2;4;5;True;False;;False;4;6;Standard;True +M10;5;0;;G5/3;G5/0;4;1;5;True;False;;False;0;0;Standard;True +M11;6;0;;G5/1;G5/2;2;3;5;True;False;;False;2;2;Standard;True +M12;7;0;;G5/1;G5/0;2;1;5;True;False;;False;3;2;Standard;True +M13;8;0;;G5/3;G5/2;4;3;5;True;False;;;;;;False +M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False +M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False +M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False +M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False + +[22] +reg_name;Private;False;0;4;1;12 +T1;Test 1;;False;6;4;2;1;1;4 +T2;Test 2;;False;9;11;1;1;2;4 +T3;Test 3;;False;5;7;0;2;1;3 +T4;Test 4;;False;8;6;1;2;0;3 +G5;A;;4 +>1;5;1;0;1;6;4;2;1;1;7;2;4 +>2;5;2;0;3;9;11;1;1;2;4;-2;4 +>3;5;3;0;4;5;7;0;2;1;2;-2;3 +>4;5;4;0;2;8;6;1;2;0;5;2;3 +M6;1;0;;G5/0;G5/1;1;2;5;True;False;;False;1;0;Standard;True +M7;2;0;;G5/2;G5/3;3;4;5;True;False;;False;2;2;Standard;True +M8;3;0;;G5/0;G5/2;1;3;5;True;False;;False;3;1;Standard;True +M9;4;0;;G5/1;G5/3;2;4;5;True;False;;False;4;6;Standard;True +M10;5;0;;G5/3;G5/0;4;1;5;True;False;;False;0;0;Standard;True +M11;6;0;;G5/1;G5/2;2;3;5;True;False;;False;2;2;Standard;True +M12;7;0;;G5/1;G5/0;2;1;5;True;False;;False;3;2;Standard;True +M13;8;0;;G5/3;G5/2;4;3;5;True;False;;;;;;False +M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False +M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False +M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False +M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False + +[23] +reg_name;Private;False;0;4;1;12 +T1;Test 1;;False;6;4;2;1;1;4 +T2;Test 2;;False;9;11;1;1;2;4 +T3;Test 3;;False;5;7;0;2;1;3 +T4;Test 4;;False;8;6;1;2;0;3 +G5;A;;4 +>1;5;1;0;1;6;4;2;1;1;7;2;4 +>2;5;2;0;3;9;11;1;1;2;4;-2;4 +>3;5;3;0;4;5;7;0;2;1;2;-2;3 +>4;5;4;0;2;8;6;1;2;0;5;2;3 +M6;1;0;;G5/0;G5/1;1;2;5;True;False;;False;1;0;Standard;True +M7;2;0;;G5/2;G5/3;3;4;5;True;False;;False;2;2;Standard;True +M8;3;0;;G5/0;G5/2;1;3;5;True;False;;False;3;1;Standard;True +M9;4;0;;G5/1;G5/3;2;4;5;True;False;;False;4;6;Standard;True +M10;5;0;;G5/3;G5/0;4;1;5;True;False;;False;0;0;Standard;True +M11;6;0;;G5/1;G5/2;2;3;5;True;False;;False;2;2;Standard;True +M12;7;0;;G5/1;G5/0;2;1;5;True;False;;False;3;2;Standard;True +M13;8;0;;G5/3;G5/2;4;3;5;True;False;;False;1;1;Standard;True +M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False +M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False +M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False +M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False + +[24] +reg_name;Private;False;0;4;1;12 +T1;Test 1;;False;6;4;2;1;1;4 +T2;Test 2;;False;9;11;1;1;2;4 +T3;Test 3;;False;5;7;0;2;1;3 +T4;Test 4;;False;8;6;1;2;0;3 +G5;A;;4 +>1;5;1;0;1;6;4;2;1;1;7;2;4 +>2;5;2;0;3;9;11;1;1;2;4;-2;4 +>3;5;3;0;4;5;7;0;2;1;2;-2;3 +>4;5;4;0;2;8;6;1;2;0;5;2;3 +M6;1;0;;G5/0;G5/1;1;2;5;True;False;;False;1;0;Standard;True +M7;2;0;;G5/2;G5/3;3;4;5;True;False;;False;2;2;Standard;True +M8;3;0;;G5/0;G5/2;1;3;5;True;False;;False;3;1;Standard;True +M9;4;0;;G5/1;G5/3;2;4;5;True;False;;False;4;6;Standard;True +M10;5;0;;G5/3;G5/0;4;1;5;True;False;;False;0;0;Standard;True +M11;6;0;;G5/1;G5/2;2;3;5;True;False;;False;2;2;Standard;True +M12;7;0;;G5/1;G5/0;2;1;5;True;False;;False;3;2;Standard;True +M13;8;0;;G5/3;G5/2;4;3;5;True;False;;False;1;1;Standard;True +M14;9;0;;G5/2;G5/0;3;1;5;True;False;;False;0;3;Standard;True +M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False +M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False +M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False + +[25] +reg_name;Private;False;0;4;1;12 +T1;Test 1;;False;6;4;2;1;1;4 +T2;Test 2;;False;9;11;1;1;2;4 +T3;Test 3;;False;5;7;0;2;1;3 +T4;Test 4;;False;8;6;1;2;0;3 +G5;A;;4 +>1;5;1;0;1;6;4;2;1;1;7;2;4 +>2;5;2;0;3;9;11;1;1;2;4;-2;4 +>3;5;3;0;4;5;7;0;2;1;2;-2;3 +>4;5;4;0;2;8;6;1;2;0;5;2;3 +M6;1;0;;G5/0;G5/1;1;2;5;True;False;;False;1;0;Standard;True +M7;2;0;;G5/2;G5/3;3;4;5;True;False;;False;2;2;Standard;True +M8;3;0;;G5/0;G5/2;1;3;5;True;False;;False;3;1;Standard;True +M9;4;0;;G5/1;G5/3;2;4;5;True;False;;False;4;6;Standard;True +M10;5;0;;G5/3;G5/0;4;1;5;True;False;;False;0;0;Standard;True +M11;6;0;;G5/1;G5/2;2;3;5;True;False;;False;2;2;Standard;True +M12;7;0;;G5/1;G5/0;2;1;5;True;False;;False;3;2;Standard;True +M13;8;0;;G5/3;G5/2;4;3;5;True;False;;False;1;1;Standard;True +M14;9;0;;G5/2;G5/0;3;1;5;True;False;;False;0;3;Standard;True +M15;10;0;;G5/3;G5/1;4;2;5;True;False;;False;2;0;Standard;True +M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False +M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False + +[26] +reg_name;Private;False;0;4;1;12 +T1;Test 1;;False;6;4;2;1;1;4 +T2;Test 2;;False;9;11;1;1;2;4 +T3;Test 3;;False;5;7;0;2;1;3 +T4;Test 4;;False;8;6;1;2;0;3 +G5;A;;4 +>1;5;1;0;1;6;4;2;1;1;7;2;4 +>2;5;2;0;3;9;11;1;1;2;4;-2;4 +>3;5;3;0;4;5;7;0;2;1;2;-2;3 +>4;5;4;0;2;8;6;1;2;0;5;2;3 +M6;1;0;;G5/0;G5/1;1;2;5;True;False;;False;1;0;Standard;True +M7;2;0;;G5/2;G5/3;3;4;5;True;False;;False;2;2;Standard;True +M8;3;0;;G5/0;G5/2;1;3;5;True;False;;False;3;1;Standard;True +M9;4;0;;G5/1;G5/3;2;4;5;True;False;;False;4;6;Standard;True +M10;5;0;;G5/3;G5/0;4;1;5;True;False;;False;0;0;Standard;True +M11;6;0;;G5/1;G5/2;2;3;5;True;False;;False;2;2;Standard;True +M12;7;0;;G5/1;G5/0;2;1;5;True;False;;False;3;2;Standard;True +M13;8;0;;G5/3;G5/2;4;3;5;True;False;;False;1;1;Standard;True +M14;9;0;;G5/2;G5/0;3;1;5;True;False;;False;0;3;Standard;True +M15;10;0;;G5/3;G5/1;4;2;5;True;False;;False;2;0;Standard;True +M16;11;0;;G5/0;G5/3;1;4;5;True;False;;False;0;2;Standard;True +M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False + +[27] +reg_name;Private;False;0;4;1;12 +T1;Test 1;;False;6;4;2;1;1;4 +T2;Test 2;;False;9;11;1;1;2;4 +T3;Test 3;;False;5;7;0;2;1;3 +T4;Test 4;;False;8;6;1;2;0;3 +G5;A;;4 +>1;5;1;0;1;6;4;2;1;1;7;2;4 +>2;5;2;0;3;9;11;1;1;2;4;-2;4 +>3;5;3;0;4;5;7;0;2;1;2;-2;3 +>4;5;4;0;2;8;6;1;2;0;5;2;3 +M6;1;0;;G5/0;G5/1;1;2;5;True;False;;False;1;0;Standard;True +M7;2;0;;G5/2;G5/3;3;4;5;True;False;;False;2;2;Standard;True +M8;3;0;;G5/0;G5/2;1;3;5;True;False;;False;3;1;Standard;True +M9;4;0;;G5/1;G5/3;2;4;5;True;False;;False;4;6;Standard;True +M10;5;0;;G5/3;G5/0;4;1;5;True;False;;False;0;0;Standard;True +M11;6;0;;G5/1;G5/2;2;3;5;True;False;;False;2;2;Standard;True +M12;7;0;;G5/1;G5/0;2;1;5;True;False;;False;3;2;Standard;True +M13;8;0;;G5/3;G5/2;4;3;5;True;False;;False;1;1;Standard;True +M14;9;0;;G5/2;G5/0;3;1;5;True;False;;False;0;3;Standard;True +M15;10;0;;G5/3;G5/1;4;2;5;True;False;;False;2;0;Standard;True +M16;11;0;;G5/0;G5/3;1;4;5;True;False;;False;0;2;Standard;True +M17;12;0;;G5/2;G5/1;3;2;5;True;False;;False;2;1;Standard;True + +[28] +reg_name;Private;False;0;4;1;12 +T1;Test 1;;False;9;6;3;1;2;6 +T2;Test 2;;False;10;15;1;1;4;6 +T3;Test 3;;False;8;12;1;3;2;6 +T4;Test 4;;False;13;7;3;3;0;6 +G5;A;;4 +>1;5;1;0;2;9;6;3;1;2;10;3;6 +>2;5;2;0;4;10;15;1;1;4;4;-5;6 +>3;5;3;0;3;8;12;1;3;2;6;-4;6 +>4;5;4;0;1;13;7;3;3;0;12;6;6 +M6;1;0;;G5/0;G5/1;1;2;5;True;False;;False;1;0;Standard;True +M7;2;0;;G5/2;G5/3;3;4;5;True;False;;False;2;2;Standard;True +M8;3;0;;G5/0;G5/2;1;3;5;True;False;;False;3;1;Standard;True +M9;4;0;;G5/1;G5/3;2;4;5;True;False;;False;4;6;Standard;True +M10;5;0;;G5/3;G5/0;4;1;5;True;False;;False;0;0;Standard;True +M11;6;0;;G5/1;G5/2;2;3;5;True;False;;False;2;2;Standard;True +M12;7;0;;G5/1;G5/0;2;1;5;True;False;;False;3;2;Standard;True +M13;8;0;;G5/3;G5/2;4;3;5;True;False;;False;1;1;Standard;True +M14;9;0;;G5/2;G5/0;3;1;5;True;False;;False;0;3;Standard;True +M15;10;0;;G5/3;G5/1;4;2;5;True;False;;False;2;0;Standard;True +M16;11;0;;G5/0;G5/3;1;4;5;True;False;;False;0;2;Standard;True +M17;12;0;;G5/2;G5/1;3;2;5;True;False;;False;2;1;Standard;True \ No newline at end of file diff --git a/src/Turnierplan.Core.Test.Regression/SubjectSerializer.cs b/src/Turnierplan.Core.Test.Regression/SubjectSerializer.cs index 329eb324..eb112234 100644 --- a/src/Turnierplan.Core.Test.Regression/SubjectSerializer.cs +++ b/src/Turnierplan.Core.Test.Regression/SubjectSerializer.cs @@ -1,4 +1,5 @@ using System.Text; +using Turnierplan.Core.Tournament.TeamSelectors; namespace Turnierplan.Core.Test.Regression; @@ -32,5 +33,134 @@ private static void AppendTournament(StringBuilder builder, Tournament.Tournamen builder.Append(';'); builder.Append(tournament.Matches.Count); builder.AppendLine(); + + foreach (var team in tournament.Teams) + { + builder.Append('T'); + builder.Append(team.Id); + builder.Append(';'); + builder.Append(team.Name); + builder.Append(';'); + builder.Append(team.EntryFeePaidAt?.Ticks); + builder.Append(';'); + builder.Append(team.OutOfCompetition); + builder.Append(';'); + builder.Append(team.Statistics.ScoreFor); + builder.Append(';'); + builder.Append(team.Statistics.ScoreAgainst); + builder.Append(';'); + builder.Append(team.Statistics.MatchesWon); + builder.Append(';'); + builder.Append(team.Statistics.MatchesDrawn); + builder.Append(';'); + builder.Append(team.Statistics.MatchesLost); + builder.Append(';'); + builder.Append(team.Statistics.MatchesPlayed); + builder.AppendLine(); + } + + foreach (var group in tournament.Groups) + { + builder.Append('G'); + builder.Append(group.Id); + builder.Append(';'); + builder.Append(group.AlphabeticalId); + builder.Append(';'); + builder.Append(group.DisplayName); + builder.Append(';'); + builder.Append(group.Participants.Count); + builder.AppendLine(); + + foreach (var participant in group.Participants) + { + builder.Append('>'); + builder.Append(participant.Team.Id); + builder.Append(';'); + builder.Append(participant.Group.Id); + builder.Append(';'); + builder.Append(participant.Order); + builder.Append(';'); + builder.Append(participant.Priority); + builder.Append(';'); + builder.Append(participant.Statistics.Position); + builder.Append(';'); + builder.Append(participant.Statistics.ScoreFor); + builder.Append(';'); + builder.Append(participant.Statistics.ScoreAgainst); + builder.Append(';'); + builder.Append(participant.Statistics.MatchesWon); + builder.Append(';'); + builder.Append(participant.Statistics.MatchesDrawn); + builder.Append(';'); + builder.Append(participant.Statistics.MatchesLost); + builder.Append(';'); + builder.Append(participant.Statistics.Points); + builder.Append(';'); + builder.Append(participant.Statistics.ScoreDifference); + builder.Append(';'); + builder.Append(participant.Statistics.MatchesPlayed); + builder.AppendLine(); + } + } + + foreach (var match in tournament.Matches) + { + builder.Append('M'); + builder.Append(match.Id); + builder.Append(';'); + builder.Append(match.Index); + builder.Append(';'); + builder.Append(match.Court); + builder.Append(';'); + builder.Append(match.Kickoff?.Ticks); + builder.Append(';'); + builder.Append(ConvertTeamSelectorToString(match.TeamSelectorA)); + builder.Append(';'); + builder.Append(ConvertTeamSelectorToString(match.TeamSelectorB)); + builder.Append(';'); + builder.Append(match.TeamA?.Id); + builder.Append(';'); + builder.Append(match.TeamB?.Id); + builder.Append(';'); + builder.Append(match.Group?.Id); + builder.Append(';'); + builder.Append(match.IsGroupMatch); + builder.Append(';'); + builder.Append(match.IsDecidingMatch); + builder.Append(';'); + builder.Append(match.PlayoffPosition); + builder.Append(';'); + builder.Append(match.IsCurrentlyPlaying); + builder.Append(';'); + builder.Append(match.ScoreA); + builder.Append(';'); + builder.Append(match.ScoreB); + builder.Append(';'); + builder.Append(match.OutcomeType); + builder.Append(';'); + builder.Append(match.IsFinished); + builder.AppendLine(); + } + } + + /// Copied from the DAL project. + private static string ConvertTeamSelectorToString(TeamSelectorBase input) + { + switch (input) + { + case GroupDefinitionSelector groupDefinitionSelector: + return $"G{groupDefinitionSelector.TargetGroupId}/{groupDefinitionSelector.TargetTeamIndex}"; + case GroupResultsNthRankedSelector groupResultsNthRankedSelector: + var groupIds = string.Join(",", groupResultsNthRankedSelector.TargetGroupIds); + return $"N{groupIds}/{groupResultsNthRankedSelector.OrdinalNumber}/{groupResultsNthRankedSelector.PlacementRank}"; + case GroupResultsSelector groupResultsSelector: + return $"R{groupResultsSelector.TargetGroupId}/{groupResultsSelector.TargetGroupPosition}"; + case MatchSelector matchSelector: + return $"{(matchSelector.SelectionMode is MatchSelector.Mode.Winner ? "W" : "L")}{matchSelector.TargetMatchIndex}"; + case StaticTeamSelector staticTeamSelector: + return $"T{staticTeamSelector.TargetTeamId}"; + default: + return string.Empty; + } } } diff --git a/src/Turnierplan.Core.Test.Regression/Tests/MyFirstTest.cs b/src/Turnierplan.Core.Test.Regression/Tests/MyFirstTest.cs deleted file mode 100644 index 4534e6d9..00000000 --- a/src/Turnierplan.Core.Test.Regression/Tests/MyFirstTest.cs +++ /dev/null @@ -1,33 +0,0 @@ -using Turnierplan.Core.Tournament; - -namespace Turnierplan.Core.Test.Regression.Tests; - -internal sealed class MyFirstTest : RegressionTestBase -{ - protected override Tournament.Tournament CreateSubject() - { - return new Tournament.Tournament(new Organization.Organization(string.Empty), "reg_name", Visibility.Private); - } - - protected override void RunSteps() - { - var team1 = Step(t => t.AddTeam("Test 1")); - var team2 = Step(t => t.AddTeam("Test 2")); - - var group1 = Step(t => t.AddGroup('A')); - - Step(t => t.AddGroupParticipant(group1, team1)); - Step(t => t.AddGroupParticipant(group1, team2)); - - Step(t => t.GenerateMatchPlan(new MatchPlanConfiguration - { - GroupRoundConfig = new GroupRoundConfig - { - GroupMatchOrder = GroupMatchOrder.Alternating, - GroupPhaseRounds = 2 - }, - FinalsRoundConfig = null, - ScheduleConfig = null - })); - } -} diff --git a/src/Turnierplan.Core.Test.Regression/Tests/Tournament4Teams1Group2RoundsNoFinals.cs b/src/Turnierplan.Core.Test.Regression/Tests/Tournament4Teams1Group2RoundsNoFinals.cs new file mode 100644 index 00000000..d92d7e3e --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/Tests/Tournament4Teams1Group2RoundsNoFinals.cs @@ -0,0 +1,55 @@ +using Turnierplan.Core.Tournament; + +namespace Turnierplan.Core.Test.Regression.Tests; + +internal sealed class Tournament4Teams1Group2RoundsNoFinals : RegressionTestBase +{ + protected override Tournament.Tournament CreateSubject() + { + return new Tournament.Tournament(new Organization.Organization(string.Empty), "reg_name", Visibility.Private); + } + + protected override void RunSteps() + { + var team1 = Step(t => t.AddTeam("Test 1")); + var team2 = Step(t => t.AddTeam("Test 2")); + var team3 = Step(t => t.AddTeam("Test 3")); + var team4 = Step(t => t.AddTeam("Test 4")); + + var group1 = Step(t => t.AddGroup('A')); + + Step(t => t.AddGroupParticipant(group1, team1)); + Step(t => t.AddGroupParticipant(group1, team2)); + Step(t => t.AddGroupParticipant(group1, team3)); + Step(t => t.AddGroupParticipant(group1, team4)); + + Step(t => t.GenerateMatchPlan(new MatchPlanConfiguration + { + GroupRoundConfig = new GroupRoundConfig + { + GroupMatchOrder = GroupMatchOrder.Alternating, + GroupPhaseRounds = 2 + }, + FinalsRoundConfig = null, + ScheduleConfig = null + })); + + Step(t => t.Compute()); + Step(t => t.Matches[0].SetOutcome(false, 1, 0, MatchOutcomeType.Standard)); + Step(t => t.Compute()); + Step(t => t.Matches[1].SetOutcome(false, 2, 2, MatchOutcomeType.Standard)); + Step(t => t.Matches[2].SetOutcome(false, 3, 1, MatchOutcomeType.Standard)); + Step(t => t.Compute()); + Step(t => t.Matches[3].SetOutcome(false, 4, 6, MatchOutcomeType.Standard)); + Step(t => t.Matches[4].SetOutcome(false, 0, 0, MatchOutcomeType.Standard)); + Step(t => t.Matches[5].SetOutcome(false, 2, 2, MatchOutcomeType.Standard)); + Step(t => t.Matches[6].SetOutcome(false, 3, 2, MatchOutcomeType.Standard)); + Step(t => t.Compute()); + Step(t => t.Matches[7].SetOutcome(false, 1, 1, MatchOutcomeType.Standard)); + Step(t => t.Matches[8].SetOutcome(false, 0, 3, MatchOutcomeType.Standard)); + Step(t => t.Matches[9].SetOutcome(false, 2, 0, MatchOutcomeType.Standard)); + Step(t => t.Matches[10].SetOutcome(false, 0, 2, MatchOutcomeType.Standard)); + Step(t => t.Matches[11].SetOutcome(false, 2, 1, MatchOutcomeType.Standard)); + Step(t => t.Compute()); + } +} From d3a4ccc65be1479b6bfb877e469dec185a147bd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=B6rner?= Date: Sat, 24 Jan 2026 11:27:14 +0100 Subject: [PATCH 04/13] Remove blank lines --- .../Tournament4Teams1Group2RoundsNoFinals.out | 27 ------------------- .../RegressionTestBase.cs | 1 - 2 files changed, 28 deletions(-) diff --git a/src/Turnierplan.Core.Test.Regression/Expected/Tournament4Teams1Group2RoundsNoFinals.out b/src/Turnierplan.Core.Test.Regression/Expected/Tournament4Teams1Group2RoundsNoFinals.out index 7e38e631..2d451c93 100644 --- a/src/Turnierplan.Core.Test.Regression/Expected/Tournament4Teams1Group2RoundsNoFinals.out +++ b/src/Turnierplan.Core.Test.Regression/Expected/Tournament4Teams1Group2RoundsNoFinals.out @@ -1,28 +1,23 @@ [1] reg_name;Private;False;0;0;0;0 - [2] reg_name;Private;False;0;1;0;0 T1;Test 1;;False;0;0;0;0;0;0 - [3] reg_name;Private;False;0;2;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 - [4] reg_name;Private;False;0;3;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 - [5] reg_name;Private;False;0;4;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 T4;Test 4;;False;0;0;0;0;0;0 - [6] reg_name;Private;False;0;4;1;0 T1;Test 1;;False;0;0;0;0;0;0 @@ -30,7 +25,6 @@ T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 T4;Test 4;;False;0;0;0;0;0;0 G5;A;;0 - [7] reg_name;Private;False;0;4;1;0 T1;Test 1;;False;0;0;0;0;0;0 @@ -39,7 +33,6 @@ T3;Test 3;;False;0;0;0;0;0;0 T4;Test 4;;False;0;0;0;0;0;0 G5;A;;1 >1;5;1;0;0;0;0;0;0;0;0;0;0 - [8] reg_name;Private;False;0;4;1;0 T1;Test 1;;False;0;0;0;0;0;0 @@ -49,7 +42,6 @@ T4;Test 4;;False;0;0;0;0;0;0 G5;A;;2 >1;5;1;0;0;0;0;0;0;0;0;0;0 >2;5;2;0;0;0;0;0;0;0;0;0;0 - [9] reg_name;Private;False;0;4;1;0 T1;Test 1;;False;0;0;0;0;0;0 @@ -60,7 +52,6 @@ G5;A;;3 >1;5;1;0;0;0;0;0;0;0;0;0;0 >2;5;2;0;0;0;0;0;0;0;0;0;0 >3;5;3;0;0;0;0;0;0;0;0;0;0 - [10] reg_name;Private;False;0;4;1;0 T1;Test 1;;False;0;0;0;0;0;0 @@ -72,7 +63,6 @@ G5;A;;4 >2;5;2;0;0;0;0;0;0;0;0;0;0 >3;5;3;0;0;0;0;0;0;0;0;0;0 >4;5;4;0;0;0;0;0;0;0;0;0;0 - [11] reg_name;Private;False;0;4;1;12 T1;Test 1;;False;0;0;0;0;0;0 @@ -96,7 +86,6 @@ M14;9;0;;G5/2;G5/0;;;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;;;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;;;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;;;5;True;False;;;;;;False - [12] reg_name;Private;False;0;4;1;12 T1;Test 1;;False;0;0;0;0;0;0 @@ -120,7 +109,6 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False - [13] reg_name;Private;False;0;4;1;12 T1;Test 1;;False;0;0;0;0;0;0 @@ -144,7 +132,6 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False - [14] reg_name;Private;False;0;4;1;12 T1;Test 1;;False;1;0;1;0;0;1 @@ -168,7 +155,6 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False - [15] reg_name;Private;False;0;4;1;12 T1;Test 1;;False;1;0;1;0;0;1 @@ -192,7 +178,6 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False - [16] reg_name;Private;False;0;4;1;12 T1;Test 1;;False;1;0;1;0;0;1 @@ -216,7 +201,6 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False - [17] reg_name;Private;False;0;4;1;12 T1;Test 1;;False;4;1;2;0;0;2 @@ -240,7 +224,6 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False - [18] reg_name;Private;False;0;4;1;12 T1;Test 1;;False;4;1;2;0;0;2 @@ -264,7 +247,6 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False - [19] reg_name;Private;False;0;4;1;12 T1;Test 1;;False;4;1;2;0;0;2 @@ -288,7 +270,6 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False - [20] reg_name;Private;False;0;4;1;12 T1;Test 1;;False;4;1;2;0;0;2 @@ -312,7 +293,6 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False - [21] reg_name;Private;False;0;4;1;12 T1;Test 1;;False;4;1;2;0;0;2 @@ -336,7 +316,6 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False - [22] reg_name;Private;False;0;4;1;12 T1;Test 1;;False;6;4;2;1;1;4 @@ -360,7 +339,6 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False - [23] reg_name;Private;False;0;4;1;12 T1;Test 1;;False;6;4;2;1;1;4 @@ -384,7 +362,6 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False - [24] reg_name;Private;False;0;4;1;12 T1;Test 1;;False;6;4;2;1;1;4 @@ -408,7 +385,6 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;False;0;3;Standard;True M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False - [25] reg_name;Private;False;0;4;1;12 T1;Test 1;;False;6;4;2;1;1;4 @@ -432,7 +408,6 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;False;0;3;Standard;True M15;10;0;;G5/3;G5/1;4;2;5;True;False;;False;2;0;Standard;True M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False - [26] reg_name;Private;False;0;4;1;12 T1;Test 1;;False;6;4;2;1;1;4 @@ -456,7 +431,6 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;False;0;3;Standard;True M15;10;0;;G5/3;G5/1;4;2;5;True;False;;False;2;0;Standard;True M16;11;0;;G5/0;G5/3;1;4;5;True;False;;False;0;2;Standard;True M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False - [27] reg_name;Private;False;0;4;1;12 T1;Test 1;;False;6;4;2;1;1;4 @@ -480,7 +454,6 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;False;0;3;Standard;True M15;10;0;;G5/3;G5/1;4;2;5;True;False;;False;2;0;Standard;True M16;11;0;;G5/0;G5/3;1;4;5;True;False;;False;0;2;Standard;True M17;12;0;;G5/2;G5/1;3;2;5;True;False;;False;2;1;Standard;True - [28] reg_name;Private;False;0;4;1;12 T1;Test 1;;False;9;6;3;1;2;6 diff --git a/src/Turnierplan.Core.Test.Regression/RegressionTestBase.cs b/src/Turnierplan.Core.Test.Regression/RegressionTestBase.cs index 582157e6..7557f67d 100644 --- a/src/Turnierplan.Core.Test.Regression/RegressionTestBase.cs +++ b/src/Turnierplan.Core.Test.Regression/RegressionTestBase.cs @@ -60,6 +60,5 @@ private void AddSaveState() _builder.Append(']'); _builder.AppendLine(); _builder.AppendSubject(_subject); - _builder.AppendLine(); } } From 3c52b84c1acbea8309dd64df5c42cf57f01ddf3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=B6rner?= Date: Sat, 24 Jan 2026 11:57:12 +0100 Subject: [PATCH 05/13] Simplify by using ctor --- .../IRegressionTest.cs | 2 - .../RegressionTestBase.cs | 40 +++++++++---------- .../RegressionTestRunner.cs | 3 +- .../Tournament4Teams1Group2RoundsNoFinals.cs | 9 ++--- 4 files changed, 23 insertions(+), 31 deletions(-) diff --git a/src/Turnierplan.Core.Test.Regression/IRegressionTest.cs b/src/Turnierplan.Core.Test.Regression/IRegressionTest.cs index 82716f5c..37d57fa5 100644 --- a/src/Turnierplan.Core.Test.Regression/IRegressionTest.cs +++ b/src/Turnierplan.Core.Test.Regression/IRegressionTest.cs @@ -2,7 +2,5 @@ namespace Turnierplan.Core.Test.Regression; internal interface IRegressionTest { - void Execute(); - string Result { get; } } diff --git a/src/Turnierplan.Core.Test.Regression/RegressionTestBase.cs b/src/Turnierplan.Core.Test.Regression/RegressionTestBase.cs index 7557f67d..aeb3bb43 100644 --- a/src/Turnierplan.Core.Test.Regression/RegressionTestBase.cs +++ b/src/Turnierplan.Core.Test.Regression/RegressionTestBase.cs @@ -2,51 +2,49 @@ namespace Turnierplan.Core.Test.Regression; +internal abstract class TournamentRegressionTestBase : RegressionTestBase; + internal abstract class RegressionTestBase : IRegressionTest where TSubject : class { private readonly StringBuilder _builder = new(); private TSubject? _subject; - private bool _finished; private int _saveStateIndex; - public string Result - { - get => !_finished ? throw new InvalidOperationException("This test is not finished yet.") : field; - private set; - } = string.Empty; - - private TSubject Subject => _subject ?? throw new InvalidOperationException("This test is not currently running."); + public string Result => _builder.ToString(); - public void Execute() + protected void Subject(TSubject subject) { if (_subject is not null) { - throw new InvalidOperationException("This test was already executed."); + throw new InvalidOperationException($"The '{nameof(Subject)}()' method may only be called once."); } - _subject = CreateSubject(); + _subject = subject; + AddSaveState(); - RunSteps(); - _finished = true; - Result = _builder.ToString(); } - - protected abstract TSubject CreateSubject(); - - protected abstract void RunSteps(); - protected void Step(Action step) { - step(Subject); + if (_subject is null) + { + throw new InvalidOperationException($"Call '{nameof(Subject)}()' first to initialize the test subject."); + } + + step(_subject); AddSaveState(); } protected TResult Step(Func step) { - var result = step(Subject); + if (_subject is null) + { + throw new InvalidOperationException($"Call '{nameof(Subject)}()' first to initialize the test subject."); + } + + var result = step(_subject); AddSaveState(); diff --git a/src/Turnierplan.Core.Test.Regression/RegressionTestRunner.cs b/src/Turnierplan.Core.Test.Regression/RegressionTestRunner.cs index 70cd7afb..26359c50 100644 --- a/src/Turnierplan.Core.Test.Regression/RegressionTestRunner.cs +++ b/src/Turnierplan.Core.Test.Regression/RegressionTestRunner.cs @@ -33,9 +33,8 @@ public async Task RegressionTest___When_Executed___Produces_Expected_Result(stri output.WriteLine("The test type {0} was successfully instantiated.", typeName); - regressionTest.Execute(); var regressionTestOutput = regressionTest.Result.TrimEnd(); - output.WriteLine("All test steps were successfully executed and the result length is {0}", regressionTestOutput.Length); + output.WriteLine("The actual test result length is {0}", regressionTestOutput.Length); var outputFileName = Path.Join(__outputFolderName, $"{regressionTestName}.out"); output.WriteLine("Writing test output to: '{0}'", outputFileName); diff --git a/src/Turnierplan.Core.Test.Regression/Tests/Tournament4Teams1Group2RoundsNoFinals.cs b/src/Turnierplan.Core.Test.Regression/Tests/Tournament4Teams1Group2RoundsNoFinals.cs index d92d7e3e..b64fab87 100644 --- a/src/Turnierplan.Core.Test.Regression/Tests/Tournament4Teams1Group2RoundsNoFinals.cs +++ b/src/Turnierplan.Core.Test.Regression/Tests/Tournament4Teams1Group2RoundsNoFinals.cs @@ -2,15 +2,12 @@ namespace Turnierplan.Core.Test.Regression.Tests; -internal sealed class Tournament4Teams1Group2RoundsNoFinals : RegressionTestBase +internal sealed class Tournament4Teams1Group2RoundsNoFinals : TournamentRegressionTestBase { - protected override Tournament.Tournament CreateSubject() + public Tournament4Teams1Group2RoundsNoFinals() { - return new Tournament.Tournament(new Organization.Organization(string.Empty), "reg_name", Visibility.Private); - } + Subject(new Tournament.Tournament(new Organization.Organization(string.Empty), "reg_name", Visibility.Private)); - protected override void RunSteps() - { var team1 = Step(t => t.AddTeam("Test 1")); var team2 = Step(t => t.AddTeam("Test 2")); var team3 = Step(t => t.AddTeam("Test 3")); From 92dc24b1f08e062b7ef8e44d21a3555fefe3f12d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=B6rner?= Date: Sat, 24 Jan 2026 12:01:26 +0100 Subject: [PATCH 06/13] Subject init => base class --- .../RegressionTestBase.cs | 2 -- .../Tests/Tournament4Teams1Group2RoundsNoFinals.cs | 2 -- .../TournamentRegressionTestBase.cs | 11 +++++++++++ 3 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 src/Turnierplan.Core.Test.Regression/TournamentRegressionTestBase.cs diff --git a/src/Turnierplan.Core.Test.Regression/RegressionTestBase.cs b/src/Turnierplan.Core.Test.Regression/RegressionTestBase.cs index aeb3bb43..4d5b1062 100644 --- a/src/Turnierplan.Core.Test.Regression/RegressionTestBase.cs +++ b/src/Turnierplan.Core.Test.Regression/RegressionTestBase.cs @@ -2,8 +2,6 @@ namespace Turnierplan.Core.Test.Regression; -internal abstract class TournamentRegressionTestBase : RegressionTestBase; - internal abstract class RegressionTestBase : IRegressionTest where TSubject : class { diff --git a/src/Turnierplan.Core.Test.Regression/Tests/Tournament4Teams1Group2RoundsNoFinals.cs b/src/Turnierplan.Core.Test.Regression/Tests/Tournament4Teams1Group2RoundsNoFinals.cs index b64fab87..60d8b572 100644 --- a/src/Turnierplan.Core.Test.Regression/Tests/Tournament4Teams1Group2RoundsNoFinals.cs +++ b/src/Turnierplan.Core.Test.Regression/Tests/Tournament4Teams1Group2RoundsNoFinals.cs @@ -6,8 +6,6 @@ internal sealed class Tournament4Teams1Group2RoundsNoFinals : TournamentRegressi { public Tournament4Teams1Group2RoundsNoFinals() { - Subject(new Tournament.Tournament(new Organization.Organization(string.Empty), "reg_name", Visibility.Private)); - var team1 = Step(t => t.AddTeam("Test 1")); var team2 = Step(t => t.AddTeam("Test 2")); var team3 = Step(t => t.AddTeam("Test 3")); diff --git a/src/Turnierplan.Core.Test.Regression/TournamentRegressionTestBase.cs b/src/Turnierplan.Core.Test.Regression/TournamentRegressionTestBase.cs new file mode 100644 index 00000000..35779a37 --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/TournamentRegressionTestBase.cs @@ -0,0 +1,11 @@ +using Turnierplan.Core.Tournament; + +namespace Turnierplan.Core.Test.Regression; + +internal abstract class TournamentRegressionTestBase : RegressionTestBase +{ + protected TournamentRegressionTestBase() + { + Subject(new Tournament.Tournament(new Organization.Organization(string.Empty), "reg_name", Visibility.Private)); + } +} From 16319ae77818a3848ec7e5587f1cb7bdc73a754a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=B6rner?= Date: Sat, 24 Jan 2026 12:07:18 +0100 Subject: [PATCH 07/13] Add a second test --- ...ournament8Teams2Groups1RoundSemiFinals.out | 385 ++++++++++++++++++ ...Tournament8Teams2Groups1RoundSemiFinals.cs | 101 +++++ 2 files changed, 486 insertions(+) create mode 100644 src/Turnierplan.Core.Test.Regression/Expected/Tournament8Teams2Groups1RoundSemiFinals.out create mode 100644 src/Turnierplan.Core.Test.Regression/Tests/Tournament8Teams2Groups1RoundSemiFinals.cs diff --git a/src/Turnierplan.Core.Test.Regression/Expected/Tournament8Teams2Groups1RoundSemiFinals.out b/src/Turnierplan.Core.Test.Regression/Expected/Tournament8Teams2Groups1RoundSemiFinals.out new file mode 100644 index 00000000..1781326d --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/Expected/Tournament8Teams2Groups1RoundSemiFinals.out @@ -0,0 +1,385 @@ +[1] +reg_name;Private;False;0;0;0;0 +[2] +reg_name;Private;False;0;1;0;0 +T1;Test 1;;False;0;0;0;0;0;0 +[3] +reg_name;Private;False;0;2;0;0 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +[4] +reg_name;Private;False;0;3;0;0 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +[5] +reg_name;Private;False;0;4;0;0 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +[6] +reg_name;Private;False;0;5;0;0 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +T5;Test 5;;False;0;0;0;0;0;0 +[7] +reg_name;Private;False;0;6;0;0 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +T5;Test 5;;False;0;0;0;0;0;0 +T6;Test 6;;False;0;0;0;0;0;0 +[8] +reg_name;Private;False;0;7;0;0 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +T5;Test 5;;False;0;0;0;0;0;0 +T6;Test 6;;False;0;0;0;0;0;0 +T7;Test 7;;False;0;0;0;0;0;0 +[9] +reg_name;Private;False;0;8;0;0 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +T5;Test 5;;False;0;0;0;0;0;0 +T6;Test 6;;False;0;0;0;0;0;0 +T7;Test 7;;False;0;0;0;0;0;0 +T8;Test 8;;False;0;0;0;0;0;0 +[10] +reg_name;Private;False;0;8;1;0 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +T5;Test 5;;False;0;0;0;0;0;0 +T6;Test 6;;False;0;0;0;0;0;0 +T7;Test 7;;False;0;0;0;0;0;0 +T8;Test 8;;False;0;0;0;0;0;0 +G9;A;Apples;0 +[11] +reg_name;Private;False;0;8;2;0 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +T5;Test 5;;False;0;0;0;0;0;0 +T6;Test 6;;False;0;0;0;0;0;0 +T7;Test 7;;False;0;0;0;0;0;0 +T8;Test 8;;False;0;0;0;0;0;0 +G9;A;Apples;0 +G10;B;Bananas;0 +[12] +reg_name;Private;False;0;8;2;0 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +T5;Test 5;;False;0;0;0;0;0;0 +T6;Test 6;;False;0;0;0;0;0;0 +T7;Test 7;;False;0;0;0;0;0;0 +T8;Test 8;;False;0;0;0;0;0;0 +G9;A;Apples;4 +>1;9;1;0;0;0;0;0;0;0;0;0;0 +>2;9;2;0;0;0;0;0;0;0;0;0;0 +>3;9;3;0;0;0;0;0;0;0;0;0;0 +>4;9;4;0;0;0;0;0;0;0;0;0;0 +G10;B;Bananas;4 +>5;10;1;0;0;0;0;0;0;0;0;0;0 +>6;10;2;0;0;0;0;0;0;0;0;0;0 +>7;10;3;0;0;0;0;0;0;0;0;0;0 +>8;10;4;0;0;0;0;0;0;0;0;0;0 +[13] +reg_name;Private;False;0;8;2;16 +T1;Test 1;;False;0;0;0;0;0;0 +T2;Test 2;;False;0;0;0;0;0;0 +T3;Test 3;;False;0;0;0;0;0;0 +T4;Test 4;;False;0;0;0;0;0;0 +T5;Test 5;;False;0;0;0;0;0;0 +T6;Test 6;;False;0;0;0;0;0;0 +T7;Test 7;;False;0;0;0;0;0;0 +T8;Test 8;;False;0;0;0;0;0;0 +G9;A;Apples;4 +>1;9;1;0;0;0;0;0;0;0;0;0;0 +>2;9;2;0;0;0;0;0;0;0;0;0;0 +>3;9;3;0;0;0;0;0;0;0;0;0;0 +>4;9;4;0;0;0;0;0;0;0;0;0;0 +G10;B;Bananas;4 +>5;10;1;0;0;0;0;0;0;0;0;0;0 +>6;10;2;0;0;0;0;0;0;0;0;0;0 +>7;10;3;0;0;0;0;0;0;0;0;0;0 +>8;10;4;0;0;0;0;0;0;0;0;0;0 +M11;1;0;639028800000000000;G9/0;G9/1;;;9;True;False;;;;;;False +M12;2;0;639028807200000000;G9/2;G9/3;;;9;True;False;;;;;;False +M13;3;0;639028814400000000;G10/0;G10/1;;;10;True;False;;;;;;False +M14;4;0;639028821600000000;G10/2;G10/3;;;10;True;False;;;;;;False +M15;5;0;639028828800000000;G9/0;G9/2;;;9;True;False;;;;;;False +M16;6;0;639028836000000000;G9/1;G9/3;;;9;True;False;;;;;;False +M17;7;0;639028843200000000;G10/0;G10/2;;;10;True;False;;;;;;False +M18;8;0;639028850400000000;G10/1;G10/3;;;10;True;False;;;;;;False +M19;9;0;639028857600000000;G9/3;G9/0;;;9;True;False;;;;;;False +M20;10;0;639028864800000000;G9/1;G9/2;;;9;True;False;;;;;;False +M21;11;0;639028872000000000;G10/3;G10/0;;;10;True;False;;;;;;False +M22;12;0;639028879200000000;G10/1;G10/2;;;10;True;False;;;;;;False +M23;13;0;639028888200000000;R9/1;R10/2;;;;False;True;;;;;;False +M24;14;0;639028896600000000;R10/1;R9/2;;;;False;True;;;;;;False +M25;15;0;639028905000000000;L13;L14;;;;False;True;3;;;;;False +M26;16;0;639028913400000000;W13;W14;;;;False;True;1;;;;;False +[14] +reg_name;Private;False;0;8;2;16 +T1;Test 1;;False;1;0;1;1;0;2 +T2;Test 2;;False;1;2;0;1;1;2 +T3;Test 3;;False;2;1;1;1;0;2 +T4;Test 4;;False;2;3;0;1;1;2 +T5;Test 5;;False;1;3;0;0;1;1 +T6;Test 6;;False;3;1;1;0;0;1 +T7;Test 7;;False;2;2;0;1;0;1 +T8;Test 8;;False;2;2;0;1;0;1 +G9;A;Apples;4 +>1;9;1;0;2;1;0;1;1;0;4;1;2 +>2;9;2;0;4;1;2;0;1;1;1;-1;2 +>3;9;3;0;1;2;1;1;1;0;4;1;2 +>4;9;4;0;3;2;3;0;1;1;1;-1;2 +G10;B;Bananas;4 +>5;10;1;0;4;1;3;0;0;1;0;-2;1 +>6;10;2;0;1;3;1;1;0;0;3;2;1 +>7;10;3;0;2;2;2;0;1;0;1;0;1 +>8;10;4;0;3;2;2;0;1;0;1;0;1 +M11;1;0;639028800000000000;G9/0;G9/1;1;2;9;True;False;;False;1;0;Standard;True +M12;2;0;639028807200000000;G9/2;G9/3;3;4;9;True;False;;False;2;1;Standard;True +M13;3;0;639028814400000000;G10/0;G10/1;5;6;10;True;False;;False;1;3;Standard;True +M14;4;0;639028821600000000;G10/2;G10/3;7;8;10;True;False;;False;2;2;Standard;True +M15;5;0;639028828800000000;G9/0;G9/2;1;3;9;True;False;;False;0;0;Standard;True +M16;6;0;639028836000000000;G9/1;G9/3;2;4;9;True;False;;False;1;1;Standard;True +M17;7;0;639028843200000000;G10/0;G10/2;5;7;10;True;False;;;;;;False +M18;8;0;639028850400000000;G10/1;G10/3;6;8;10;True;False;;;;;;False +M19;9;0;639028857600000000;G9/3;G9/0;4;1;9;True;False;;;;;;False +M20;10;0;639028864800000000;G9/1;G9/2;2;3;9;True;False;;;;;;False +M21;11;0;639028872000000000;G10/3;G10/0;8;5;10;True;False;;;;;;False +M22;12;0;639028879200000000;G10/1;G10/2;6;7;10;True;False;;;;;;False +M23;13;0;639028888200000000;R9/1;R10/2;;;;False;True;;;;;;False +M24;14;0;639028896600000000;R10/1;R9/2;;;;False;True;;;;;;False +M25;15;0;639028905000000000;L13;L14;;;;False;True;3;;;;;False +M26;16;0;639028913400000000;W13;W14;;;;False;True;1;;;;;False +[15] +reg_name;Private;False;0;8;2;16 +T1;Test 1;;False;3;0;2;1;0;3 +T2;Test 2;;False;6;3;1;1;1;3 +T3;Test 3;;False;3;6;1;1;1;3 +T4;Test 4;;False;2;5;0;1;2;3 +T5;Test 5;;False;4;7;0;1;2;3 +T6;Test 6;;False;10;5;3;0;0;3 +T7;Test 7;;False;6;6;1;1;1;3 +T8;Test 8;;False;6;8;0;2;1;3 +G9;A;Apples;4 +>1;9;1;0;1;3;0;2;1;0;7;3;3 +>2;9;2;0;2;6;3;1;1;1;4;3;3 +>3;9;3;0;3;3;6;1;1;1;4;-3;3 +>4;9;4;0;4;2;5;0;1;2;1;-3;3 +G10;B;Bananas;4 +>5;10;1;0;4;4;7;0;1;2;1;-3;3 +>6;10;2;0;1;10;5;3;0;0;9;5;3 +>7;10;3;0;2;6;6;1;1;1;4;0;3 +>8;10;4;0;3;6;8;0;2;1;2;-2;3 +M11;1;0;639028800000000000;G9/0;G9/1;1;2;9;True;False;;False;1;0;Standard;True +M12;2;0;639028807200000000;G9/2;G9/3;3;4;9;True;False;;False;2;1;Standard;True +M13;3;0;639028814400000000;G10/0;G10/1;5;6;10;True;False;;False;1;3;Standard;True +M14;4;0;639028821600000000;G10/2;G10/3;7;8;10;True;False;;False;2;2;Standard;True +M15;5;0;639028828800000000;G9/0;G9/2;1;3;9;True;False;;False;0;0;Standard;True +M16;6;0;639028836000000000;G9/1;G9/3;2;4;9;True;False;;False;1;1;Standard;True +M17;7;0;639028843200000000;G10/0;G10/2;5;7;10;True;False;;False;1;2;Standard;True +M18;8;0;639028850400000000;G10/1;G10/3;6;8;10;True;False;;False;4;2;Standard;True +M19;9;0;639028857600000000;G9/3;G9/0;4;1;9;True;False;;False;0;2;Standard;True +M20;10;0;639028864800000000;G9/1;G9/2;2;3;9;True;False;;False;5;1;Standard;True +M21;11;0;639028872000000000;G10/3;G10/0;8;5;10;True;False;;False;2;2;Standard;True +M22;12;0;639028879200000000;G10/1;G10/2;6;7;10;True;False;;False;3;2;Standard;True +M23;13;0;639028888200000000;R9/1;R10/2;1;7;;False;True;;;;;;False +M24;14;0;639028896600000000;R10/1;R9/2;6;2;;False;True;;;;;;False +M25;15;0;639028905000000000;L13;L14;;;;False;True;3;;;;;False +M26;16;0;639028913400000000;W13;W14;;;;False;True;1;;;;;False +[16] +reg_name;Private;False;0;8;2;16 +T1;Test 1;;False;3;0;2;1;0;3 +T2;Test 2;;False;6;3;1;1;1;3 +T3;Test 3;;False;3;6;1;1;1;3 +T4;Test 4;;False;2;5;0;1;2;3 +T5;Test 5;;False;4;7;0;1;2;3 +T6;Test 6;;False;10;5;3;0;0;3 +T7;Test 7;;False;6;6;1;1;1;3 +T8;Test 8;;False;6;8;0;2;1;3 +G9;A;Apples;4 +>1;9;1;0;1;3;0;2;1;0;7;3;3 +>2;9;2;0;2;6;3;1;1;1;4;3;3 +>3;9;3;0;3;3;6;1;1;1;4;-3;3 +>4;9;4;0;4;2;5;0;1;2;1;-3;3 +G10;B;Bananas;4 +>5;10;1;0;4;4;7;0;1;2;1;-3;3 +>6;10;2;0;1;10;5;3;0;0;9;5;3 +>7;10;3;0;2;6;6;1;1;1;4;0;3 +>8;10;4;0;3;6;8;0;2;1;2;-2;3 +M11;1;0;639028800000000000;G9/0;G9/1;1;2;9;True;False;;False;1;0;Standard;True +M12;2;0;639028807200000000;G9/2;G9/3;3;4;9;True;False;;False;2;1;Standard;True +M13;3;0;639028814400000000;G10/0;G10/1;5;6;10;True;False;;False;1;3;Standard;True +M14;4;0;639028821600000000;G10/2;G10/3;7;8;10;True;False;;False;2;2;Standard;True +M15;5;0;639028828800000000;G9/0;G9/2;1;3;9;True;False;;False;0;0;Standard;True +M16;6;0;639028836000000000;G9/1;G9/3;2;4;9;True;False;;False;1;1;Standard;True +M17;7;0;639028843200000000;G10/0;G10/2;5;7;10;True;False;;False;1;2;Standard;True +M18;8;0;639028850400000000;G10/1;G10/3;6;8;10;True;False;;False;4;2;Standard;True +M19;9;0;639028857600000000;G9/3;G9/0;4;1;9;True;False;;False;0;2;Standard;True +M20;10;0;639028864800000000;G9/1;G9/2;2;3;9;True;False;;False;5;1;Standard;True +M21;11;0;639028872000000000;G10/3;G10/0;8;5;10;True;False;;False;2;2;Standard;True +M22;12;0;639028879200000000;G10/1;G10/2;6;7;10;True;False;;False;3;2;Standard;True +M23;13;0;639028888200000000;R9/1;R10/2;1;7;;False;True;;False;3;1;AfterOvertime;True +M24;14;0;639028896600000000;R10/1;R9/2;6;2;;False;True;;;;;;False +M25;15;0;639028905000000000;L13;L14;;;;False;True;3;;;;;False +M26;16;0;639028913400000000;W13;W14;;;;False;True;1;;;;;False +[17] +reg_name;Private;False;0;8;2;16 +T1;Test 1;;False;3;0;2;1;0;3 +T2;Test 2;;False;6;3;1;1;1;3 +T3;Test 3;;False;3;6;1;1;1;3 +T4;Test 4;;False;2;5;0;1;2;3 +T5;Test 5;;False;4;7;0;1;2;3 +T6;Test 6;;False;10;5;3;0;0;3 +T7;Test 7;;False;6;6;1;1;1;3 +T8;Test 8;;False;6;8;0;2;1;3 +G9;A;Apples;4 +>1;9;1;0;1;3;0;2;1;0;7;3;3 +>2;9;2;0;2;6;3;1;1;1;4;3;3 +>3;9;3;0;3;3;6;1;1;1;4;-3;3 +>4;9;4;0;4;2;5;0;1;2;1;-3;3 +G10;B;Bananas;4 +>5;10;1;0;4;4;7;0;1;2;1;-3;3 +>6;10;2;0;1;10;5;3;0;0;9;5;3 +>7;10;3;0;2;6;6;1;1;1;4;0;3 +>8;10;4;0;3;6;8;0;2;1;2;-2;3 +M11;1;0;639028800000000000;G9/0;G9/1;1;2;9;True;False;;False;1;0;Standard;True +M12;2;0;639028807200000000;G9/2;G9/3;3;4;9;True;False;;False;2;1;Standard;True +M13;3;0;639028814400000000;G10/0;G10/1;5;6;10;True;False;;False;1;3;Standard;True +M14;4;0;639028821600000000;G10/2;G10/3;7;8;10;True;False;;False;2;2;Standard;True +M15;5;0;639028828800000000;G9/0;G9/2;1;3;9;True;False;;False;0;0;Standard;True +M16;6;0;639028836000000000;G9/1;G9/3;2;4;9;True;False;;False;1;1;Standard;True +M17;7;0;639028843200000000;G10/0;G10/2;5;7;10;True;False;;False;1;2;Standard;True +M18;8;0;639028850400000000;G10/1;G10/3;6;8;10;True;False;;False;4;2;Standard;True +M19;9;0;639028857600000000;G9/3;G9/0;4;1;9;True;False;;False;0;2;Standard;True +M20;10;0;639028864800000000;G9/1;G9/2;2;3;9;True;False;;False;5;1;Standard;True +M21;11;0;639028872000000000;G10/3;G10/0;8;5;10;True;False;;False;2;2;Standard;True +M22;12;0;639028879200000000;G10/1;G10/2;6;7;10;True;False;;False;3;2;Standard;True +M23;13;0;639028888200000000;R9/1;R10/2;1;7;;False;True;;False;3;1;AfterOvertime;True +M24;14;0;639028896600000000;R10/1;R9/2;6;2;;False;True;;False;6;7;AfterPenalties;True +M25;15;0;639028905000000000;L13;L14;;;;False;True;3;;;;;False +M26;16;0;639028913400000000;W13;W14;;;;False;True;1;;;;;False +[18] +reg_name;Private;False;0;8;2;16 +T1;Test 1;;False;6;1;3;1;0;4 +T2;Test 2;;False;13;9;2;1;1;4 +T3;Test 3;;False;3;6;1;1;1;3 +T4;Test 4;;False;2;5;0;1;2;3 +T5;Test 5;;False;4;7;0;1;2;3 +T6;Test 6;;False;16;12;3;0;1;4 +T7;Test 7;;False;7;9;1;1;2;4 +T8;Test 8;;False;6;8;0;2;1;3 +G9;A;Apples;4 +>1;9;1;0;1;3;0;2;1;0;7;3;3 +>2;9;2;0;2;6;3;1;1;1;4;3;3 +>3;9;3;0;3;3;6;1;1;1;4;-3;3 +>4;9;4;0;4;2;5;0;1;2;1;-3;3 +G10;B;Bananas;4 +>5;10;1;0;4;4;7;0;1;2;1;-3;3 +>6;10;2;0;1;10;5;3;0;0;9;5;3 +>7;10;3;0;2;6;6;1;1;1;4;0;3 +>8;10;4;0;3;6;8;0;2;1;2;-2;3 +M11;1;0;639028800000000000;G9/0;G9/1;1;2;9;True;False;;False;1;0;Standard;True +M12;2;0;639028807200000000;G9/2;G9/3;3;4;9;True;False;;False;2;1;Standard;True +M13;3;0;639028814400000000;G10/0;G10/1;5;6;10;True;False;;False;1;3;Standard;True +M14;4;0;639028821600000000;G10/2;G10/3;7;8;10;True;False;;False;2;2;Standard;True +M15;5;0;639028828800000000;G9/0;G9/2;1;3;9;True;False;;False;0;0;Standard;True +M16;6;0;639028836000000000;G9/1;G9/3;2;4;9;True;False;;False;1;1;Standard;True +M17;7;0;639028843200000000;G10/0;G10/2;5;7;10;True;False;;False;1;2;Standard;True +M18;8;0;639028850400000000;G10/1;G10/3;6;8;10;True;False;;False;4;2;Standard;True +M19;9;0;639028857600000000;G9/3;G9/0;4;1;9;True;False;;False;0;2;Standard;True +M20;10;0;639028864800000000;G9/1;G9/2;2;3;9;True;False;;False;5;1;Standard;True +M21;11;0;639028872000000000;G10/3;G10/0;8;5;10;True;False;;False;2;2;Standard;True +M22;12;0;639028879200000000;G10/1;G10/2;6;7;10;True;False;;False;3;2;Standard;True +M23;13;0;639028888200000000;R9/1;R10/2;1;7;;False;True;;False;3;1;AfterOvertime;True +M24;14;0;639028896600000000;R10/1;R9/2;6;2;;False;True;;False;6;7;AfterPenalties;True +M25;15;0;639028905000000000;L13;L14;7;6;;False;True;3;;;;;False +M26;16;0;639028913400000000;W13;W14;1;2;;False;True;1;;;;;False +[19] +reg_name;Private;False;0;8;2;16 +T1;Test 1;;False;6;1;3;1;0;4 +T2;Test 2;;False;13;9;2;1;1;4 +T3;Test 3;;False;3;6;1;1;1;3 +T4;Test 4;;False;2;5;0;1;2;3 +T5;Test 5;;False;4;7;0;1;2;3 +T6;Test 6;;False;16;15;3;0;2;5 +T7;Test 7;;False;10;9;2;1;2;5 +T8;Test 8;;False;6;8;0;2;1;3 +G9;A;Apples;4 +>1;9;1;0;1;3;0;2;1;0;7;3;3 +>2;9;2;0;2;6;3;1;1;1;4;3;3 +>3;9;3;0;3;3;6;1;1;1;4;-3;3 +>4;9;4;0;4;2;5;0;1;2;1;-3;3 +G10;B;Bananas;4 +>5;10;1;0;4;4;7;0;1;2;1;-3;3 +>6;10;2;0;1;10;5;3;0;0;9;5;3 +>7;10;3;0;2;6;6;1;1;1;4;0;3 +>8;10;4;0;3;6;8;0;2;1;2;-2;3 +M11;1;0;639028800000000000;G9/0;G9/1;1;2;9;True;False;;False;1;0;Standard;True +M12;2;0;639028807200000000;G9/2;G9/3;3;4;9;True;False;;False;2;1;Standard;True +M13;3;0;639028814400000000;G10/0;G10/1;5;6;10;True;False;;False;1;3;Standard;True +M14;4;0;639028821600000000;G10/2;G10/3;7;8;10;True;False;;False;2;2;Standard;True +M15;5;0;639028828800000000;G9/0;G9/2;1;3;9;True;False;;False;0;0;Standard;True +M16;6;0;639028836000000000;G9/1;G9/3;2;4;9;True;False;;False;1;1;Standard;True +M17;7;0;639028843200000000;G10/0;G10/2;5;7;10;True;False;;False;1;2;Standard;True +M18;8;0;639028850400000000;G10/1;G10/3;6;8;10;True;False;;False;4;2;Standard;True +M19;9;0;639028857600000000;G9/3;G9/0;4;1;9;True;False;;False;0;2;Standard;True +M20;10;0;639028864800000000;G9/1;G9/2;2;3;9;True;False;;False;5;1;Standard;True +M21;11;0;639028872000000000;G10/3;G10/0;8;5;10;True;False;;False;2;2;Standard;True +M22;12;0;639028879200000000;G10/1;G10/2;6;7;10;True;False;;False;3;2;Standard;True +M23;13;0;639028888200000000;R9/1;R10/2;1;7;;False;True;;False;3;1;AfterOvertime;True +M24;14;0;639028896600000000;R10/1;R9/2;6;2;;False;True;;False;6;7;AfterPenalties;True +M25;15;0;639028905000000000;L13;L14;7;6;;False;True;3;False;3;0;Standard;True +M26;16;0;639028913400000000;W13;W14;1;2;;False;True;1;True;1;2;Standard;False +[20] +reg_name;Private;False;0;8;2;16 +T1;Test 1;;False;7;5;3;1;1;5 +T2;Test 2;;False;17;10;3;1;1;5 +T3;Test 3;;False;3;6;1;1;1;3 +T4;Test 4;;False;2;5;0;1;2;3 +T5;Test 5;;False;4;7;0;1;2;3 +T6;Test 6;;False;16;15;3;0;2;5 +T7;Test 7;;False;10;9;2;1;2;5 +T8;Test 8;;False;6;8;0;2;1;3 +G9;A;Apples;4 +>1;9;1;0;1;3;0;2;1;0;7;3;3 +>2;9;2;0;2;6;3;1;1;1;4;3;3 +>3;9;3;0;3;3;6;1;1;1;4;-3;3 +>4;9;4;0;4;2;5;0;1;2;1;-3;3 +G10;B;Bananas;4 +>5;10;1;0;4;4;7;0;1;2;1;-3;3 +>6;10;2;0;1;10;5;3;0;0;9;5;3 +>7;10;3;0;2;6;6;1;1;1;4;0;3 +>8;10;4;0;3;6;8;0;2;1;2;-2;3 +M11;1;0;639028800000000000;G9/0;G9/1;1;2;9;True;False;;False;1;0;Standard;True +M12;2;0;639028807200000000;G9/2;G9/3;3;4;9;True;False;;False;2;1;Standard;True +M13;3;0;639028814400000000;G10/0;G10/1;5;6;10;True;False;;False;1;3;Standard;True +M14;4;0;639028821600000000;G10/2;G10/3;7;8;10;True;False;;False;2;2;Standard;True +M15;5;0;639028828800000000;G9/0;G9/2;1;3;9;True;False;;False;0;0;Standard;True +M16;6;0;639028836000000000;G9/1;G9/3;2;4;9;True;False;;False;1;1;Standard;True +M17;7;0;639028843200000000;G10/0;G10/2;5;7;10;True;False;;False;1;2;Standard;True +M18;8;0;639028850400000000;G10/1;G10/3;6;8;10;True;False;;False;4;2;Standard;True +M19;9;0;639028857600000000;G9/3;G9/0;4;1;9;True;False;;False;0;2;Standard;True +M20;10;0;639028864800000000;G9/1;G9/2;2;3;9;True;False;;False;5;1;Standard;True +M21;11;0;639028872000000000;G10/3;G10/0;8;5;10;True;False;;False;2;2;Standard;True +M22;12;0;639028879200000000;G10/1;G10/2;6;7;10;True;False;;False;3;2;Standard;True +M23;13;0;639028888200000000;R9/1;R10/2;1;7;;False;True;;False;3;1;AfterOvertime;True +M24;14;0;639028896600000000;R10/1;R9/2;6;2;;False;True;;False;6;7;AfterPenalties;True +M25;15;0;639028905000000000;L13;L14;7;6;;False;True;3;False;3;0;Standard;True +M26;16;0;639028913400000000;W13;W14;1;2;;False;True;1;False;1;4;Standard;True \ No newline at end of file diff --git a/src/Turnierplan.Core.Test.Regression/Tests/Tournament8Teams2Groups1RoundSemiFinals.cs b/src/Turnierplan.Core.Test.Regression/Tests/Tournament8Teams2Groups1RoundSemiFinals.cs new file mode 100644 index 00000000..d23201fe --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/Tests/Tournament8Teams2Groups1RoundSemiFinals.cs @@ -0,0 +1,101 @@ +using FluentAssertions.Extensions; +using Turnierplan.Core.Tournament; + +namespace Turnierplan.Core.Test.Regression.Tests; + +internal sealed class Tournament8Teams2Groups1RoundSemiFinals : TournamentRegressionTestBase +{ + public Tournament8Teams2Groups1RoundSemiFinals() + { + var team1 = Step(t => t.AddTeam("Test 1")); + var team2 = Step(t => t.AddTeam("Test 2")); + var team3 = Step(t => t.AddTeam("Test 3")); + var team4 = Step(t => t.AddTeam("Test 4")); + var team5 = Step(t => t.AddTeam("Test 5")); + var team6 = Step(t => t.AddTeam("Test 6")); + var team7 = Step(t => t.AddTeam("Test 7")); + var team8 = Step(t => t.AddTeam("Test 8")); + + var group1 = Step(t => t.AddGroup('A', "Apples")); + var group2 = Step(t => t.AddGroup('B', "Bananas")); + + Step(t => + { + t.AddGroupParticipant(group1, team1); + t.AddGroupParticipant(group1, team2); + t.AddGroupParticipant(group1, team3); + t.AddGroupParticipant(group1, team4); + + t.AddGroupParticipant(group2, team5); + t.AddGroupParticipant(group2, team6); + t.AddGroupParticipant(group2, team7); + t.AddGroupParticipant(group2, team8); + }); + + Step(t => t.GenerateMatchPlan(new MatchPlanConfiguration + { + GroupRoundConfig = new GroupRoundConfig + { + GroupMatchOrder = GroupMatchOrder.Sequential, + GroupPhaseRounds = 1 + }, + FinalsRoundConfig = new FinalsRoundConfig + { + FirstFinalsRoundOrder = FinalsRoundOrder.SemiFinals, + EnableThirdPlacePlayoff = true, + TeamSelectors = null, + AdditionalPlayoffs = null + }, + ScheduleConfig = new ScheduleConfig + { + FirstMatchKickoff = new DateTime(2026, 1, 1, 16, 0, 0), + GroupPhaseNumberOfCourts = 1, + GroupPhasePlayTime = 10.Minutes(), + GroupPhasePauseTime = 2.Minutes(), + PauseBetweenGroupAndFinalsPhase = 5.Minutes(), + FinalsPhaseNumberOfCourts = 1, + FinalsPhasePlayTime = 12.Minutes(), + FinalsPhasePauseTime = 2.Minutes() + } + })); + + Step(t => + { + t.Matches[0].SetOutcome(false, 1, 0, MatchOutcomeType.Standard); + t.Matches[1].SetOutcome(false, 2, 1, MatchOutcomeType.Standard); + t.Matches[2].SetOutcome(false, 1, 3, MatchOutcomeType.Standard); + t.Matches[3].SetOutcome(false, 2, 2, MatchOutcomeType.Standard); + t.Matches[4].SetOutcome(false, 0, 0, MatchOutcomeType.Standard); + t.Matches[5].SetOutcome(false, 1, 1, MatchOutcomeType.Standard); + t.Compute(); + }); + + Step(t => + { + t.Matches[6].SetOutcome(false, 1, 2, MatchOutcomeType.Standard); + t.Matches[7].SetOutcome(false, 4, 2, MatchOutcomeType.Standard); + t.Matches[8].SetOutcome(false, 0, 2, MatchOutcomeType.Standard); + t.Matches[9].SetOutcome(false, 5, 1, MatchOutcomeType.Standard); + t.Matches[10].SetOutcome(false, 2, 2, MatchOutcomeType.Standard); + t.Matches[11].SetOutcome(false, 3, 2, MatchOutcomeType.Standard); + t.Compute(); + }); + + Step(t => t.Matches[12].SetOutcome(false, 3, 1, MatchOutcomeType.AfterOvertime)); + Step(t => t.Matches[13].SetOutcome(false, 6, 7, MatchOutcomeType.AfterPenalties)); + Step(t => t.Compute()); + + Step(t => + { + t.Matches[14].SetOutcome(false, 3, 0, MatchOutcomeType.Standard); + t.Matches[15].SetOutcome(true, 1, 2, MatchOutcomeType.Standard); + t.Compute(); + }); + + Step(t => + { + t.Matches[15].SetOutcome(false, 1, 4, MatchOutcomeType.Standard); + t.Compute(); + }); + } +} From 539ff05eab0d8a3fb5d94821d4dcae07861d43c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=B6rner?= Date: Sat, 24 Jan 2026 12:09:24 +0100 Subject: [PATCH 08/13] Include rankings in test output --- .../Tournament4Teams1Group2RoundsNoFinals.out | 126 ++++++++++++++---- ...ournament8Teams2Groups1RoundSemiFinals.out | 98 +++++++++++--- .../SubjectSerializer.cs | 30 +++++ 3 files changed, 204 insertions(+), 50 deletions(-) diff --git a/src/Turnierplan.Core.Test.Regression/Expected/Tournament4Teams1Group2RoundsNoFinals.out b/src/Turnierplan.Core.Test.Regression/Expected/Tournament4Teams1Group2RoundsNoFinals.out index 2d451c93..0c43a5fd 100644 --- a/src/Turnierplan.Core.Test.Regression/Expected/Tournament4Teams1Group2RoundsNoFinals.out +++ b/src/Turnierplan.Core.Test.Regression/Expected/Tournament4Teams1Group2RoundsNoFinals.out @@ -1,32 +1,32 @@ [1] -reg_name;Private;False;0;0;0;0 +reg_name;Private;False;0;0;0;0;0;0 [2] -reg_name;Private;False;0;1;0;0 +reg_name;Private;False;0;1;0;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 [3] -reg_name;Private;False;0;2;0;0 +reg_name;Private;False;0;2;0;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 [4] -reg_name;Private;False;0;3;0;0 +reg_name;Private;False;0;3;0;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 [5] -reg_name;Private;False;0;4;0;0 +reg_name;Private;False;0;4;0;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 T4;Test 4;;False;0;0;0;0;0;0 [6] -reg_name;Private;False;0;4;1;0 +reg_name;Private;False;0;4;1;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 T4;Test 4;;False;0;0;0;0;0;0 G5;A;;0 [7] -reg_name;Private;False;0;4;1;0 +reg_name;Private;False;0;4;1;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 @@ -34,7 +34,7 @@ T4;Test 4;;False;0;0;0;0;0;0 G5;A;;1 >1;5;1;0;0;0;0;0;0;0;0;0;0 [8] -reg_name;Private;False;0;4;1;0 +reg_name;Private;False;0;4;1;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 @@ -43,7 +43,7 @@ G5;A;;2 >1;5;1;0;0;0;0;0;0;0;0;0;0 >2;5;2;0;0;0;0;0;0;0;0;0;0 [9] -reg_name;Private;False;0;4;1;0 +reg_name;Private;False;0;4;1;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 @@ -53,7 +53,7 @@ G5;A;;3 >2;5;2;0;0;0;0;0;0;0;0;0;0 >3;5;3;0;0;0;0;0;0;0;0;0;0 [10] -reg_name;Private;False;0;4;1;0 +reg_name;Private;False;0;4;1;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 @@ -64,7 +64,7 @@ G5;A;;4 >3;5;3;0;0;0;0;0;0;0;0;0;0 >4;5;4;0;0;0;0;0;0;0;0;0;0 [11] -reg_name;Private;False;0;4;1;12 +reg_name;Private;False;0;4;1;12;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 @@ -87,7 +87,7 @@ M15;10;0;;G5/3;G5/1;;;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;;;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;;;5;True;False;;;;;;False [12] -reg_name;Private;False;0;4;1;12 +reg_name;Private;False;0;4;1;12;0;4 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 @@ -109,8 +109,12 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; [13] -reg_name;Private;False;0;4;1;12 +reg_name;Private;False;0;4;1;12;0;4 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 @@ -132,8 +136,12 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; [14] -reg_name;Private;False;0;4;1;12 +reg_name;Private;False;0;4;1;12;0;4 T1;Test 1;;False;1;0;1;0;0;1 T2;Test 2;;False;0;1;0;0;1;1 T3;Test 3;;False;0;0;0;0;0;0 @@ -155,8 +163,12 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; [15] -reg_name;Private;False;0;4;1;12 +reg_name;Private;False;0;4;1;12;0;4 T1;Test 1;;False;1;0;1;0;0;1 T2;Test 2;;False;0;1;0;0;1;1 T3;Test 3;;False;0;0;0;0;0;0 @@ -178,8 +190,12 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; [16] -reg_name;Private;False;0;4;1;12 +reg_name;Private;False;0;4;1;12;0;4 T1;Test 1;;False;1;0;1;0;0;1 T2;Test 2;;False;0;1;0;0;1;1 T3;Test 3;;False;0;0;0;0;0;0 @@ -201,8 +217,12 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; [17] -reg_name;Private;False;0;4;1;12 +reg_name;Private;False;0;4;1;12;0;4 T1;Test 1;;False;4;1;2;0;0;2 T2;Test 2;;False;0;1;0;0;1;1 T3;Test 3;;False;3;5;0;1;1;2 @@ -224,8 +244,12 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; [18] -reg_name;Private;False;0;4;1;12 +reg_name;Private;False;0;4;1;12;0;4 T1;Test 1;;False;4;1;2;0;0;2 T2;Test 2;;False;0;1;0;0;1;1 T3;Test 3;;False;3;5;0;1;1;2 @@ -247,8 +271,12 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; [19] -reg_name;Private;False;0;4;1;12 +reg_name;Private;False;0;4;1;12;0;4 T1;Test 1;;False;4;1;2;0;0;2 T2;Test 2;;False;0;1;0;0;1;1 T3;Test 3;;False;3;5;0;1;1;2 @@ -270,8 +298,12 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; [20] -reg_name;Private;False;0;4;1;12 +reg_name;Private;False;0;4;1;12;0;4 T1;Test 1;;False;4;1;2;0;0;2 T2;Test 2;;False;0;1;0;0;1;1 T3;Test 3;;False;3;5;0;1;1;2 @@ -293,8 +325,12 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; [21] -reg_name;Private;False;0;4;1;12 +reg_name;Private;False;0;4;1;12;0;4 T1;Test 1;;False;4;1;2;0;0;2 T2;Test 2;;False;0;1;0;0;1;1 T3;Test 3;;False;3;5;0;1;1;2 @@ -316,8 +352,12 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; [22] -reg_name;Private;False;0;4;1;12 +reg_name;Private;False;0;4;1;12;0;4 T1;Test 1;;False;6;4;2;1;1;4 T2;Test 2;;False;9;11;1;1;2;4 T3;Test 3;;False;5;7;0;2;1;3 @@ -339,8 +379,12 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; [23] -reg_name;Private;False;0;4;1;12 +reg_name;Private;False;0;4;1;12;0;4 T1;Test 1;;False;6;4;2;1;1;4 T2;Test 2;;False;9;11;1;1;2;4 T3;Test 3;;False;5;7;0;2;1;3 @@ -362,8 +406,12 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;;;;;False M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; [24] -reg_name;Private;False;0;4;1;12 +reg_name;Private;False;0;4;1;12;0;4 T1;Test 1;;False;6;4;2;1;1;4 T2;Test 2;;False;9;11;1;1;2;4 T3;Test 3;;False;5;7;0;2;1;3 @@ -385,8 +433,12 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;False;0;3;Standard;True M15;10;0;;G5/3;G5/1;4;2;5;True;False;;;;;;False M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; [25] -reg_name;Private;False;0;4;1;12 +reg_name;Private;False;0;4;1;12;0;4 T1;Test 1;;False;6;4;2;1;1;4 T2;Test 2;;False;9;11;1;1;2;4 T3;Test 3;;False;5;7;0;2;1;3 @@ -408,8 +460,12 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;False;0;3;Standard;True M15;10;0;;G5/3;G5/1;4;2;5;True;False;;False;2;0;Standard;True M16;11;0;;G5/0;G5/3;1;4;5;True;False;;;;;;False M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; [26] -reg_name;Private;False;0;4;1;12 +reg_name;Private;False;0;4;1;12;0;4 T1;Test 1;;False;6;4;2;1;1;4 T2;Test 2;;False;9;11;1;1;2;4 T3;Test 3;;False;5;7;0;2;1;3 @@ -431,8 +487,12 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;False;0;3;Standard;True M15;10;0;;G5/3;G5/1;4;2;5;True;False;;False;2;0;Standard;True M16;11;0;;G5/0;G5/3;1;4;5;True;False;;False;0;2;Standard;True M17;12;0;;G5/2;G5/1;3;2;5;True;False;;;;;;False +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; [27] -reg_name;Private;False;0;4;1;12 +reg_name;Private;False;0;4;1;12;0;4 T1;Test 1;;False;6;4;2;1;1;4 T2;Test 2;;False;9;11;1;1;2;4 T3;Test 3;;False;5;7;0;2;1;3 @@ -454,8 +514,12 @@ M14;9;0;;G5/2;G5/0;3;1;5;True;False;;False;0;3;Standard;True M15;10;0;;G5/3;G5/1;4;2;5;True;False;;False;2;0;Standard;True M16;11;0;;G5/0;G5/3;1;4;5;True;False;;False;0;2;Standard;True M17;12;0;;G5/2;G5/1;3;2;5;True;False;;False;2;1;Standard;True +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; [28] -reg_name;Private;False;0;4;1;12 +reg_name;Private;False;0;4;1;12;0;4 T1;Test 1;;False;9;6;3;1;2;6 T2;Test 2;;False;10;15;1;1;4;6 T3;Test 3;;False;8;12;1;3;2;6 @@ -476,4 +540,8 @@ M13;8;0;;G5/3;G5/2;4;3;5;True;False;;False;1;1;Standard;True M14;9;0;;G5/2;G5/0;3;1;5;True;False;;False;0;3;Standard;True M15;10;0;;G5/3;G5/1;4;2;5;True;False;;False;2;0;Standard;True M16;11;0;;G5/0;G5/3;1;4;5;True;False;;False;0;2;Standard;True -M17;12;0;;G5/2;G5/1;3;2;5;True;False;;False;2;1;Standard;True \ No newline at end of file +M17;12;0;;G5/2;G5/1;3;2;5;True;False;;False;2;1;Standard;True +R1;RankingViaGroupResults;True;4 +R2;RankingViaGroupResults;True;1 +R3;RankingViaGroupResults;True;3 +R4;RankingViaGroupResults;True;2 \ No newline at end of file diff --git a/src/Turnierplan.Core.Test.Regression/Expected/Tournament8Teams2Groups1RoundSemiFinals.out b/src/Turnierplan.Core.Test.Regression/Expected/Tournament8Teams2Groups1RoundSemiFinals.out index 1781326d..a5bc9155 100644 --- a/src/Turnierplan.Core.Test.Regression/Expected/Tournament8Teams2Groups1RoundSemiFinals.out +++ b/src/Turnierplan.Core.Test.Regression/Expected/Tournament8Teams2Groups1RoundSemiFinals.out @@ -1,32 +1,32 @@ [1] -reg_name;Private;False;0;0;0;0 +reg_name;Private;False;0;0;0;0;0;0 [2] -reg_name;Private;False;0;1;0;0 +reg_name;Private;False;0;1;0;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 [3] -reg_name;Private;False;0;2;0;0 +reg_name;Private;False;0;2;0;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 [4] -reg_name;Private;False;0;3;0;0 +reg_name;Private;False;0;3;0;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 [5] -reg_name;Private;False;0;4;0;0 +reg_name;Private;False;0;4;0;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 T4;Test 4;;False;0;0;0;0;0;0 [6] -reg_name;Private;False;0;5;0;0 +reg_name;Private;False;0;5;0;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 T4;Test 4;;False;0;0;0;0;0;0 T5;Test 5;;False;0;0;0;0;0;0 [7] -reg_name;Private;False;0;6;0;0 +reg_name;Private;False;0;6;0;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 @@ -34,7 +34,7 @@ T4;Test 4;;False;0;0;0;0;0;0 T5;Test 5;;False;0;0;0;0;0;0 T6;Test 6;;False;0;0;0;0;0;0 [8] -reg_name;Private;False;0;7;0;0 +reg_name;Private;False;0;7;0;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 @@ -43,7 +43,7 @@ T5;Test 5;;False;0;0;0;0;0;0 T6;Test 6;;False;0;0;0;0;0;0 T7;Test 7;;False;0;0;0;0;0;0 [9] -reg_name;Private;False;0;8;0;0 +reg_name;Private;False;0;8;0;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 @@ -53,7 +53,7 @@ T6;Test 6;;False;0;0;0;0;0;0 T7;Test 7;;False;0;0;0;0;0;0 T8;Test 8;;False;0;0;0;0;0;0 [10] -reg_name;Private;False;0;8;1;0 +reg_name;Private;False;0;8;1;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 @@ -64,7 +64,7 @@ T7;Test 7;;False;0;0;0;0;0;0 T8;Test 8;;False;0;0;0;0;0;0 G9;A;Apples;0 [11] -reg_name;Private;False;0;8;2;0 +reg_name;Private;False;0;8;2;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 @@ -76,7 +76,7 @@ T8;Test 8;;False;0;0;0;0;0;0 G9;A;Apples;0 G10;B;Bananas;0 [12] -reg_name;Private;False;0;8;2;0 +reg_name;Private;False;0;8;2;0;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 @@ -96,7 +96,7 @@ G10;B;Bananas;4 >7;10;3;0;0;0;0;0;0;0;0;0;0 >8;10;4;0;0;0;0;0;0;0;0;0;0 [13] -reg_name;Private;False;0;8;2;16 +reg_name;Private;False;0;8;2;16;0;0 T1;Test 1;;False;0;0;0;0;0;0 T2;Test 2;;False;0;0;0;0;0;0 T3;Test 3;;False;0;0;0;0;0;0 @@ -132,7 +132,7 @@ M24;14;0;639028896600000000;R10/1;R9/2;;;;False;True;;;;;;False M25;15;0;639028905000000000;L13;L14;;;;False;True;3;;;;;False M26;16;0;639028913400000000;W13;W14;;;;False;True;1;;;;;False [14] -reg_name;Private;False;0;8;2;16 +reg_name;Private;False;0;8;2;16;0;8 T1;Test 1;;False;1;0;1;1;0;2 T2;Test 2;;False;1;2;0;1;1;2 T3;Test 3;;False;2;1;1;1;0;2 @@ -167,8 +167,16 @@ M23;13;0;639028888200000000;R9/1;R10/2;;;;False;True;;;;;;False M24;14;0;639028896600000000;R10/1;R9/2;;;;False;True;;;;;;False M25;15;0;639028905000000000;L13;L14;;;;False;True;3;;;;;False M26;16;0;639028913400000000;W13;W14;;;;False;True;1;;;;;False +R1;WinnerOfFinal;False; +R2;LoserOfFinal;False; +R3;WinnerOfThirdPlacePlayoff;False; +R4;LoserOfThirdPlacePlayoff;False; +R5;NotQualifiedForFinals;False; +R6;NotQualifiedForFinals;False; +R7;NotQualifiedForFinals;False; +R8;NotQualifiedForFinals;False; [15] -reg_name;Private;False;0;8;2;16 +reg_name;Private;False;0;8;2;16;0;8 T1;Test 1;;False;3;0;2;1;0;3 T2;Test 2;;False;6;3;1;1;1;3 T3;Test 3;;False;3;6;1;1;1;3 @@ -203,8 +211,16 @@ M23;13;0;639028888200000000;R9/1;R10/2;1;7;;False;True;;;;;;False M24;14;0;639028896600000000;R10/1;R9/2;6;2;;False;True;;;;;;False M25;15;0;639028905000000000;L13;L14;;;;False;True;3;;;;;False M26;16;0;639028913400000000;W13;W14;;;;False;True;1;;;;;False +R1;WinnerOfFinal;False; +R2;LoserOfFinal;False; +R3;WinnerOfThirdPlacePlayoff;False; +R4;LoserOfThirdPlacePlayoff;False; +R5;NotQualifiedForFinals;True;3 +R6;NotQualifiedForFinals;True;8 +R7;NotQualifiedForFinals;True;5 +R8;NotQualifiedForFinals;True;4 [16] -reg_name;Private;False;0;8;2;16 +reg_name;Private;False;0;8;2;16;0;8 T1;Test 1;;False;3;0;2;1;0;3 T2;Test 2;;False;6;3;1;1;1;3 T3;Test 3;;False;3;6;1;1;1;3 @@ -239,8 +255,16 @@ M23;13;0;639028888200000000;R9/1;R10/2;1;7;;False;True;;False;3;1;AfterOvertime; M24;14;0;639028896600000000;R10/1;R9/2;6;2;;False;True;;;;;;False M25;15;0;639028905000000000;L13;L14;;;;False;True;3;;;;;False M26;16;0;639028913400000000;W13;W14;;;;False;True;1;;;;;False +R1;WinnerOfFinal;False; +R2;LoserOfFinal;False; +R3;WinnerOfThirdPlacePlayoff;False; +R4;LoserOfThirdPlacePlayoff;False; +R5;NotQualifiedForFinals;True;3 +R6;NotQualifiedForFinals;True;8 +R7;NotQualifiedForFinals;True;5 +R8;NotQualifiedForFinals;True;4 [17] -reg_name;Private;False;0;8;2;16 +reg_name;Private;False;0;8;2;16;0;8 T1;Test 1;;False;3;0;2;1;0;3 T2;Test 2;;False;6;3;1;1;1;3 T3;Test 3;;False;3;6;1;1;1;3 @@ -275,8 +299,16 @@ M23;13;0;639028888200000000;R9/1;R10/2;1;7;;False;True;;False;3;1;AfterOvertime; M24;14;0;639028896600000000;R10/1;R9/2;6;2;;False;True;;False;6;7;AfterPenalties;True M25;15;0;639028905000000000;L13;L14;;;;False;True;3;;;;;False M26;16;0;639028913400000000;W13;W14;;;;False;True;1;;;;;False +R1;WinnerOfFinal;False; +R2;LoserOfFinal;False; +R3;WinnerOfThirdPlacePlayoff;False; +R4;LoserOfThirdPlacePlayoff;False; +R5;NotQualifiedForFinals;True;3 +R6;NotQualifiedForFinals;True;8 +R7;NotQualifiedForFinals;True;5 +R8;NotQualifiedForFinals;True;4 [18] -reg_name;Private;False;0;8;2;16 +reg_name;Private;False;0;8;2;16;0;8 T1;Test 1;;False;6;1;3;1;0;4 T2;Test 2;;False;13;9;2;1;1;4 T3;Test 3;;False;3;6;1;1;1;3 @@ -311,8 +343,16 @@ M23;13;0;639028888200000000;R9/1;R10/2;1;7;;False;True;;False;3;1;AfterOvertime; M24;14;0;639028896600000000;R10/1;R9/2;6;2;;False;True;;False;6;7;AfterPenalties;True M25;15;0;639028905000000000;L13;L14;7;6;;False;True;3;;;;;False M26;16;0;639028913400000000;W13;W14;1;2;;False;True;1;;;;;False +R1;WinnerOfFinal;False; +R2;LoserOfFinal;False; +R3;WinnerOfThirdPlacePlayoff;False; +R4;LoserOfThirdPlacePlayoff;False; +R5;NotQualifiedForFinals;True;3 +R6;NotQualifiedForFinals;True;8 +R7;NotQualifiedForFinals;True;5 +R8;NotQualifiedForFinals;True;4 [19] -reg_name;Private;False;0;8;2;16 +reg_name;Private;False;0;8;2;16;0;8 T1;Test 1;;False;6;1;3;1;0;4 T2;Test 2;;False;13;9;2;1;1;4 T3;Test 3;;False;3;6;1;1;1;3 @@ -347,8 +387,16 @@ M23;13;0;639028888200000000;R9/1;R10/2;1;7;;False;True;;False;3;1;AfterOvertime; M24;14;0;639028896600000000;R10/1;R9/2;6;2;;False;True;;False;6;7;AfterPenalties;True M25;15;0;639028905000000000;L13;L14;7;6;;False;True;3;False;3;0;Standard;True M26;16;0;639028913400000000;W13;W14;1;2;;False;True;1;True;1;2;Standard;False +R1;WinnerOfFinal;False; +R2;LoserOfFinal;False; +R3;WinnerOfThirdPlacePlayoff;True;7 +R4;LoserOfThirdPlacePlayoff;True;6 +R5;NotQualifiedForFinals;True;3 +R6;NotQualifiedForFinals;True;8 +R7;NotQualifiedForFinals;True;5 +R8;NotQualifiedForFinals;True;4 [20] -reg_name;Private;False;0;8;2;16 +reg_name;Private;False;0;8;2;16;0;8 T1;Test 1;;False;7;5;3;1;1;5 T2;Test 2;;False;17;10;3;1;1;5 T3;Test 3;;False;3;6;1;1;1;3 @@ -382,4 +430,12 @@ M22;12;0;639028879200000000;G10/1;G10/2;6;7;10;True;False;;False;3;2;Standard;Tr M23;13;0;639028888200000000;R9/1;R10/2;1;7;;False;True;;False;3;1;AfterOvertime;True M24;14;0;639028896600000000;R10/1;R9/2;6;2;;False;True;;False;6;7;AfterPenalties;True M25;15;0;639028905000000000;L13;L14;7;6;;False;True;3;False;3;0;Standard;True -M26;16;0;639028913400000000;W13;W14;1;2;;False;True;1;False;1;4;Standard;True \ No newline at end of file +M26;16;0;639028913400000000;W13;W14;1;2;;False;True;1;False;1;4;Standard;True +R1;WinnerOfFinal;True;2 +R2;LoserOfFinal;True;1 +R3;WinnerOfThirdPlacePlayoff;True;7 +R4;LoserOfThirdPlacePlayoff;True;6 +R5;NotQualifiedForFinals;True;3 +R6;NotQualifiedForFinals;True;8 +R7;NotQualifiedForFinals;True;5 +R8;NotQualifiedForFinals;True;4 \ No newline at end of file diff --git a/src/Turnierplan.Core.Test.Regression/SubjectSerializer.cs b/src/Turnierplan.Core.Test.Regression/SubjectSerializer.cs index eb112234..bdbc82a4 100644 --- a/src/Turnierplan.Core.Test.Regression/SubjectSerializer.cs +++ b/src/Turnierplan.Core.Test.Regression/SubjectSerializer.cs @@ -32,6 +32,10 @@ private static void AppendTournament(StringBuilder builder, Tournament.Tournamen builder.Append(tournament.Groups.Count); builder.Append(';'); builder.Append(tournament.Matches.Count); + builder.Append(';'); + builder.Append(tournament.RankingOverwrites.Count); + builder.Append(';'); + builder.Append(tournament.Ranking.Count); builder.AppendLine(); foreach (var team in tournament.Teams) @@ -141,6 +145,32 @@ private static void AppendTournament(StringBuilder builder, Tournament.Tournamen builder.Append(match.IsFinished); builder.AppendLine(); } + + foreach (var overwrite in tournament.RankingOverwrites) + { + builder.Append("RO"); + builder.Append(overwrite.Id); + builder.Append(';'); + builder.Append(overwrite.PlacementRank); + builder.Append(';'); + builder.Append(overwrite.HideRanking); + builder.Append(';'); + builder.Append(overwrite.AssignTeam?.Id); + builder.AppendLine(); + } + + foreach (var ranking in tournament.Ranking) + { + builder.Append('R'); + builder.Append(ranking.Position); + builder.Append(';'); + builder.Append(ranking.Reason); + builder.Append(';'); + builder.Append(ranking.IsDefined); + builder.Append(';'); + builder.Append(ranking.Team?.Id); + builder.AppendLine(); + } } /// Copied from the DAL project. From 7b2f444ce46f34af8dfa36e6adfba01cd9e161a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=B6rner?= Date: Sat, 24 Jan 2026 10:23:59 +0100 Subject: [PATCH 09/13] Add props file for test dependencies --- .../Turnierplan.Adapter.Test.Functional.csproj | 16 ++-------------- .../Turnierplan.App.Test.Unit.csproj | 14 +------------- .../Turnierplan.Core.Test.Unit.csproj | 14 +------------- .../Turnierplan.Dal.Test.Unit.csproj | 14 +------------- .../Turnierplan.Localization.Test.Unit.csproj | 14 +------------- .../Turnierplan.PdfRendering.Test.Unit.csproj | 14 +------------- src/Turnierplan.Test.Common.props | 15 +++++++++++++++ src/turnierplan.NET.slnx | 1 + 8 files changed, 23 insertions(+), 79 deletions(-) create mode 100644 src/Turnierplan.Test.Common.props diff --git a/src/Turnierplan.Adapter.Test.Functional/Turnierplan.Adapter.Test.Functional.csproj b/src/Turnierplan.Adapter.Test.Functional/Turnierplan.Adapter.Test.Functional.csproj index d536bec1..6c8d11d3 100644 --- a/src/Turnierplan.Adapter.Test.Functional/Turnierplan.Adapter.Test.Functional.csproj +++ b/src/Turnierplan.Adapter.Test.Functional/Turnierplan.Adapter.Test.Functional.csproj @@ -8,20 +8,8 @@ true - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - + + diff --git a/src/Turnierplan.App.Test.Unit/Turnierplan.App.Test.Unit.csproj b/src/Turnierplan.App.Test.Unit/Turnierplan.App.Test.Unit.csproj index 3fc2a059..a7aa67a2 100644 --- a/src/Turnierplan.App.Test.Unit/Turnierplan.App.Test.Unit.csproj +++ b/src/Turnierplan.App.Test.Unit/Turnierplan.App.Test.Unit.csproj @@ -8,19 +8,7 @@ true - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - + diff --git a/src/Turnierplan.Core.Test.Unit/Turnierplan.Core.Test.Unit.csproj b/src/Turnierplan.Core.Test.Unit/Turnierplan.Core.Test.Unit.csproj index c206cede..d57bf0bf 100644 --- a/src/Turnierplan.Core.Test.Unit/Turnierplan.Core.Test.Unit.csproj +++ b/src/Turnierplan.Core.Test.Unit/Turnierplan.Core.Test.Unit.csproj @@ -8,19 +8,7 @@ true - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - + diff --git a/src/Turnierplan.Dal.Test.Unit/Turnierplan.Dal.Test.Unit.csproj b/src/Turnierplan.Dal.Test.Unit/Turnierplan.Dal.Test.Unit.csproj index fc00c807..2531a38e 100644 --- a/src/Turnierplan.Dal.Test.Unit/Turnierplan.Dal.Test.Unit.csproj +++ b/src/Turnierplan.Dal.Test.Unit/Turnierplan.Dal.Test.Unit.csproj @@ -8,19 +8,7 @@ true - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - + diff --git a/src/Turnierplan.Localization.Test.Unit/Turnierplan.Localization.Test.Unit.csproj b/src/Turnierplan.Localization.Test.Unit/Turnierplan.Localization.Test.Unit.csproj index ce126c64..c8f1bbb9 100644 --- a/src/Turnierplan.Localization.Test.Unit/Turnierplan.Localization.Test.Unit.csproj +++ b/src/Turnierplan.Localization.Test.Unit/Turnierplan.Localization.Test.Unit.csproj @@ -8,19 +8,7 @@ true - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - + diff --git a/src/Turnierplan.PdfRendering.Test.Unit/Turnierplan.PdfRendering.Test.Unit.csproj b/src/Turnierplan.PdfRendering.Test.Unit/Turnierplan.PdfRendering.Test.Unit.csproj index 11a48252..e69d1554 100644 --- a/src/Turnierplan.PdfRendering.Test.Unit/Turnierplan.PdfRendering.Test.Unit.csproj +++ b/src/Turnierplan.PdfRendering.Test.Unit/Turnierplan.PdfRendering.Test.Unit.csproj @@ -8,19 +8,7 @@ true - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - + diff --git a/src/Turnierplan.Test.Common.props b/src/Turnierplan.Test.Common.props new file mode 100644 index 00000000..b2cd38d2 --- /dev/null +++ b/src/Turnierplan.Test.Common.props @@ -0,0 +1,15 @@ + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + diff --git a/src/turnierplan.NET.slnx b/src/turnierplan.NET.slnx index dd863087..718cb313 100644 --- a/src/turnierplan.NET.slnx +++ b/src/turnierplan.NET.slnx @@ -4,6 +4,7 @@ + From 1368fc87295327a1af02b897a5387a12cd921391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=B6rner?= Date: Sat, 24 Jan 2026 12:27:09 +0100 Subject: [PATCH 10/13] Update to xunit 3 --- .../Turnierplan.Adapter.Test.Functional.csproj | 1 - src/Turnierplan.App.Test.Unit/Turnierplan.App.Test.Unit.csproj | 1 - src/Turnierplan.App/Turnierplan.App.csproj | 2 +- .../Turnierplan.Core.Test.Unit.csproj | 1 - src/Turnierplan.Dal.Test.Unit/Turnierplan.Dal.Test.Unit.csproj | 1 - src/Turnierplan.Dal/Turnierplan.Dal.csproj | 2 +- .../Turnierplan.Localization.Test.Unit.csproj | 1 - src/Turnierplan.PdfRendering.Test.Unit/GlobalUsings.cs | 1 - .../Turnierplan.PdfRendering.Test.Unit.csproj | 1 - src/Turnierplan.Test.Common.props | 2 +- 10 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/Turnierplan.Adapter.Test.Functional/Turnierplan.Adapter.Test.Functional.csproj b/src/Turnierplan.Adapter.Test.Functional/Turnierplan.Adapter.Test.Functional.csproj index 6c8d11d3..e7c25c9a 100644 --- a/src/Turnierplan.Adapter.Test.Functional/Turnierplan.Adapter.Test.Functional.csproj +++ b/src/Turnierplan.Adapter.Test.Functional/Turnierplan.Adapter.Test.Functional.csproj @@ -5,7 +5,6 @@ net10.0 enable enable - true diff --git a/src/Turnierplan.App.Test.Unit/Turnierplan.App.Test.Unit.csproj b/src/Turnierplan.App.Test.Unit/Turnierplan.App.Test.Unit.csproj index a7aa67a2..645d1ebf 100644 --- a/src/Turnierplan.App.Test.Unit/Turnierplan.App.Test.Unit.csproj +++ b/src/Turnierplan.App.Test.Unit/Turnierplan.App.Test.Unit.csproj @@ -5,7 +5,6 @@ net10.0 enable enable - true diff --git a/src/Turnierplan.App/Turnierplan.App.csproj b/src/Turnierplan.App/Turnierplan.App.csproj index 751f1ef2..b874c098 100644 --- a/src/Turnierplan.App/Turnierplan.App.csproj +++ b/src/Turnierplan.App/Turnierplan.App.csproj @@ -14,7 +14,7 @@ - + all diff --git a/src/Turnierplan.Core.Test.Unit/Turnierplan.Core.Test.Unit.csproj b/src/Turnierplan.Core.Test.Unit/Turnierplan.Core.Test.Unit.csproj index d57bf0bf..a00efb46 100644 --- a/src/Turnierplan.Core.Test.Unit/Turnierplan.Core.Test.Unit.csproj +++ b/src/Turnierplan.Core.Test.Unit/Turnierplan.Core.Test.Unit.csproj @@ -5,7 +5,6 @@ net10.0 enable enable - true diff --git a/src/Turnierplan.Dal.Test.Unit/Turnierplan.Dal.Test.Unit.csproj b/src/Turnierplan.Dal.Test.Unit/Turnierplan.Dal.Test.Unit.csproj index 2531a38e..f3849da0 100644 --- a/src/Turnierplan.Dal.Test.Unit/Turnierplan.Dal.Test.Unit.csproj +++ b/src/Turnierplan.Dal.Test.Unit/Turnierplan.Dal.Test.Unit.csproj @@ -5,7 +5,6 @@ net10.0 enable enable - true diff --git a/src/Turnierplan.Dal/Turnierplan.Dal.csproj b/src/Turnierplan.Dal/Turnierplan.Dal.csproj index ab6f08ee..8b8359e3 100644 --- a/src/Turnierplan.Dal/Turnierplan.Dal.csproj +++ b/src/Turnierplan.Dal/Turnierplan.Dal.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/Turnierplan.Localization.Test.Unit/Turnierplan.Localization.Test.Unit.csproj b/src/Turnierplan.Localization.Test.Unit/Turnierplan.Localization.Test.Unit.csproj index c8f1bbb9..d0d58469 100644 --- a/src/Turnierplan.Localization.Test.Unit/Turnierplan.Localization.Test.Unit.csproj +++ b/src/Turnierplan.Localization.Test.Unit/Turnierplan.Localization.Test.Unit.csproj @@ -5,7 +5,6 @@ net10.0 enable enable - true diff --git a/src/Turnierplan.PdfRendering.Test.Unit/GlobalUsings.cs b/src/Turnierplan.PdfRendering.Test.Unit/GlobalUsings.cs index bab39d1d..2ce28cbb 100644 --- a/src/Turnierplan.PdfRendering.Test.Unit/GlobalUsings.cs +++ b/src/Turnierplan.PdfRendering.Test.Unit/GlobalUsings.cs @@ -1,4 +1,3 @@ global using FluentAssertions; global using FluentAssertions.Extensions; global using Xunit; -global using Xunit.Abstractions; diff --git a/src/Turnierplan.PdfRendering.Test.Unit/Turnierplan.PdfRendering.Test.Unit.csproj b/src/Turnierplan.PdfRendering.Test.Unit/Turnierplan.PdfRendering.Test.Unit.csproj index e69d1554..d6963700 100644 --- a/src/Turnierplan.PdfRendering.Test.Unit/Turnierplan.PdfRendering.Test.Unit.csproj +++ b/src/Turnierplan.PdfRendering.Test.Unit/Turnierplan.PdfRendering.Test.Unit.csproj @@ -5,7 +5,6 @@ net10.0 enable enable - true diff --git a/src/Turnierplan.Test.Common.props b/src/Turnierplan.Test.Common.props index b2cd38d2..4d363abd 100644 --- a/src/Turnierplan.Test.Common.props +++ b/src/Turnierplan.Test.Common.props @@ -2,7 +2,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all From 82ff3caad970e79f99b5ad25b45cbc41ec9daf7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=B6rner?= Date: Sat, 24 Jan 2026 12:32:36 +0100 Subject: [PATCH 11/13] Merge amend --- .../Turnierplan.Core.Test.Regression.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Turnierplan.Core.Test.Regression/Turnierplan.Core.Test.Regression.csproj b/src/Turnierplan.Core.Test.Regression/Turnierplan.Core.Test.Regression.csproj index 8a6db644..5dd08e5e 100644 --- a/src/Turnierplan.Core.Test.Regression/Turnierplan.Core.Test.Regression.csproj +++ b/src/Turnierplan.Core.Test.Regression/Turnierplan.Core.Test.Regression.csproj @@ -5,7 +5,6 @@ net10.0 enable enable - true From c21cee2feaae232bf54a219e8587a7e82a125378 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=B6rner?= Date: Sat, 24 Jan 2026 12:36:21 +0100 Subject: [PATCH 12/13] xunit 3 --- .../RegressionTestRunner.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/Turnierplan.Core.Test.Regression/RegressionTestRunner.cs b/src/Turnierplan.Core.Test.Regression/RegressionTestRunner.cs index 26359c50..41832063 100644 --- a/src/Turnierplan.Core.Test.Regression/RegressionTestRunner.cs +++ b/src/Turnierplan.Core.Test.Regression/RegressionTestRunner.cs @@ -1,8 +1,8 @@ using System.Reflection; using FluentAssertions; using Xunit; -using Xunit.Abstractions; using Xunit.Sdk; +using Xunit.v3; namespace Turnierplan.Core.Test.Regression; @@ -38,7 +38,7 @@ public async Task RegressionTest___When_Executed___Produces_Expected_Result(stri var outputFileName = Path.Join(__outputFolderName, $"{regressionTestName}.out"); output.WriteLine("Writing test output to: '{0}'", outputFileName); - await File.WriteAllTextAsync(outputFileName, regressionTestOutput); + await File.WriteAllTextAsync(outputFileName, regressionTestOutput, TestContext.Current.CancellationToken); var expectedFileResourceName = $"{__selfType.Namespace}.Expected.{regressionTestName}.out"; output.WriteLine("Expected test output file: {0}", expectedFileResourceName); @@ -50,7 +50,7 @@ public async Task RegressionTest___When_Executed___Produces_Expected_Result(stri } using var streamReader = new StreamReader(expectedFileStream); - var expectedTestOutput = (await streamReader.ReadToEndAsync()).TrimEnd(); + var expectedTestOutput = (await streamReader.ReadToEndAsync(TestContext.Current.CancellationToken)).TrimEnd(); output.WriteLine("Expected test output was read and has a length of {0}", expectedTestOutput.Length); regressionTestOutput.Should().Be(expectedTestOutput); @@ -59,15 +59,21 @@ public async Task RegressionTest___When_Executed___Produces_Expected_Result(stri [AttributeUsage(AttributeTargets.Method)] private sealed class RegressionTestDataAttribute : DataAttribute { - public override IEnumerable GetData(MethodInfo testMethod) + public override ValueTask> GetData(MethodInfo testMethod, DisposalTracker disposalTracker) { var interfaceType = typeof(IRegressionTest); - return __selfType.Assembly + return ValueTask.FromResult>(__selfType.Assembly .GetTypes() .Where(type => type.IsAssignableTo(interfaceType) && type is { IsClass: true, IsAbstract: false }) .Select(type => type.Name) - .Select(name => new object[] { name }); + .Select(name => new TheoryDataRow(name)) + .ToList()); + } + + public override bool SupportsDiscoveryEnumeration() + { + return true; } } } From 7e498ffd3521ab1f644ca3af08748d1aeec4cf23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=B6rner?= Date: Sat, 24 Jan 2026 12:38:22 +0100 Subject: [PATCH 13/13] changeo rder --- .../Turnierplan.Core.Test.Regression.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Turnierplan.Core.Test.Regression/Turnierplan.Core.Test.Regression.csproj b/src/Turnierplan.Core.Test.Regression/Turnierplan.Core.Test.Regression.csproj index 5dd08e5e..429633f2 100644 --- a/src/Turnierplan.Core.Test.Regression/Turnierplan.Core.Test.Regression.csproj +++ b/src/Turnierplan.Core.Test.Regression/Turnierplan.Core.Test.Regression.csproj @@ -8,12 +8,12 @@ - + - + - +