Skip to content

Commit 9000284

Browse files
committed
Started refactoring in preparation for supporting other race types.
1 parent b97ffc4 commit 9000284

File tree

527 files changed

+289
-78
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

527 files changed

+289
-78
lines changed

src/main/java/lap_race/Category.java

+5-48
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,12 @@
11
package lap_race;
22

3-
public enum Category {
3+
public interface Category {
44

5-
// Declared in order of decreasing generality.
6-
// The order is significant in that it defines the order of iteration when allocating prizes.
5+
boolean includes(final Category other_category);
76

8-
OPEN_SENIOR("Open Senior", "Open", 15, 3),
9-
MIXED_SENIOR("Mixed Senior", "Mixed", 15, 1),
10-
FEMALE_SENIOR("Women Senior", "Women", 15, 3),
11-
OPEN_40("Open 40+", "Open", 40, 1),
12-
MIXED_40("Mixed 40+", "Mixed", 40, 1),
13-
FEMALE_40("Women 40+", "Women", 40, 1),
14-
OPEN_50("Open 50+", "Open", 50,1),
15-
FEMALE_50("Women 50+", "Women", 50, 1),
16-
OPEN_60("Open 60+", "Open", 60,1),
17-
FEMALE_60("Women 60+", "Women", 60, 1);
7+
int numberOfPrizes();
188

19-
private final String category_name;
20-
private final String composition;
21-
private final int minimum_age;
22-
public final int number_of_prizes;
9+
String shortName();
2310

24-
Category(final String category_name, final String composition, final int minimum_age, final int number_of_prizes) {
25-
26-
this.category_name = category_name;
27-
this.composition = composition;
28-
this.minimum_age = minimum_age;
29-
this.number_of_prizes = number_of_prizes;
30-
}
31-
32-
public boolean includes(final Category other_category) {
33-
34-
return compositionIncludes(other_category.composition) && minimum_age <= other_category.minimum_age;
35-
}
36-
37-
private boolean compositionIncludes(final String other_composition) {
38-
39-
return composition.equals(other_composition) ||
40-
composition.equals("Open") && other_composition.equals("Women") ||
41-
composition.equals("Open") && other_composition.equals("Mixed");
42-
}
43-
44-
public static Category parse(final String s) {
45-
46-
for (Category category : values())
47-
if (category.category_name.equals(s)) return category;
48-
49-
throw new RuntimeException("undefined category: " + s);
50-
}
51-
52-
public String toString() {
53-
return category_name;
54-
}
11+
String longName();
5512
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package lap_race;
2+
3+
public enum LapRaceCategory implements Category {
4+
5+
// Declared in order of decreasing generality.
6+
// The order is significant in that it defines the order of iteration when allocating prizes.
7+
8+
OPEN_SENIOR("Open Senior", "Open", 15, 3),
9+
MIXED_SENIOR("Mixed Senior", "Mixed", 15, 1),
10+
FEMALE_SENIOR("Women Senior", "Women", 15, 3),
11+
OPEN_40("Open 40+", "Open", 40, 1),
12+
MIXED_40("Mixed 40+", "Mixed", 40, 1),
13+
FEMALE_40("Women 40+", "Women", 40, 1),
14+
OPEN_50("Open 50+", "Open", 50,1),
15+
FEMALE_50("Women 50+", "Women", 50, 1),
16+
OPEN_60("Open 60+", "Open", 60,1),
17+
FEMALE_60("Women 60+", "Women", 60, 1);
18+
19+
private final String category_name;
20+
private final String composition;
21+
private final int minimum_age;
22+
public final int number_of_prizes;
23+
24+
LapRaceCategory(final String category_name, final String composition, final int minimum_age, final int number_of_prizes) {
25+
26+
this.category_name = category_name;
27+
this.composition = composition;
28+
this.minimum_age = minimum_age;
29+
this.number_of_prizes = number_of_prizes;
30+
}
31+
32+
@Override
33+
public boolean includes(final Category other_category) {
34+
35+
LapRaceCategory other = (LapRaceCategory) other_category;
36+
return compositionIncludes(other.composition) && minimum_age <= other.minimum_age;
37+
}
38+
39+
private boolean compositionIncludes(final String other_composition) {
40+
41+
return composition.equals(other_composition) ||
42+
composition.equals("Open") && other_composition.equals("Women") ||
43+
composition.equals("Open") && other_composition.equals("Mixed");
44+
}
45+
46+
public static Category parse(final String s) {
47+
48+
for (Category category : values())
49+
if (category.shortName().equals(s)) return category;
50+
51+
throw new RuntimeException("undefined category: " + s);
52+
}
53+
54+
@Override
55+
public String shortName() {
56+
return category_name;
57+
}
58+
59+
@Override
60+
public String longName() {
61+
return category_name;
62+
}
63+
64+
@Override
65+
public int numberOfPrizes() {
66+
return number_of_prizes;
67+
}
68+
}

src/main/java/lap_race/Output.java

+10-10
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,16 @@ public abstract class Output {
1212
public static final String DNF_STRING = "DNF";
1313

1414
public static final List<Category> CATEGORY_REPORT_ORDER = Arrays.asList(
15-
Category.FEMALE_SENIOR,
16-
Category.OPEN_SENIOR,
17-
Category.FEMALE_40,
18-
Category.OPEN_40,
19-
Category.FEMALE_50,
20-
Category.OPEN_50,
21-
Category.FEMALE_60,
22-
Category.OPEN_60,
23-
Category.MIXED_SENIOR,
24-
Category.MIXED_40);
15+
LapRaceCategory.FEMALE_SENIOR,
16+
LapRaceCategory.OPEN_SENIOR,
17+
LapRaceCategory.FEMALE_40,
18+
LapRaceCategory.OPEN_40,
19+
LapRaceCategory.FEMALE_50,
20+
LapRaceCategory.OPEN_50,
21+
LapRaceCategory.FEMALE_60,
22+
LapRaceCategory.OPEN_60,
23+
LapRaceCategory.MIXED_SENIOR,
24+
LapRaceCategory.MIXED_40);
2525

2626
final Results results;
2727

src/main/java/lap_race/OutputCSV.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ private void printOverallResults(final OutputStreamWriter writer) throws IOExcep
7171
writer.append(",").
7272
append(String.valueOf(overall_result.team.bib_number)).append(",").
7373
append(overall_result.team.name).append(",").
74-
append(String.valueOf(overall_result.team.category)).append(",").
74+
append(overall_result.team.category.shortName()).append(",").
7575
append(overall_result.dnf() ? "DNF" : Output.format(overall_result.duration())).append("\n");
7676
}
7777
}
@@ -103,7 +103,7 @@ private void printDetailedResult(final OutputStreamWriter writer, final int resu
103103
writer.append(",");
104104
writer.append(String.valueOf(result.team.bib_number)).append(",");
105105
writer.append(result.team.name).append(",");
106-
writer.append(result.team.category.toString()).append(",");
106+
writer.append(result.team.category.shortName()).append(",");
107107

108108
printLegDetails(writer, result, result.team);
109109

@@ -138,7 +138,7 @@ private void printLegResultsHeader(final OutputStreamWriter writer, final int le
138138

139139
private void printLegResults(final OutputStreamWriter writer, final LegResult[] leg_results) throws IOException {
140140

141-
// Deal with dead heats in legs 2-4.
141+
// Deal with dead heats in legs after the first.
142142
setPositionStrings(leg_results);
143143

144144
for (final LegResult leg_result : leg_results)

src/main/java/lap_race/OutputHTML.java

+4-8
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,7 @@
33
import java.io.IOException;
44
import java.io.OutputStream;
55
import java.io.OutputStreamWriter;
6-
import java.io.UnsupportedEncodingException;
7-
import java.net.URLEncoder;
8-
import java.nio.charset.StandardCharsets;
96
import java.nio.file.Files;
10-
import java.nio.file.Path;
117
import java.util.List;
128

139
public class OutputHTML extends Output {
@@ -101,7 +97,7 @@ private void printPrizes(OutputStreamWriter html_writer) throws IOException {
10197

10298
private void printPrizes(final Category category, final OutputStreamWriter writer) throws IOException {
10399

104-
writer.append("<p><strong>").append(String.valueOf(category)).append("</strong></p>\n");
100+
writer.append("<p><strong>").append(category.shortName()).append("</strong></p>\n");
105101
writer.append("<ol>\n");
106102

107103
final List<Team> category_prize_winners = results.prize_winners.get(category);
@@ -116,7 +112,7 @@ private void printPrizes(final Category category, final OutputStreamWriter write
116112

117113
writer.append("<li>").
118114
append(result.team.name).append(" (").
119-
append(result.team.category.toString()).append(") ").
115+
append(result.team.category.shortName()).append(") ").
120116
append(format(result.duration())).append("</li>\n");
121117
}
122118

@@ -168,7 +164,7 @@ private void printOverallResultsBody(final OutputStreamWriter writer) throws IOE
168164
writer.append("""
169165
</td>
170166
<td>""");
171-
writer.append(String.valueOf(result.team.category));
167+
writer.append(result.team.category.shortName());
172168
writer.append("""
173169
</td>
174170
<td>""");
@@ -252,7 +248,7 @@ private void printDetailedResult(final OutputStreamWriter writer, final int resu
252248
writer.append("""
253249
</td>
254250
<td>""");
255-
writer.append(String.valueOf(result.team.category));
251+
writer.append(result.team.category.shortName());
256252
writer.append("""
257253
</td>""");
258254

src/main/java/lap_race/OutputPDF.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public void printPrizes() throws IOException {
5959

6060
private void printPrizes(final Category category, final Document document) {
6161

62-
final Paragraph category_header_paragraph = new Paragraph(48f, "Category: " + category, PDF_BOLD_UNDERLINED_FONT);
62+
final Paragraph category_header_paragraph = new Paragraph(48f, "Category: " + category.shortName(), PDF_BOLD_UNDERLINED_FONT);
6363
category_header_paragraph.setSpacingAfter(12);
6464
document.add(category_header_paragraph);
6565

@@ -76,7 +76,7 @@ private void printPrizes(final Category category, final Document document) {
7676
final Paragraph paragraph = new Paragraph();
7777
paragraph.add(new Chunk(position++ + ": ", PDF_FONT));
7878
paragraph.add(new Chunk(result.team.name, PDF_BOLD_FONT));
79-
paragraph.add(new Chunk(" (" + result.team.category + ") ", PDF_FONT));
79+
paragraph.add(new Chunk(" (" + result.team.category.shortName() + ") ", PDF_FONT));
8080
paragraph.add(new Chunk(format(result.duration()), PDF_FONT));
8181
document.add(paragraph);
8282
}

src/main/java/lap_race/OutputText.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public void printPrizes() throws IOException {
4747

4848
private void printPrizes(final Category category, final OutputStreamWriter writer) throws IOException {
4949

50-
final String header = "Category: " + category;
50+
final String header = "Category: " + category.shortName();
5151

5252
writer.append(header).append("\n");
5353
writer.append("-".repeat(header.length())).append("\n\n");
@@ -64,7 +64,7 @@ private void printPrizes(final Category category, final OutputStreamWriter write
6464

6565
writer.append(String.valueOf(position++)).append(": ").
6666
append(result.team.name).append(" (").
67-
append(result.team.category.toString()).append(") ").
67+
append(result.team.category.shortName()).append(") ").
6868
append(format(result.duration())).append("\n");
6969
}
7070

src/main/java/lap_race/Prizes.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public void allocatePrizes() {
2525

2626
private void allocateFirstPrizes() {
2727

28-
for (final Category category : Category.values()) {
28+
for (final Category category : LapRaceCategory.values()) {
2929

3030
results.prize_winners.put(category, new ArrayList<>());
3131
allocateFirstPrize(category);
@@ -44,7 +44,7 @@ private void allocateFirstPrize(final Category category) {
4444

4545
private void allocateMinorPrizes() {
4646

47-
for (final Category category : Category.values())
47+
for (final Category category : LapRaceCategory.values())
4848
allocateMinorPrizes(category);
4949
}
5050

@@ -54,7 +54,7 @@ private void allocateMinorPrizes(final Category category) {
5454

5555
for (final OverallResult result : results.overall_results) {
5656

57-
if (position > category.number_of_prizes) return;
57+
if (position > category.numberOfPrizes()) return;
5858

5959
if (prizeWinner(result, category)) {
6060
results.prize_winners.get(category).add(result.team);

src/main/java/lap_race/Team.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public Team(final String[] elements) {
1616
bib_number = Integer.parseInt(elements[0]);
1717
name = elements[1];
1818
try {
19-
category = Category.parse(elements[2]);
19+
category = LapRaceCategory.parse(elements[2]);
2020
}
2121
catch (RuntimeException e) {
2222
throw new RuntimeException("illegal category for team: " + bib_number);

src/test/java/lap_race/devils_burdens/ResultsTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@ private void configureTest(String test_resource_root) throws IOException {
471471
Path temp_input_sub_directory = Files.createDirectories(temp_directory.resolve("input"));
472472
temp_output_sub_directory = Files.createDirectories(temp_directory.resolve("output"));
473473

474-
Path resources_root = Paths.get("src/test/resources/devils_burdens/" + test_resource_root);
474+
Path resources_root = Paths.get("src/test/resources/lap_race/devils_burdens/" + test_resource_root);
475475
Path resources_inputs = resources_root.resolve("input");
476476
resources_expected_outputs = resources_root.resolve("expected");
477477
Path resources_config = resources_inputs.resolve("config.txt");
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
Pos,No,Runner,Club,Cat,Time
2+
16,28,Myles Christie,Fife AC,F40,01:04:28
3+
24,14,Lena K. Maclean,Dundee Hawkhill Harriers,F40,01:16:04
4+
27,27,Henry Muir,Perth Road Runners,F40,01:20:25
5+
6,4,Sofia O'Connor,Fife AC,F50,00:49:58
6+
21,15,Cayla Duncan,Dundee Hawkhill Harriers,F70,01:11:43
7+
1,20,Amelia Muir,Strathearn Harriers,FS,00:42:43
8+
2,29,Isabel Ritchie,Fife AC,FS,00:44:10
9+
4,10,Nina Joan Fiona Walker,Carnegie Harriers,FS,00:47:04
10+
8,22,Zuzanna Miller-Ford,Leven Las Vegas RC,FS,00:52:52
11+
14,21,Alix Crawford,STAART,FS,01:01:34
12+
23,26,Paige Thompson,Perth Road Runners,FS,01:14:37
13+
25,19,Martha Gibson,Strathearn,FS,01:17:31
14+
13,16,Amé MacDonald,Unatt.,FU20,01:00:07
15+
18,6,Hailey Dickson:),Unatt.,FU20,01:07:22
16+
9,24,Hasan Robertson,Anster Haddies,M40,00:54:19
17+
10,25,Hope Christie,Anster Haddies,M40,00:55:46
18+
12,23,Leland Donaldson,Leven Las Vegas RC,M40,00:58:40
19+
29,8,Martin King,PH Racing,M40,01:23:19
20+
11,17,Regan Millar,FTR,M50,00:57:13
21+
15,18,Hubert Gray,Falkland Trail Runners,M50,01:03:01
22+
26,9,Philip O’Donohue,Strathearn Harriers,M50,01:18:58
23+
28,2,Bartosz Thomson,Dundee Road Runners,M50,01:21:52
24+
20,13,Neil MacDonald,Dundee Road Runners,M60,01:10:16
25+
7,12,Leo McKenzie,Dundee Hawkhill Harriers,M70,00:51:25
26+
19,11,Rhys Müllar,Dundee Hawkhill Harriers,M80,01:08:49
27+
3,1,John Smith,Fife AC,MS,00:45:37
28+
5,5,Clark O' Connor,Unatt.,MS,00:48:31
29+
22,3,JackBruce,Dundee Road Runners,MS,01:13:10
30+
30,30,Scott Kelly,Fife AC,MS,01:24:46
31+
17,7,John Smith,Unatt.,MU20,01:05:55

0 commit comments

Comments
 (0)