From 6c7fddae1627800e27e7ab8f05f12cc5254a7e0b Mon Sep 17 00:00:00 2001 From: Graham Kirby Date: Mon, 2 Dec 2024 09:15:39 +0000 Subject: [PATCH] Progress on Grand Prix, not working. --- .../race_timing/common/Normalisation.java | 17 ++- .../grahamkirby/race_timing/common/Race.java | 20 +++- .../race_timing/common/RaceInput.java | 2 +- .../individual_race/IndividualRace.java | 79 ++++++++++--- .../individual_race/IndividualRaceEntry.java | 6 +- .../individual_race/IndividualRaceInput.java | 2 + .../individual_race/IndividualRaceResult.java | 2 +- .../race_timing/series_race/SeriesRace.java | 6 + .../fife_ac_grand_prix/GrandPrixRace.java | 106 +++++++++++++++--- .../GrandPrixRaceOutputCSV.java | 79 +++++++++++++ .../GrandPrixRaceResult.java | 71 ++++++++++++ .../fife_ac_midweek/MidweekRace.java | 7 ++ .../fife_ac_minitour/MinitourRace.java | 7 ++ .../race_timing/single_race/SingleRace.java | 2 + .../single_race/SingleRaceInput.java | 41 ++++++- .../ActualRacesGrandPrixTest.java | 42 +++++++ .../2016/input/stirling_10k/input/config.txt | 1 - .../2016/input/stirling_10k/input/results.txt | 20 ---- .../expected/grand_prix_overall_2016.csv} | 0 .../input/black_rock/input/config.txt | 11 ++ .../input/black_rock/input/entry_map.csv | 1 + .../input/black_rock/input/results.txt | 0 .../categories_prize_individual_senior.csv | 14 +++ .../2016/completed_12/input}/config.txt | 3 +- .../input/east_neuk_10k/input/config.txt | 11 ++ .../input/east_neuk_10k/input/entry_map.csv | 5 + .../input/east_neuk_10k/input/results.txt | 0 .../input/gateside_gallop/input/config.txt | 11 ++ .../input/gateside_gallop/input/entry_map.csv | 13 +++ .../input/gateside_gallop/input/results.txt | 0 .../input/giffordtown_5k/input/config.txt | 11 ++ .../input/giffordtown_5k/input/entry_map.csv | 3 + .../input/giffordtown_5k/input/results.txt | 0 .../input/kinnoull/input/config.txt | 11 ++ .../input/kinnoull/input/entry_map.csv | 3 + .../input/kinnoull/input/results.txt | 0 .../input/kinross_10k/input/config.txt | 10 ++ .../input/kinross_10k/input/results.txt | 0 .../completed_12/input/largo/input/config.txt | 11 ++ .../input/largo/input/entry_map.csv | 3 + .../input/largo/input/results.txt | 0 .../input/lomonds/input/config.txt | 11 ++ .../input/lomonds/input/entry_map.csv | 5 + .../input/lomonds/input/results.txt | 2 +- .../input/normans_law/input/config.txt | 11 ++ .../input/normans_law/input/entry_map.csv | 9 ++ .../input/normans_law/input/results.txt | 4 +- .../input/sandy_slither/input/config.txt | 11 ++ .../input/sandy_slither/input/entry_map.csv | 11 ++ .../input/sandy_slither/input/results.txt | 0 .../input/stirling_10k/input/config.txt | 12 ++ .../input/stirling_10k/input/results.txt | 20 ++++ .../input/trail_champs/input/config.txt | 12 ++ .../input/trail_champs/input/results.txt | 0 54 files changed, 667 insertions(+), 72 deletions(-) create mode 100644 src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_grand_prix/GrandPrixRaceOutputCSV.java create mode 100644 src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_grand_prix/GrandPrixRaceResult.java create mode 100644 src/test/java/org/grahamkirby/race_timing/actual_races/ActualRacesGrandPrixTest.java delete mode 100644 src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/stirling_10k/input/config.txt delete mode 100644 src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/stirling_10k/input/results.txt rename src/test/resources/actual_races/{grand_prix_race/summer_grand_prix/2016/expected/grand_prix_2016.csv => series_race/grand_prix/2016/completed_12/expected/grand_prix_overall_2016.csv} (100%) create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/black_rock/input/config.txt create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/black_rock/input/entry_map.csv rename src/test/resources/actual_races/{grand_prix_race/summer_grand_prix/2016 => series_race/grand_prix/2016/completed_12}/input/black_rock/input/results.txt (100%) create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/categories_prize_individual_senior.csv rename src/test/resources/actual_races/{grand_prix_race/summer_grand_prix/2016 => series_race/grand_prix/2016/completed_12/input}/config.txt (82%) create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/east_neuk_10k/input/config.txt create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/east_neuk_10k/input/entry_map.csv rename src/test/resources/actual_races/{grand_prix_race/summer_grand_prix/2016 => series_race/grand_prix/2016/completed_12}/input/east_neuk_10k/input/results.txt (100%) create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/gateside_gallop/input/config.txt create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/gateside_gallop/input/entry_map.csv rename src/test/resources/actual_races/{grand_prix_race/summer_grand_prix/2016 => series_race/grand_prix/2016/completed_12}/input/gateside_gallop/input/results.txt (100%) create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/giffordtown_5k/input/config.txt create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/giffordtown_5k/input/entry_map.csv rename src/test/resources/actual_races/{grand_prix_race/summer_grand_prix/2016 => series_race/grand_prix/2016/completed_12}/input/giffordtown_5k/input/results.txt (100%) create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/kinnoull/input/config.txt create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/kinnoull/input/entry_map.csv rename src/test/resources/actual_races/{grand_prix_race/summer_grand_prix/2016 => series_race/grand_prix/2016/completed_12}/input/kinnoull/input/results.txt (100%) create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/kinross_10k/input/config.txt rename src/test/resources/actual_races/{grand_prix_race/summer_grand_prix/2016 => series_race/grand_prix/2016/completed_12}/input/kinross_10k/input/results.txt (100%) create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/largo/input/config.txt create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/largo/input/entry_map.csv rename src/test/resources/actual_races/{grand_prix_race/summer_grand_prix/2016 => series_race/grand_prix/2016/completed_12}/input/largo/input/results.txt (100%) create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/lomonds/input/config.txt create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/lomonds/input/entry_map.csv rename src/test/resources/actual_races/{grand_prix_race/summer_grand_prix/2016 => series_race/grand_prix/2016/completed_12}/input/lomonds/input/results.txt (98%) create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/normans_law/input/config.txt create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/normans_law/input/entry_map.csv rename src/test/resources/actual_races/{grand_prix_race/summer_grand_prix/2016 => series_race/grand_prix/2016/completed_12}/input/normans_law/input/results.txt (98%) create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/sandy_slither/input/config.txt create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/sandy_slither/input/entry_map.csv rename src/test/resources/actual_races/{grand_prix_race/summer_grand_prix/2016 => series_race/grand_prix/2016/completed_12}/input/sandy_slither/input/results.txt (100%) create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/stirling_10k/input/config.txt create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/stirling_10k/input/results.txt create mode 100644 src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/trail_champs/input/config.txt rename src/test/resources/actual_races/{grand_prix_race/summer_grand_prix/2016 => series_race/grand_prix/2016/completed_12}/input/trail_champs/input/results.txt (100%) diff --git a/src/main/java/org/grahamkirby/race_timing/common/Normalisation.java b/src/main/java/org/grahamkirby/race_timing/common/Normalisation.java index 0959afa4..23063799 100644 --- a/src/main/java/org/grahamkirby/race_timing/common/Normalisation.java +++ b/src/main/java/org/grahamkirby/race_timing/common/Normalisation.java @@ -131,12 +131,23 @@ private static String replaceAllMapEntries(final String s, final Map getPrizeCategories() { public List getOverallResults() { - return getOverallResults(getPrizeCategories()); + return overall_results; +// return getOverallResults(getPrizeCategories()); } public List getOverallResults(final List prize_categories) { @@ -240,7 +248,7 @@ public List getOverallResults(final List prize_catego public List getOverallResults(final Predicate inclusion_filter) { - final List results = overall_results.stream().filter(inclusion_filter).toList(); + final List results = getOverallResults().stream().filter(inclusion_filter).toList(); setPositionStrings(results, allowEqualPositions()); return results; } @@ -282,6 +290,9 @@ public static Path getTestResourcesRootPath(final String individual_test_resourc protected int compareCompletion(final RaceResult r1, final RaceResult r2) { + if (r1 == null) { + int x = 3; + } return Boolean.compare(r1.getCompletionStatus() != CompletionStatus.COMPLETED, r2.getCompletionStatus() != CompletionStatus.COMPLETED); } @@ -416,12 +427,12 @@ protected void sortResults() { sortDNFResults(); } - private void sortAllResults() { + protected void sortAllResults() { overall_results.sort(combineComparators(getComparators())); } - private void sortDNFResults() { + protected void sortDNFResults() { overall_results.sort(dnfOnly(combineComparators(getDNFComparators()))); } @@ -471,6 +482,7 @@ private PrizeCategoryGroup getGroupWithName(final List group private boolean entryCategoryIsEligibleForPrizeCategoryByAge(final EntryCategory entry_category, final PrizeCategory prize_category) { + if (entry_category == null) return true; return entry_category.getMinimumAge() >= prize_category.getMinimumAge() && entry_category.getMaximumAge() <= prize_category.getMaximumAge(); } diff --git a/src/main/java/org/grahamkirby/race_timing/common/RaceInput.java b/src/main/java/org/grahamkirby/race_timing/common/RaceInput.java index cefd445c..30887810 100644 --- a/src/main/java/org/grahamkirby/race_timing/common/RaceInput.java +++ b/src/main/java/org/grahamkirby/race_timing/common/RaceInput.java @@ -19,7 +19,7 @@ public abstract class RaceInput { protected final Race race; - protected String entries_path, raw_results_path, categories_entry_path, categories_prize_path; + protected String entries_path, raw_results_path, results_path, categories_entry_path, categories_prize_path; public RaceInput(Race race) { this.race = race; diff --git a/src/main/java/org/grahamkirby/race_timing/individual_race/IndividualRace.java b/src/main/java/org/grahamkirby/race_timing/individual_race/IndividualRace.java index 0943b608..8c4d9ff5 100644 --- a/src/main/java/org/grahamkirby/race_timing/individual_race/IndividualRace.java +++ b/src/main/java/org/grahamkirby/race_timing/individual_race/IndividualRace.java @@ -17,6 +17,7 @@ package org.grahamkirby.race_timing.individual_race; import org.grahamkirby.race_timing.common.CompletionStatus; +import org.grahamkirby.race_timing.common.Normalisation; import org.grahamkirby.race_timing.common.RaceInput; import org.grahamkirby.race_timing.common.RaceResult; import org.grahamkirby.race_timing.common.categories.EntryCategory; @@ -30,11 +31,14 @@ import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; +import java.time.Duration; import java.util.Comparator; import java.util.List; public class IndividualRace extends SingleRace { + private String median_time_string; + public IndividualRace(final Path config_file_path) throws IOException { super(config_file_path); } @@ -57,11 +61,13 @@ public void calculateResults() { initialiseResults(); - fillFinishTimes(); - fillDNFs(); + if (raw_results != null) { + fillFinishTimes(); + fillDNFs(); - sortResults(); - allocatePrizes(); + sortResults(); + allocatePrizes(); + } } public EntryCategory findCategory(final int bib_number) { @@ -80,6 +86,26 @@ private int compareRecordedPosition(final RaceResult r1, final RaceResult r2) { ////////////////////////////////////////////////////////////////////////////////////////////////// + @Override + protected void sortAllResults() { + if (raw_results != null) super.sortAllResults(); + } + + @Override + protected void sortDNFResults() { + if (raw_results != null) super.sortDNFResults(); + } + + @Override + protected void readProperties() throws IOException { + + super.readProperties(); + + // Specifies all the bib numbers for runners who did have a finish + // time recorded but were declared DNF. + median_time_string = getProperty(KEY_MEDIAN_TIME); + } + @Override protected RaceInput getInput() { return new IndividualRaceInput(this); @@ -108,10 +134,15 @@ protected RaceOutputPDF getOutputPDF() { @Override protected void initialiseResults() { - entries.stream(). - map(entry -> (IndividualRaceEntry)entry). - map(entry -> new IndividualRaceResult(this, entry)). - forEachOrdered(overall_results::add); + if (entries != null) { + entries.stream(). + map(entry -> (IndividualRaceEntry) entry). + map(entry -> new IndividualRaceResult(this, entry)). + forEachOrdered(overall_results::add); + } + else { + + } } @Override @@ -139,6 +170,7 @@ public List> getDNFComparators() { @Override protected boolean entryCategoryIsEligibleForPrizeCategoryByGender(final EntryCategory entry_category, final PrizeCategory prize_category) { + if (entry_category == null) return true; return entry_category.getGender().equals(prize_category.getGender()); } @@ -164,17 +196,34 @@ protected void fillDNF(final String dnf_string) { ////////////////////////////////////////////////////////////////////////////////////////////////// + public Duration getMedianTime() { + + if (median_time_string != null) return Normalisation.parseTime(median_time_string); + + List results = getOverallResults(); + if (results.size() % 2 == 0) { + RaceResult result1 = results.get(results.size() / 2); + RaceResult result2 = results.get(results.size() / 2 + 1); + return ((IndividualRaceResult) result1).finish_time.plus(((IndividualRaceResult) result2).finish_time).dividedBy(2); + } + else { + RaceResult result = results.get(results.size() / 2); + return ((IndividualRaceResult) result).finish_time; + } + } + private void fillFinishTimes() { - raw_results.forEach(raw_result -> { + if (raw_results != null) + raw_results.forEach(raw_result -> { - final IndividualRaceResult result = getResultWithBibNumber(raw_result.getBibNumber()); - result.finish_time = raw_result.getRecordedFinishTime(); + final IndividualRaceResult result = getResultWithBibNumber(raw_result.getBibNumber()); + result.finish_time = raw_result.getRecordedFinishTime(); - // Provisionally this result is not DNF since a finish time was recorded. - // However, it might still be set to DNF in fillDNF() if the runner didn't complete the course. - result.completion_status = CompletionStatus.COMPLETED; - }); + // Provisionally this result is not DNF since a finish time was recorded. + // However, it might still be set to DNF in fillDNF() if the runner didn't complete the course. + result.completion_status = CompletionStatus.COMPLETED; + }); } private IndividualRaceResult getResultWithBibNumber(final int bib_number) { diff --git a/src/main/java/org/grahamkirby/race_timing/individual_race/IndividualRaceEntry.java b/src/main/java/org/grahamkirby/race_timing/individual_race/IndividualRaceEntry.java index f713c004..86a77494 100644 --- a/src/main/java/org/grahamkirby/race_timing/individual_race/IndividualRaceEntry.java +++ b/src/main/java/org/grahamkirby/race_timing/individual_race/IndividualRaceEntry.java @@ -48,11 +48,13 @@ public IndividualRaceEntry(final List elements, final Race race) { final String name = race.normalisation.cleanRunnerName(mapped_elements.get(NAME_INDEX)); final String club = race.normalisation.cleanClubOrTeamName(mapped_elements.get(CLUB_INDEX)); - final EntryCategory category = race.lookupEntryCategory(race.mapCategory(mapped_elements.get(CATEGORY_INDEX))); + + final String category_name = race.mapCategory(mapped_elements.get(CATEGORY_INDEX)); + final EntryCategory category = category_name.isEmpty() ? null : race.lookupEntryCategory(category_name); runner = new Runner(name, club, category); } - catch (RuntimeException _) { + catch (RuntimeException e) { throw new RuntimeException("illegal category for runner: " + bib_number); } } diff --git a/src/main/java/org/grahamkirby/race_timing/individual_race/IndividualRaceInput.java b/src/main/java/org/grahamkirby/race_timing/individual_race/IndividualRaceInput.java index 966fa58f..39a7ed25 100644 --- a/src/main/java/org/grahamkirby/race_timing/individual_race/IndividualRaceInput.java +++ b/src/main/java/org/grahamkirby/race_timing/individual_race/IndividualRaceInput.java @@ -37,6 +37,8 @@ protected RaceEntry makeRaceEntry(final List elements) { @Override public List loadRawResults() throws IOException { + + if (raw_results_path == null) return null; return loadRawResults(race.getPath(raw_results_path)); } } diff --git a/src/main/java/org/grahamkirby/race_timing/individual_race/IndividualRaceResult.java b/src/main/java/org/grahamkirby/race_timing/individual_race/IndividualRaceResult.java index c3cf9ad0..31062af5 100644 --- a/src/main/java/org/grahamkirby/race_timing/individual_race/IndividualRaceResult.java +++ b/src/main/java/org/grahamkirby/race_timing/individual_race/IndividualRaceResult.java @@ -27,7 +27,7 @@ public class IndividualRaceResult extends RaceResult { public IndividualRaceEntry entry; public Duration finish_time; - CompletionStatus completion_status; + public CompletionStatus completion_status; ////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/main/java/org/grahamkirby/race_timing/series_race/SeriesRace.java b/src/main/java/org/grahamkirby/race_timing/series_race/SeriesRace.java index a9bf9234..d9a88fc1 100644 --- a/src/main/java/org/grahamkirby/race_timing/series_race/SeriesRace.java +++ b/src/main/java/org/grahamkirby/race_timing/series_race/SeriesRace.java @@ -26,6 +26,7 @@ import java.nio.file.Path; import java.util.List; import java.util.Objects; +import java.util.function.Predicate; public abstract class SeriesRace extends Race { @@ -67,9 +68,12 @@ protected void configureInputData() throws IOException { @Override protected void initialiseResults() { + final Predicate inclusion_predicate = getResultInclusionPredicate(); + races.stream(). filter(Objects::nonNull). flatMap(race -> race.getOverallResults().stream()). + filter(inclusion_predicate). map(result -> (IndividualRaceResult) result). map(result -> result.entry.runner). distinct(). @@ -77,6 +81,7 @@ protected void initialiseResults() { forEachOrdered(overall_results::add); } + @Override protected void outputResults() throws IOException { @@ -108,4 +113,5 @@ public int getNumberOfRacesTakenPlace() { ////////////////////////////////////////////////////////////////////////////////////////////////// protected abstract RaceResult getOverallResult(final Runner runner); + protected abstract Predicate getResultInclusionPredicate(); } diff --git a/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_grand_prix/GrandPrixRace.java b/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_grand_prix/GrandPrixRace.java index b2c281b4..f64b2a84 100644 --- a/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_grand_prix/GrandPrixRace.java +++ b/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_grand_prix/GrandPrixRace.java @@ -26,17 +26,22 @@ import org.grahamkirby.race_timing.common.output.RaceOutputPDF; import org.grahamkirby.race_timing.common.output.RaceOutputText; import org.grahamkirby.race_timing.individual_race.IndividualRace; +import org.grahamkirby.race_timing.individual_race.IndividualRaceResult; import org.grahamkirby.race_timing.series_race.SeriesRace; +import org.grahamkirby.race_timing.series_race.SeriesRaceInput; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; +import java.time.Duration; import java.util.Comparator; import java.util.List; +import java.util.Objects; +import java.util.function.Predicate; public class GrandPrixRace extends SeriesRace { - private int max_race_score; + public static final int SCORE_FOR_MEDIAN_POSITION = 1000; ////////////////////////////////////////////////////////////////////////////////////////////////// @@ -61,7 +66,29 @@ public static void main(final String[] args) throws IOException { protected void readProperties() { minimum_number_of_races = Integer.parseInt(getProperty(KEY_MINIMUM_NUMBER_OF_RACES)); - max_race_score = Integer.parseInt(getProperty(KEY_MAX_RACE_SCORE)); + } + + protected void printOverallResults() throws IOException { + + output_CSV.printResults(); +// output_HTML.printResults(); + } + + protected void printPrizes() throws IOException { + +// output_PDF.printPrizes(); +// output_HTML.printPrizes(); +// output_text.printPrizes(); + } + + protected void printNotes() throws IOException { + +// output_text.printNotes(); + } + + protected void printCombined() throws IOException { + +// output_HTML.printCombined(); } @Override @@ -73,14 +100,13 @@ protected void configureInputData() throws IOException { @Override protected RaceInput getInput() { -// return new GrandPrixRaceInput(this); - return null; + return new SeriesRaceInput(this); } @Override protected RaceOutputCSV getOutputCSV() { -// return new GrandPrixRaceOutputCSV(this); - return null; + return new GrandPrixRaceOutputCSV(this); + } @Override @@ -114,24 +140,37 @@ protected List> getDNFComparators() { @Override protected boolean entryCategoryIsEligibleForPrizeCategoryByGender(final EntryCategory entry_category, final PrizeCategory prize_category) { +if (entry_category == null) { + int x = 3; + return false; +} return entry_category.getGender().equals(prize_category.getGender()); } @Override protected EntryCategory getEntryCategory(final RaceResult result) { -// return ((GrandPrixRaceResult) result).runner.category; - return null; +if ( ((GrandPrixRaceResult) result).runner.category == null +) { + int x = 3; +} + return ((GrandPrixRaceResult) result).runner.category; + } @Override protected RaceResult getOverallResult(final Runner runner) { - final List scores = races.stream(). + final List scores = races.stream(). map(race -> calculateRaceScore(race, runner)). toList(); -// return new GrandPrixRaceResult(runner, scores, this); - return null; + return new GrandPrixRaceResult(runner, scores, this); + } + + @Override + protected Predicate getResultInclusionPredicate() { + + return (result -> ((IndividualRaceResult) result).entry.runner.club.equals("Fife AC")); } ////////////////////////////////////////////////////////////////////////////////////////////////// @@ -171,20 +210,57 @@ private boolean clubIsDefined(final String club) { private List getRunnerClubs(final String runner_name) { - return null; + return races.stream(). + filter(Objects::nonNull). + flatMap(race -> race.getOverallResults().stream()). + map(result -> (IndividualRaceResult)result). + map(result -> result.entry.runner). + filter(runner -> runner.name.equals(runner_name)). + map(runner -> runner.club). + distinct(). + sorted(). + toList(); } private List getRunnerNames() { - return null; + return races.stream(). + filter(Objects::nonNull). + flatMap(race -> race.getOverallResults().stream()). + map(result -> (IndividualRaceResult)result). + map(result -> result.entry.runner.name). + distinct(). + toList(); } private void recordDefinedClubForRunnerName(final String runner_name, final String defined_club) { + races.stream(). + filter(Objects::nonNull). + flatMap(race -> race.getOverallResults().stream()). + map(result -> (IndividualRaceResult)result). + map(result -> result.entry.runner). + filter(runner -> runner.name.equals(runner_name)). + forEachOrdered(runner -> runner.club = defined_club); + } + + public double calculateRaceScore(final IndividualRace individual_race, final Runner runner) { + + Duration median_time = individual_race.getMedianTime(); + Duration runner_time = getResult(individual_race, runner); + + if (runner_time == null) return 0.0; + + return (double)runner_time.toMillis() / (double)median_time.toMillis() * SCORE_FOR_MEDIAN_POSITION; } - public int calculateRaceScore(final IndividualRace individual_race, final Runner runner) { + private Duration getResult(IndividualRace individualRace, Runner runner) { - return 0; + return individualRace.getOverallResults().stream(). + map(result -> ((IndividualRaceResult)result)). + filter(result -> runner.equals(result.entry.runner)). + map(IndividualRaceResult::duration). + findFirst(). + orElse(null); } } diff --git a/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_grand_prix/GrandPrixRaceOutputCSV.java b/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_grand_prix/GrandPrixRaceOutputCSV.java new file mode 100644 index 00000000..e6afe9fb --- /dev/null +++ b/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_grand_prix/GrandPrixRaceOutputCSV.java @@ -0,0 +1,79 @@ +/* + * Copyright 2024 Graham Kirby: + * + * + * This file is part of the module race-timing. + * + * race-timing is free software: you can redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * race-timing is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with race-timing. If not, see + * . + */ +package org.grahamkirby.race_timing.series_race.fife_ac_grand_prix; + +import org.grahamkirby.race_timing.common.CompletionStatus; +import org.grahamkirby.race_timing.common.Race; +import org.grahamkirby.race_timing.common.RaceResult; +import org.grahamkirby.race_timing.common.output.ResultPrinter; +import org.grahamkirby.race_timing.common.output.ResultPrinterCSV; +import org.grahamkirby.race_timing.series_race.SeriesRaceOutputCSV; + +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.util.stream.Collectors; + +public class GrandPrixRaceOutputCSV extends SeriesRaceOutputCSV { + + public GrandPrixRaceOutputCSV(final Race race) { + super(race); + } + + @Override + public String getResultsHeader() { + return getSeriesResultsHeader() + ",Total,Completed\n"; + } + + @Override + protected ResultPrinter getOverallResultPrinter(final OutputStreamWriter writer) { + return new OverallResultPrinter(race, writer); + } + + // Prize results not printed to text file. + @Override + protected ResultPrinter getPrizeResultPrinter(final OutputStreamWriter writer) { throw new UnsupportedOperationException(); } + + ////////////////////////////////////////////////////////////////////////////////////////////////// + + private static class OverallResultPrinter extends ResultPrinterCSV { + + public OverallResultPrinter(Race race, OutputStreamWriter writer) { + super(race, writer); + } + + @Override + public void printResult(final RaceResult r) throws IOException { + + final GrandPrixRaceResult result = ((GrandPrixRaceResult) r); + final GrandPrixRace grand_prix_race = (GrandPrixRace)race; + final int number_of_races_taken_place = grand_prix_race.getNumberOfRacesTakenPlace(); + + if (result.shouldBeDisplayedInResults()) { + + writer.append(STR."\{result.shouldDisplayPosition() ? result.position_string : ""},\{encode(result.runner.name)},\{encode(result.runner.club)},\{result.runner.category.getShortName()},"); + + writer.append( + grand_prix_race.getRaces().subList(0, number_of_races_taken_place).stream(). + map(individual_race -> String.valueOf(Math.round(grand_prix_race.calculateRaceScore(individual_race, result.runner)))). + collect(Collectors.joining(",")) + ); + + writer.append(STR.",\{Math.round(result.totalScore())},\{result.getCompletionStatus() == CompletionStatus.COMPLETED ? "Y" : "N"}\n"); + } + } + } +} diff --git a/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_grand_prix/GrandPrixRaceResult.java b/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_grand_prix/GrandPrixRaceResult.java new file mode 100644 index 00000000..9dc53bf0 --- /dev/null +++ b/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_grand_prix/GrandPrixRaceResult.java @@ -0,0 +1,71 @@ +/* + * Copyright 2024 Graham Kirby: + * + * + * This file is part of the module race-timing. + * + * race-timing is free software: you can redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * race-timing is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with race-timing. If not, see + * . + */ +package org.grahamkirby.race_timing.series_race.fife_ac_grand_prix; + +import org.grahamkirby.race_timing.common.CompletionStatus; +import org.grahamkirby.race_timing.common.Race; +import org.grahamkirby.race_timing.common.RaceResult; +import org.grahamkirby.race_timing.common.Runner; +import org.grahamkirby.race_timing.series_race.SeriesRaceResult; + +import java.util.List; + +public class GrandPrixRaceResult extends SeriesRaceResult { + + protected final List scores; + + public GrandPrixRaceResult(final Runner runner, final List scores, final Race race) { + + super(runner, race); + this.scores = scores; + } + + @Override + protected String getIndividualRunnerName() { + return runner.name; + } + + @Override + public int comparePerformanceTo(final RaceResult o) { + + return Double.compare(totalScore(), ((GrandPrixRaceResult) o).totalScore()); + } + + @Override + public boolean shouldBeDisplayedInResults() { + return getCompletionStatus() != CompletionStatus.DNS; + } + + public boolean shouldDisplayPosition() { + + return canCompleteSeries(); + } + + protected double totalScore() { + + final int number_of_races_to_count = Math.min( + ((GrandPrixRace)race).getNumberOfRacesTakenPlace(), + ((GrandPrixRace)race).getMinimumNumberOfRaces()); + + return scores.stream(). + sorted(). + toList(). + reversed(). + subList(0, number_of_races_to_count).stream(). + reduce(0.0, Double::sum); + } +} diff --git a/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_midweek/MidweekRace.java b/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_midweek/MidweekRace.java index 1187ff5a..ffc68922 100644 --- a/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_midweek/MidweekRace.java +++ b/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_midweek/MidweekRace.java @@ -37,6 +37,7 @@ import java.util.Comparator; import java.util.List; import java.util.Objects; +import java.util.function.Predicate; public class MidweekRace extends SeriesRace { @@ -131,6 +132,12 @@ protected RaceResult getOverallResult(final Runner runner) { return new MidweekRaceResult(runner, scores, this); } + @Override + protected Predicate getResultInclusionPredicate() { + + return (_ -> true); + } + public int calculateRaceScore(final IndividualRace individual_race, final Runner runner) { if (individual_race == null) return 0; diff --git a/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_minitour/MinitourRace.java b/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_minitour/MinitourRace.java index 0ec8cb7f..8829231a 100644 --- a/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_minitour/MinitourRace.java +++ b/src/main/java/org/grahamkirby/race_timing/series_race/fife_ac_minitour/MinitourRace.java @@ -36,6 +36,7 @@ import java.util.Comparator; import java.util.List; import java.util.Optional; +import java.util.function.Predicate; public class MinitourRace extends SeriesRace { @@ -134,6 +135,12 @@ protected RaceResult getOverallResult(final Runner runner) { return new MinitourRaceResult(runner, times, this); } + @Override + protected Predicate getResultInclusionPredicate() { + + return (_ -> true); + } + ////////////////////////////////////////////////////////////////////////////////////////////////// private Duration getRaceTime(final IndividualRace individual_race, final Runner runner) { diff --git a/src/main/java/org/grahamkirby/race_timing/single_race/SingleRace.java b/src/main/java/org/grahamkirby/race_timing/single_race/SingleRace.java index 497c62d1..a3baa6c4 100644 --- a/src/main/java/org/grahamkirby/race_timing/single_race/SingleRace.java +++ b/src/main/java/org/grahamkirby/race_timing/single_race/SingleRace.java @@ -57,6 +57,8 @@ protected void configureInputData() throws IOException { entries = ((SingleRaceInput)input).loadEntries(); raw_results = ((SingleRaceInput)input).loadRawResults(); + + overall_results = ((SingleRaceInput)input).loadOverallResults(); } ////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/main/java/org/grahamkirby/race_timing/single_race/SingleRaceInput.java b/src/main/java/org/grahamkirby/race_timing/single_race/SingleRaceInput.java index dbd805f7..a80e9063 100644 --- a/src/main/java/org/grahamkirby/race_timing/single_race/SingleRaceInput.java +++ b/src/main/java/org/grahamkirby/race_timing/single_race/SingleRaceInput.java @@ -16,10 +16,10 @@ */ package org.grahamkirby.race_timing.single_race; -import org.grahamkirby.race_timing.common.Race; -import org.grahamkirby.race_timing.common.RaceEntry; -import org.grahamkirby.race_timing.common.RaceInput; -import org.grahamkirby.race_timing.common.RawResult; +import org.grahamkirby.race_timing.common.*; +import org.grahamkirby.race_timing.individual_race.IndividualRace; +import org.grahamkirby.race_timing.individual_race.IndividualRaceEntry; +import org.grahamkirby.race_timing.individual_race.IndividualRaceResult; import java.io.IOException; import java.nio.file.Files; @@ -33,6 +33,8 @@ public abstract class SingleRaceInput extends RaceInput { + final Function race_entry_mapper = line -> makeRaceEntry(Arrays.stream(line.split("\t")).toList()); + public SingleRaceInput(final Race race) { super(race); @@ -44,13 +46,16 @@ protected void readProperties() { entries_path = race.getProperty(KEY_ENTRIES_PATH); raw_results_path = race.getProperty(KEY_RAW_RESULTS_PATH); + results_path = race.getProperty(KEY_RESULTS_PATH); categories_entry_path = race.getProperty(KEY_CATEGORIES_ENTRY_PATH); categories_prize_path = race.getProperty(KEY_CATEGORIES_PRIZE_PATH); } protected List loadEntries() throws IOException { - final Function race_entry_mapper = line -> makeRaceEntry(Arrays.stream(line.split("\t")).toList()); +// final Function race_entry_mapper = line -> makeRaceEntry(Arrays.stream(line.split("\t")).toList()); + if (entries_path == null) return List.of(); + final List entries = Files.readAllLines(race.getPath(entries_path)).stream(). filter(line -> !line.isEmpty()). map(race_entry_mapper). @@ -62,8 +67,34 @@ protected List loadEntries() throws IOException { return entries; } + protected List loadOverallResults() throws IOException { + +// final Function race_entry_mapper = line -> makeRaceEntry(Arrays.stream(line.split("\t")).toList()); + if (results_path == null) return new ArrayList<>(); + + return Files.readAllLines(race.getPath(results_path)).stream(). + filter(line -> !line.isEmpty()). + map(line -> makeRaceResult(new ArrayList<>(Arrays.stream(line.split("\t")).toList()))). + toList(); + } + + int next_fake_bib_number = 1; + + private RaceResult makeRaceResult(List elements) { + + elements.addFirst(String.valueOf(next_fake_bib_number++)); + + IndividualRaceEntry entry = new IndividualRaceEntry(elements, race); + IndividualRaceResult result = new IndividualRaceResult((IndividualRace) race, entry); + result.finish_time = Normalisation.parseTime(elements.getLast()); + result.completion_status = CompletionStatus.COMPLETED; + return result; + } + protected List loadRawResults(final Path results_path) throws IOException { + if (raw_results_path == null) return List.of(); + final List raw_results = new ArrayList<>(); for (final String line : Files.readAllLines(results_path)) diff --git a/src/test/java/org/grahamkirby/race_timing/actual_races/ActualRacesGrandPrixTest.java b/src/test/java/org/grahamkirby/race_timing/actual_races/ActualRacesGrandPrixTest.java new file mode 100644 index 00000000..7dc4ce47 --- /dev/null +++ b/src/test/java/org/grahamkirby/race_timing/actual_races/ActualRacesGrandPrixTest.java @@ -0,0 +1,42 @@ +/* + * Copyright 2024 Graham Kirby: + * + * + * This file is part of the module race-timing. + * + * race-timing is free software: you can redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * race-timing is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with race-timing. If not, see + * . + */ +package org.grahamkirby.race_timing.actual_races; + +import org.grahamkirby.race_timing.RaceTest; +import org.grahamkirby.race_timing.common.Race; +import org.grahamkirby.race_timing.series_race.fife_ac_grand_prix.GrandPrixRace; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.nio.file.Path; + +public class ActualRacesGrandPrixTest extends RaceTest { + + // TODO test for runner competing as more than one of eligible clubs. + // TODO test for runner scores differing only in fractional part. + @Override + protected Race makeRace(final Path config_file_path) throws IOException { + return new GrandPrixRace(config_file_path); + } + + @Test + @Disabled + public void grandPrix2016Completed() throws Exception { + testExpectedCompletion("actual_races/series_race/grand_prix/2016/completed_12"); + } +} diff --git a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/stirling_10k/input/config.txt b/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/stirling_10k/input/config.txt deleted file mode 100644 index 03ff7eeb..00000000 --- a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/stirling_10k/input/config.txt +++ /dev/null @@ -1 +0,0 @@ -MEDIAN = 0:45:43 diff --git a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/stirling_10k/input/results.txt b/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/stirling_10k/input/results.txt deleted file mode 100644 index d7adbd16..00000000 --- a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/stirling_10k/input/results.txt +++ /dev/null @@ -1,20 +0,0 @@ -Logan Rees 00:30:48 -Tristan Rees 00:33:03 -James Rae 00:36:01 -Annabel Simpson 00:36:44 -Katie Jones 00:37:27 -Jeremy Tomlinson 00:37:32 -Andrea Burke Rae 00:38:42 -Daniel Newman 00:40:06 -Kirsti Sharratt 00:40:42 -Jennifer Cruickshanks 00:41:28 -David Sleigh 00:42:05 -Ailsa Cruickshanks 00:44:22 -David Norrie 00:44:28 -Innes Bracegirdle 00:44:58 -Sandra Tulloch 00:46:30 -Eddie Sanders 00:47:24 -Nick Brian 00:48:41 -Sue Whisler 00:48:57 -Derek Adamson 00:50:49 -George Black 00:51:19 diff --git a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/expected/grand_prix_2016.csv b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/expected/grand_prix_overall_2016.csv similarity index 100% rename from src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/expected/grand_prix_2016.csv rename to src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/expected/grand_prix_overall_2016.csv diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/black_rock/input/config.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/black_rock/input/config.txt new file mode 100644 index 00000000..9735054d --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/black_rock/input/config.txt @@ -0,0 +1,11 @@ +YEAR = 2016 +RACE_NAME_FOR_RESULTS = Black Rock +RACE_NAME_FOR_FILENAMES = black_rock + +# Relative to directory containing configuration file. +RESULTS_PATH = results.txt +ENTRY_MAP_PATH = entry_map.csv + +# Relative to project root directory. +CATEGORIES_ENTRY_PATH = /src/main/resources/configuration/categories_entry_individual_senior.csv +CATEGORIES_PRIZE_PATH = /src/main/resources/configuration/categories_prize_individual_senior.csv diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/black_rock/input/entry_map.csv b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/black_rock/input/entry_map.csv new file mode 100644 index 00000000..a9d2b9d6 --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/black_rock/input/entry_map.csv @@ -0,0 +1 @@ +1,2-3,4,5 diff --git a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/black_rock/input/results.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/black_rock/input/results.txt similarity index 100% rename from src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/black_rock/input/results.txt rename to src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/black_rock/input/results.txt diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/categories_prize_individual_senior.csv b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/categories_prize_individual_senior.csv new file mode 100644 index 00000000..467f1637 --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/categories_prize_individual_senior.csv @@ -0,0 +1,14 @@ +Women Senior,FS,Women,18,99,Overall,3 +Men Senior,MS,Men,18,99,Overall,3 +Women 40-49,F40,Women,40,49,Overall,1 +Men 40-49,M40,Men,40,49,Overall,1 +Women 50-59,F50,Women,50,59,Overall,1 +Men 50-59,M50,Men,50,59,Overall,1 +Women 60-69,F60,Women,60,69,Overall,1 +Men 60-69,M60,Men,60,69,Overall,1 +Women 70-79,F70,Women,70,79,Overall,1 +Men 70-79,M70,Men,70,79,Overall,1 +Women 80-89,F80,Women,80,89,Overall,1 +Men 80-89,M80,Men,80,89,Overall,1 +Women 90-99,F90,Women,90,99,Overall,1 +Men 90-99,M90,Men,90,99,Overall,1 diff --git a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/config.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/config.txt similarity index 82% rename from src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/config.txt rename to src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/config.txt index 515c0aa0..03d144f7 100644 --- a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/config.txt +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/config.txt @@ -2,10 +2,9 @@ YEAR = 2016 RACE_NAME_FOR_RESULTS = Grand Prix RACE_NAME_FOR_FILENAMES = grand_prix -RACES = normans_law/input/config.txt,kinnoull/input/config.txt,largo/input/config.txt,lomonds/input/config.txt,kinross_10k/input/config.txt,stirling_10k/input/config.txt,east_neuk_10k/input/config.txt,giffordtown_5k/input/config.txt,black_rock/input/config.txt,sandy_slither/input/config.txt,trail/input/config.txt,gateside_gallop/input/config.txt +RACES = normans_law/input/config.txt,kinnoull/input/config.txt,largo/input/config.txt,lomonds/input/config.txt,kinross_10k/input/config.txt,stirling_10k/input/config.txt,east_neuk_10k/input/config.txt,giffordtown_5k/input/config.txt,black_rock/input/config.txt,sandy_slither/input/config.txt,trail_champs/input/config.txt,gateside_gallop/input/config.txt MINIMUM_NUMBER_OF_RACES = 6 -# Relative to config file. CATEGORIES_PRIZE_PATH = categories_prize_individual_senior.csv # Relative to project root directory. diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/east_neuk_10k/input/config.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/east_neuk_10k/input/config.txt new file mode 100644 index 00000000..bc94ab22 --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/east_neuk_10k/input/config.txt @@ -0,0 +1,11 @@ +YEAR = 2016 +RACE_NAME_FOR_RESULTS = East Neuk 10K +RACE_NAME_FOR_FILENAMES = east_neuk + +# Relative to directory containing configuration file. +RESULTS_PATH = results.txt +ENTRY_MAP_PATH = entry_map.csv + +# Relative to project root directory. +CATEGORIES_ENTRY_PATH = /src/main/resources/configuration/categories_entry_individual_senior.csv +CATEGORIES_PRIZE_PATH = /src/main/resources/configuration/categories_prize_individual_senior.csv diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/east_neuk_10k/input/entry_map.csv b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/east_neuk_10k/input/entry_map.csv new file mode 100644 index 00000000..66125eae --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/east_neuk_10k/input/entry_map.csv @@ -0,0 +1,5 @@ +1,2-3,4,5 +M,MS +F,FS +MJ,MU20 +FJ,FU20 diff --git a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/east_neuk_10k/input/results.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/east_neuk_10k/input/results.txt similarity index 100% rename from src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/east_neuk_10k/input/results.txt rename to src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/east_neuk_10k/input/results.txt diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/gateside_gallop/input/config.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/gateside_gallop/input/config.txt new file mode 100644 index 00000000..d72166e8 --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/gateside_gallop/input/config.txt @@ -0,0 +1,11 @@ +YEAR = 2016 +RACE_NAME_FOR_RESULTS = Gateside Gallop +RACE_NAME_FOR_FILENAMES = gateside_gallop + +# Relative to directory containing configuration file. +RESULTS_PATH = results.txt +ENTRY_MAP_PATH = entry_map.csv + +# Relative to project root directory. +CATEGORIES_ENTRY_PATH = /src/main/resources/configuration/categories_entry_individual_senior.csv +CATEGORIES_PRIZE_PATH = /src/main/resources/configuration/categories_prize_individual_senior.csv diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/gateside_gallop/input/entry_map.csv b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/gateside_gallop/input/entry_map.csv new file mode 100644 index 00000000..0ccd4731 --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/gateside_gallop/input/entry_map.csv @@ -0,0 +1,13 @@ +1,2,3,4 +MJ,MU20 +FJ,FU20 +MV40,M40 +FV40,F40 +MV50,M50 +FV50,F50 +MV60,M60 +FV60,F60 +MV70,M70 +FV70,F70 +MV80,M80 +FV80,F80 diff --git a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/gateside_gallop/input/results.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/gateside_gallop/input/results.txt similarity index 100% rename from src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/gateside_gallop/input/results.txt rename to src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/gateside_gallop/input/results.txt diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/giffordtown_5k/input/config.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/giffordtown_5k/input/config.txt new file mode 100644 index 00000000..41deada6 --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/giffordtown_5k/input/config.txt @@ -0,0 +1,11 @@ +YEAR = 2016 +RACE_NAME_FOR_RESULTS = Giffordtown +RACE_NAME_FOR_FILENAMES = giffordtown + +# Relative to directory containing configuration file. +RESULTS_PATH = results.txt +ENTRY_MAP_PATH = entry_map.csv + +# Relative to project root directory. +CATEGORIES_ENTRY_PATH = /src/main/resources/configuration/categories_entry_individual_senior.csv +CATEGORIES_PRIZE_PATH = /src/main/resources/configuration/categories_prize_individual_senior.csv diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/giffordtown_5k/input/entry_map.csv b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/giffordtown_5k/input/entry_map.csv new file mode 100644 index 00000000..85d2e24f --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/giffordtown_5k/input/entry_map.csv @@ -0,0 +1,3 @@ +1,2,3,4 +MU13,MU20 +FU13,FU20 diff --git a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/giffordtown_5k/input/results.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/giffordtown_5k/input/results.txt similarity index 100% rename from src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/giffordtown_5k/input/results.txt rename to src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/giffordtown_5k/input/results.txt diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/kinnoull/input/config.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/kinnoull/input/config.txt new file mode 100644 index 00000000..1ef5a6ae --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/kinnoull/input/config.txt @@ -0,0 +1,11 @@ +YEAR = 2016 +RACE_NAME_FOR_RESULTS = Kinnoull +RACE_NAME_FOR_FILENAMES = kinnoull + +# Relative to directory containing configuration file. +RESULTS_PATH = results.txt +ENTRY_MAP_PATH = entry_map.csv + +# Relative to project root directory. +CATEGORIES_ENTRY_PATH = /src/main/resources/configuration/categories_entry_individual_senior.csv +CATEGORIES_PRIZE_PATH = /src/main/resources/configuration/categories_prize_individual_senior.csv diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/kinnoull/input/entry_map.csv b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/kinnoull/input/entry_map.csv new file mode 100644 index 00000000..0b119235 --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/kinnoull/input/entry_map.csv @@ -0,0 +1,3 @@ +1,2,3,4 +M,MS +F,FS diff --git a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/kinnoull/input/results.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/kinnoull/input/results.txt similarity index 100% rename from src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/kinnoull/input/results.txt rename to src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/kinnoull/input/results.txt diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/kinross_10k/input/config.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/kinross_10k/input/config.txt new file mode 100644 index 00000000..05c1c548 --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/kinross_10k/input/config.txt @@ -0,0 +1,10 @@ +YEAR = 2016 +RACE_NAME_FOR_RESULTS = Kinross +RACE_NAME_FOR_FILENAMES = kinross + +# Relative to directory containing configuration file. +RESULTS_PATH = results.txt + +# Relative to project root directory. +CATEGORIES_ENTRY_PATH = /src/main/resources/configuration/categories_entry_individual_senior.csv +CATEGORIES_PRIZE_PATH = /src/main/resources/configuration/categories_prize_individual_senior.csv diff --git a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/kinross_10k/input/results.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/kinross_10k/input/results.txt similarity index 100% rename from src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/kinross_10k/input/results.txt rename to src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/kinross_10k/input/results.txt diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/largo/input/config.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/largo/input/config.txt new file mode 100644 index 00000000..6ee39e79 --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/largo/input/config.txt @@ -0,0 +1,11 @@ +YEAR = 2016 +RACE_NAME_FOR_RESULTS = Largo +RACE_NAME_FOR_FILENAMES = largo + +# Relative to directory containing configuration file. +RESULTS_PATH = results.txt +ENTRY_MAP_PATH = entry_map.csv + +# Relative to project root directory. +CATEGORIES_ENTRY_PATH = /src/main/resources/configuration/categories_entry_individual_senior.csv +CATEGORIES_PRIZE_PATH = /src/main/resources/configuration/categories_prize_individual_senior.csv diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/largo/input/entry_map.csv b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/largo/input/entry_map.csv new file mode 100644 index 00000000..0b119235 --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/largo/input/entry_map.csv @@ -0,0 +1,3 @@ +1,2,3,4 +M,MS +F,FS diff --git a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/largo/input/results.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/largo/input/results.txt similarity index 100% rename from src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/largo/input/results.txt rename to src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/largo/input/results.txt diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/lomonds/input/config.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/lomonds/input/config.txt new file mode 100644 index 00000000..2fe6b27f --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/lomonds/input/config.txt @@ -0,0 +1,11 @@ +YEAR = 2016 +RACE_NAME_FOR_RESULTS = Lomonds +RACE_NAME_FOR_FILENAMES = lomonds + +# Relative to directory containing configuration file. +RESULTS_PATH = results.txt +ENTRY_MAP_PATH = entry_map.csv + +# Relative to project root directory. +CATEGORIES_ENTRY_PATH = /src/main/resources/configuration/categories_entry_individual_senior.csv +CATEGORIES_PRIZE_PATH = /src/main/resources/configuration/categories_prize_individual_senior.csv diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/lomonds/input/entry_map.csv b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/lomonds/input/entry_map.csv new file mode 100644 index 00000000..6bf92a87 --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/lomonds/input/entry_map.csv @@ -0,0 +1,5 @@ +1,2,3,4 +M,MS +F,FS +M Jun,MU20 +F Jun,FU20 diff --git a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/lomonds/input/results.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/lomonds/input/results.txt similarity index 98% rename from src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/lomonds/input/results.txt rename to src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/lomonds/input/results.txt index 5251cfe9..f6035820 100644 --- a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/lomonds/input/results.txt +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/lomonds/input/results.txt @@ -44,7 +44,7 @@ Gus Bowman Lomonds M50 02:05:31 Euan MacKinnon Carnethy M40 02:07:15 Colin Wilson Lomonds M50 02:08:08 Rachel Dance Unattached F 02:08:14 -Rosie Knox Anster Haddies Fjun 02:08:40 +Rosie Knox Anster Haddies F Jun 02:08:40 Pat Bartlett Interlopers M40 02:08:55 Billy Pillet Norham M50 02:09:00 Alison Whyte Carnegie F40 02:09:27 diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/normans_law/input/config.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/normans_law/input/config.txt new file mode 100644 index 00000000..d1873616 --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/normans_law/input/config.txt @@ -0,0 +1,11 @@ +YEAR = 2023 +RACE_NAME_FOR_RESULTS = Balmullo +RACE_NAME_FOR_FILENAMES = balmullo + +# Relative to directory containing configuration file. +RESULTS_PATH = results.txt +ENTRY_MAP_PATH = entry_map.csv + +# Relative to project root directory. +CATEGORIES_ENTRY_PATH = /src/main/resources/configuration/categories_entry_individual_senior.csv +CATEGORIES_PRIZE_PATH = /src/main/resources/configuration/categories_prize_individual_senior.csv diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/normans_law/input/entry_map.csv b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/normans_law/input/entry_map.csv new file mode 100644 index 00000000..ca0897bb --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/normans_law/input/entry_map.csv @@ -0,0 +1,9 @@ +1,2,3,4 +MV40,M40 +FV40,F40 +MV50,M50 +FV50,F50 +MV60,M60 +FV60,F60 +MV70,M70 +FV70,F70 diff --git a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/normans_law/input/results.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/normans_law/input/results.txt similarity index 98% rename from src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/normans_law/input/results.txt rename to src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/normans_law/input/results.txt index 2d3259a7..6550b58e 100644 --- a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/normans_law/input/results.txt +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/normans_law/input/results.txt @@ -73,7 +73,7 @@ Peter Darbyshire Fife AC MV50 00:43:47 Lisa Blackley Unatt. FS 00:43:48 David Norrie Fife AC MV60 00:43:51 Deborah Kilpatrick Ochil Hill Runners FS 00:43:54 -Claire Riley Unatt. Fv40 00:44:00 +Claire Riley Unatt. FV40 00:44:00 Judith Dobson Kinross RR FV50 00:44:06 Richard Ward Perth RR MV40 00:44:14 Allen Marr Anster Haddies MV60 00:44:23 @@ -115,7 +115,7 @@ Anne Whiteford Fife AC FV50 00:53:52 Mark Stewart Dundee RR MV40 00:53:53 Nina Roberts Perth RR FS 00:55:40 Holly Staples Perth RR FS 00:55:42 -Sue Whisler Fife AC FV55 00:55:56 +Sue Whisler Fife AC FV50 00:55:56 Anna Cuthbert Unatt. FV40 00:58:12 Graham Bennison Fife AC MV60 00:58:59 Eric Nachman Unatt. MV60 00:59:09 diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/sandy_slither/input/config.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/sandy_slither/input/config.txt new file mode 100644 index 00000000..45cfa870 --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/sandy_slither/input/config.txt @@ -0,0 +1,11 @@ +YEAR = 2016 +RACE_NAME_FOR_RESULTS = Sandy Slither +RACE_NAME_FOR_FILENAMES = sandy_slither + +# Relative to directory containing configuration file. +RESULTS_PATH = results.txt +ENTRY_MAP_PATH = entry_map.csv + +# Relative to project root directory. +CATEGORIES_ENTRY_PATH = /src/main/resources/configuration/categories_entry_individual_senior.csv +CATEGORIES_PRIZE_PATH = /src/main/resources/configuration/categories_prize_individual_senior.csv diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/sandy_slither/input/entry_map.csv b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/sandy_slither/input/entry_map.csv new file mode 100644 index 00000000..2a2287b3 --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/sandy_slither/input/entry_map.csv @@ -0,0 +1,11 @@ +1,2,3,4 +MJ,MU20 +FJ,FU20 +MV40,M40 +FV40,F40 +MV50,M50 +FV50,F50 +MV60,M60 +FV60,F60 +MV70,M70 +FV70,F70 diff --git a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/sandy_slither/input/results.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/sandy_slither/input/results.txt similarity index 100% rename from src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/sandy_slither/input/results.txt rename to src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/sandy_slither/input/results.txt diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/stirling_10k/input/config.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/stirling_10k/input/config.txt new file mode 100644 index 00000000..ad29e5dd --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/stirling_10k/input/config.txt @@ -0,0 +1,12 @@ +YEAR = 2016 +RACE_NAME_FOR_RESULTS = Stirling +RACE_NAME_FOR_FILENAMES = stirling + +# Relative to directory containing configuration file. +RESULTS_PATH = results.txt + +# Relative to project root directory. +CATEGORIES_ENTRY_PATH = /src/main/resources/configuration/categories_entry_individual_senior.csv +CATEGORIES_PRIZE_PATH = /src/main/resources/configuration/categories_prize_individual_senior.csv + +MEDIAN_TIME = 0:45:43 diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/stirling_10k/input/results.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/stirling_10k/input/results.txt new file mode 100644 index 00000000..9f82bc95 --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/stirling_10k/input/results.txt @@ -0,0 +1,20 @@ +Logan Rees Fife AC 00:30:48 +Tristan Rees Fife AC 00:33:03 +James Rae Fife AC 00:36:01 +Annabel Simpson Fife AC 00:36:44 +Katie Jones Fife AC 00:37:27 +Jeremy Tomlinson Fife AC 00:37:32 +Andrea Burke Rae Fife AC 00:38:42 +Daniel Newman Fife AC 00:40:06 +Kirsti Sharratt Fife AC 00:40:42 +Jennifer Cruickshanks Fife AC 00:41:28 +David Sleigh Fife AC 00:42:05 +Ailsa Cruickshanks Fife AC 00:44:22 +David Norrie Fife AC 00:44:28 +Innes Bracegirdle Fife AC 00:44:58 +Sandra Tulloch Fife AC 00:46:30 +Eddie Sanders Fife AC 00:47:24 +Nick Brian Fife AC 00:48:41 +Sue Whisler Fife AC 00:48:57 +Derek Adamson Fife AC 00:50:49 +George Black Fife AC 00:51:19 diff --git a/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/trail_champs/input/config.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/trail_champs/input/config.txt new file mode 100644 index 00000000..1fb87ee7 --- /dev/null +++ b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/trail_champs/input/config.txt @@ -0,0 +1,12 @@ +YEAR = 2016 +RACE_NAME_FOR_RESULTS = Trail Champs +RACE_NAME_FOR_FILENAMES = trail_champs + +# Relative to directory containing configuration file. +RESULTS_PATH = results.txt + +# Relative to project root directory. +CATEGORIES_ENTRY_PATH = /src/main/resources/configuration/categories_entry_individual_senior.csv +CATEGORIES_PRIZE_PATH = /src/main/resources/configuration/categories_prize_individual_senior.csv + +MEDIAN_TIME = 0:45:43 diff --git a/src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/trail_champs/input/results.txt b/src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/trail_champs/input/results.txt similarity index 100% rename from src/test/resources/actual_races/grand_prix_race/summer_grand_prix/2016/input/trail_champs/input/results.txt rename to src/test/resources/actual_races/series_race/grand_prix/2016/completed_12/input/trail_champs/input/results.txt