Skip to content

Commit acb4e18

Browse files
Add tests for compare services
1 parent 2b6eea2 commit acb4e18

File tree

7 files changed

+360
-20
lines changed

7 files changed

+360
-20
lines changed

webapp/src/DataTransferObject/ContestState.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
class ContestState
66
{
77
public function __construct(
8-
public readonly ?string $started,
9-
public readonly ?string $ended,
10-
public readonly ?string $frozen,
11-
public readonly ?string $thawed,
12-
public readonly ?string $finalized,
13-
public readonly ?string $endOfUpdates,
8+
public readonly ?string $started = null,
9+
public readonly ?string $ended = null,
10+
public readonly ?string $frozen = null,
11+
public readonly ?string $thawed = null,
12+
public readonly ?string $finalized = null,
13+
public readonly ?string $endOfUpdates = null,
1414
) {}
1515
}

webapp/src/Service/Compare/AbstractCompareService.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,12 @@ protected function addMessage(
7373
): void {
7474
$this->messages[] = new Message($type, $message, $source, $target);
7575
}
76+
77+
/**
78+
* @return Message[]
79+
*/
80+
public function getMessages(): array
81+
{
82+
return $this->messages;
83+
}
7684
}

webapp/src/Service/Compare/ResultsCompareService.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,29 +56,29 @@ public function compare($object1, $object2): void
5656
} else {
5757
$result2 = $results2Indexed[$result->teamId];
5858
if ($result->rank !== $result2->rank) {
59-
$this->addMessage(MessageType::ERROR, sprintf('Team %s has different rank', $result->teamId), (string)$result->rank, (string)$result2->rank);
59+
$this->addMessage(MessageType::ERROR, sprintf('Team "%s" has different rank', $result->teamId), (string)$result->rank, (string)$result2->rank);
6060
}
6161
if ($result->award !== $result2->award) {
62-
$this->addMessage(MessageType::ERROR, sprintf('Team %s has different award', $result->teamId), $result->award, $result2->award);
62+
$this->addMessage(MessageType::ERROR, sprintf('Team "%s" has different award', $result->teamId), $result->award, $result2->award);
6363
}
6464
if ($result->numSolved !== $result2->numSolved) {
65-
$this->addMessage(MessageType::ERROR, sprintf('Team %s has different num_solved', $result->teamId), (string)$result->numSolved, (string)$result2->numSolved);
65+
$this->addMessage(MessageType::ERROR, sprintf('Team "%s" has different num solved', $result->teamId), (string)$result->numSolved, (string)$result2->numSolved);
6666
}
6767
if ($result->totalTime !== $result2->totalTime) {
68-
$this->addMessage(MessageType::ERROR, sprintf('Team %s has different total_time', $result->teamId), (string)$result->totalTime, (string)$result2->totalTime);
68+
$this->addMessage(MessageType::ERROR, sprintf('Team "%s" has different total time', $result->teamId), (string)$result->totalTime, (string)$result2->totalTime);
6969
}
7070
if ($result->lastTime !== $result2->lastTime) {
71-
$this->addMessage(MessageType::ERROR, sprintf('Team %s has different last_time', $result->teamId), (string)$result->lastTime, (string)$result2->lastTime);
71+
$this->addMessage(MessageType::ERROR, sprintf('Team "%s" has different last time', $result->teamId), (string)$result->lastTime, (string)$result2->lastTime);
7272
}
7373
if ($result->groupWinner !== $result2->groupWinner) {
74-
$this->addMessage(MessageType::WARNING, sprintf('Team %s has different group_winner', $result->teamId), (string)$result->groupWinner, (string)$result2->groupWinner);
74+
$this->addMessage(MessageType::WARNING, sprintf('Team "%s" has different group winner', $result->teamId), (string)$result->groupWinner, (string)$result2->groupWinner);
7575
}
7676
}
7777
}
7878

7979
foreach ($object2 as $result) {
8080
if (!isset($results1Indexed[$result->teamId])) {
81-
$this->addMessage(MessageType::ERROR, sprintf('Team %s not found in first file', $result->teamId));
81+
$this->addMessage(MessageType::ERROR, sprintf('Team "%s" not found in first file', $result->teamId));
8282
}
8383
}
8484
}

webapp/src/Service/Compare/ScoreboardCompareService.php

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,22 +59,21 @@ public function compare($object1, $object2): void
5959

6060
foreach ($object1->rows as $index => $row) {
6161
if ($row->teamId !== $object2->rows[$index]->teamId) {
62-
$this->addMessage(MessageType::ERROR, sprintf('Row %d: Team ID does not match', $index), $row->teamId, $object2->rows[$index]->teamId);
62+
$this->addMessage(MessageType::ERROR, sprintf('Row %d: team ID does not match', $index), $row->teamId, $object2->rows[$index]->teamId);
6363
}
6464

6565
if ($row->rank !== $object2->rows[$index]->rank) {
66-
$this->addMessage(MessageType::ERROR, sprintf('Row %d: Rank does not match', $index), (string)$row->rank, (string)$object2->rows[$index]->rank);
66+
$this->addMessage(MessageType::ERROR, sprintf('Row %d: rank does not match', $index), (string)$row->rank, (string)$object2->rows[$index]->rank);
6767
}
6868

6969
if ($row->score->numSolved !== $object2->rows[$index]->score->numSolved) {
70-
$this->addMessage(MessageType::ERROR, sprintf('Row %d: Num solved does not match', $index), (string)$row->score->numSolved, (string)$object2->rows[$index]->score->numSolved);
70+
$this->addMessage(MessageType::ERROR, sprintf('Row %d: num solved does not match', $index), (string)$row->score->numSolved, (string)$object2->rows[$index]->score->numSolved);
7171
}
7272

7373
if ($row->score->totalTime !== $object2->rows[$index]->score->totalTime) {
74-
$this->addMessage(MessageType::ERROR, sprintf('Row %d: Total time does not match', $index), (string)$row->score->totalTime, (string)$object2->rows[$index]->score->totalTime);
74+
$this->addMessage(MessageType::ERROR, sprintf('Row %d: total time does not match', $index), (string)$row->score->totalTime, (string)$object2->rows[$index]->score->totalTime);
7575
}
7676

77-
// Problem messages are mostly info for now, since PC^2 doesn't expose time info
7877
foreach ($row->problems as $problem) {
7978
/** @var Problem|null $problemForSecond */
8079
$problemForSecond = null;
@@ -91,7 +90,7 @@ public function compare($object1, $object2): void
9190
}
9291

9392
if ($problemForSecond === null && $problem->solved) {
94-
$this->addMessage(MessageType::ERROR, sprintf('Row %d: Problem %s solved in first file, but not in second file', $index, $problem->problemId));
93+
$this->addMessage(MessageType::ERROR, sprintf('Row %d: Problem %s solved in first file, but not found in second file', $index, $problem->problemId));
9594
} elseif ($problemForSecond !== null && $problem->solved !== $problemForSecond->solved) {
9695
$this->addMessage(MessageType::ERROR, sprintf('Row %d: Problem %s solved does not match', $index, $problem->problemId), (string)$problem->solved, (string)$problemForSecond->solved);
9796
}
@@ -106,6 +105,7 @@ public function compare($object1, $object2): void
106105
}
107106

108107
if ($problem->time !== $problemForSecond->time) {
108+
// This is an info message for now, since PC^2 doesn't expose time info
109109
$this->addMessage(MessageType::INFO, sprintf('Row %d: Problem %s time does not match', $index, $problem->problemId), (string)$problem->time, (string)$problemForSecond->time);
110110
}
111111
}
@@ -126,7 +126,7 @@ public function compare($object1, $object2): void
126126
}
127127

128128
if ($problemForFirst === null && $problem2->solved) {
129-
$this->addMessage(MessageType::ERROR, sprintf('Row %d: Problem %s solved in second file, but not in first file', $index, $problem2->problemId));
129+
$this->addMessage(MessageType::ERROR, sprintf('Row %d: Problem %s solved in second file, but not found in first file', $index, $problem2->problemId));
130130
}
131131
}
132132
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace App\Tests\Unit\Service\Compare;
4+
5+
use App\DataTransferObject\Award;
6+
use App\Service\Compare\AwardCompareService;
7+
use App\Service\Compare\Message;
8+
use App\Service\Compare\MessageType;
9+
use Generator;
10+
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
11+
use Symfony\Component\Serializer\SerializerInterface;
12+
13+
class AwardCompareServiceTest extends KernelTestCase
14+
{
15+
/**
16+
* @param Award[] $awards1
17+
* @param Award[] $awards2
18+
* @param Message[] $expectedMessages
19+
*
20+
* @dataProvider provideCompare
21+
*/
22+
public function testCompare(array $awards1, array $awards2, array $expectedMessages): void
23+
{
24+
$serializer = $this->createMock(SerializerInterface::class);
25+
$compareService = new AwardCompareService($serializer);
26+
27+
$compareService->compare($awards1, $awards2);
28+
$messages = $compareService->getMessages();
29+
30+
self::assertEquals($expectedMessages, $messages);
31+
}
32+
33+
public function provideCompare(): Generator
34+
{
35+
yield [[], [], []];
36+
yield [
37+
[new Award('award1', null, [])],
38+
[],
39+
[new Message(MessageType::INFO, 'Award "award1" not found in second file, but has no team ID\'s in first file', null, null)],
40+
];
41+
yield [
42+
[],
43+
[new Award('award2', null, [])],
44+
[new Message(MessageType::INFO, 'Award "award2" not found in first file, but has no team ID\'s in second file', null, null)],
45+
];
46+
yield [
47+
[new Award('award3', null, ["1", "2", "3"])],
48+
[],
49+
[new Message(MessageType::ERROR, 'Award "award3" not found in second file', null, null)],
50+
];
51+
yield [
52+
[],
53+
[new Award('award4', null, ["1", "2", "3"])],
54+
[new Message(MessageType::ERROR, 'Award "award4" not found in first file', null, null)],
55+
];
56+
yield [
57+
[new Award('award1', 'citation1', [])],
58+
[new Award('award1', 'citation2', [])],
59+
[new Message(MessageType::WARNING, 'Award "award1" has different citation', 'citation1', 'citation2')],
60+
];
61+
yield [
62+
[new Award('award1', 'citation1', ["1", "2"])],
63+
[new Award('award1', 'citation1', ["2", "3"])],
64+
[new Message(MessageType::ERROR, 'Award "award1" has different team ID\'s', '1, 2', '2, 3')],
65+
];
66+
}
67+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace App\Tests\Unit\Service\Compare;
4+
5+
use App\DataTransferObject\Result;
6+
use App\Service\Compare\Message;
7+
use App\Service\Compare\MessageType;
8+
use App\Service\Compare\ResultsCompareService;
9+
use Generator;
10+
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
11+
use Symfony\Component\Serializer\SerializerInterface;
12+
13+
class ResultsCompareServiceTest extends KernelTestCase
14+
{
15+
/**
16+
* @param Result[] $results1
17+
* @param Result[] $results2
18+
* @param Message[] $expectedMessages
19+
*
20+
* @dataProvider provideCompare
21+
*/
22+
public function testCompare(array $results1, array $results2, array $expectedMessages): void
23+
{
24+
$serializer = $this->createMock(SerializerInterface::class);
25+
$compareService = new ResultsCompareService($serializer);
26+
27+
$compareService->compare($results1, $results2);
28+
$messages = $compareService->getMessages();
29+
30+
self::assertEquals($expectedMessages, $messages);
31+
}
32+
33+
public function provideCompare(): Generator
34+
{
35+
yield [[], [], []];
36+
yield [
37+
[new Result('team1', 1, '', 0, 0, 0)],
38+
[],
39+
[new Message(MessageType::ERROR, 'Team "team1" not found in second file', null, null)],
40+
];
41+
yield [
42+
[],
43+
[new Result('team2', 1, '', 0, 0, 0)],
44+
[new Message(MessageType::ERROR, 'Team "team2" not found in first file', null, null)],
45+
];
46+
yield [
47+
[new Result('team3', 1, '', 0, 0, 0)],
48+
[new Result('team3', 2, '', 0, 0, 0)],
49+
[new Message(MessageType::ERROR, 'Team "team3" has different rank', '1', '2')],
50+
];
51+
yield [
52+
[new Result('team4', 1, 'award1', 0, 0, 0)],
53+
[new Result('team4', 1, 'award2', 0, 0, 0)],
54+
[new Message(MessageType::ERROR, 'Team "team4" has different award', 'award1', 'award2')],
55+
];
56+
yield [
57+
[new Result('team5', 1, 'award3', 1, 0, 0)],
58+
[new Result('team5', 1, 'award3', 2, 0, 0)],
59+
[new Message(MessageType::ERROR, 'Team "team5" has different num solved', '1', '2')],
60+
];
61+
yield [
62+
[new Result('team6', 1, 'award4', 1, 100, 0)],
63+
[new Result('team6', 1, 'award4', 1, 200, 0)],
64+
[new Message(MessageType::ERROR, 'Team "team6" has different total time', '100', '200')],
65+
];
66+
yield [
67+
[new Result('team7', 1, 'award4', 1, 100, 10)],
68+
[new Result('team7', 1, 'award4', 1, 100, 20)],
69+
[new Message(MessageType::ERROR, 'Team "team7" has different last time', '10', '20')],
70+
];
71+
yield [
72+
[new Result('team8', 1, 'award4', 1, 100, 10, 'winner1')],
73+
[new Result('team8', 1, 'award4', 1, 100, 10, 'winner2')],
74+
[new Message(MessageType::WARNING, 'Team "team8" has different group winner', 'winner1', 'winner2')],
75+
];
76+
}
77+
}

0 commit comments

Comments
 (0)