178 lines
6.8 KiB
C++
178 lines
6.8 KiB
C++
#define CATCH_CONFIG_MAIN
|
|
|
|
#include "catch2/catch.hpp"
|
|
|
|
#define ARDUINOJSON_USE_LONG_LONG 1
|
|
#include "ArduinoJson.h"
|
|
#undef ARDUINOJSON_ENABLE_ARDUINO_STRING
|
|
#undef PAINLESSMESH_ENABLE_ARDUINO_STRING
|
|
#define PAINLESSMESH_ENABLE_STD_STRING
|
|
typedef std::string TSTRING;
|
|
|
|
#include "catch_utils.hpp"
|
|
|
|
#include "painlessmesh/layout.hpp"
|
|
#include "painlessmesh/protocol.hpp"
|
|
|
|
using namespace painlessmesh;
|
|
|
|
SCENARIO("isRoot returns true if the top level Node is the root of the mesh") {
|
|
GIVEN("A nodeTree with root as a top node") {
|
|
std::string rootJson =
|
|
"{\"type\":6,\"root\":true,\"dest\":2428398258,\"from\":3907768579,"
|
|
"\"subs\":[{"
|
|
"\"nodeId\":3959373838,\"subs\":[{\"nodeId\":416992913},{\"nodeId\":"
|
|
"1895675348}]}]}";
|
|
auto variant = protocol::Variant(rootJson);
|
|
auto tree1 = variant.to<protocol::NodeTree>();
|
|
THEN("isRoot returns true") { REQUIRE(layout::isRoot(tree1)); }
|
|
}
|
|
GIVEN("A nodeTree without a root as a top node") {
|
|
std::string jsonTree1 =
|
|
"{\"type\":6,\"dest\":2428398258,\"from\":3907768579,\"nodeId\":"
|
|
"3907768579,\"subs\":[{\"nodeId\":3959373838,\"subs\":[{\"nodeId\":"
|
|
"416992913},{\"nodeId\":1895675348,\"root\":true}]}]}";
|
|
auto variant1 = protocol::Variant(jsonTree1);
|
|
auto tree1 = variant1.to<protocol::NodeTree>();
|
|
std::string jsonTree2 =
|
|
"{\"type\":6,\"dest\":2428398258,\"from\":3907768579,\"nodeId\":"
|
|
"3907768579,\"subs\":[{\"nodeId\":3959373838,\"subs\":[{\"nodeId\":"
|
|
"416992913},{\"nodeId\":1895675348,\"root\":true}]}]}";
|
|
auto variant2 = protocol::Variant(jsonTree2);
|
|
auto tree2 = variant2.to<protocol::NodeTree>();
|
|
THEN("isRoot returns false") {
|
|
REQUIRE(!layout::isRoot(tree1));
|
|
REQUIRE(!layout::isRoot(tree2));
|
|
}
|
|
}
|
|
|
|
GIVEN("A random tree with a root at top level") {
|
|
auto tree1 = createNodeTree(runif(1, 255), 0);
|
|
THEN("isRoot returns true") { REQUIRE(layout::isRoot(tree1)); }
|
|
}
|
|
|
|
GIVEN("A random tree with no root at top level") {
|
|
auto noNodes = runif(2, 255);
|
|
auto tree1 = createNodeTree(noNodes, runif(1, noNodes - 1));
|
|
auto tree2 = createNodeTree(runif(1, 255), -1);
|
|
THEN("isRoot returns false") {
|
|
REQUIRE(!layout::isRoot(tree1));
|
|
REQUIRE(!layout::isRoot(tree2));
|
|
}
|
|
}
|
|
}
|
|
|
|
SCENARIO("isRooted returns true if any node in the mesh is the root node") {
|
|
GIVEN("A nodeTree with root as a top node") {
|
|
std::string rootJson =
|
|
"{\"type\":6,\"root\":true,\"dest\":2428398258,\"from\":3907768579,"
|
|
"\"subs\":[{"
|
|
"\"nodeId\":3959373838,\"subs\":[{\"nodeId\":416992913},{\"nodeId\":"
|
|
"1895675348}]}]}";
|
|
auto variant = protocol::Variant(rootJson);
|
|
auto tree1 = variant.to<protocol::NodeTree>();
|
|
THEN("isRooted returns true") { REQUIRE(layout::isRooted(tree1)); }
|
|
}
|
|
GIVEN("A nodeTree with a root some where else") {
|
|
std::string jsonTree1 =
|
|
"{\"type\":6,\"dest\":2428398258,\"from\":3907768579,\"nodeId\":"
|
|
"3907768579,\"subs\":[{\"nodeId\":3959373838,\"subs\":[{\"nodeId\":"
|
|
"416992913},{\"nodeId\":1895675348,\"root\":true}]}]}";
|
|
auto variant1 = protocol::Variant(jsonTree1);
|
|
auto tree1 = variant1.to<protocol::NodeTree>();
|
|
THEN("isRooted returns true") { REQUIRE(layout::isRooted(tree1)); }
|
|
}
|
|
|
|
GIVEN("A nodeTree without a root any where else") {
|
|
std::string jsonTree2 =
|
|
"{\"type\":6,\"dest\":2428398258,\"from\":3907768579,\"nodeId\":"
|
|
"3907768579,\"subs\":[{\"nodeId\":3959373838,\"subs\":[{\"nodeId\":"
|
|
"416992913},{\"nodeId\":1895675348,\"root\":true}]}]}";
|
|
auto variant2 = protocol::Variant(jsonTree2);
|
|
auto tree2 = variant2.to<protocol::NodeTree>();
|
|
THEN("isRooted returns false") { REQUIRE(!layout::isRoot(tree2)); }
|
|
}
|
|
|
|
GIVEN("A random tree with a root") {
|
|
auto noNodes = runif(1, 255);
|
|
auto tree1 = createNodeTree(noNodes, runif(0, noNodes - 1));
|
|
THEN("isRooted returns true") { REQUIRE(layout::isRooted(tree1)); }
|
|
}
|
|
|
|
GIVEN("A random tree without a root") {
|
|
auto tree1 = createNodeTree(runif(1, 255), -1);
|
|
THEN("isRooted returns false") { REQUIRE(!layout::isRooted(tree1)); }
|
|
}
|
|
}
|
|
|
|
SCENARIO("We can get the size of the mesh") {
|
|
GIVEN("A tree with a set size") {
|
|
std::string jsonTree =
|
|
"{\"type\":6,\"dest\":2428398258,\"from\":3907768579,\"nodeId\":"
|
|
"3907768579,\"subs\":[{\"nodeId\":3959373838,\"subs\":[{\"nodeId\":"
|
|
"416992913},{\"nodeId\":1895675348,\"root\":true}]}]}";
|
|
auto variant = protocol::Variant(jsonTree);
|
|
auto tree = variant.to<protocol::NodeTree>();
|
|
THEN("Size returns the correct size") { REQUIRE(layout::size(tree) == 4); }
|
|
}
|
|
GIVEN("A random tree with a set size") {
|
|
auto noNodes = runif(1, 255);
|
|
auto tree = createNodeTree(noNodes, runif(-1, noNodes - 1));
|
|
THEN("Size returns the correct size") {
|
|
REQUIRE(layout::size(tree) == noNodes);
|
|
}
|
|
}
|
|
}
|
|
|
|
SCENARIO("We can confirm whether a mesh contains specific nodes") {
|
|
GIVEN("A tree with known nodes") {
|
|
std::string jsonTree =
|
|
"{\"type\":6,\"dest\":2428398258,\"from\":3107768579,\"nodeId\":"
|
|
"3907768579,\"subs\":[{\"nodeId\":3959373838,\"subs\":[{\"nodeId\":"
|
|
"416992913},{\"nodeId\":1895675348,\"root\":true}]}]}";
|
|
auto variant = protocol::Variant(jsonTree);
|
|
auto tree = variant.to<protocol::NodeTree>();
|
|
THEN(
|
|
"contains should return the true when it contains a node, false "
|
|
"otherwise") {
|
|
REQUIRE(layout::contains(tree, 1895675348));
|
|
REQUIRE(layout::contains(tree, 3907768579));
|
|
REQUIRE(layout::contains(tree, 3959373838));
|
|
REQUIRE(!layout::contains(tree, 0));
|
|
REQUIRE(!layout::contains(tree, 2428398258));
|
|
REQUIRE(!layout::contains(tree, 3107768579));
|
|
}
|
|
}
|
|
}
|
|
|
|
SCENARIO("A layout neighbour knows when to update its sub") {
|
|
GIVEN("A Neighbour") {
|
|
std::string jsonTree =
|
|
"{\"type\":6,\"dest\":2428398258,\"from\":3107768579,\"nodeId\":"
|
|
"3907768579,\"subs\":[{\"nodeId\":3959373838,\"subs\":[{\"nodeId\":"
|
|
"416992913},{\"nodeId\":1895675348,\"root\":true}]}]}";
|
|
auto variant = protocol::Variant(jsonTree);
|
|
auto tree = variant.to<layout::Neighbour>();
|
|
// auto neighbour = std::interpret_cast<layout::Neighbour*>(pTree);
|
|
auto neighbour = tree;
|
|
THEN("When passed the same tree updateSubs() will return false") {
|
|
REQUIRE(!neighbour.updateSubs(tree));
|
|
}
|
|
|
|
auto tree1 = createNodeTree(runif(2, 5), -1);
|
|
tree1.nodeId = neighbour.nodeId;
|
|
THEN("When passing a different tree it will get updated") {
|
|
REQUIRE(neighbour.updateSubs(tree1));
|
|
REQUIRE(tree1 == neighbour);
|
|
}
|
|
|
|
THEN("When current nodeId is zero then updateSubs() will return true") {
|
|
neighbour.nodeId = 0;
|
|
REQUIRE(neighbour.updateSubs(tree));
|
|
REQUIRE(neighbour == tree);
|
|
REQUIRE(neighbour.nodeId == tree.nodeId);
|
|
}
|
|
}
|
|
}
|
|
|