如何在没有图形界面的情况下使用 SDL 测试程序?
How to test a program using SDL without a graphical interface?
我制作了一个使用SDL 进行显示和声音的C++ 程序。我正在实施 gtest 来测试图形功能,例如绘制一个像素:
void Interface::draw_pixel(unsigned short x, unsigned short y, bool on) {
if (on) {
SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE);
} else {
SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
}
SDL_Rect rect = {normalize_x(x), normalize_y(y), SIZE_MULTIPLIER_, SIZE_MULTIPLIER_};
SDL_RenderFillRect(renderer, &rect);
}
并检查是否确实绘制了该像素:
bool Interface::is_pixel_on(int x, int y) {
p_ = (uint8_t *) SDL_GetWindowSurface(window)->pixels + normalize_y(y) * SDL_GetWindowSurface(window)->pitch +
normalize_x(x) * bpp_;
SDL_GetRGB(*(uint32_t *) p_, SDL_GetWindowSurface(window)->format, &rgb_.r, &rgb_.g, &rgb_.b);
return rgb_.r != 0;
}
我想绘制一个像素并检查它是否在 C.I 中绘制。测试。我试图用 SDL_WINDOW_HIDDEN
标志创建 SDL window,但它没有绘制,我的测试失败了。
您有什么想法或提示应该如何完成吗?
一般来说,单元测试不测试图形用户界面,而是测试逻辑。
在库和您的逻辑之间有一个抽象层。
例如:
namespace mygui
{
RenderFillRect(MyRenderer renderer, MyRect* rect);
};
void Interface::draw_pixel(unsigned short x, unsigned short y, bool on) {
if (on) {
MySetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE);
} else {
MySetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
}
MyRect rect = {normalize_x(x), normalize_y(y), SIZE_MULTIPLIER_, SIZE_MULTIPLIER_};
MyRenderFillRect(renderer, &rect);
}
模拟 mygui::RenderFillRect
并在调用 Interface::draw_pixel
.
后检查它是否使用正确的参数调用
经过您对CHIP8解释器测试的详细评论,我的建议仍然适用。
我建议您使用指令 .
模拟 SDL 函数调用
另一种方法是模拟 Interface::draw_pixel()
以确保一条指令写入正确的位置。
我不确定您什么时候需要测试 SDL 库。我想到的唯一场景是升级库版本时它可能会中断。但是大多数时候它不会经常升级。
我制作了一个使用SDL 进行显示和声音的C++ 程序。我正在实施 gtest 来测试图形功能,例如绘制一个像素:
void Interface::draw_pixel(unsigned short x, unsigned short y, bool on) {
if (on) {
SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE);
} else {
SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
}
SDL_Rect rect = {normalize_x(x), normalize_y(y), SIZE_MULTIPLIER_, SIZE_MULTIPLIER_};
SDL_RenderFillRect(renderer, &rect);
}
并检查是否确实绘制了该像素:
bool Interface::is_pixel_on(int x, int y) {
p_ = (uint8_t *) SDL_GetWindowSurface(window)->pixels + normalize_y(y) * SDL_GetWindowSurface(window)->pitch +
normalize_x(x) * bpp_;
SDL_GetRGB(*(uint32_t *) p_, SDL_GetWindowSurface(window)->format, &rgb_.r, &rgb_.g, &rgb_.b);
return rgb_.r != 0;
}
我想绘制一个像素并检查它是否在 C.I 中绘制。测试。我试图用 SDL_WINDOW_HIDDEN
标志创建 SDL window,但它没有绘制,我的测试失败了。
您有什么想法或提示应该如何完成吗?
一般来说,单元测试不测试图形用户界面,而是测试逻辑。
在库和您的逻辑之间有一个抽象层。
例如:
namespace mygui
{
RenderFillRect(MyRenderer renderer, MyRect* rect);
};
void Interface::draw_pixel(unsigned short x, unsigned short y, bool on) {
if (on) {
MySetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE);
} else {
MySetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
}
MyRect rect = {normalize_x(x), normalize_y(y), SIZE_MULTIPLIER_, SIZE_MULTIPLIER_};
MyRenderFillRect(renderer, &rect);
}
模拟 mygui::RenderFillRect
并在调用 Interface::draw_pixel
.
经过您对CHIP8解释器测试的详细评论,我的建议仍然适用。
我建议您使用指令
另一种方法是模拟 Interface::draw_pixel()
以确保一条指令写入正确的位置。
我不确定您什么时候需要测试 SDL 库。我想到的唯一场景是升级库版本时它可能会中断。但是大多数时候它不会经常升级。