From 1228b7150ab7fde58f6f0b20c96ec455d6bca3cc Mon Sep 17 00:00:00 2001 From: rasmus Date: Thu, 27 Mar 2025 15:07:45 +0100 Subject: [PATCH] Validate if there are more or less than the allowed rolls, if the numbers are valid and if the number isn't a number. --- include/FileUtil.h | 19 +++++++++++++++++++ include/NumberHelper.h | 7 ++++--- src/FileUtil.cpp | 28 ++++++++++++++++++++++++++++ src/NumberHelper.cpp | 30 ++++++++++++++++++++++-------- src/PrintFrames.cpp | 1 - src/main.cpp | 7 +++---- 6 files changed, 76 insertions(+), 16 deletions(-) create mode 100644 include/FileUtil.h create mode 100644 src/FileUtil.cpp diff --git a/include/FileUtil.h b/include/FileUtil.h new file mode 100644 index 0000000..6fd990c --- /dev/null +++ b/include/FileUtil.h @@ -0,0 +1,19 @@ +#ifndef FILEUTIL_H +#define FILEUTIL_H + +#include +#include + +using namespace std; + +class FileUtil { + public: + FileUtil() = default; + + ~FileUtil() = default; + + static string getFile(char *path); + static bool fileExists(char *path); +}; + +#endif \ No newline at end of file diff --git a/include/NumberHelper.h b/include/NumberHelper.h index ba28ed5..eb2c7b1 100644 --- a/include/NumberHelper.h +++ b/include/NumberHelper.h @@ -18,9 +18,10 @@ class NumberHelper { static vector createFrames(vector rolls); private: - static Frame CreateStrikeFrame(int i); - static Frame CreateFreeFrame(int i, int j); - static Frame CreateBonusFrame(int i, int j, int k); + static Frame createStrikeFrame(int i); + static Frame createFreeFrame(int i, int j); + static Frame createBonusFrame(int i, int j, int k); + static bool isNumber(const std::string& str); }; diff --git a/src/FileUtil.cpp b/src/FileUtil.cpp new file mode 100644 index 0000000..9d5278e --- /dev/null +++ b/src/FileUtil.cpp @@ -0,0 +1,28 @@ +#include "../include/FileUtil.h" +#include +#include +#include + +bool FileUtil::fileExists(char *path){ + struct stat s; + + // Check if file exists, and if it isn't a folder. + if (stat(path, &s) == 0 && !(s.st_mode & S_IFDIR)){ + return true; + } + + return false; +} + +string FileUtil::getFile(char *path){ + ifstream file(path); + + string line; + + // There is only one line in the file + getline(file, line); + + file.close(); + + return line; +} \ No newline at end of file diff --git a/src/NumberHelper.cpp b/src/NumberHelper.cpp index 08add36..4bb6b91 100644 --- a/src/NumberHelper.cpp +++ b/src/NumberHelper.cpp @@ -3,6 +3,7 @@ #include #include #include +#include vector NumberHelper::getRolls(string csv){ vector rolls; @@ -11,6 +12,11 @@ vector NumberHelper::getRolls(string csv){ // Get number from the CSV file, split by comma, and convert to int. while (getline(ss, number, ',')) { + if (!isNumber(number)) { + cerr << number << " is not a number."; + break; + } + rolls.push_back(stoi(number)); } @@ -55,11 +61,11 @@ vector NumberHelper::createFrames(vector rolls){ { // If we're on our last frame, and roll a strike, we're given two bonus rolls. if (roll + 3 == rolls.size() && rolls[roll - 3] == 10) { - frame.push_back(CreateBonusFrame(rolls[roll], rolls[roll + 1], rolls[roll + 2])); + frame.push_back(createBonusFrame(rolls[roll], rolls[roll + 1], rolls[roll + 2])); break; } - frame.push_back(CreateStrikeFrame(10)); + frame.push_back(createStrikeFrame(10)); roll += 1; } @@ -70,11 +76,11 @@ vector NumberHelper::createFrames(vector rolls){ // If we're on our last frame, and roll a spare, we're given a bonus roll. if (roll + 3 == rolls.size() && rolls[roll] + rolls[roll + 1] == 10) { - frame.push_back(CreateBonusFrame(rolls[roll], rolls[roll + 1], rolls[roll + 2])); + frame.push_back(createBonusFrame(rolls[roll], rolls[roll + 1], rolls[roll + 2])); break; } - frame.push_back(CreateFreeFrame(rolls[roll], rolls[roll + 1])); + frame.push_back(createFreeFrame(rolls[roll], rolls[roll + 1])); roll += 2; } @@ -82,7 +88,7 @@ vector NumberHelper::createFrames(vector rolls){ // Open Frame else { - frame.push_back(CreateFreeFrame(rolls[roll], rolls[roll + 1])); + frame.push_back(createFreeFrame(rolls[roll], rolls[roll + 1])); roll += 2; } @@ -91,7 +97,7 @@ vector NumberHelper::createFrames(vector rolls){ return frame; } -Frame NumberHelper::CreateStrikeFrame(int i){ +Frame NumberHelper::createStrikeFrame(int i){ struct Frame frame = Frame(); vector rolls; @@ -103,7 +109,7 @@ Frame NumberHelper::CreateStrikeFrame(int i){ return frame; } -Frame NumberHelper::CreateFreeFrame(int i, int j){ +Frame NumberHelper::createFreeFrame(int i, int j){ struct Frame frame = Frame(); vector rolls; @@ -116,7 +122,7 @@ Frame NumberHelper::CreateFreeFrame(int i, int j){ return frame; } -Frame NumberHelper::CreateBonusFrame(int i, int j, int k){ +Frame NumberHelper::createBonusFrame(int i, int j, int k){ struct Frame frame = Frame(); vector rolls; @@ -128,4 +134,12 @@ Frame NumberHelper::CreateBonusFrame(int i, int j, int k){ frame.Roll = rolls; return frame; +} + +bool NumberHelper::isNumber(const std::string& str){ + for (size_t i = 0; i < str.size(); ++i) { + if (!isdigit(str[i]) && !isspace(str[i])) return false; + } + + return true; } \ No newline at end of file diff --git a/src/PrintFrames.cpp b/src/PrintFrames.cpp index fc4d3de..aa99d11 100644 --- a/src/PrintFrames.cpp +++ b/src/PrintFrames.cpp @@ -11,7 +11,6 @@ void PrintFrames::printValue(string value) { } string PrintFrames::parseValue(vector frames) { - string value; stringstream ss; // There can only be 10 frames. diff --git a/src/main.cpp b/src/main.cpp index b800f92..9abb39a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,7 +1,6 @@ #include #include -#include "../include/FileReader.h" -#include "../include/FileHelper.h" +#include "../include/FileUtil.h" #include "../include/NumberHelper.h" #include "../include/ScoreCalculator.h" #include "../include/PrintFrames.h" @@ -14,12 +13,12 @@ int main(int argc, char *argv[]) { return 0; } - if (!FileHelper::fileExists(argv[1])) { + if (!FileUtil::fileExists(argv[1])) { cerr << "Filepath: " << argv[1] << " doesn't exist."; return 0; } - string file = FileReader::getFile(argv[1]); + string file = FileUtil::getFile(argv[1]); vector rolls = NumberHelper::getRolls(file); if (!NumberHelper::validateRolls(rolls)) {