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..0c43a5fd --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/Expected/Tournament4Teams1Group2RoundsNoFinals.out @@ -0,0 +1,547 @@ +[1] +reg_name;Private;False;0;0;0;0;0;0 +[2] +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;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;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;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;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;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;;1 +>1;5;1;0;0;0;0;0;0;0;0;0;0 +[8] +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;;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;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;;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;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;;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;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;;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;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 +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 +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; +[13] +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 +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 +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; +[14] +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 +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 +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; +[15] +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 +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 +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; +[16] +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 +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 +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; +[17] +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 +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 +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; +[18] +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 +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 +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; +[19] +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 +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 +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; +[20] +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 +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 +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; +[21] +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 +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 +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; +[22] +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 +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 +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; +[23] +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 +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 +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; +[24] +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 +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 +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; +[25] +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 +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 +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; +[26] +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 +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 +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; +[27] +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 +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 +R1;RankingViaGroupResults;False; +R2;RankingViaGroupResults;False; +R3;RankingViaGroupResults;False; +R4;RankingViaGroupResults;False; +[28] +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 +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 +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 new file mode 100644 index 00000000..a5bc9155 --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/Expected/Tournament8Teams2Groups1RoundSemiFinals.out @@ -0,0 +1,441 @@ +[1] +reg_name;Private;False;0;0;0;0;0;0 +[2] +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;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;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;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;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;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;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;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;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 +G9;A;Apples;0 +[11] +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 +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;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 +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;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 +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;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 +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 +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;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 +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 +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;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 +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 +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;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 +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 +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;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 +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 +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;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 +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 +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;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 +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 +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/IRegressionTest.cs b/src/Turnierplan.Core.Test.Regression/IRegressionTest.cs new file mode 100644 index 00000000..37d57fa5 --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/IRegressionTest.cs @@ -0,0 +1,6 @@ +namespace Turnierplan.Core.Test.Regression; + +internal interface IRegressionTest +{ + 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..4d5b1062 --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/RegressionTestBase.cs @@ -0,0 +1,60 @@ +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 int _saveStateIndex; + + public string Result => _builder.ToString(); + + protected void Subject(TSubject subject) + { + if (_subject is not null) + { + throw new InvalidOperationException($"The '{nameof(Subject)}()' method may only be called once."); + } + + _subject = subject; + + AddSaveState(); + } + + protected void Step(Action step) + { + if (_subject is null) + { + throw new InvalidOperationException($"Call '{nameof(Subject)}()' first to initialize the test subject."); + } + + step(_subject); + + AddSaveState(); + } + + protected TResult Step(Func step) + { + if (_subject is null) + { + throw new InvalidOperationException($"Call '{nameof(Subject)}()' first to initialize the test subject."); + } + + var result = step(_subject); + + AddSaveState(); + + return result; + } + + private void AddSaveState() + { + _builder.Append('['); + _builder.Append(++_saveStateIndex); + _builder.Append(']'); + _builder.AppendLine(); + _builder.AppendSubject(_subject); + } +} diff --git a/src/Turnierplan.Core.Test.Regression/RegressionTestRunner.cs b/src/Turnierplan.Core.Test.Regression/RegressionTestRunner.cs new file mode 100644 index 00000000..41832063 --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/RegressionTestRunner.cs @@ -0,0 +1,79 @@ +using System.Reflection; +using FluentAssertions; +using Xunit; +using Xunit.Sdk; +using Xunit.v3; + +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); + + var regressionTestOutput = regressionTest.Result.TrimEnd(); + 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); + await File.WriteAllTextAsync(outputFileName, regressionTestOutput, TestContext.Current.CancellationToken); + + 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(TestContext.Current.CancellationToken)).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 ValueTask> GetData(MethodInfo testMethod, DisposalTracker disposalTracker) + { + var interfaceType = typeof(IRegressionTest); + + return ValueTask.FromResult>(__selfType.Assembly + .GetTypes() + .Where(type => type.IsAssignableTo(interfaceType) && type is { IsClass: true, IsAbstract: false }) + .Select(type => type.Name) + .Select(name => new TheoryDataRow(name)) + .ToList()); + } + + public override bool SupportsDiscoveryEnumeration() + { + return true; + } + } +} diff --git a/src/Turnierplan.Core.Test.Regression/SubjectSerializer.cs b/src/Turnierplan.Core.Test.Regression/SubjectSerializer.cs new file mode 100644 index 00000000..bdbc82a4 --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/SubjectSerializer.cs @@ -0,0 +1,196 @@ +using System.Text; +using Turnierplan.Core.Tournament.TeamSelectors; + +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.Append(';'); + builder.Append(tournament.RankingOverwrites.Count); + builder.Append(';'); + builder.Append(tournament.Ranking.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(); + } + + 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. + 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/Tournament4Teams1Group2RoundsNoFinals.cs b/src/Turnierplan.Core.Test.Regression/Tests/Tournament4Teams1Group2RoundsNoFinals.cs new file mode 100644 index 00000000..60d8b572 --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/Tests/Tournament4Teams1Group2RoundsNoFinals.cs @@ -0,0 +1,50 @@ +using Turnierplan.Core.Tournament; + +namespace Turnierplan.Core.Test.Regression.Tests; + +internal sealed class Tournament4Teams1Group2RoundsNoFinals : TournamentRegressionTestBase +{ + public Tournament4Teams1Group2RoundsNoFinals() + { + 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()); + } +} 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(); + }); + } +} 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)); + } +} 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..429633f2 --- /dev/null +++ b/src/Turnierplan.Core.Test.Regression/Turnierplan.Core.Test.Regression.csproj @@ -0,0 +1,19 @@ + + + + + net10.0 + enable + enable + + + + + + + + + + + + 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 @@ +