feat(hash): add synchronized export table template

This commit is contained in:
fallenoak 2023-03-27 17:28:51 -05:00 committed by GitHub
parent a0af28c9b0
commit 3d14119536
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 132 additions and 0 deletions

View file

@ -1,4 +1,5 @@
#include "storm/Hash.hpp"
#include "storm/Thread.hpp"
#include "test/Test.hpp"
struct TestHashObject : TSHashObject<TestHashObject, HASHKEY_STRI> {
@ -11,6 +12,8 @@ struct TestExportObject : TSHashObject<TestHashObject, HASHKEY_NONE> {
typedef void* TestExportObjectHandle;
typedef void* TestExportLockedHandle;
TEST_CASE("TSHashTable", "[hash]") {
SECTION("constructs correctly") {
TSHashTable<TestHashObject, HASHKEY_STRI> hashTable;
@ -117,3 +120,44 @@ TEST_CASE("TSExportTableSimpleReuse::Delete", "[hash]") {
REQUIRE(exportTable.Ptr(handle) == nullptr);
}
}
TEST_CASE("TSExportTableSyncReuse", "[hash]") {
SECTION("constructs correctly") {
TSExportTableSyncReuse<TestExportObject, TestExportObjectHandle, TestExportLockedHandle, CCritSect> exportTable;
REQUIRE(exportTable.Head() == nullptr);
}
}
TEST_CASE("TSExportTableSyncReuse::NewLock", "[hash]") {
SECTION("returns a new object, handle, and locked handle") {
TSExportTableSyncReuse<TestExportObject, TestExportObjectHandle, TestExportLockedHandle, CCritSect> exportTable;
TestExportObjectHandle handle;
TestExportLockedHandle lockedHandle;
auto object = exportTable.NewLock(&handle, &lockedHandle);
exportTable.Unlock(lockedHandle);
REQUIRE(handle != nullptr);
REQUIRE(lockedHandle != nullptr);
REQUIRE(object != nullptr);
REQUIRE(object != handle);
REQUIRE(exportTable.Head() == object);
REQUIRE(exportTable.Ptr(handle) == object);
}
}
TEST_CASE("TSExportTableSyncReuse::Delete", "[hash]") {
SECTION("deletes object from export table") {
TSExportTableSyncReuse<TestExportObject, TestExportObjectHandle, TestExportLockedHandle, CCritSect> exportTable;
TestExportObjectHandle handle;
TestExportLockedHandle lockedHandle;
auto object = exportTable.NewLock(&handle, &lockedHandle);
exportTable.Unlock(lockedHandle);
exportTable.Delete(handle);
REQUIRE(handle != nullptr);
REQUIRE(object != nullptr);
REQUIRE(object != handle);
REQUIRE(exportTable.Head() == nullptr);
REQUIRE(exportTable.Ptr(handle) == nullptr);
}
}