Better test input support

master
Benjamin Kraft 2 years ago
parent a3f03395c7
commit 16b77ae41b
  1. 21
      README.md
  2. 33
      src/main.cpp
  3. 16
      src/util.h

@ -11,4 +11,23 @@ Expects runtime arguments as days, for example:
"5 9 1" executes Days 5, 9, 1 in this order. "5 9 1" executes Days 5, 9, 1 in this order.
Add argument "T" before to use XX_testInput.txt rather than XX_input.txt #### Test Inputs
Add argument "T" after each Day to use XX_testInput.txt rather than XX_input.txt
For Test-Inputs, it tries to fetch the content of the first code-Tag. You can control this by adding the index of the desired code-Tag.
Example:
"3T 6T1 9"
- Day 3 with content from inside the first code-Tag
- Day 6 with content from inside the second code-Tag
- Day 9 with regular input
#### Get index with Browser Dev Tools:
Select the correct code-Tag in the inspector, then paste this into the console:
<code>
Array.from(document.getElementsByTagName("code")).indexOf($0)
</code>

@ -2,8 +2,7 @@
#include <cpr/cpr.h> #include <cpr/cpr.h>
#include "days/days.h" #include "days/days.h"
Input getInput(int day, string key, bool useTestInput, int testFetchIndex) {
Input getInput(int day, string key, bool useTestInput) {
Input input; Input input;
char dayStrPadded[3]; char dayStrPadded[3];
@ -11,26 +10,27 @@ Input getInput(int day, string key, bool useTestInput) {
string postfix = useTestInput ? "_testInput.txt" : "_input.txt"; string postfix = useTestInput ? "_testInput.txt" : "_input.txt";
string localFilePath = "input/" + string(dayStrPadded) + postfix; string localFilePath = "input/" + string(dayStrPadded) + postfix;
std::filesystem::remove(localFilePath);
if (!std::filesystem::exists({localFilePath})) { if (!std::filesystem::exists({localFilePath})) {
string dayStr = std::to_string(day); string dayStr = std::to_string(day);
string url = "https://adventofcode.com/2022/day/" + dayStr; string url = "https://adventofcode.com/2022/day/" + dayStr;
auto cookies = cpr::Cookies{{"session", key}}; auto cookies = cpr::Cookies{{"session", key}};
if (!useTestInput){ if (!useTestInput){
if (key.empty()) if (key.empty()){
cout << "Session key Cookie is missing, cannot fetch Input" << endl;
return input; return input;
}
url += "/input"; url += "/input";
cout << "Input does not exist. Fetching from " + url << endl; cout << "Input does not exist. Fetching from " + url << endl;
std::ofstream file(localFilePath); std::ofstream file(localFilePath);
file << cpr::Get(cpr::Url{url}, cookies).text; file << cpr::Get(cpr::Url{url}, cookies).text;
file.close(); file.close();
} else { } else {
// TODO fetch testInput from first <code>-Tag in HTML cout << "Test Input does not exist. Fetching from " + url << " from <code>-Tag with index " << testFetchIndex << endl;
std::ofstream file(localFilePath); std::ofstream file(localFilePath);
auto header = cpr::Header{{"User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:107.0) Gecko/20100101 Firefox/107.0"}, string res = cpr::Get(cpr::Url{url}).text;
{"Connection", "keep-alive"}}; size_t i1 = findAll(res, "<code>")[testFetchIndex];
file << cpr::Get(cpr::Url{url}, cookies, header).text; size_t i2 = findAll(res, "</code>")[testFetchIndex];
file << res.substr(i1 + 6, i2 - (i1 + 6));
file.close(); file.close();
} }
} }
@ -59,19 +59,16 @@ string getSessionKey() {
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
auto key = getSessionKey(); auto key = getSessionKey();
bool useTestInput = false;
auto days = getAllDays(); auto days = getAllDays();
std::filesystem::create_directory("input"); std::filesystem::create_directory("input");
int i = 1; for (int i = 1; i < argc; i++) {
if (argc > 1 && string(argv[1]) == "T") { string arg = argv[i];
useTestInput = true; bool useTestInput = arg.size() > 1 && arg[1] == 'T';
i++; int testFetchIndex = useTestInput && arg.size() > 2 ? arg[2] - '0' : 0;
} int dayNum = std::stoi(arg);
for (; i < argc; i++) {
int dayNum = std::stoi(argv[i]);
cout << "Running day " << dayNum << endl; cout << "Running day " << dayNum << endl;
Input input = getInput(dayNum, key, useTestInput); Input input = getInput(dayNum, key, useTestInput, testFetchIndex);
Day *day = days[dayNum - 1]; Day *day = days[dayNum - 1];
int code = day->run(input); int code = day->run(input);
if (code != 0) if (code != 0)

@ -10,4 +10,18 @@
using std::stoi, std::to_string; using std::stoi, std::to_string;
using std::cout, std::endl; using std::cout, std::endl;
using std::string, std::vector, std::set, std::pair, std::map; using std::string, std::vector, std::set, std::pair, std::map;
inline vector<size_t> findAll(const string& data, const string& toSearch){
vector<size_t> indices;
size_t pos = data.find(toSearch);
while (pos != string::npos){
indices.push_back(pos);
pos = data.find(toSearch, pos + toSearch.size());
}
return indices;
}
Loading…
Cancel
Save