11#include < gtest/gtest.h>
22
3+ #include < glad/glad.h>
4+ #include < GLFW/glfw3.h>
5+
36#include < Base/GlobalSettings.h>
47
58#include < EngineInterface/Description.h>
811
912#include " IntegrationTestFramework.h"
1013
11- class GeometryTests
12- : public IntegrationTestFramework
13- , public testing::WithParamInterface<bool >
14+ class GeometryTests : public IntegrationTestFramework
1415{
1516public:
1617 GeometryTests ()
1718 : IntegrationTestFramework()
18- {
19- GlobalSettings::get ().setNoInterop (GetParam ());
20- }
21-
22- ~GeometryTests () { GlobalSettings::get ().setNoInterop (false ); }
19+ {}
2320};
2421
25- INSTANTIATE_TEST_SUITE_P (InteropModes, GeometryTests, ::testing::Values(false , true ));
26-
27- TEST_P (GeometryTests, getNumRenderObjects_emptySim)
22+ TEST_F (GeometryTests, getNumRenderObjects_emptySim)
2823{
2924 _simulationFacade->clear ();
3025
@@ -36,7 +31,7 @@ TEST_P(GeometryTests, getNumRenderObjects_emptySim)
3631 EXPECT_EQ (0u , numObjects.triangleIndices );
3732}
3833
39- TEST_P (GeometryTests, getNumRenderObjects_singleCell)
34+ TEST_F (GeometryTests, getNumRenderObjects_singleCell)
4035{
4136 auto data = Description ().cells ({CellDescription ().id (1 ).pos ({100 .0f , 100 .0f })});
4237 _simulationFacade->setSimulationData (data);
@@ -47,7 +42,7 @@ TEST_P(GeometryTests, getNumRenderObjects_singleCell)
4742 EXPECT_EQ (0u , numObjects.energyParticles );
4843}
4944
50- TEST_P (GeometryTests, getNumRenderObjects_multipleCells)
45+ TEST_F (GeometryTests, getNumRenderObjects_multipleCells)
5146{
5247 auto data = Description ().cells ({
5348 CellDescription ().id (1 ).pos ({100 .0f , 100 .0f }),
@@ -61,7 +56,7 @@ TEST_P(GeometryTests, getNumRenderObjects_multipleCells)
6156 EXPECT_EQ (3u , numObjects.cells );
6257}
6358
64- TEST_P (GeometryTests, getNumRenderObjects_singleParticle)
59+ TEST_F (GeometryTests, getNumRenderObjects_singleParticle)
6560{
6661 auto data = Description ().particles ({ParticleDescription ().id (1 ).pos ({100 .0f , 100 .0f }).energy (10 .0f )});
6762 _simulationFacade->setSimulationData (data);
@@ -72,7 +67,7 @@ TEST_P(GeometryTests, getNumRenderObjects_singleParticle)
7267 EXPECT_EQ (1u , numObjects.energyParticles );
7368}
7469
75- TEST_P (GeometryTests, getNumRenderObjects_multipleParticles)
70+ TEST_F (GeometryTests, getNumRenderObjects_multipleParticles)
7671{
7772 auto data = Description ().particles ({
7873 ParticleDescription ().id (1 ).pos ({100 .0f , 100 .0f }).energy (10 .0f ),
@@ -87,7 +82,7 @@ TEST_P(GeometryTests, getNumRenderObjects_multipleParticles)
8782 EXPECT_EQ (4u , numObjects.energyParticles );
8883}
8984
90- TEST_P (GeometryTests, getNumRenderObjects_cellsWithConnections)
85+ TEST_F (GeometryTests, getNumRenderObjects_cellsWithConnections)
9186{
9287 auto data = Description ().cells ({
9388 CellDescription ().id (1 ).pos ({100 .0f , 100 .0f }),
@@ -102,7 +97,7 @@ TEST_P(GeometryTests, getNumRenderObjects_cellsWithConnections)
10297 EXPECT_EQ (2u , numObjects.lineIndices );
10398}
10499
105- TEST_P (GeometryTests, getNumRenderObjects_triangularCluster)
100+ TEST_F (GeometryTests, getNumRenderObjects_triangularCluster)
106101{
107102 auto data = Description ().cells ({
108103 CellDescription ().id (1 ).pos ({100 .0f , 100 .0f }),
@@ -121,7 +116,7 @@ TEST_P(GeometryTests, getNumRenderObjects_triangularCluster)
121116 EXPECT_EQ (6u , numObjects.triangleIndices );
122117}
123118
124- TEST_P (GeometryTests, getNumRenderObjects_mixedCellsAndParticles)
119+ TEST_F (GeometryTests, getNumRenderObjects_mixedCellsAndParticles)
125120{
126121 auto data = Description ()
127122 .cells ({
@@ -141,7 +136,7 @@ TEST_P(GeometryTests, getNumRenderObjects_mixedCellsAndParticles)
141136 EXPECT_EQ (3u , numObjects.energyParticles );
142137}
143138
144- TEST_P (GeometryTests, getNumRenderObjects_creature)
139+ TEST_F (GeometryTests, getNumRenderObjects_creature)
145140{
146141 auto data = Description ().addCreature (CreatureDescription ().id (1 ).cells ({
147142 CellDescription ().id (1 ).pos ({100 .0f , 100 .0f }),
@@ -157,3 +152,152 @@ TEST_P(GeometryTests, getNumRenderObjects_creature)
157152 EXPECT_EQ (3u , numObjects.cells );
158153 EXPECT_EQ (4u , numObjects.lineIndices );
159154}
155+
156+ class GeometryTests_CopyBuffers
157+ : public IntegrationTestFramework
158+ , public testing::WithParamInterface<bool >
159+ {
160+ public:
161+ GeometryTests_CopyBuffers ()
162+ : IntegrationTestFramework()
163+ {
164+ GlobalSettings::get ().setNoInterop (GetParam ());
165+
166+ glfwInit ();
167+ glfwWindowHint (GLFW_VISIBLE, GLFW_FALSE);
168+ _window = glfwCreateWindow (100 , 100 , " Test" , nullptr , nullptr );
169+ if (_window) {
170+ glfwMakeContextCurrent (_window);
171+ gladLoadGLLoader (reinterpret_cast <GLADloadproc>(glfwGetProcAddress));
172+ }
173+ }
174+
175+ ~GeometryTests_CopyBuffers ()
176+ {
177+ GlobalSettings::get ().setNoInterop (false );
178+ if (_window) {
179+ glfwDestroyWindow (_window);
180+ }
181+ glfwTerminate ();
182+ }
183+
184+ protected:
185+ GLFWwindow* _window = nullptr ;
186+ };
187+
188+ INSTANTIATE_TEST_SUITE_P (InteropModes, GeometryTests_CopyBuffers, ::testing::Values(false , true ));
189+
190+ TEST_P (GeometryTests_CopyBuffers, copyBuffers_emptySim)
191+ {
192+ if (!GetParam ()) {
193+ GTEST_SKIP () << " Interop mode requires display with CUDA-OpenGL support" ;
194+ }
195+ _simulationFacade->clear ();
196+ auto geometryBuffers = _GeometryBuffers::create ();
197+ RealRect visibleWorldRect{{0 , 0 }, {1000 , 1000 }};
198+
199+ _simulationFacade->tryCopyBuffersFromCudaToOpenGL (geometryBuffers, visibleWorldRect);
200+
201+ auto numObjects = geometryBuffers->getNumObjects ();
202+ EXPECT_EQ (0u , numObjects.cells );
203+ EXPECT_EQ (0u , numObjects.energyParticles );
204+ }
205+
206+ TEST_P (GeometryTests_CopyBuffers, copyBuffers_singleCell)
207+ {
208+ if (!GetParam ()) {
209+ GTEST_SKIP () << " Interop mode requires display with CUDA-OpenGL support" ;
210+ }
211+ auto data = Description ().cells ({CellDescription ().id (1 ).pos ({100 .0f , 100 .0f })});
212+ _simulationFacade->setSimulationData (data);
213+ auto geometryBuffers = _GeometryBuffers::create ();
214+ RealRect visibleWorldRect{{0 , 0 }, {1000 , 1000 }};
215+
216+ _simulationFacade->tryCopyBuffersFromCudaToOpenGL (geometryBuffers, visibleWorldRect);
217+
218+ auto numObjects = geometryBuffers->getNumObjects ();
219+ EXPECT_EQ (1u , numObjects.cells );
220+ }
221+
222+ TEST_P (GeometryTests_CopyBuffers, copyBuffers_multipleCells)
223+ {
224+ if (!GetParam ()) {
225+ GTEST_SKIP () << " Interop mode requires display with CUDA-OpenGL support" ;
226+ }
227+ auto data = Description ().cells ({
228+ CellDescription ().id (1 ).pos ({100 .0f , 100 .0f }),
229+ CellDescription ().id (2 ).pos ({101 .0f , 100 .0f }),
230+ CellDescription ().id (3 ).pos ({102 .0f , 100 .0f }),
231+ });
232+ _simulationFacade->setSimulationData (data);
233+ auto geometryBuffers = _GeometryBuffers::create ();
234+ RealRect visibleWorldRect{{0 , 0 }, {1000 , 1000 }};
235+
236+ _simulationFacade->tryCopyBuffersFromCudaToOpenGL (geometryBuffers, visibleWorldRect);
237+
238+ auto numObjects = geometryBuffers->getNumObjects ();
239+ EXPECT_EQ (3u , numObjects.cells );
240+ }
241+
242+ TEST_P (GeometryTests_CopyBuffers, copyBuffers_singleParticle)
243+ {
244+ if (!GetParam ()) {
245+ GTEST_SKIP () << " Interop mode requires display with CUDA-OpenGL support" ;
246+ }
247+ auto data = Description ().particles ({ParticleDescription ().id (1 ).pos ({100 .0f , 100 .0f }).energy (10 .0f )});
248+ _simulationFacade->setSimulationData (data);
249+ auto geometryBuffers = _GeometryBuffers::create ();
250+ RealRect visibleWorldRect{{0 , 0 }, {1000 , 1000 }};
251+
252+ _simulationFacade->tryCopyBuffersFromCudaToOpenGL (geometryBuffers, visibleWorldRect);
253+
254+ auto numObjects = geometryBuffers->getNumObjects ();
255+ EXPECT_EQ (1u , numObjects.energyParticles );
256+ }
257+
258+ TEST_P (GeometryTests_CopyBuffers, copyBuffers_cellsWithConnections)
259+ {
260+ if (!GetParam ()) {
261+ GTEST_SKIP () << " Interop mode requires display with CUDA-OpenGL support" ;
262+ }
263+ auto data = Description ().cells ({
264+ CellDescription ().id (1 ).pos ({100 .0f , 100 .0f }),
265+ CellDescription ().id (2 ).pos ({101 .0f , 100 .0f }),
266+ });
267+ data.addConnection (1 , 2 );
268+ _simulationFacade->setSimulationData (data);
269+ auto geometryBuffers = _GeometryBuffers::create ();
270+ RealRect visibleWorldRect{{0 , 0 }, {1000 , 1000 }};
271+
272+ _simulationFacade->tryCopyBuffersFromCudaToOpenGL (geometryBuffers, visibleWorldRect);
273+
274+ auto numObjects = geometryBuffers->getNumObjects ();
275+ EXPECT_EQ (2u , numObjects.cells );
276+ EXPECT_EQ (2u , numObjects.lineIndices );
277+ }
278+
279+ TEST_P (GeometryTests_CopyBuffers, copyBuffers_mixedCellsAndParticles)
280+ {
281+ if (!GetParam ()) {
282+ GTEST_SKIP () << " Interop mode requires display with CUDA-OpenGL support" ;
283+ }
284+ auto data = Description ()
285+ .cells ({
286+ CellDescription ().id (1 ).pos ({100 .0f , 100 .0f }),
287+ CellDescription ().id (2 ).pos ({101 .0f , 100 .0f }),
288+ })
289+ .particles ({
290+ ParticleDescription ().id (3 ).pos ({200 .0f , 200 .0f }).energy (10 .0f ),
291+ ParticleDescription ().id (4 ).pos ({201 .0f , 200 .0f }).energy (10 .0f ),
292+ ParticleDescription ().id (5 ).pos ({202 .0f , 200 .0f }).energy (10 .0f ),
293+ });
294+ _simulationFacade->setSimulationData (data);
295+ auto geometryBuffers = _GeometryBuffers::create ();
296+ RealRect visibleWorldRect{{0 , 0 }, {1000 , 1000 }};
297+
298+ _simulationFacade->tryCopyBuffersFromCudaToOpenGL (geometryBuffers, visibleWorldRect);
299+
300+ auto numObjects = geometryBuffers->getNumObjects ();
301+ EXPECT_EQ (2u , numObjects.cells );
302+ EXPECT_EQ (3u , numObjects.energyParticles );
303+ }
0 commit comments