Hangman/unit_tests.cpp
2024-05-23 17:31:25 +03:00

247 lines
No EOL
5.4 KiB
C++

#include "unit_tests.h"
#include "constants.h"
#include "game.h"
#include "score.h"
#include "input.h"
#include "word_choosing.h"
#include <cassert>
#include <chrono>
#include <iostream>
#include <string>
#include <thread>
#include <vector>
void testcheckGuess()
{
#ifdef NDEBUG
std::cerr << "NDEBUG is defined (asserts compiled out), tests can't be run\n";
std::abort();
#endif
assert(!checkGuess('a', "hello"));
assert(!checkGuess('0', "dog"));
assert(checkGuess('p', "alpha"));
assert(checkGuess('e', "eel"));
assert(!checkGuess(' ', "cat"));
assert(!checkGuess('j', ""));
assert(checkGuess('h', "h6"));
assert(!checkGuess('7', "654"));
}
void testchangeGameLetters()
{
#ifdef NDEBUG
std::cerr << "NDEBUG is defined (asserts compiled out), tests can't be run\n";
std::abort();
#endif
std::string test1{ "" };
changeGameLetters('a', test1, "");
assert(test1 == "");
std::string test2{ "__ph_be_" };
changeGameLetters('a', test2, "alphabet");
assert(test2 == "a_phabe_");
std::string test3{ "p_g" };
changeGameLetters('i', test3, "pig");
assert(test3 == "pig");
std::string test4{ "1235" };
changeGameLetters('k', test4, "1235");
assert(test4 == "1235");
std::string test5{ "_845_" };
changeGameLetters('g', test5, "g845u");
assert(test5 == "g845_");
std::string test6{ "_" };
changeGameLetters('g', test6, "b");
assert(test6 == "_");
std::string test7{ " " };
changeGameLetters('j', test7, " 5j ");
assert(test7 == " j ");
}
void testpreviouslyGuessed()
{
#ifdef NDEBUG
std::cerr << "NDEBUG is defined (asserts compiled out), tests can't be run\n";
std::abort();
#endif
std::vector<char> test1{ 'h', 'j' };
assert(!previouslyGuessed('i', "hell_", test1));
std::vector<char> test2{};
assert(!previouslyGuessed('j', "", test2));
std::vector<char> test3{ 'k' };
assert(previouslyGuessed('g', "g", test3));
std::vector<char> test4{ '3', '1' };
assert(!previouslyGuessed('j', "1o", test4));
std::vector<char> test5{ 'a', 'b', 'q' };
assert(!previouslyGuessed('y', " ", test5));
}
void testgetGuess()
{
constexpr char exitValue{ 'p' };
std::vector<char> test{ 'h', 'j', 'a', '5', '7' , '\n' };
char guess{};
do
{
guess = getGuess(test, " e1z");
} while (guess != exitValue);
}
void testgetGameMode()
{
constexpr int exitValue{ 5 };
int gameMode{};
do
{
gameMode = getGameMode();
} while (gameMode != exitValue);
}
void testincrementScore()
{
int guessed_easy1{ 8 };
int guessed_medium1{ 7 };
int guessed_hard1{ 99 };
incrementScore(2, guessed_easy1, guessed_medium1, guessed_hard1);
assert(guessed_medium1 == 8);
int guessed_easy2{ -8 };
int guessed_medium2{ 48 };
int guessed_hard2{ -771 };
incrementScore(1, guessed_easy2, guessed_medium2, guessed_hard2);
assert(guessed_easy2 == -7);
int guessed_easy3{ 8 };
int guessed_medium3{ 7 };
int guessed_hard3{ 99 };
incrementScore(3, guessed_easy3, guessed_medium3, guessed_hard3);
assert(guessed_hard3 == 100);
int guessed_easy4{ 0 };
int guessed_medium4{ 0 };
int guessed_hard4{ 0 };
incrementScore(3, guessed_easy4, guessed_medium4, guessed_hard4);
assert(guessed_hard4 == 1);
// Fail cases:
// incrementScore(4, guessed_easy1, guessed_medium1, guessed_hard1);
// incrementScore(0, guessed_easy1, guessed_medium1, guessed_hard1);
}
void testwriteScore()
{
using namespace std::chrono_literals;
// Fail cases:
// writeScore(-1, 2, 3);
// writeScore(2, -4, 1);
// writeScore(-1, -2, -7);
// writeScore(1000000000, 9999999999999999, 9999999911174);
// std::this_thread::sleep_for(10s);
writeScore(1, 2, 3);
std::this_thread::sleep_for(10s);
writeScore(79, 51, 2);
}
void testreadScore()
{
using namespace std::chrono_literals;
int test1{};
int test2{};
int test3{};
std::cout << "0% done\n";
std::cout << "10s till first check\n";
std::this_thread::sleep_for(10s);
assert(readScore(test1, test2, test3) == error_code::score_success);
assert(test1 == 79 && test2 == 51 && test3 == 2);
std::cout << "20% done\n";
std::cout << "10s till second check\n";
std::this_thread::sleep_for(10s);
assert(readScore(test1, test2, test3) == error_code::negative_score);
assert(test1 == -1 && test2 == -2 && test3 == 2);
std::cout << "40% done\n";
std::cout << "10s till third check\n";
std::this_thread::sleep_for(10s);
assert(readScore(test1, test2, test3) == error_code::score_success);
assert(test1 == 0 && test2 == 0 && test3 == 0);
std::cout << "60% done\n";
std::cout << "10s till fourth check\n";
std::this_thread::sleep_for(10s);
assert(readScore(test1, test2, test3) == error_code::score_fail);
assert(test1 == 0 && test2 == 0 && test3 == 0);
std::cout << "80% done\n";
std::cout << "10s till fifth check\n";
std::this_thread::sleep_for(10s);
assert(readScore(test1, test2, test3) == error_code::score_fail);
assert(test1 == 0 && test2 == 0 && test3 == 0);
std::cout << "100% done\n";
}
void testtopicChooser()
{
for (int i{ 1 }; i <= 20; ++i)
{
std::cout << topicChooser() << '\t';
if (i % 5 == 0)
std::cout << '\n';
}
}
void testwordChooser()
{
std::cout << "EASY SPORTS: \n";
for (int i{ 1 }; i <= 10; ++i)
{
std::cout << wordChooser(1, "sports") << '\t';
if (i % 5 == 0)
std::cout << '\n';
}
std::cout << "MEDIUM SPORTS: \n";
for (int i{ 1 }; i <= 10; ++i)
{
std::cout << wordChooser(2, "sports") << '\t';
if (i % 5 == 0)
std::cout << '\n';
}
std::cout << "HARD SPORTS: \n";
for (int i{ 1 }; i <= 10; ++i)
{
std::cout << wordChooser(3, "sports") << '\t';
if (i % 5 == 0)
std::cout << '\n';
}
}