Files
Renderive/render_3D/tests/Object_State_Tests.cpp
T
2026-08-14 09:12:42 +08:00

61 lines
2.4 KiB
C++

#include "Test_Fixtures.h"
#include <render_3D/base/Object_Access_p.h>
#include <gtest/gtest.h>
namespace renderive::render_3D {
TEST(Render3DObjectState, MeshMutationStaysInCacheUntilPublish) {
Mesh mesh({.geometry = test::triangle_geometry()});
const auto initial = detail::Object_Access::publish(mesh);
Matrix4 translated;
translated.elements[12] = 2.0F;
mesh.place(translated);
const auto cached = detail::Object_Access::cache(mesh);
const auto still_rendered = detail::Object_Access::rendered(mesh);
EXPECT_EQ(cached.properties.transform, translated);
EXPECT_EQ(cached.revision, initial.revision + 1);
EXPECT_EQ(still_rendered.properties.transform, initial.properties.transform);
EXPECT_EQ(still_rendered.revision, initial.revision);
const auto published = detail::Object_Access::publish(mesh);
EXPECT_EQ(published.properties.transform, translated);
EXPECT_EQ(published.revision, cached.revision);
}
TEST(Render3DObjectState, ImmutableGeometryIsSharedAcrossDoubleStatePublication) {
const auto geometry = test::triangle_geometry();
Mesh mesh({.geometry = geometry});
const auto published = detail::Object_Access::publish(mesh);
EXPECT_EQ(published.properties.geometry, geometry);
const auto replacement = test::triangle_geometry(0.1F);
mesh.replace_geometry(replacement);
EXPECT_EQ(detail::Object_Access::rendered(mesh).properties.geometry, geometry);
EXPECT_EQ(detail::Object_Access::publish(mesh).properties.geometry, replacement);
}
TEST(Render3DObjectState, BuildersValidateWithoutCreatingBackendResources) {
Mesh_Builder builder;
EXPECT_THROW(builder.build(), std::invalid_argument);
const auto mesh = builder.set<&Mesh_Properties::geometry>(test::triangle_geometry()).build();
ASSERT_NE(mesh, nullptr);
EXPECT_TRUE(mesh->identity().valid());
}
TEST(Render3DObjectState, TextMutationStaysInCacheUntilPublish) {
Text text({.string = "before"});
const auto initial = detail::Object_Access::publish(text);
text.set_string("after");
EXPECT_EQ(detail::Object_Access::cache(text).properties.string, "after");
EXPECT_EQ(detail::Object_Access::rendered(text).properties.string, "before");
const auto published = detail::Object_Access::publish(text);
EXPECT_EQ(published.properties.string, "after");
EXPECT_EQ(published.revision, initial.revision + 1);
}
} // namespace renderive::render_3D