#include #include #include namespace aethera::render_3d { namespace { template void verify_visual(Item valid, Item) { using Object = Visual; auto built = typename Object::template Builder{}.build(); ASSERT_TRUE(built.has_value()); auto object = std::move(built).value(); object->template set<&Visual::Prop::items>(std::vector{valid}); object->advance(); EXPECT_EQ(object->template read_prop().items.size(), 1U); } } TEST(Render_3D_Visual, Migrated_Families_Build_And_Validate) { verify_visual(Point{}, Point{.diameter_px = 0.0F}); verify_visual(Splat{}, Splat{.sigma = {0.0F, 0.0F}}); verify_visual(Pixel{}, Pixel{.size_px = 0.0F}); verify_visual(Marker{}, Marker{.diameter_px = 0.0F}); verify_visual(Sphere{}, Sphere{.radius = 0.0F}); verify_visual(Segment{}, Segment{.width_px = 0.0F}); verify_visual(Vector_Glyph{}, Vector_Glyph{.width_px = 0.0F}); verify_visual(Primitive_Vertex{}, Primitive_Vertex{.position = {NAN, 0.0F, 0.0F}}); verify_visual(Mesh_Vertex{}, Mesh_Vertex{.normal = {NAN, 0.0F, 0.0F}}); verify_visual(Path_Vertex{}, Path_Vertex{.width_px = 0.0F}); verify_visual(Image{}, Image{.extent = {0.0F, 0.0F}}); verify_visual(Label{}, Label{.extent = {0.0F, 0.0F}}); verify_visual(Glyph{}, Glyph{.angle = NAN}); verify_visual(Text_Label{.text = "A"}, Text_Label{}); verify_visual(Voxel{}, Voxel{.value = NAN}); } TEST(Render_3D_Scene, Builder_Instantiates_Async_Paint_Contract) { using Visual_Object = Point_Visual; using Scene_Object = Render_Scene_3D; auto visual_result = typename Visual_Object::template Builder{}.build(); ASSERT_TRUE(visual_result.has_value()); auto visual = std::move(visual_result).value(); auto camera = *Camera_3D::Builder{}.build(); auto axes = *Axes_3D::Builder{}.build(); typename Scene_Object::template Builder scene_builder; scene_builder.add_renderable(visual.get()).add_camera(camera.get()).add_axes(axes.get()); static_assert(std::same_as, Dependency_Graph_Error>>); } TEST(Render_3D_Visual, Prepared_Data_Preserves_Datoviz_Attributes) { detail::Mesh_Prepared_Data mesh; detail::Mesh_Spec::prepare( std::vector{{.texture_coordinate = {0.25F, 0.75F}}}, mesh); ASSERT_EQ(mesh.texture_coordinates.size(), 1U); EXPECT_EQ(mesh.texture_coordinates.front(), (std::array{0.25F, 0.75F})); detail::Image_Prepared_Data image; detail::Image_Spec::prepare( std::vector{{.texture_rectangle = {0.1F, 0.2F, 0.8F, 0.9F}}}, image); EXPECT_EQ(image.texture_rectangles.front(), (std::array{0.1F, 0.2F, 0.8F, 0.9F})); detail::Glyph_Prepared_Data glyph; detail::Glyph_Spec::prepare(std::vector{{ .bounds = {-1.0F, -2.0F, 3.0F, 4.0F}, .texture_coordinates = {0.0F, 0.1F, 0.9F, 1.0F}, .angle = 0.5F}}, glyph); EXPECT_EQ(glyph.bounds.front(), (std::array{-1.0F, -2.0F, 3.0F, 4.0F})); EXPECT_EQ(glyph.texture_coordinates.front(), (std::array{0.0F, 0.1F, 0.9F, 1.0F})); detail::Text_Prepared_Data text; detail::Text_Spec::prepare( std::vector{{.text = "dynamic", .size_px = 23.0F}}, text); ASSERT_EQ(text.strings.size(), 1U); EXPECT_EQ(text.strings.front(), "dynamic"); EXPECT_FLOAT_EQ(text.sizes.front(), 23.0F); } }