61 lines
2.4 KiB
C++
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
|