#include "MapOnStack.h" #include "catch.hpp" #include "sls/bit_utils.h" #include namespace sls { using Key = FixedString<32>; TEST_CASE("MapOnStack with int values") { MapOnStack map; map.addKey("bit0", 55); map.addKeyOrSetValue("bit1", 66); REQUIRE(map.size() == 2); REQUIRE(map.capacity() == 64); REQUIRE(map.empty() == false); REQUIRE(map.getValue("bit0") == 55); REQUIRE(map.getValue("bit1") == 66); // Duplicate key throws REQUIRE_THROWS(map.addKey("bit0", 77)); // Duplicate value throws REQUIRE_THROWS(map.addKey("bit2", 66)); // modifies map.addKeyOrSetValue("bit0", 77); REQUIRE(map.getValue("bit0") == 77); // containsKey / hasValue REQUIRE(map.containsKey("bit1")); REQUIRE(map.hasValue(77)); // Clear map map.clear(); REQUIRE(map.empty()); REQUIRE(map.size() == 0); REQUIRE(map.capacity() == 64); } TEST_CASE("MapOnStack with BitAddress values") { MapOnStack map; RegisterAddress addr0(0x100); RegisterAddress addr1(0x200); BitAddress b0(addr0, 0); BitAddress b1(addr0, 1); BitAddress b2(addr1, 0); map.addKey("bit0", b0); map.addKeyOrSetValue("bit1", b1); REQUIRE(map.size() == 2); REQUIRE(map.capacity() == 64); REQUIRE(map.empty() == false); REQUIRE(map.getValue("bit0") == b0); REQUIRE(map.getValue("bit1") == b1); // Duplicate key throws REQUIRE_THROWS(map.addKey("bit0", b2)); // Duplicate value throws REQUIRE_THROWS(map.addKey("bit2", b1)); // modifies map.addKeyOrSetValue("bit0", b2); REQUIRE(map.getValue("bit0") == b2); // containsKey / hasValue REQUIRE(map.containsKey("bit1")); REQUIRE(map.hasValue(b2)); // Clear map map.clear(); REQUIRE(map.empty()); REQUIRE(map.size() == 0); REQUIRE(map.capacity() == 64); } TEST_CASE("Set and get a single entry") { MapOnStack map; RegisterAddress addr0(0x100); map.addKey("bit0", addr0); auto entries = map.getMap(); REQUIRE(entries.size() == 1); REQUIRE(map.getValue("bit0") == addr0); REQUIRE(entries["bit0"] == addr0); } TEST_CASE("Set a name that is too large throws") { MapOnStack map; REQUIRE_THROWS(map.addKey("somestringthatisreallytolongforadatac", 12)); } TEST_CASE("Length of dac name cannot be 0") { MapOnStack map; REQUIRE_THROWS(map.addKey("", 12)); } TEST_CASE("Copy a MapOnStack") { MapOnStack m1; m1.addKey("key1", 12); auto m2 = m1; // change the first object // to detecto shallow copy m1.setValue("key1", 34); REQUIRE(m2.getValue("key1") == 12); } TEST_CASE("Move MapOnStack ") { MapOnStack m1; m1.addKey("key1", 12); MapOnStack m2(std::move(m1)); REQUIRE(m1.size() == 0); REQUIRE(m2.size() == 1); } TEST_CASE("Set map from std::map") { MapOnStack map; std::map m1 = {{"key1", 11}, {"key2", 22}, {"key3", 33}}; map.setMap(m1); REQUIRE(map.size() == 3); REQUIRE(map.getValue("key2") == 22); auto retrieved_map = map.getMap(); REQUIRE(retrieved_map.size() == 3); REQUIRE(retrieved_map["key3"] == 33); } // namespace sls