Skip to content

Commit 294d538

Browse files
committed
Write the tests for standings positions creators (close the issue #49)
1 parent 33ec62c commit 294d538

8 files changed

+131
-38
lines changed
Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,32 @@
11
import 'package:sj_manager/models/db/event_series/standings/standings_positions_map_creator/standings_positions_creator.dart';
22
import 'package:sj_manager/models/db/event_series/standings/standings_record.dart';
33

4-
class StandingsPositionsWithExAequoCreator<T extends StandingsRecord>
4+
class StandingsPositionsWithExAequosCreator<T extends StandingsRecord>
55
implements StandingsPositionsCreator<T> {
6+
late List<T> _records;
7+
68
@override
79
Map<int, List<T>> create(List<T> records) {
8-
_sortRecords(records);
9-
return _generatePositionsMap(records);
10+
_records = List.of(records);
11+
_sortRecords();
12+
return _generatePositionsMap();
1013
}
1114

12-
void _sortRecords(List<T> records) {
13-
records.sort((a, b) => b.compareTo(a));
15+
void _sortRecords() {
16+
_records.sort((a, b) => b.compareTo(a));
1417
}
1518

16-
Map<int, List<T>> _generatePositionsMap(List<T> records) {
19+
Map<int, List<T>> _generatePositionsMap() {
1720
Map<int, List<T>> positionsMap = {};
1821
int currentPosition = 1;
1922
int currentRank = 1;
2023

21-
for (int i = 0; i < records.length; i++) {
22-
if (i > 0 && records[i].score != records[i - 1].score) {
24+
for (int i = 0; i < _records.length; i++) {
25+
if (i > 0 && _records[i].score != _records[i - 1].score) {
2326
currentRank = currentPosition;
2427
}
2528

26-
positionsMap.putIfAbsent(currentRank, () => []).add(records[i]);
29+
positionsMap.putIfAbsent(currentRank, () => []).add(_records[i]);
2730
currentPosition++;
2831
}
2932

lib/models/db/event_series/standings/standings_positions_map_creator/standings_positions_with_no_ex_aequo_creator.dart

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,28 @@ import 'package:sj_manager/models/db/event_series/standings/standings_record.dar
33

44
class StandingsPositionsWithNoExAequoCreator<T extends StandingsRecord>
55
implements StandingsPositionsCreator<T> {
6+
late List<T> _records;
7+
68
@override
79
Map<int, List<T>> create(List<T> records) {
8-
_sortRecords(records);
9-
return _generatePositionsMap(records);
10+
_records = List.of(records);
11+
_sortRecords();
12+
return _generatePositionsMap();
1013
}
1114

12-
void _sortRecords(List<T> records) {
13-
records.sort((a, b) => a.score > b.score ? -1 : 1);
15+
void _sortRecords() {
16+
_records.sort((a, b) {
17+
if (a.score > b.score) return -1;
18+
if (a.score < b.score) return 1;
19+
return 0; // Maintain original order if scores are equal
20+
});
1421
}
1522

16-
Map<int, List<T>> _generatePositionsMap(List<T> records) {
23+
Map<int, List<T>> _generatePositionsMap() {
1724
Map<int, List<T>> positionsMap = {};
1825
int currentPosition = 1;
1926

20-
for (T record in records) {
27+
for (T record in _records) {
2128
positionsMap[currentPosition] = [record];
2229
currentPosition++;
2330
}

lib/models/db/event_series/standings/standings_positions_map_creator/standings_positions_with_shuffle_on_equals_creator.dart

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,30 @@ import 'package:sj_manager/models/db/event_series/standings/standings_record.dar
66
class StandingsPositionsWithShuffleOnEqualsCreator<T extends StandingsRecord>
77
implements StandingsPositionsCreator<T> {
88
final Random _random = Random();
9+
late List<T> _records;
910

1011
@override
1112
Map<int, List<T>> create(List<T> records) {
12-
_sortRecords(records);
13-
return _generatePositionsMap(records);
13+
_records = List.of(records);
14+
_sortRecords();
15+
return _generatePositionsMap();
1416
}
1517

16-
void _sortRecords(List<T> records) {
17-
records.sort((a, b) => a.score > b.score ? -1 : 1);
18+
void _sortRecords() {
19+
_records.sort((a, b) => a.score > b.score ? -1 : 1);
1820
}
1921

20-
Map<int, List<T>> _generatePositionsMap(List<T> records) {
22+
Map<int, List<T>> _generatePositionsMap() {
2123
Map<int, List<T>> positionsMap = {};
2224
int currentPosition = 1;
2325
int currentRank = 1;
2426

25-
for (int i = 0; i < records.length; i++) {
26-
if (i > 0 && records[i].score < records[i - 1].score) {
27+
for (int i = 0; i < _records.length; i++) {
28+
if (i > 0 && _records[i].score < _records[i - 1].score) {
2729
currentRank = currentPosition;
2830
}
2931

30-
positionsMap.putIfAbsent(currentRank, () => []).add(records[i]);
32+
positionsMap.putIfAbsent(currentRank, () => []).add(_records[i]);
3133
currentPosition++;
3234
}
3335

test/career_mode_logic/classification_standings_test.dart

Lines changed: 0 additions & 13 deletions
This file was deleted.

test/career_mode_logic/callback_classification_scoring_delegate_by_event_series_test.dart renamed to test/standings/callback_classification_scoring_delegate_by_event_series_test.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import 'package:flutter_test/flutter_test.dart';
22
import 'package:mockito/annotations.dart';
33
import 'package:sj_manager/models/db/event_series/classification/classification_scoring_delegate/callback_classification_scoring_delegates.dart';
4-
import 'package:sj_manager/models/db/event_series/classification/classification_scoring_delegate/classification_scoring_delegate.dart';
54
import 'package:sj_manager/models/db/event_series/event_series.dart';
65

76
import 'callback_classification_scoring_delegate_by_event_series_test.mocks.dart';
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Mocks generated by Mockito 5.4.4 from annotations
2-
// in sj_manager/test/career_mode_logic/callback_classification_scoring_delegate_by_event_series_test.dart.
2+
// in sj_manager/test/standings/callback_classification_scoring_delegate_by_event_series_test.dart.
33
// Do not manually edit this file.
44

55
// ignore_for_file: no_leading_underscores_for_library_prefixes
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import 'package:flutter_test/flutter_test.dart';
2+
import 'package:sj_manager/models/db/event_series/standings/score/basic_score_types.dart';
3+
import 'package:sj_manager/models/db/event_series/standings/standings_positions_map_creator/standings_positions_creator.dart';
4+
import 'package:sj_manager/models/db/event_series/standings/standings_positions_map_creator/standings_positions_with_ex_aequos_creator.dart';
5+
import 'package:sj_manager/models/db/event_series/standings/standings_positions_map_creator/standings_positions_with_no_ex_aequo_creator.dart';
6+
import 'package:sj_manager/models/db/event_series/standings/standings_record.dart';
7+
8+
void main() {
9+
late StandingsPositionsCreator<StandingsRecord<String, PointsScore>> creator;
10+
const recordsWithoutExAequo = [
11+
StandingsRecord(entity: 'Maciej Kot', score: PointsScore(140.5)),
12+
StandingsRecord(entity: 'Dawid Kubacki', score: PointsScore(137.2)),
13+
StandingsRecord(entity: 'Kamil Stoch', score: PointsScore(132.5)),
14+
StandingsRecord(entity: 'Jakub Wolny', score: PointsScore(130.4)),
15+
StandingsRecord(entity: 'Paweł Wasek', score: PointsScore(128.5)),
16+
StandingsRecord(entity: 'Andrzej Stękała', score: PointsScore(111.5)),
17+
];
18+
19+
const recordsWithExAequos = [
20+
StandingsRecord(entity: 'Maciej Kot', score: PointsScore(140.5)),
21+
StandingsRecord(entity: 'Dawid Kubacki', score: PointsScore(140.5)),
22+
StandingsRecord(entity: 'Piotr Żyła', score: PointsScore(140.5)),
23+
StandingsRecord(entity: 'Kamil Stoch', score: PointsScore(130.1)),
24+
StandingsRecord(entity: 'Jakub Wolny', score: PointsScore(129.0)),
25+
StandingsRecord(entity: 'Paweł Wasek', score: PointsScore(129.0)),
26+
StandingsRecord(entity: 'Andrzej Stękała', score: PointsScore(110.0)),
27+
StandingsRecord(entity: 'Kacper Tomasiak', score: PointsScore(110.0)),
28+
StandingsRecord(entity: 'Stefan Hula', score: PointsScore(107.6)),
29+
StandingsRecord(entity: 'Tymek Amilkiewicz', score: PointsScore(103.5)),
30+
];
31+
32+
group('When no aequos', () {
33+
const expected = {
34+
1: [StandingsRecord(entity: 'Maciej Kot', score: PointsScore(140.5))],
35+
2: [StandingsRecord(entity: 'Dawid Kubacki', score: PointsScore(137.2))],
36+
3: [StandingsRecord(entity: 'Kamil Stoch', score: PointsScore(132.5))],
37+
4: [StandingsRecord(entity: 'Jakub Wolny', score: PointsScore(130.4))],
38+
5: [StandingsRecord(entity: 'Paweł Wasek', score: PointsScore(128.5))],
39+
6: [StandingsRecord(entity: 'Andrzej Stękała', score: PointsScore(111.5))],
40+
};
41+
test('No ex aequos for StandingsPositionsWithNoExAequoCreator', () {
42+
creator = StandingsPositionsWithNoExAequoCreator();
43+
final positions = creator.create(recordsWithoutExAequo);
44+
expect(positions, expected);
45+
});
46+
test('No ex aequos for StandingsPositionsWithExAequosCreator', () {
47+
creator = StandingsPositionsWithExAequosCreator();
48+
final positions = creator.create(recordsWithoutExAequo);
49+
expect(positions, expected);
50+
});
51+
});
52+
53+
group('When there are ex aequos', () {
54+
test('Ex aequos for StandingsPositionsWithNoExAequoCreator', () {
55+
creator = StandingsPositionsWithNoExAequoCreator();
56+
final positions = creator.create(recordsWithExAequos);
57+
expect(positions, const {
58+
1: [StandingsRecord(entity: 'Maciej Kot', score: PointsScore(140.5))],
59+
2: [StandingsRecord(entity: 'Dawid Kubacki', score: PointsScore(140.5))],
60+
3: [StandingsRecord(entity: 'Piotr Żyła', score: PointsScore(140.5))],
61+
4: [StandingsRecord(entity: 'Kamil Stoch', score: PointsScore(130.1))],
62+
5: [StandingsRecord(entity: 'Jakub Wolny', score: PointsScore(129.0))],
63+
6: [StandingsRecord(entity: 'Paweł Wasek', score: PointsScore(129.0))],
64+
7: [StandingsRecord(entity: 'Andrzej Stękała', score: PointsScore(110.0))],
65+
8: [StandingsRecord(entity: 'Kacper Tomasiak', score: PointsScore(110.0))],
66+
9: [StandingsRecord(entity: 'Stefan Hula', score: PointsScore(107.6))],
67+
10: [StandingsRecord(entity: 'Tymek Amilkiewicz', score: PointsScore(103.5))],
68+
});
69+
});
70+
test('Ex aequos for StandingsPositionsWithNoAequosCreator', () {
71+
creator = StandingsPositionsWithExAequosCreator();
72+
final positions = creator.create(recordsWithExAequos);
73+
expect(positions, const {
74+
1: [
75+
StandingsRecord(entity: 'Maciej Kot', score: PointsScore(140.5)),
76+
StandingsRecord(entity: 'Dawid Kubacki', score: PointsScore(140.5)),
77+
StandingsRecord(entity: 'Piotr Żyła', score: PointsScore(140.5)),
78+
],
79+
4: [
80+
StandingsRecord(entity: 'Kamil Stoch', score: PointsScore(130.1)),
81+
],
82+
5: [
83+
StandingsRecord(entity: 'Jakub Wolny', score: PointsScore(129.0)),
84+
StandingsRecord(entity: 'Paweł Wasek', score: PointsScore(129.0)),
85+
],
86+
7: [
87+
StandingsRecord(entity: 'Andrzej Stękała', score: PointsScore(110.0)),
88+
StandingsRecord(entity: 'Kacper Tomasiak', score: PointsScore(110.0)),
89+
],
90+
9: [StandingsRecord(entity: 'Stefan Hula', score: PointsScore(107.6))],
91+
10: [StandingsRecord(entity: 'Tymek Amilkiewicz', score: PointsScore(103.5))],
92+
});
93+
});
94+
});
95+
}

0 commit comments

Comments
 (0)