|
|
@@ -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();
|
|
|
+}
|