blob: dd9d028e1b8bd6c4c3ba4f06f33030663906843d [file] [log] [blame] [view]
# `MockGLES`
This directory contains a mock implementation of the GLES backend.
Most functions are implemented as no-ops, have a default implementation that is not configurable, or just record the call. The latter is useful for testing:
```cc
TEST(MockGLES, Example) {
// Creates a mock GLES implementation and sets it as the current one.
auto mock_gles = MockGLES::Init();
auto& gl = mock_gles->GetProcTable();
// Call the proc table methods as usual, or pass the proc table to a class
// that needs it.
gl.PushDebugGroupKHR(GL_DEBUG_SOURCE_APPLICATION_KHR, 0, -1, "test");
gl.PopDebugGroupKHR();
// Method names are recorded and can be inspected.
//
// Note that many built-ins, like glGetString, are not recorded (otherwise the // logs would be much bigger and less useful).
auto calls = mock_gles->GetCapturedCalls();
EXPECT_EQ(calls, std::vector<std::string>(
{"PushDebugGroupKHR", "PopDebugGroupKHR"}));
}
```
To add a new function, do the following:
1. Add a new top-level method to [`mock_gles.cc`](mock_gles.cc):
```cc
void glFooBar() {
recordCall("glFooBar");
}
```
2. Edit the `kMockResolver`, and add a new `else if` clause:
```diff
+ else if (strcmp(name, "glFooBar") == 0) {
+ return reinterpret_cast<void*>(&glFooBar);
} else {
return reinterpret_cast<void*>(&glDoNothing);
}
```
It's possible we'll want to add a more sophisticated mechanism for mocking
besides capturing calls, but this is a good start. PRs welcome!