Files
Renderive/renderive_package/render_3D/tests/Datoviz_Transaction_Tests.cpp
2026-08-13 23:10:04 +08:00

97 lines
2.8 KiB
C++

#include <gtest/gtest.h>
#include "render_3D/detail/Ordered_Artifact_Transaction.h"
#include "render_3D/detail/Ordered_Backend_Shutdown.h"
#include <string>
#include <vector>
namespace renderive::detail {
namespace {
struct Fake_Artifact {
int stream = 7;
};
struct Fake_Transaction_Api {
std::vector<std::string> events;
Fake_Artifact artifact;
bool emit_succeeds = true;
bool attach_succeeds = true;
bool execute_succeeds = true;
std::size_t execute_count{};
Fake_Artifact* emit() {
events.emplace_back("emit");
return emit_succeeds ? &artifact : nullptr;
}
int* stream(Fake_Artifact& value) {
events.emplace_back("stream");
return &value.stream;
}
bool attach() {
events.emplace_back("attach");
return attach_succeeds;
}
bool execute(const int&) {
events.emplace_back("execute");
++execute_count;
return execute_succeeds;
}
void destroy(Fake_Artifact&) { events.emplace_back("destroy"); }
};
TEST(DatovizTransaction, SuccessfulEmitExecutesExactlyOnceInCausalOrder) {
Fake_Transaction_Api api;
EXPECT_TRUE(static_cast<bool>(execute_ordered_artifact_transaction(api)));
EXPECT_EQ(api.execute_count, 1U);
EXPECT_EQ(api.events, std::vector<std::string>({"emit", "stream", "attach", "execute", "destroy"}));
}
TEST(DatovizTransaction, AttachFailureStillConsumesEmittedArtifactExactlyOnce) {
Fake_Transaction_Api api;
api.attach_succeeds = false;
EXPECT_FALSE(static_cast<bool>(execute_ordered_artifact_transaction(api)));
EXPECT_EQ(api.execute_count, 1U);
EXPECT_EQ(api.events, std::vector<std::string>({"emit", "stream", "attach", "execute", "destroy"}));
}
TEST(DatovizTransaction, ExecuteFailureConsumesAndDestroysArtifactBeforeRecovery) {
Fake_Transaction_Api api;
api.execute_succeeds = false;
EXPECT_FALSE(static_cast<bool>(execute_ordered_artifact_transaction(api)));
EXPECT_EQ(api.execute_count, 1U);
EXPECT_EQ(api.events, std::vector<std::string>({"emit", "stream", "attach", "execute", "destroy"}));
}
TEST(DatovizTransaction, FailedEmitDoesNotStartAttachOrExecute) {
Fake_Transaction_Api api;
api.emit_succeeds = false;
EXPECT_FALSE(static_cast<bool>(execute_ordered_artifact_transaction(api)));
EXPECT_EQ(api.execute_count, 0U);
EXPECT_EQ(api.events, std::vector<std::string>({"emit"}));
}
TEST(DatovizOwnership, ShutdownOrderProtectsBorrowedDeviceAndTargets) {
std::vector<std::string> events;
ordered_backend_shutdown(
[&] { events.emplace_back("runtime"); },
[&] { events.emplace_back("targets"); },
[&] { events.emplace_back("scene"); },
[&] { events.emplace_back("gpu_ctx"); });
EXPECT_EQ(events, std::vector<std::string>({"runtime", "targets", "scene", "gpu_ctx"}));
}
} // namespace
} // namespace renderive::detail