diff --git a/README.md b/README.md index ab74461..37a7f9f 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This is a single command line application for all puzzles written in [FreePascal ## Puzzle Input -This project does not contain the puzzle or example inputs as per the [copyright notice of Advent of Code](https://adventofcode.com/about). +This project does not contain the puzzle or example inputs as per the [copyright notice of Advent of Code](https://adventofcode.com/about). In order to run the compiled application, the puzzle inputs have to be downloaded from the [Advent of Code 2023](https://adventofcode.com/2023/) puzzle pages, and placed as text files into the `bin\data` directory. The application will output an error with details, if it cannot find an input file. ## Day 1: Trebuchet?! diff --git a/USolver.pas b/USolver.pas index 9d0df05..266d280 100644 --- a/USolver.pas +++ b/USolver.pas @@ -69,6 +69,7 @@ type procedure ProcessData(const ASolver: ISolver); procedure Run(const ASolver: ISolver); procedure RunAndFree(const ASolver: ISolver); + function GetDataFileName(const ASolver: ISolver): string; end; implementation @@ -105,7 +106,7 @@ var begin ASolver.Init; - AssignFile(data, ConcatPaths([FRelativeDataPath, ASolver.DataFileName])); + AssignFile(data, GetDataFileName(ASolver)); try reset(data); while (not EOF(data)) do @@ -121,12 +122,22 @@ begin end; procedure TSolverEngine.Run(const ASolver: ISolver); +var + fileName: string; begin WriteLn; WriteLn('--- ', ASolver.PuzzleName, ' ---'); - ProcessData(ASolver); - WriteLn('Part 1: ', ASolver.ResultPart1); - WriteLn('Part 2: ', ASolver.ResultPart2); + fileName := GetDataFileName(ASolver); + if FileExists(fileName) then + begin + ProcessData(ASolver); + WriteLn('Part 1: ', ASolver.ResultPart1); + WriteLn('Part 2: ', ASolver.ResultPart2); + end + else begin + WriteLn('Cannot find puzzle input file ''', ExpandFileName(fileName), '''.'); + WriteLn('Please download the file content from https://adventofcode.com/2023/'); + end; end; procedure TSolverEngine.RunAndFree(const ASolver: ISolver); @@ -135,5 +146,10 @@ begin ASolver.Free; end; +function TSolverEngine.GetDataFileName(const ASolver: ISolver): string; +begin + Result := ConcatPaths([FRelativeDataPath, ASolver.DataFileName]); +end; + end. diff --git a/tests/UBaseTestCases.pas b/tests/UBaseTestCases.pas index 9a5dedf..5f9d64a 100644 --- a/tests/UBaseTestCases.pas +++ b/tests/UBaseTestCases.pas @@ -72,9 +72,15 @@ end; { TEngineBaseTest } procedure TEngineBaseTest.Setup; +var + fileName: string; begin inherited Setup; FEngine := TSolverEngine.Create(GetDataPath); + fileName := FEngine.GetDataFileName(FSolver); + AssertTrue('Cannot find puzzle input file ''' + ExpandFileName(fileName) + '''. ' + + 'Please download the file from https://adventofcode.com/2023/', + FileExists(fileName)); FEngine.ProcessData(FSolver); end;