Back to Breadth-first traversal
// Description: Testing for breadth-first traversal
// DocumentationOf: breadth_first.h
#include "test/test_init.h"
#include "pastel/sys/graph/breadth_first.h"
#include <vector>
#include <unordered_set>
TEST_CASE("traverseBreadthFirst (traverseBreadthFirst)")
{
    std::vector<integer> reportSet;
    std::unordered_set<integer> visitedSet;
    auto forEachSeedVertex = 
        [](const std::function<void(integer)>& visit)
    {
        visit(0);
    };
    auto forEachAdjacent =
        [](integer vertex, 
        const std::function<void(integer)>& visit)
    {
        if (vertex < 7)
        {
            visit(2 * vertex + 1);
            visit(2 * vertex + 2);
        }
    };
    auto mark =
        [&](integer vertex)
    {
        visitedSet.insert(vertex);
        reportSet.push_back(vertex);
    };
    auto marked =
        [&](integer vertex) -> bool
    {
        return visitedSet.count(vertex);
    };
    traverseGraph<integer>(
        forEachSeedVertex,
        forEachAdjacent,
        mark,
        marked,
        BreadthFirst_GraphTraversal());
    integer correctSet[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
    integer correctSize = std::end(correctSet) - std::begin(correctSet);
    REQUIRE(reportSet.size() == correctSize);
    if (reportSet.size() == correctSize)
    {
        REQUIRE(
            std::equal(std::begin(correctSet), std::end(correctSet),
            std::begin(reportSet)));
    }
}