Skip to content

Commit

Permalink
Add unit test for n-queens (#273)
Browse files Browse the repository at this point in the history
* Add unit test for n-queens
* Update readme with white check

Co-authored-by: Alex Johnson <alxmjo@gmail.com>
  • Loading branch information
robinkjoy and alxmjo authored May 21, 2020
1 parent 9428742 commit 44b7c02
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 2 deletions.
9 changes: 9 additions & 0 deletions C++/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,15 @@ add_library(test_runner STATIC
# Algorithms
# ============================================================================

# -------------------
# Backtracking
# -------------------

# N-Queens
add_executable(n_queens
test/algorithm/backtracking/n_queens.cpp)
target_link_libraries(n_queens test_runner)

# -------------------
# Dynamic programming
# -------------------
Expand Down
4 changes: 2 additions & 2 deletions C++/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ Implementing well-known (and some rare) **algorithms and data structures in C++*
### Algorithms

* Backtracking
* [N-Queens](include/algorithm/backtracking/n_queens.hpp)
* [N-Queens](include/algorithms/backtracking/n_queens.hpp) :white_check_mark:

* Dynamic programming
* [0-1 knapsack](include/algorithm/dynamic_programming/0_1_knapsack.hpp) :white_check_mark:
* [Coin change](include/algorithm/dynamic_programming/coin_change.hpp) :white_check_mark:
Expand Down
59 changes: 59 additions & 0 deletions C++/test/algorithm/backtracking/n_queens.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#include "third_party/catch.hpp"
#include "algorithm/backtracking/n_queens.hpp"

TEST_CASE("Base cases", "[backtracking][n_queens]") {
// N = 0 (cannot place)
NQueensSolver b0(0);
REQUIRE(b0.can_place_queens() == false);

// N = 1 (can place)
NQueensSolver b1(1);
REQUIRE(b1.can_place_queens() == true);
REQUIRE(b1.num_solutions() == 1);
Board b1_sln {{true}};
REQUIRE(b1.get_solution() == b1_sln);
std::vector<Board> b1_slns {{{true}}};
REQUIRE(b1.get_solutions() == b1_slns);
}

TEST_CASE("Unplaceable cases", "[backtracking][n_queens]") {
// N = 2
NQueensSolver b2(2);
REQUIRE(b2.can_place_queens() == false);

// N = 3
NQueensSolver b3(3);
REQUIRE(b3.can_place_queens() == false);
}

TEST_CASE("Placeable cases", "[backtracking][n_queens]") {
// N = 4
NQueensSolver b4(4);
REQUIRE(b4.can_place_queens() == true);
REQUIRE(b4.num_solutions() == 2);
Board b4_sln1 {
{false, true, false, false},
{false, false, false, true},
{true, false, false, false},
{false, false, true, false}
};
Board b4_sln2 {
{false, false, true, false},
{true, false, false, false},
{false, false, false, true},
{false, true, false, false}
};
using Catch::Matchers::VectorContains;
REQUIRE_THAT(b4.get_solutions(), VectorContains(b4_sln1));
REQUIRE_THAT(b4.get_solutions(), VectorContains(b4_sln2));

// N = 9
NQueensSolver b9(9);
REQUIRE(b9.can_place_queens() == true);
REQUIRE(b9.num_solutions() == 352);

// N = 11
NQueensSolver b11(11);
REQUIRE(b11.can_place_queens() == true);
REQUIRE(b11.num_solutions() == 2680);
}

0 comments on commit 44b7c02

Please sign in to comment.