xcal
基于 C++23 的现代图形渲染引擎
载入中...
搜索中...
未找到
test_scene.cc
浏览该文件的文档.
1#include <gtest/gtest.h>
2
3#include <cmath>
8
14TEST(TestScene, CreateEmptyScene) {
15 // 测试创建空场景
17
18 // 新创建的场景应该为空
19 EXPECT_TRUE(scene.mobjects().empty());
20 EXPECT_EQ(scene.mobjects().size(), 0);
21}
22
23TEST(TestScene, AddCircleWithSmartPointer) {
24 // 测试使用智能指针添加圆形对象
26
27 // 创建圆形对象并添加到场景
29 xcal::property::Position::data_t{1.0f, 2.0f}, 3.0f);
30
31 // 验证对象添加成功
32 EXPECT_FALSE(scene.mobjects().empty());
33 EXPECT_EQ(scene.mobjects().size(), 1);
34 EXPECT_NE(circlePtr, nullptr);
35 EXPECT_EQ(circlePtr->radius(), 3.0f);
36 EXPECT_EQ(circlePtr->pos().x(), 1.0f);
37 EXPECT_EQ(circlePtr->pos().y(), 2.0f);
38}
39
40TEST(TestScene, AddCircleWithRawPointer) {
41 // 测试使用裸指针添加圆形对象
43
44 // 创建圆形对象并添加到场景
45 auto circle = new xcal::mobject::Circle({4.0f, 5.0f}, 6.0f);
46 xcal::mobject::Circle* circlePtr = scene.add(circle);
47
48 // 验证对象添加成功
49 EXPECT_FALSE(scene.mobjects().empty());
50 EXPECT_EQ(scene.mobjects().size(), 1);
51 EXPECT_EQ(circlePtr, circle);
52 EXPECT_EQ(circlePtr->radius(), 6.0f);
53}
54
55TEST(TestScene, AddCircleWithConstruction) {
56 // 测试直接在场景中构造并添加圆形对象
58
59 // 在场景中直接构造圆形对象
61 xcmath::vec2<float_t>{7.0f, 8.0f}, 9.0f);
62
63 // 验证对象添加成功
64 EXPECT_FALSE(scene.mobjects().empty());
65 EXPECT_EQ(scene.mobjects().size(), 1);
66 EXPECT_NE(circlePtr, nullptr);
67 EXPECT_EQ(circlePtr->radius(), 9.0f);
68 EXPECT_EQ(circlePtr->pos().x(), 7.0f);
69 EXPECT_EQ(circlePtr->pos().y(), 8.0f);
70}
71
72TEST(TestScene, AddMultipleObjects) {
73 // 测试添加多个不同类型的对象
75
76 // 添加圆形对象
77 auto circlePtr = scene.add<xcal::mobject::Circle>(
78 xcal::property::Position::data_t{1.0f, 1.0f}, 2.0f);
79
80 // 添加矩形对象
81 auto rectPtr = scene.add<xcal::mobject::Rectangle>(
82 xcal::property::Vec<float_t, 3>::data_t{3.0f, 3.0f}, 4.0f, 5.0f);
83
84 // 验证两个对象都添加成功
85 EXPECT_EQ(scene.mobjects().size(), 2);
86 EXPECT_NE(circlePtr, nullptr);
87 EXPECT_NE(rectPtr, nullptr);
88
89 // 验证对象类型正确
90 EXPECT_EQ(circlePtr->radius(), 2.0f);
91 // 注意:这里假设 Rectangle 有 width() 和 height() 方法
92}
93
94TEST(TestScene, ObjectOwnership) {
95 // 测试场景对对象的所有权管理
97
98 // 创建对象并添加到场景
99 auto originalCircle = std::make_unique<xcal::mobject::Circle>();
100 xcal::mobject::Circle* circlePtr = originalCircle.get();
101
102 // 转移所有权到场景
103 scene.add(std::move(originalCircle));
104
105 // 原始指针应该不再拥有对象
106 // 场景应该管理对象的生命周期
107 EXPECT_FALSE(scene.mobjects().empty());
108
109 // 验证可以通过返回的指针访问对象
110 EXPECT_EQ(circlePtr->radius(), 1.0f); // 默认半径
111}
112
113TEST(TestScene, ConstAccessToObjects) {
114 // 测试常量访问对象列表
115 xcal::scene::Scene scene;
116
117 // 添加一些对象
118 scene.add<xcal::mobject::Circle>();
119 scene.add<xcal::mobject::Circle>();
120
121 // 获取常量引用
122 const auto& constObjects = scene.mobjects();
123
124 // 验证可以常量访问
125 EXPECT_EQ(constObjects.size(), 2);
126
127 // 验证每个对象都存在
128 for (const auto& obj : constObjects) {
129 EXPECT_NE(obj.get(), nullptr);
130 EXPECT_TRUE(obj->visible()); // 默认应该可见
131 }
132}
133
134TEST(TestScene, SceneDestruction) {
135 // 测试场景析构时正确释放对象
136 // 这个测试主要验证没有内存泄漏
137 // 实际的内存泄漏检测需要专门的工具
138
139 {
140 xcal::scene::Scene scene;
141
142 // 添加多个对象
143 scene.add<xcal::mobject::Circle>();
144 scene.add<xcal::mobject::Circle>();
145 scene.add<xcal::mobject::Circle>();
146
147 EXPECT_EQ(scene.mobjects().size(), 3);
148 }
149
150 // 场景析构后,所有对象应该被正确释放
151 // 如果没有内存错误,测试通过
152 SUCCEED();
153}
圆形图形对象类
Definition circle.hpp:18
float_t radius() const
获取半径值
Definition circle.hpp:41
std::vector< ObjectPtr > & mobjects()
获取对象列表(可修改)
T * add(Args &&... args)
添加对象/相机/动画/时间线
Definition abs_scene.hpp:56
Vector class template
Definition vec.hpp:206
TEST(TestScene, CreateEmptyScene)
场景管理测试套件
Definition test_scene.cc:14