Skip to content

Commit

Permalink
#5912: Add unit tests checking the ContinuousBuffer::syncModification…
Browse files Browse the repository at this point in the history
…sToBufferObject method
  • Loading branch information
codereader committed Mar 11, 2022
1 parent 22af758 commit 89fe375
Show file tree
Hide file tree
Showing 5 changed files with 134 additions and 29 deletions.
63 changes: 63 additions & 0 deletions test/ContinuousBuffer.cpp
@@ -1,10 +1,18 @@
#include "gtest/gtest.h"

#include "render/ContinuousBuffer.h"
#include "testutil/TestBufferObjectProvider.h"

namespace test
{

namespace
{

TestBufferObjectProvider _testBufferObjectProvider;

}

template<typename T>
bool checkData(render::ContinuousBuffer<T>& buffer, typename render::ContinuousBuffer<T>::Handle handle, const std::vector<T>& data)
{
Expand Down Expand Up @@ -40,6 +48,27 @@ bool checkContinuousData(render::ContinuousBuffer<T>& buffer, typename render::C
return result;
}

template<typename T>
bool checkDataInBufferObject(render::ContinuousBuffer<T>& buffer, typename render::ContinuousBuffer<T>::Handle handle,
TestBufferObject& bufferObject, const std::vector<T>& data)
{
// Data start in ContinuousBuffer
auto current = buffer.getBufferStart() + buffer.getOffset(handle);

// Data start in the BufferObject
auto dataInBuffer = reinterpret_cast<const T*>(bufferObject.buffer.data()) + buffer.getOffset(handle);

bool result = true;

for (auto i = 0; i < data.size(); ++i)
{
EXPECT_EQ(dataInBuffer[i], current[i]) << "Buffer data mismatch at index " << i;
result &= dataInBuffer[i] == current[i];
}

return result;
}

TEST(ContinuousBufferTest, InitialSize)
{
// Construct a buffer of a certain initial size
Expand Down Expand Up @@ -421,4 +450,38 @@ TEST(ContinuousBufferTest, ExpandFullBuffer)
EXPECT_TRUE(checkContinuousData(buffer, handle1, { eight, four, eight }));
}

TEST(ContinuousBufferTest, SyncToBufferObject)
{
auto eight = std::vector<int>({ 0,1,2,3,4,5,6,7 });
auto four = std::vector<int>({ 10,11,12,13 });

render::ContinuousBuffer<int> buffer(eight.size()); // Allocate a buffer that matches exactly
auto bufferObject = std::make_shared<TestBufferObject>();

// Allocate and fill in the eight bytes
auto handle1 = buffer.allocate(eight.size());
buffer.setData(handle1, eight);

// Sync, it should then contain the 8 numbers
auto modifiedData = eight;
buffer.syncModificationsToBufferObject(bufferObject);
EXPECT_TRUE(checkDataInBufferObject(buffer, handle1, *bufferObject, modifiedData)) << "Data sync unsuccessful";

// Upload the buffer partially
buffer.setSubData(handle1, 3, four);
std::copy(four.begin(), four.end(), modifiedData.begin() + 3);

// Sync the buffer, it should now reflect the partially modified array
buffer.syncModificationsToBufferObject(bufferObject);
EXPECT_TRUE(checkDataInBufferObject(buffer, handle1, *bufferObject, modifiedData)) << "Data sync unsuccessful";

// Resize the buffer and sync again
auto handle2 = buffer.allocate(eight.size());
buffer.setData(handle2, eight);

buffer.syncModificationsToBufferObject(bufferObject);
EXPECT_TRUE(checkDataInBufferObject(buffer, handle1, *bufferObject, modifiedData)) << "Data sync unsuccessful";
EXPECT_TRUE(checkDataInBufferObject(buffer, handle2, *bufferObject, eight)) << "Data sync unsuccessful";
}

}
45 changes: 16 additions & 29 deletions test/GeometryStore.cpp
Expand Up @@ -4,6 +4,7 @@
#include <numeric>
#include <random>
#include "render/GeometryStore.h"
#include "testutil/TestBufferObjectProvider.h"

namespace test
{
Expand All @@ -27,25 +28,11 @@ class NullSyncObjectProvider final :
}
};

class NullBufferObjectProvider final :
public render::IBufferObjectProvider
{
public:
render::IBufferObject::Ptr createBufferObject(render::IBufferObject::Type type) override
{
return {};
}

static NullBufferObjectProvider& Instance()
{
static NullBufferObjectProvider _instance;
return _instance;
}
};

namespace
{

TestBufferObjectProvider _testBufferObjectProvider;

inline MeshVertex createNthVertex(int n, int id, std::size_t size)
{
auto offset = static_cast<double>(n + size * id);
Expand Down Expand Up @@ -137,7 +124,7 @@ inline void verifyAllAllocations(render::IGeometryStore& store, const std::vecto

TEST(GeometryStore, AllocateAndDeallocate)
{
render::GeometryStore store(NullSyncObjectProvider::Instance(), NullBufferObjectProvider::Instance());
render::GeometryStore store(NullSyncObjectProvider::Instance(), _testBufferObjectProvider);

std::vector<render::IGeometryStore::Slot> allocatedSlots;

Expand All @@ -158,7 +145,7 @@ TEST(GeometryStore, AllocateAndDeallocate)

TEST(GeometryStore, UpdateData)
{
render::GeometryStore store(NullSyncObjectProvider::Instance(), NullBufferObjectProvider::Instance());
render::GeometryStore store(NullSyncObjectProvider::Instance(), _testBufferObjectProvider);

std::set<Allocation> allocations;

Expand Down Expand Up @@ -207,7 +194,7 @@ TEST(GeometryStore, UpdateData)

TEST(GeometryStore, UpdateSubData)
{
render::GeometryStore store(NullSyncObjectProvider::Instance(), NullBufferObjectProvider::Instance());
render::GeometryStore store(NullSyncObjectProvider::Instance(), _testBufferObjectProvider);

std::set<Allocation> allocations;

Expand Down Expand Up @@ -277,7 +264,7 @@ TEST(GeometryStore, UpdateSubData)

TEST(GeometryStore, ResizeData)
{
render::GeometryStore store(NullSyncObjectProvider::Instance(), NullBufferObjectProvider::Instance());
render::GeometryStore store(NullSyncObjectProvider::Instance(), _testBufferObjectProvider);

// Allocate a few dummy slots
store.allocateSlot(17, 27);
Expand Down Expand Up @@ -321,7 +308,7 @@ TEST(GeometryStore, ResizeData)

TEST(GeometryStore, FrameBufferSwitching)
{
render::GeometryStore store(NullSyncObjectProvider::Instance(), NullBufferObjectProvider::Instance());
render::GeometryStore store(NullSyncObjectProvider::Instance(), _testBufferObjectProvider);

store.onFrameStart();

Expand Down Expand Up @@ -468,7 +455,7 @@ TEST(GeometryStore, FrameBufferSwitching)

TEST(GeometryStore, SyncObjectAcquisition)
{
render::GeometryStore store(NullSyncObjectProvider::Instance(), NullBufferObjectProvider::Instance());
render::GeometryStore store(NullSyncObjectProvider::Instance(), _testBufferObjectProvider);

NullSyncObjectProvider::Instance().invocationCount = 0;

Expand All @@ -484,7 +471,7 @@ TEST(GeometryStore, SyncObjectAcquisition)

TEST(GeometryStore, AllocateIndexRemap)
{
render::GeometryStore store(NullSyncObjectProvider::Instance(), NullBufferObjectProvider::Instance());
render::GeometryStore store(NullSyncObjectProvider::Instance(), _testBufferObjectProvider);

// Allocate a slot to hold indexed vertices
auto vertices = generateVertices(3, 15 * 20);
Expand All @@ -505,7 +492,7 @@ TEST(GeometryStore, AllocateIndexRemap)

TEST(GeometryStore, AllocateInvalidIndexRemap)
{
render::GeometryStore store(NullSyncObjectProvider::Instance(), NullBufferObjectProvider::Instance());
render::GeometryStore store(NullSyncObjectProvider::Instance(), _testBufferObjectProvider);

// Allocate a slot to hold indexed vertices
auto vertices = generateVertices(3, 15 * 20);
Expand All @@ -524,7 +511,7 @@ TEST(GeometryStore, AllocateInvalidIndexRemap)

TEST(GeometryStore, UpdateIndexRemapData)
{
render::GeometryStore store(NullSyncObjectProvider::Instance(), NullBufferObjectProvider::Instance());
render::GeometryStore store(NullSyncObjectProvider::Instance(), _testBufferObjectProvider);

// Allocate a slot to hold indexed vertices
auto vertices = generateVertices(3, 15 * 20);
Expand Down Expand Up @@ -560,7 +547,7 @@ TEST(GeometryStore, UpdateIndexRemapData)

TEST(GeometryStore, UpdateIndexRemapSubData)
{
render::GeometryStore store(NullSyncObjectProvider::Instance(), NullBufferObjectProvider::Instance());
render::GeometryStore store(NullSyncObjectProvider::Instance(), _testBufferObjectProvider);

// Allocate a slot to hold indexed vertices
auto vertices = generateVertices(3, 15 * 20);
Expand Down Expand Up @@ -604,7 +591,7 @@ TEST(GeometryStore, UpdateIndexRemapSubData)

TEST(GeometryStore, ResizeIndexRemapData)
{
render::GeometryStore store(NullSyncObjectProvider::Instance(), NullBufferObjectProvider::Instance());
render::GeometryStore store(NullSyncObjectProvider::Instance(), _testBufferObjectProvider);

// Allocate a slot to hold indexed vertices
auto vertices = generateVertices(3, 15 * 20);
Expand Down Expand Up @@ -645,7 +632,7 @@ TEST(GeometryStore, ResizeIndexRemapData)

TEST(GeometryStore, RegularSlotBounds)
{
render::GeometryStore store(NullSyncObjectProvider::Instance(), NullBufferObjectProvider::Instance());
render::GeometryStore store(NullSyncObjectProvider::Instance(), _testBufferObjectProvider);

// Allocate a slot to hold indexed vertices
auto vertices = generateVertices(3, 15 * 20);
Expand Down Expand Up @@ -690,7 +677,7 @@ TEST(GeometryStore, RegularSlotBounds)

TEST(GeometryStore, IndexRemappingSlotBounds)
{
render::GeometryStore store(NullSyncObjectProvider::Instance(), NullBufferObjectProvider::Instance());
render::GeometryStore store(NullSyncObjectProvider::Instance(), _testBufferObjectProvider);

// Allocate a slot to hold indexed vertices
auto vertices = generateVertices(3, 15 * 20);
Expand Down
51 changes: 51 additions & 0 deletions test/testutil/TestBufferObjectProvider.h
@@ -0,0 +1,51 @@
#pragma once

#include "igeometrystore.h"

namespace test
{

class TestBufferObject final :
public render::IBufferObject
{
public:
std::vector<unsigned char> buffer;

void setData(std::size_t offset, const unsigned char* firstElement, std::size_t numBytes) override
{
auto current = firstElement;
for (auto i = 0; i < numBytes; ++i)
{
buffer.at(offset + i) = *current++;
}
}

void resize(std::size_t newSize) override
{
buffer = std::vector<unsigned char>(newSize, '\0');
}
};

class TestBufferObjectProvider final :
public render::IBufferObjectProvider
{
public:
render::IBufferObject::Ptr lastAllocatedVertexBuffer;
render::IBufferObject::Ptr lastAllocatedIndexBuffer;

render::IBufferObject::Ptr createBufferObject(render::IBufferObject::Type type) override
{
if (type == render::IBufferObject::Type::Vertex)
{
lastAllocatedVertexBuffer = std::make_shared<TestBufferObject>();
return lastAllocatedVertexBuffer;
}
else
{
lastAllocatedIndexBuffer = std::make_shared<TestBufferObject>();
return lastAllocatedIndexBuffer;
}
}
};

}
1 change: 1 addition & 0 deletions tools/msvc/Tests/Tests.vcxproj
Expand Up @@ -71,6 +71,7 @@
<ClInclude Include="..\..\..\test\TdmMissionSetup.h" />
<ClInclude Include="..\..\..\test\TestContext.h" />
<ClInclude Include="..\..\..\test\TestLogFile.h" />
<ClInclude Include="..\..\..\test\testutil\TestBufferObjectProvider.h" />
<ClInclude Include="..\..\..\test\testutil\FileSelectionHelper.h" />
</ItemGroup>
<ItemGroup>
Expand Down
3 changes: 3 additions & 0 deletions tools/msvc/Tests/Tests.vcxproj.filters
Expand Up @@ -85,6 +85,9 @@
<ClInclude Include="..\..\..\test\algorithm\Entity.h">
<Filter>algorithm</Filter>
</ClInclude>
<ClInclude Include="..\..\..\test\testutil\TestBufferObjectProvider.h">
<Filter>testutil</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="algorithm">
Expand Down

0 comments on commit 89fe375

Please sign in to comment.