Repository navigation
Expand file tree
/
Copy pathTest.cpp
More file actions
396 lines (302 loc) · 13.2 KB
/
Copy pathTest.cpp
File metadata and controls
396 lines (302 loc) · 13.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
// written by Lior Trachtman: 211791041
// EMAIL: lior16122000@gmail.com
#include "doctest.h"
#include "Board.hpp"
#include "Player.hpp"
#include "Settlement.hpp"
#include "Road.hpp"
#include "DevelopmentCard.hpp"
#include "Resources.hpp"
#include "Tile.hpp"
#include "Catan.hpp"
using namespace ariel;
TEST_CASE("Player functions") {
// Create a board and initialize it
Board board;
board.makeBoard();
// Create players and add them to the board
Player player("Player1");
board.addPlayer(player);
// Test setting and getting points
player.setPoints(5);
CHECK(player.getPoints() == 5);
// Test adding and removing resources
player.addResource(Resources::ResourceType::WOOD, 3, board);
CHECK(player.getResourceCount(Resources::ResourceType::WOOD) == 3);
player.removeResource(Resources::ResourceType::WOOD, 1, board);
CHECK(player.getResourceCount(Resources::ResourceType::WOOD) == 2);
// Test placing settlement and road
player.placeSettlement(0, board);
CHECK(board.getNumSettlements("Player1") == 1);
player.placeRoad(0, 1, board);
CHECK(board.getNumRoads("Player1") == 1);
}
TEST_CASE("Board initialization and basic functions") {
Board board;
board.makeBoard();
CHECK(board.getPlayers().empty());
CHECK(board.getSettlements().empty());
CHECK(board.getRoads().empty());
CHECK(board.getVertexToTiles().size() == 54);
CHECK(board.getTileAtIndex(0).getId() == 0);
Player player1("Player1");
Player player2("Player2");
board.addPlayer(player1);
board.addPlayer(player2);
CHECK(board.getPlayers().size() == 2);
CHECK(board.getPlayers()[0].getName() == "Player1");
CHECK(board.getPlayers()[1].getName() == "Player2");
board.resetGame();
CHECK(board.getPlayers().empty());
}
TEST_CASE("Board settlement and road placement") {
Board board;
board.makeBoard();
Player player1("Player1");
Player player2("Player2");
board.addPlayer(player1);
board.addPlayer(player2);
// Place settlements and roads for both players
player1.placeSettlement(0, board);
player1.placeRoad(0, 1, board);
player2.placeSettlement(3, board);
player2.placeRoad(3, 4, board);
// Check number of settlements and roads for each player
CHECK(board.getNumSettlements("Player1") == 1);
CHECK(board.getNumSettlements("Player2") == 1);
CHECK(board.getNumRoads("Player1") == 1);
CHECK(board.getNumRoads("Player2") == 1);
}
TEST_CASE("Board dice roll and resource collection") {
Board board;
board.makeBoard();
Player player1("Player1");
Player player2("Player2");
board.addPlayer(player1);
board.addPlayer(player2);
// Roll dice and distribute resources accordingly
player1.rollDice(board);
// Check if resources are correctly distributed to the player
CHECK(player1.getResourceCount(Resources::ResourceType::WOOD) >= 0);
CHECK(player1.getResourceCount(Resources::ResourceType::BRICK) >= 0);
CHECK(player1.getResourceCount(Resources::ResourceType::ORE) >= 0);
CHECK(player1.getResourceCount(Resources::ResourceType::GRAIN) >= 0);
CHECK(player1.getResourceCount(Resources::ResourceType::WOOL) >= 0);
}
TEST_CASE("Player development card purchase and usage") {
Board board;
board.makeBoard();
Player player1("Player1");
board.addPlayer(player1);
// Add resources to player for purchasing development cards
player1.addResource(Resources::ResourceType::ORE, 1, board);
player1.addResource(Resources::ResourceType::WOOL, 1, board);
player1.addResource(Resources::ResourceType::GRAIN, 1, board);
// Purchase a development card and verify if it's added to player's hand
player1.buyDevelopmentCard(board);
CHECK(player1.hasDevelopmentCard());
// Play the development card (e.g., Knight card)
player1.playDevelopmentCard(DevelopmentCardType::KNIGHT, board);
// Verify the effect of the development card on the game state
// Example: Check if the robber position changes or another player's resource is affected
}
TEST_CASE("Board reset and state after game completion") {
Board board;
board.makeBoard();
Player player1("Player1");
Player player2("Player2");
board.addPlayer(player1);
board.addPlayer(player2);
// Play through a full game or until completion
// Example: Players build settlements, roads, cities, purchase development cards, etc.
// Reset the game board and verify initial state for a new game
board.resetGame();
CHECK(board.getPlayers().empty());
CHECK(board.getSettlements().empty());
CHECK(board.getRoads().empty());
}
TEST_CASE("Player victory point calculation from settlements and cities") {
Board board;
board.makeBoard();
Player player1("Player1");
board.addPlayer(player1);
// Add resources to player
player1.addResource(Resources::ResourceType::ORE, 3, board);
player1.addResource(Resources::ResourceType::WOOL, 1, board);
player1.addResource(Resources::ResourceType::BRICK, 1, board);
player1.addResource(Resources::ResourceType::WOOD, 1, board);
player1.addResource(Resources::ResourceType::GRAIN, 3, board);
// Build settlements and cities to earn victory points
player1.placeSettlement(0, board);
player1.placeCity(0,board);
// Check the total victory points of the player
CHECK(player1.getPoints() >= 2); // Assuming 2 points from settlement and city
}
TEST_CASE("DevelopmentCard functions") {
DevelopmentCard knightCard(DevelopmentCardType::KNIGHT);
CHECK(knightCard.getType() == DevelopmentCardType::KNIGHT);
CHECK(knightCard.getDescription() == "Knight card - lets the player move the robber");
auto deck = DevelopmentCard::initializeDeck();
CHECK(deck.size() == 25);
DevelopmentCard::shuffleDeck(deck);
auto discardPile = std::vector<DevelopmentCard>();
auto drawnCard = DevelopmentCard::drawCard(deck);
CHECK(!deck.empty());
}
TEST_CASE("Player functions") {
Player player("Player1");
Board board;
board.makeBoard();
player.setPoints(5);
CHECK(player.getPoints() == 5);
player.addResource(Resources::ResourceType::WOOD, 3, board);
CHECK(player.getResourceCount(Resources::ResourceType::WOOD) == 3);
player.removeResource(Resources::ResourceType::WOOD, 1, board);
CHECK(player.getResourceCount(Resources::ResourceType::WOOD) == 2);
player.placeSettlement(0, board);
CHECK(board.getNumSettlements("Player1") == 1);
player.placeRoad(0, 1, board);
CHECK(board.getNumRoads("Player1") == 1);
}
TEST_CASE("Resource distribution functions") {
auto resources = Resources();
auto resourceTypes = resources.distributeResourceTypes();
auto resourceNumbers = resources.distributeResourceNumbers();
CHECK(resourceTypes.size() == 19);
CHECK(resourceNumbers.size() == 19);
CHECK(Resources::resourceTypeToString(Resources::ResourceType::WOOD) == "Wood");
CHECK(Resources::stringToResourceType("Brick") == Resources::ResourceType::BRICK);
}
TEST_CASE("Road functions") {
Road road("Player1", {0, 1});
CHECK(road.getVertices().first == 0);
CHECK(road.getVertices().second == 1);
CHECK(road.getPlayerId() == "Player1");
}
TEST_CASE("Settlement functions") {
std::vector<std::vector<int>> vertexToTiles;
Settlement settlement("Player1", vertexToTiles, 0);
CHECK(settlement.getPlayerId() == "Player1");
CHECK(settlement.getVerticeId() == 0);
CHECK(!settlement.isCity());
settlement.upgradeToCity();
CHECK(settlement.isCity());
}
TEST_CASE("Tile functions") {
std::vector<int> vertices = {0, 1, 2, 3, 4, 5};
Tile tile(1, vertices, Resources::ResourceType::WOOD, 6);
CHECK(tile.getId() == 1);
CHECK(tile.getVertices() == vertices);
CHECK(tile.getType() == Resources::ResourceType::WOOD);
CHECK(tile.getdiceNumber() == 6);
std::vector<std::pair<int, int>> edges = tile.getEdges();
CHECK(edges.size() == 6);
}
TEST_CASE("Full game flow") {
Board board;
Player player1("Player1");
Player player2("Player2");
board.addPlayer(player1);
board.addPlayer(player2);
board.makeBoard();
board.initializeDevelopmentCardDeck();
board.shuffleDevelopmentCardDeck();
player1.addResource(Resources::ResourceType::WOOD, 2, board);
player1.addResource(Resources::ResourceType::BRICK, 2, board);
player1.placeSettlement(0, board);
player1.placeRoad(0, 1, board);
CHECK(board.getNumSettlements("Player1") == 1);
CHECK(board.getNumRoads("Player1") == 1);
auto card = board.drawDevelopmentCard();
player1.playDevelopmentCard(card.getType(), board);
player1.trade(player2, "Wood", "Brick", 1, 1, board);
player2.rollDice(board);
}
TEST_CASE("Player resource trading") {
Board board;
board.makeBoard();
Player player1("Player1");
Player player2("Player2");
board.addPlayer(player1);
board.addPlayer(player2);
// Initialize resources for testing
player1.addResource(Resources::ResourceType::WOOD, 3, board);
player1.addResource(Resources::ResourceType::BRICK, 2, board);
player2.addResource(Resources::ResourceType::WOOD, 2, board);
player2.addResource(Resources::ResourceType::BRICK, 3, board);
SUBCASE("Valid trade with sufficient resources") {
// Trade where player1 gives 2 Wood and gets 1 Brick from player2
player1.trade(player2, "Wood", "Brick", 2, 1, board);
// Check player1's resources after trade
CHECK(player1.getResourceCount(Resources::ResourceType::WOOD) == 1);
CHECK(player1.getResourceCount(Resources::ResourceType::BRICK) == 3);
// Check player2's resources after trade
CHECK(player2.getResourceCount(Resources::ResourceType::WOOD) == 4); // 2 (initial) + 2 (traded)
CHECK(player2.getResourceCount(Resources::ResourceType::BRICK) == 2); // 3 (initial) - 1 (traded)
}
SUBCASE("Invalid trade with insufficient resources") {
// Attempt trade where player1 gives 4 Wood (insufficient) and expects 2 Brick from player2
player1.trade(player2, "Wood", "Brick", 4, 2, board);
// Check player1's resources remain unchanged
CHECK(player1.getResourceCount(Resources::ResourceType::WOOD) == 3);
CHECK(player1.getResourceCount(Resources::ResourceType::BRICK) == 2);
// Check player2's resources remain unchanged
CHECK(player2.getResourceCount(Resources::ResourceType::WOOD) == 2);
CHECK(player2.getResourceCount(Resources::ResourceType::BRICK) == 3);
}
SUBCASE("Trade with different amounts and types") {
// Trade where player1 gives 1 Wood and gets 2 Brick from player2
player1.trade(player2, "Wood", "Brick", 1, 2, board);
// Check player1's resources after trade
CHECK(player1.getResourceCount(Resources::ResourceType::WOOD) == 2);
CHECK(player1.getResourceCount(Resources::ResourceType::BRICK) == 4); // 2 (initial) + 2 (traded)
// Check player2's resources after trade
CHECK(player2.getResourceCount(Resources::ResourceType::WOOD) == 3); // 2 (initial) - 1 (traded)
CHECK(player2.getResourceCount(Resources::ResourceType::BRICK) == 1); // 3 (initial) + 2 (traded)
}
SUBCASE("Trade with invalid resource types") {
// Attempt trade with invalid resource types
player1.trade(player2, "InvalidResource", "Brick", 1, 1, board);
// Check player1's and player2's resources remain unchanged
CHECK(player1.getResourceCount(Resources::ResourceType::WOOD) == 3);
CHECK(player1.getResourceCount(Resources::ResourceType::BRICK) == 2);
CHECK(player2.getResourceCount(Resources::ResourceType::WOOD) == 2);
CHECK(player2.getResourceCount(Resources::ResourceType::BRICK) == 3);
}
}
TEST_CASE("Player acquires development cards and checks resource availability") {
Board board;
board.makeBoard();
Player player1("Player1");
Player player2("Player2");
board.addPlayer(player1);
board.addPlayer(player2);
// Add sufficient resources for testing
player1.addResource(Resources::ResourceType::WOOD, 100, board);
player1.addResource(Resources::ResourceType::BRICK, 100, board);
player1.addResource(Resources::ResourceType::ORE, 100, board);
player1.addResource(Resources::ResourceType::GRAIN, 100, board);
player1.addResource(Resources::ResourceType::WOOL, 100, board);
player1.buyDevelopmentCard(board);
// Assertions to verify player's state after buying development cards
CHECK(player1.hasDevelopmentCard());
CHECK(player1.hasResourcesForCityBuilding());
CHECK(player1.hasResourcesForDevelopmentCard());
CHECK(player1.hasResourcesForRoadBuilding());
CHECK(player1.hasResourcesForSettlementBuilding());
}
TEST_CASE("Tile edge functionality") {
// Create a tile with known edges
Tile tile(0, {0, 1, 2, 3, 4, 5}, Resources::ResourceType::WOOD, 6);
// Retrieve edges and verify their correctness
auto edges = tile.getEdges();
// Check number of edges
CHECK(edges.size() == 6);
// Verify each edge
CHECK(edges[0] == std::make_pair(0, 1));
CHECK(edges[1] == std::make_pair(1, 2));
CHECK(edges[2] == std::make_pair(2, 3));
CHECK(edges[3] == std::make_pair(3, 4));
CHECK(edges[4] == std::make_pair(4, 5));
CHECK(edges[5] == std::make_pair(5, 0));
}