fprime/Fw/DataStructures/test/ut/ExternalRedBlackTreeMapTest.cpp
Rob Bocchino e9d7f3ab66
Data structure library, phase 2 (#4062)
* Revise RedBlackTree impl docs

* Revise RedBlackTree impl docs

* Revise RedBlackTree impl docs

* Revise RedBlackTree impl docs

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl docs

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Fix typo

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl docs

* Revise RedBlackTree impl docs

* Revise RedBlackTree impl

* Revise RedBlackTreeImpl docs

* Revise Fw/DataStructures

Reformat code

* Revise Fw/DataStructures

Fix compile errors on Linux

* Revise Fw/DataStructures

Fix compile errors on Linux

* Revise Fw/DataStructures

Fix compile errors on Linux

* Revise Fw/DataStructures

Fix compile errors on Linux

* Fix comments

* Revise Fw/DataStructures

Fix compile errors on Linux

* Revise ArrayMap docs

* Remove helper scripts

* Revise tests for Fw/DataStructures

* Fix spelling

* Fix Markdown link

* Fix uninitialized variable in test

* Fix uninitialized variable in test

* Fix "spelling"

Why is the spelling check enforcing arbitrary rules of style?

* Fix comments

* Revise RedBlackTree impl docs

* Start adding RedBlackTree impl

* Revise tests for ArraySetOrMapImpl

* Revise RedBlackTree impl

* Revise comment

* Revise comment

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise ArraySetOrMap impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Add RedBlackTree impl tester

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Fix comments

* Revise RedBlackTree impl

* Fix comments

* Revise comments

* Revise comments

* Revise comments

* Revise statement order for clarity

* Revise unit tests for RedBlackTree impl

* Revise RedBlackTree impl tests

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Add build and clean scripts

Working around regressions in the F Prime build system

* Revise build

Fix warnings

* Revise RedBlackTree impl and tests

* Revise tests for RedBlackTree impl

* Revise RedBlackTree impl and tests

* Revise RedBlackTree tests

Remove debug print statements

* Revise RedBlackTree impl tester

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise build script

* Revise RedBlackTree tests

* Revise RedBlackTree tests

* Revise RedBlackTree tests

* Revise RedBlackTree tests

* Revise RedBlackTree tests

* Revise RedBlackTree impl tests

* Revise RedBlackTree impl tests

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl tests

* Revise RedBlackTree impl tests

* Revise RedBlackTree impl tests

* Revise RedBlackTree impl tests

* Revise RedBlackTree impl tests

* Revise RedBlackTree impl tests

* Revise RedBlackTree impl test

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise comment

* Revise RedBlackTree impl and tests

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl

* Revise RedBlackTree impl tests

* Revise RedBlackTree impl tests

* Revise RedBlackTree impl

* Revise RedBlackTree impl tests

* Revise formatting

* Format code

* Revise docs

* Revise docs for Fw/DataStructures

* Revise Array and ExternalArray

Add static assertions

* Revise FifoQueue and Stack

Add static assertions

* Revise ArraySet and ArrayMap

Add static assertions

* Revise docs for ExternalRedBlackTreeMap

* Revise docs for ExternalRedBlackTreeSet

* Revise docs for RedBlackTreeMap

* Revise docs for RedBlackTreeSet

* Revise ExternalRedBlackTreeMap tests

* Refactor ExternalStackTester

* Revise ArrayMap tests

* Add RedBlackTreeMap

* Revise RedBlackTreeMap tests

* Revise RedBlackTreeMap

* Add ExternalRedBlackTreeSet

* Add missing file

* Revise SetConstIterator

* Revise ExternalRedBlackTreeSet tests

* Revise ExternalRedBlackTreeSet tests

* Revise ExternalRedBlackTreeSet tests

* Revise ExternalRedBlackTreeSet tests

* Revise ExternalRedBlackTreeSet tests

* Revise ExternalRedBlackTree tests

* Revise ExternalArraySet tests

* Revise ExternalArraySet tests

* Add RedBlackTreeSet

* Revise RedBlackTreeSet tests

* Refactor ArraySetTest

* Revise RedBlackTreeSetOrMapImpl docs

* Revise array initialization

* Revise comments

* Revise Array initialization

* Revise Array design and implementation

* Revert changes to Fw/DataStructures

* Revise Array

* Revise Array

* Revise Array

* Fix formatting

* Add SizedContainer base class

* Revise StackBase

Make it inherit from SizedContainer
Revise stack tests

* Revise MapBase

Make it inherit from SizedContainer
Revise tests

* Revise SetBase

Make it inherit from SizedContainer
Revise tests

* Revise DataStructures design

Add SizedContainer

* Revise SDD for DataStructures

* Revise DataStructures design

* Revise DataStructures design

* Revise DataStructures design

* Revise DataStructures design

* Fix spelling

* Revise zero-arg constructor for Array

* Revise Array interface

Make it consistent with the arrays generated by FPP

* Fix to assertion

* Format code

* Fix spelling

* Fix spelling

* Add -Wno-comment to suppress warnings for now

* Revise comments

* Revise diagrams

* Fix comment warnings on gcc

* Eliminate tabs

* Remove utility scripts

* Revise placement of break statements

* Rename function

getParentDirection --> getDirectionFromParent

* Add comment

* Add svg diagram

* Add svg diagram

* Add svg files

* Revise diagram

* Replace png with svg

* Replace png with svg

* Replace png with svg

* Revise comment

* Revise SDD for red-black tree

* Revise SDD for red-black tree
2025-10-06 13:26:23 -07:00

206 lines
7.1 KiB
C++

// ======================================================================
// \title ExternalRedBlackTreeMapTest.cpp
// \author bocchino
// \brief cpp file for ExternalRedBlackTreeMap tests
// ======================================================================
#include "Fw/DataStructures/ExternalRedBlackTreeMap.hpp"
#include "Fw/DataStructures/test/ut/ExternalStackTester.hpp"
#include "Fw/DataStructures/test/ut/RedBlackTreeSetOrMapImplTester.hpp"
#include "Fw/DataStructures/test/ut/STest/MapTestRules.hpp"
#include "Fw/DataStructures/test/ut/STest/MapTestScenarios.hpp"
#include "STest/STest/Pick/Pick.hpp"
namespace Fw {
template <typename K, typename V>
class ExternalRedBlackTreeMapTester {
public:
ExternalRedBlackTreeMapTester<K, V>(const ExternalRedBlackTreeMap<K, V>& map) : m_map(map) {}
const RedBlackTreeSetOrMapImpl<K, V>& getImpl() const { return this->m_map.m_impl; }
private:
const ExternalRedBlackTreeMap<K, V>& m_map;
};
namespace MapTest {
using Impl = RedBlackTreeSetOrMapImpl<State::KeyType, State::ValueType>;
using ImplTester = RedBlackTreeSetOrMapImplTester<State::KeyType, State::ValueType>;
using Map = ExternalRedBlackTreeMap<State::KeyType, State::ValueType>;
using MapTester = ExternalRedBlackTreeMapTester<State::KeyType, State::ValueType>;
using StackTester = ExternalStackTester<ImplTester::Index>;
TEST(ExternalRedBlackTreeMap, ZeroArgConstructor) {
Map map;
ASSERT_EQ(map.getCapacity(), 0);
ASSERT_EQ(map.getSize(), 0);
}
TEST(ExternalRedBlackTreeMap, TypedStorageConstructor) {
ImplTester::Node nodes[State::capacity];
ImplTester::Index freeNodes[State::capacity];
Map map(nodes, freeNodes, State::capacity);
MapTester mapTester(map);
ImplTester implTester(mapTester.getImpl());
ASSERT_EQ(implTester.getNodes().getElements(), nodes);
StackTester stackTester(implTester.getFreeNodes());
ASSERT_EQ(stackTester.getItems().getElements(), freeNodes);
ASSERT_EQ(map.getCapacity(), FwSizeType(State::capacity));
ASSERT_EQ(map.getSize(), 0);
}
TEST(ExternalRedBlackTreeMap, UntypedStorageConstructor) {
constexpr auto alignment = Map::getByteArrayAlignment();
constexpr auto byteArraySize = Map::getByteArraySize(State::capacity);
alignas(alignment) U8 bytes[byteArraySize];
Map map(ByteArray(&bytes[0], sizeof bytes), State::capacity);
MapTester mapTester(map);
ImplTester implTester(mapTester.getImpl());
ASSERT_EQ(implTester.getNodes().getElements(), reinterpret_cast<Impl::Node*>(bytes));
ASSERT_EQ(map.getCapacity(), FwSizeType(State::capacity));
ASSERT_EQ(map.getSize(), 0);
}
TEST(ExternalRedBlackTreeMap, CopyConstructor) {
ImplTester::Node nodes[State::capacity];
ImplTester::Index freeNodes[State::capacity];
// Call the constructor providing backing storage
Map map1(nodes, freeNodes, State::capacity);
// Insert an item
const State::KeyType key = 0;
const State::ValueType value = 42;
const auto status = map1.insert(key, value);
ASSERT_EQ(status, Success::SUCCESS);
// Call the copy constructor
Map map2(map1);
MapTester mapTester1(map1);
MapTester mapTester2(map2);
ImplTester implTester1(mapTester1.getImpl());
ImplTester implTester2(mapTester2.getImpl());
ASSERT_EQ(implTester2.getNodes().getElements(), nodes);
ASSERT_EQ(implTester2.getNodes().getSize(), FwSizeType(State::capacity));
StackTester stackTester(implTester2.getFreeNodes());
ASSERT_EQ(stackTester.getItems().getElements(), freeNodes);
ASSERT_EQ(map2.getSize(), 1);
}
TEST(ExternalRedBlackTreeMap, CopyAssignmentOperator) {
ImplTester::Node nodes[State::capacity];
ImplTester::Index freeNodes[State::capacity];
// Call the constructor providing backing storage
Map map1(nodes, freeNodes, State::capacity);
// Insert an item
const State::KeyType key = 0;
const State::ValueType value = 42;
const auto status = map1.insert(key, value);
ASSERT_EQ(status, Success::SUCCESS);
// Call the default constructor
Map map2;
ASSERT_EQ(map2.getSize(), 0);
// Call the copy assignment operator
map2 = map1;
ASSERT_EQ(map2.getSize(), 1);
}
TEST(ExternalRedBlackTreeMap, CopyDataFrom) {
constexpr FwSizeType maxSize = 10;
constexpr FwSizeType smallSize = maxSize / 2;
ImplTester::Node nodes1[maxSize];
ImplTester::Node nodes2[maxSize];
ImplTester::Index freeNodes1[maxSize];
ImplTester::Index freeNodes2[maxSize];
Map m1(nodes1, freeNodes1, maxSize);
// size1 < capacity2
{
Map m2(nodes2, freeNodes2, maxSize);
State::testCopyDataFrom(m1, smallSize, m2);
}
// size1 == capacity2
{
Map m2(nodes2, freeNodes2, maxSize);
State::testCopyDataFrom(m1, maxSize, m2);
}
// size1 > capacity2
{
Map m2(nodes2, freeNodes2, smallSize);
State::testCopyDataFrom(m1, maxSize, m2);
}
}
TEST(ExternalRedBlackTreeMapScenarios, Clear) {
ImplTester::Node nodes[State::capacity];
ImplTester::Index freeNodes[State::capacity];
Map map(nodes, freeNodes, State::capacity);
State state(map);
Scenarios::clear(state);
}
TEST(ExternalRedBlackTreeMapScenarios, Find) {
ImplTester::Node nodes[State::capacity];
ImplTester::Index freeNodes[State::capacity];
Map map(nodes, freeNodes, State::capacity);
State state(map);
Scenarios::find(state);
}
TEST(ExternalRedBlackTreeMapScenarios, FindExisting) {
ImplTester::Node nodes[State::capacity];
ImplTester::Index freeNodes[State::capacity];
Map map(nodes, freeNodes, State::capacity);
State state(map);
Scenarios::findExisting(state);
}
TEST(ExternalRedBlackTreeMapScenarios, InsertExisting) {
ImplTester::Node nodes[State::capacity];
ImplTester::Index freeNodes[State::capacity];
Map map(nodes, freeNodes, State::capacity);
State state(map);
Scenarios::insertExisting(state);
}
TEST(ExternalRedBlackTreeMapScenarios, InsertFull) {
ImplTester::Node nodes[State::capacity];
ImplTester::Index freeNodes[State::capacity];
Map map(nodes, freeNodes, State::capacity);
State state(map);
Scenarios::insertFull(state);
}
TEST(ExternalRedBlackTreeMapScenarios, InsertNotFull) {
ImplTester::Node nodes[State::capacity];
ImplTester::Index freeNodes[State::capacity];
Map map(nodes, freeNodes, State::capacity);
State state(map);
Scenarios::insertNotFull(state);
}
TEST(ExternalRedBlackTreeMapScenarios, Remove) {
ImplTester::Node nodes[State::capacity];
ImplTester::Index freeNodes[State::capacity];
Map map(nodes, freeNodes, State::capacity);
State state(map);
Scenarios::remove(state);
}
TEST(ExternalRedBlackTreeMapScenarios, RemoveExisting) {
ImplTester::Node nodes[State::capacity];
ImplTester::Index freeNodes[State::capacity];
Map map(nodes, freeNodes, State::capacity);
State state(map);
Scenarios::removeExisting(state);
}
TEST(ExternalRedBlackTreeMapScenarios, Random) {
ImplTester::Node nodes[State::capacity];
ImplTester::Index freeNodes[State::capacity];
Map map(nodes, freeNodes, State::capacity);
State state(map);
Scenarios::random(Fw::String("ExternalRedBlackTreeMapRandom"), state, 1000);
}
} // namespace MapTest
} // namespace Fw