@@ -59,6 +59,12 @@ public function __construct(
59
59
protected readonly PaginatorInterface $ paginator ,
60
60
) {}
61
61
62
+ /**
63
+ * Returns a two-element array:
64
+ * - The score for the testcase group, or null if not all results are ready.
65
+ * - The result for the testcase group, or null if not all results are ready.
66
+ * @return array{string|null, string|null}
67
+ */
62
68
public static function maybeSetScoringResult (TestcaseGroup $ testcaseGroup , Judging $ judging ): array
63
69
{
64
70
$ allResultsReady = true ;
@@ -139,43 +145,46 @@ public static function maybeSetScoringResult(TestcaseGroup $testcaseGroup, Judgi
139
145
}
140
146
141
147
$ testcaseAggregationType = $ testcaseGroup ->getAggregationType ();
142
- if ($ testcaseAggregationType === TestcaseAggregationType::SUM
143
- || $ testcaseAggregationType === TestcaseAggregationType::AVG ) {
144
- $ score = "0 " ;
145
- foreach ($ results as $ result ) {
146
- if ($ result === null ) {
147
- $ allResultsReady = false ;
148
- break ;
149
- } else {
150
- $ score = bcadd ($ score , $ result , ScoreboardService::SCALE );
151
- }
152
- }
153
- if ($ testcaseAggregationType === TestcaseAggregationType::AVG && count ($ results ) > 0 ) {
154
- $ score = bcdiv ($ score , (string )count ($ results ), ScoreboardService::SCALE );
155
- }
156
- } elseif ($ testcaseAggregationType === TestcaseAggregationType::MIN
157
- || $ testcaseAggregationType === TestcaseAggregationType::MAX ) {
158
- $ score = null ;
159
- foreach ($ results as $ result ) {
160
- if ($ result === null ) {
161
- $ allResultsReady = false ;
162
- break ;
163
- } elseif ($ score === null ) {
164
- $ score = $ result ;
165
- } else {
166
- if ($ testcaseAggregationType === TestcaseAggregationType::MIN
167
- && bccomp ($ result , $ score , ScoreboardService::SCALE ) < 0 ) {
168
- $ score = $ result ;
148
+ switch ($ testcaseAggregationType ) {
149
+ case TestcaseAggregationType::SUM :
150
+ case TestcaseAggregationType::AVG :
151
+ $ score = "0 " ;
152
+ foreach ($ results as $ result ) {
153
+ if ($ result === null ) {
154
+ $ allResultsReady = false ;
155
+ break ;
156
+ } else {
157
+ $ score = bcadd ($ score , $ result , ScoreboardService::SCALE );
169
158
}
170
- if ($ testcaseAggregationType === TestcaseAggregationType::MAX
171
- && bccomp ($ result , $ score , ScoreboardService::SCALE ) > 0 ) {
159
+ }
160
+ if ($ testcaseAggregationType === TestcaseAggregationType::AVG && count ($ results ) > 0 ) {
161
+ $ score = bcdiv ($ score , (string )count ($ results ), ScoreboardService::SCALE );
162
+ }
163
+ break ;
164
+ case TestcaseAggregationType::MIN :
165
+ case TestcaseAggregationType::MAX :
166
+ $ score = null ;
167
+ foreach ($ results as $ result ) {
168
+ if ($ result === null ) {
169
+ $ allResultsReady = false ;
170
+ break ;
171
+ } elseif ($ score === null ) {
172
172
$ score = $ result ;
173
+ } else {
174
+ if ($ testcaseAggregationType === TestcaseAggregationType::MIN
175
+ && bccomp ($ result , $ score , ScoreboardService::SCALE ) < 0 ) {
176
+ $ score = $ result ;
177
+ }
178
+ if ($ testcaseAggregationType === TestcaseAggregationType::MAX
179
+ && bccomp ($ result , $ score , ScoreboardService::SCALE ) > 0 ) {
180
+ $ score = $ result ;
181
+ }
173
182
}
174
183
}
175
- }
176
- } else {
177
- throw new InvalidArgumentException (sprintf ("Unknown testcase aggregation type '%s'. " ,
178
- $ testcaseAggregationType ->name ));
184
+ break ;
185
+ default :
186
+ throw new InvalidArgumentException (sprintf ("Unknown testcase aggregation type '%s'. " ,
187
+ $ testcaseAggregationType ->name ));
179
188
}
180
189
181
190
if ($ allResultsReady || (!$ allCorrect && !$ testcaseGroup ->isOnRejectContinue ())) {
0 commit comments