Skip to content

Commit 8de8a21

Browse files
robinkjoyalxmjo
authored andcommitted
Add unit test for n-queens (ProAlgos#273)
* Add unit test for n-queens * Update readme with white check Co-authored-by: Alex Johnson <[email protected]>
1 parent 0147072 commit 8de8a21

File tree

3 files changed

+70
-2
lines changed

3 files changed

+70
-2
lines changed

C++/CMakeLists.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,15 @@ add_library(test_runner STATIC
1919
# Algorithms
2020
# ============================================================================
2121

22+
# -------------------
23+
# Backtracking
24+
# -------------------
25+
26+
# N-Queens
27+
add_executable(n_queens
28+
test/algorithm/backtracking/n_queens.cpp)
29+
target_link_libraries(n_queens test_runner)
30+
2231
# -------------------
2332
# Dynamic programming
2433
# -------------------

C++/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ Implementing well-known (and some rare) **algorithms and data structures in C++*
1111
### Algorithms
1212

1313
* Backtracking
14-
* [N-Queens](include/algorithm/backtracking/n_queens.hpp)
15-
14+
* [N-Queens](include/algorithms/backtracking/n_queens.hpp) :white_check_mark:
15+
1616
* Dynamic programming
1717
* [0-1 knapsack](include/algorithm/dynamic_programming/0_1_knapsack.hpp) :white_check_mark:
1818
* [Coin change](include/algorithm/dynamic_programming/coin_change.hpp) :white_check_mark:
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#include "third_party/catch.hpp"
2+
#include "algorithm/backtracking/n_queens.hpp"
3+
4+
TEST_CASE("Base cases", "[backtracking][n_queens]") {
5+
// N = 0 (cannot place)
6+
NQueensSolver b0(0);
7+
REQUIRE(b0.can_place_queens() == false);
8+
9+
// N = 1 (can place)
10+
NQueensSolver b1(1);
11+
REQUIRE(b1.can_place_queens() == true);
12+
REQUIRE(b1.num_solutions() == 1);
13+
Board b1_sln {{true}};
14+
REQUIRE(b1.get_solution() == b1_sln);
15+
std::vector<Board> b1_slns {{{true}}};
16+
REQUIRE(b1.get_solutions() == b1_slns);
17+
}
18+
19+
TEST_CASE("Unplaceable cases", "[backtracking][n_queens]") {
20+
// N = 2
21+
NQueensSolver b2(2);
22+
REQUIRE(b2.can_place_queens() == false);
23+
24+
// N = 3
25+
NQueensSolver b3(3);
26+
REQUIRE(b3.can_place_queens() == false);
27+
}
28+
29+
TEST_CASE("Placeable cases", "[backtracking][n_queens]") {
30+
// N = 4
31+
NQueensSolver b4(4);
32+
REQUIRE(b4.can_place_queens() == true);
33+
REQUIRE(b4.num_solutions() == 2);
34+
Board b4_sln1 {
35+
{false, true, false, false},
36+
{false, false, false, true},
37+
{true, false, false, false},
38+
{false, false, true, false}
39+
};
40+
Board b4_sln2 {
41+
{false, false, true, false},
42+
{true, false, false, false},
43+
{false, false, false, true},
44+
{false, true, false, false}
45+
};
46+
using Catch::Matchers::VectorContains;
47+
REQUIRE_THAT(b4.get_solutions(), VectorContains(b4_sln1));
48+
REQUIRE_THAT(b4.get_solutions(), VectorContains(b4_sln2));
49+
50+
// N = 9
51+
NQueensSolver b9(9);
52+
REQUIRE(b9.can_place_queens() == true);
53+
REQUIRE(b9.num_solutions() == 352);
54+
55+
// N = 11
56+
NQueensSolver b11(11);
57+
REQUIRE(b11.can_place_queens() == true);
58+
REQUIRE(b11.num_solutions() == 2680);
59+
}

0 commit comments

Comments
 (0)