如何在没有图形界面的情况下使用 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 库。我想到的唯一场景是升级库版本时它可能会中断。但是大多数时候它不会经常升级。