Browse Source

Add basic tests for graphics::batch_renderer.

Sam Jaffe 6 years ago
parent
commit
f98a9769ed
1 changed files with 63 additions and 13 deletions
  1. 63 13
      graphics/test/renderer_test.cxx

+ 63 - 13
graphics/test/renderer_test.cxx

@@ -15,6 +15,11 @@
 #include "game/math/shape.hpp"
 #include "matrix/matrix.hpp"
 
+using testing::AnyNumber;
+using testing::IsEmpty;
+using testing::SizeIs;
+using testing::_;
+
 struct mock_renderer_impl : graphics::renderer_impl {
   MOCK_CONST_METHOD0(manager, std::shared_ptr<graphics::manager const>());
   MOCK_METHOD3(draw, void(identity<graphics::material>, math::matr4 const &,
@@ -40,31 +45,36 @@ void DirectRendererTest::SetUp() {
   renderer.reset(new graphics::direct_renderer(mock));
 }
 
-void DirectRendererTest::TearDown() { delete mock; }
+void DirectRendererTest::TearDown() {
+  renderer.reset();
+  delete mock;
+}
+
+graphics::object DemoObject() {
+  math::dim2::rectangle const size{{{-1.f, -1.f}}, {{2.f, 2.f}}};
+  math::dim2::rectangle const tex{{{0.f, 0.f}}, {{1.f, 1.f}}};
+  return {size, size, cast(1), tex};
+}
 
 TEST_F(DirectRendererTest, DrawPassesToDraw) {
-  using testing::IsEmpty;
   EXPECT_CALL(*mock, draw(cast(1), math::matr4(), IsEmpty())).Times(1);
   renderer->draw(cast(1), math::matr4(), {});
 }
 
 TEST_F(DirectRendererTest, DrawObjectHasEmptyTranslation) {
-  using testing::_;
-  math::dim2::rectangle const size{{{-1.f, -1.f}}, {{2.f, 2.f}}};
-  math::dim2::rectangle const tex{{{0.f, 0.f}}, {{1.f, 1.f}}};
-  graphics::object const object{size, size, cast(1), tex};
   EXPECT_CALL(*mock, draw(cast(1), math::matr4(), _)).Times(1);
-  renderer->draw(object);
+  renderer->draw(DemoObject());
 }
 
 TEST_F(DirectRendererTest, DrawObjectHasSixVertices) {
-  using testing::SizeIs;
-  using testing::_;
-  math::dim2::rectangle const size{{{-1.f, -1.f}}, {{2.f, 2.f}}};
-  math::dim2::rectangle const tex{{{0.f, 0.f}}, {{1.f, 1.f}}};
-  graphics::object const object{size, size, cast(1), tex};
   EXPECT_CALL(*mock, draw(_, _, SizeIs(6))).Times(1);
-  renderer->draw(object);
+  renderer->draw(DemoObject());
+}
+
+TEST_F(DirectRendererTest, MultipleDrawCallsDispatchMultipleDraws) {
+  EXPECT_CALL(*mock, draw(_, _, SizeIs(6))).Times(2);
+  renderer->draw(DemoObject());
+  renderer->draw(DemoObject());
 }
 
 TEST_F(DirectRendererTest, ClearPassesToClear) {
@@ -76,3 +86,43 @@ TEST_F(DirectRendererTest, FlushPassesToFlush) {
   EXPECT_CALL(*mock, flush()).Times(1);
   renderer->flush();
 }
+
+struct BatchRendererTest : testing::Test {
+  void SetUp() override;
+  void TearDown() override;
+
+  std::unique_ptr<graphics::batch_renderer> renderer;
+  std::unique_ptr<graphics::direct_renderer> drenderer;
+  mock_renderer_impl * mock;
+};
+
+void BatchRendererTest::SetUp() {
+  mock = new mock_renderer_impl;
+  drenderer.reset(new graphics::direct_renderer(mock));
+  renderer.reset(new graphics::batch_renderer(drenderer.get()));
+}
+
+void BatchRendererTest::TearDown() {
+  renderer.reset();
+  drenderer.reset();
+  delete mock;
+}
+
+TEST_F(BatchRendererTest, CallsFlushOnDestructor) {
+  EXPECT_CALL(*mock, flush()).Times(1);
+  renderer.reset();
+  testing::Mock::VerifyAndClearExpectations(mock);
+}
+
+TEST_F(BatchRendererTest, ClearPassesToClear) {
+  EXPECT_CALL(*mock, flush()).Times(AnyNumber());
+  EXPECT_CALL(*mock, clear()).Times(1);
+  renderer->clear();
+}
+
+TEST_F(BatchRendererTest, FlushPassesToFlush) {
+  EXPECT_CALL(*mock, flush()).Times(AnyNumber());
+  // This will end up changing
+  EXPECT_CALL(*mock, flush()).Times(1).RetiresOnSaturation();
+  renderer->flush();
+}