【问题标题】:How to test a program using SDL without a graphical interface?如何在没有图形界面的情况下使用 SDL 测试程序?
【发布时间】:2021-09-07 08:26:53
【问题描述】:

我制作了一个使用 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 窗口,但它没有绘制并且我的测试失败。

你有什么想法或提示应该怎么做吗?

【问题讨论】:

  • 将您的逻辑在 gui 和计算之间分离。不要测试图书馆是否指出了这一点。测试您的逻辑是否将点放在正确的位置并进行渲染。
  • 您可以使用屏幕外软件渲染器来完成此操作(不要创建窗口而是创建表面,并将渲染器与该表面相关联)。但是,即使存在窗口,这里 SDL_GetWindowSurface 也是错误的。
  • 问题是您要测试什么?使用单元测试 (gtest) 测试 UI 通常很难或毫无意义。
  • 我正在制作一个 CHIP8 解释器,我想检查一条指令是否确实会在显示器上打印精灵。我应该有一个单独的屏幕内存,SDL 会直接显示吗?我可以直接从那个内存中测试像素的值吗?因为目前我的显示内存在 SDL 中。
  • 我的建议仍然适用,我发现来源可能是helping

标签: c++ sdl googletest


【解决方案1】:

通常,单元测试不测试 gui,而是测试逻辑。

在库和您的逻辑之间有一个抽象层。

例如:

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 解释器的评论后,我的建议仍然适用。

我建议您使用指令here 模拟 SDL 函数调用。

另一种方法是模拟 Interface::draw_pixel() 以确保一条指令写入正确的位置。

我不确定您何时需要测试 SDL 库。我想出的唯一情况是升级库版本时它可能会中断。但是大多数时候它不会经常升级。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2020-04-03
    • 1970-01-01
    相关资源
    最近更新 更多