Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added Tests #26

Merged
merged 15 commits into from
Nov 3, 2018
11 changes: 11 additions & 0 deletions TicTacToe/tests/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
CC=g++ --std=c++11
TARGET=tests.exe
OBJS="$(TARGET) main.o TicTacToeDescriptor.o TicTacToeBoard.o TicTacToe.o TicTacToePlayer.o"
SRCS=main.cpp TicTacToeDescriptorTest.cpp TicTacToeBoardTest.cpp TicTacToeTest.cpp TicTacToePlayerTest.cpp ../backend/TicTacToeBoardDescriptor.cpp ../backend/TicTacToeBoard.cpp ../backend/TicTacToe.cpp ../engine/TicTacToePlayer.cpp

test: $(SRCS)
$(CC) $(SRCS) -o $(TARGET)

clean:
rm -f $(OBJS)
rm */*.gch
151 changes: 151 additions & 0 deletions TicTacToe/tests/TicTacToeBoardTest.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
#include "../backend/TicTacToeBoard.h"

#include "catch.hpp"

// TESTS FOR TICTACTOEMOVE
TEST_CASE("Contstructor throws correct errors")
{
SECTION("Correct , no errors")
{
int row = 1;
int col = 1;
char symbol = 'x';

REQUIRE_NOTHROW(TicTacToeMove(row, col, symbol));
}

SECTION("Row invalid")
{
int row = 3;
int col = 1;
char symbol = 'x';

CHECK_THROWS_AS(TicTacToeMove(row, col, symbol), std::invalid_argument);
}

SECTION("Col invalid")
{
int row = 1;
int col = 3;
char symbol = 'x';

CHECK_THROWS_AS(TicTacToeMove(row, col, symbol), std::invalid_argument);
}

SECTION("Symbol invalid")
{
int row = 1;
int col = 1;
char symbol = 'a';

CHECK_THROWS_AS(TicTacToeMove(row, col, symbol), std::invalid_argument);
}

SECTION("position invalid")
{
int pos = 9;
char symbol = 'o';

CHECK_THROWS_AS(TicTacToeMove(pos, symbol), std::invalid_argument);
}
}


// TESTS FOR TICTACTOEBOARD
TEST_CASE("tests for makeMove && isLegal")
{
SECTION("throws error when move is Illegal")
{
int pos = 5;
char symbol = 'x';

TicTacToeMove move(pos, symbol);
TicTacToeBoardDescriptor desc("xxxxxxxxx");
TicTacToeBoard board(desc);

CHECK_THROWS_AS(board.makeMove(move), int);
}

SECTION("Returns false when move is not Legal")
{
int row = 1;
int col = 1;
char symbol = 'x';

TicTacToeMove move(row, col, symbol);
TicTacToeBoardDescriptor desc("xxxxxxxxx");
TicTacToeBoard board(desc);

CHECK(board.isLegal(move) == false);
}

SECTION("makeMove returns new Board with correct description")
{
int row = 1;
int col = 1;
char symbol = 'x';

TicTacToeMove move(row, col, symbol);
TicTacToeBoardDescriptor desc(".........");
TicTacToeBoard board(desc);

TicTacToeBoard nBoard = board.makeMove(move);

CHECK(nBoard.getDescriptor().getDescription() != board.getDescriptor().getDescription());
CHECK(nBoard.getDescriptor().getDescription() == "....x....");
}
}

TEST_CASE("tests for getGameState")
{
SECTION("returns correct state when x wins")
{
TicTacToeBoardDescriptor d1("xxx.oo.xo");
TicTacToeBoard board(d1);

CHECK(board.getGameState() == Win1);
}

SECTION("returns correct state when o wins")
{
TicTacToeBoardDescriptor d1("xx.ooo.xo");
TicTacToeBoard board(d1);

CHECK(board.getGameState() == Win2);
}

SECTION("returns correct state when draw")
{
TicTacToeBoardDescriptor d1("oxooxxxoo");
TicTacToeBoard board(d1);

CHECK(board.getGameState() == Draw);
}

SECTION("returns continue when game not finished")
{
TicTacToeBoardDescriptor d1("oxo.xx.oo");
TicTacToeBoard board(d1);

CHECK(board.getGameState() == Continue);
}
}

TEST_CASE("tests for numOccupied")
{
SECTION("returns 0")
{
TicTacToeBoardDescriptor d(".........");
TicTacToeBoard board(d);

CHECK(board.numOccupied() == 0);
}

SECTION("returns 8")
{
TicTacToeBoardDescriptor d("oxooxxxo.");
TicTacToeBoard board(d);

CHECK(board.numOccupied() == 8);
}
}
67 changes: 67 additions & 0 deletions TicTacToe/tests/TicTacToeDescriptorTest.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#include "../backend/TicTacToeBoardDescriptor.h"

#include <iostream>
#include <string>

#include "catch.hpp"


TEST_CASE("checking for correct error messages in descriptor")
{
SECTION("descriptor is correct")
{
const std::string descriptor = ".x..o.x..";

CHECK_NOTHROW(TicTacToeBoardDescriptor());
CHECK_NOTHROW(TicTacToeBoardDescriptor(descriptor));
}

SECTION("descriptor is too short")
{
const std::string descriptor = "....";
CHECK_THROWS(TicTacToeBoardDescriptor(descriptor));
}

SECTION("descriptor is too long")
{
const std::string descriptor = ".............";
CHECK_THROWS(TicTacToeBoardDescriptor(descriptor));
}

SECTION("descriptor has invalid char")
{
const std::string descriptor = "........0";
CHECK_THROWS_WITH(TicTacToeBoardDescriptor(descriptor), "Found invalid character in descriptor!");
}

SECTION("descriptor has only invalid char")
{
const std::string descriptor = "abcdefghj";
CHECK_THROWS_WITH(TicTacToeBoardDescriptor(descriptor), "Found invalid character in descriptor!");
}
}

TEST_CASE("test getDescription")
{
TicTacToeBoardDescriptor ttd;

SECTION("getDescription returns correct descriptor")
{
const std::string descriptor = ".........";
REQUIRE(ttd.getDescription() == descriptor);
}
}

TEST_CASE("test editDescription")
{
TicTacToeBoardDescriptor ttd;

SECTION("editDescription returns correct descriptor after editing")
{
int pos = 0;
char val = 'x';

const std::string descriptor = "x........";
REQUIRE(ttd.editDescription(pos, val).getDescription() == descriptor);
}
}
74 changes: 74 additions & 0 deletions TicTacToe/tests/TicTacToePlayerTest.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#include "../engine/TicTacToePlayer.h"
#include "../backend/TicTacToeBoardDescriptor.h"
#include "../backend/TicTacToeBoard.h"

#include "catch.hpp"

TEST_CASE("Test Tictactoe Player class")
{
SECTION("player symbol is x")
{
char symbol = 'x';
CHECK_NOTHROW(TicTacToePlayer(symbol));
}

SECTION("player symbol is o")
{
char symbol = 'o';
CHECK_NOTHROW(TicTacToePlayer(symbol));
}

SECTION("player symbol is invalid")
{
char symbol = 'a';
CHECK_THROWS(TicTacToePlayer(symbol));
}
}

TEST_CASE("test play returns correct moves")
{
SECTION("makes correct choice between blocking and winning")
{
TicTacToeBoardDescriptor desc("x.xox.oo.");
TicTacToeBoard board(desc);
TicTacToePlayer engine('o');

REQUIRE(engine.play(board).i == 8);
}

SECTION("makes choice to block 1")
{
TicTacToeBoardDescriptor desc("x..x.o...");
TicTacToeBoard board(desc);
TicTacToePlayer engine('o');

REQUIRE(engine.play(board).i == 6);
}

SECTION("makes choice to block 2")
{
TicTacToeBoardDescriptor desc("oxo.x...x");
TicTacToeBoard board(desc);
TicTacToePlayer engine('o');

REQUIRE(engine.play(board).i == 7);
}

SECTION("makes choice to win 1")
{
TicTacToeBoardDescriptor desc("oo..x..x.");
TicTacToeBoard board(desc);
TicTacToePlayer engine('o');

REQUIRE(engine.play(board).i == 2);
}

SECTION("makes choice to win 2")
{
TicTacToeBoardDescriptor desc("oxx.o.oxx");
TicTacToeBoard board(desc);
TicTacToePlayer engine('o');

CHECK(engine.play(board).i == 3);
}
}
Loading