Jason Gedge

Unit Testing and Texture Builder

Posted on May 17, 2014

I’m going to put in extra effort to try and write at least one dev journal entry every week. It should help keep me motivated, which has been a little difficult these days. I usually get home from work and shut my brain off so I can unwind before the next work day.

But I digress. This week’s entry will give a quick update on what I’ve done recently: unit testing and my use of the Builder pattern.

So one of the biggest things I’ve done since my last update is add a bunch of unit tests for my code, and a couple of performance tests. I made use of the wonderful GoogleMock library to get me there. I’m not following a pure test-driven development workflow, but I do try my best to add in tests whenever I can. The only thing I’m missing right now, which I may add in the near future, are tests to verify correctness in rendering. If it does happen, I’ll compare rendered images against golden images. Rendering images for testing means using a headless/software renderer, which will likely be Mesa if they ever fix this issue. I haven’t come across any other decent open-source software renderer for OpenGL (perhaps a side project?). In the meantime, I have empty implementations of any OpenGL functions I’m using and link those in for unit tests.

One other significant thing I done was refactor my texture code. I was kind of lazy initially and duplicated a fair amount of code for different types of textures: 2D texture arrays, regular 2D textures, and rectangular textures. My refactoring unified all of these into a single texture class that is constructed from a builder instance. Creating a texture looks something like this now:

1
2
3
4
5
6
7
TextureBuilder builder(GL_TEXTURE_2D_ARRAY);
builder.mipmap()
       .allocate(128, 128, 3)
       .fromImage("assets/textures/foo1.png")
       .fromImage("assets/textures/foo2.png")
       .fromImage("assets/textures/foo3.png");
return std::make_shared<Texture>(builder);
comments powered by Disqus