blob: 185c01b30f17e3c05de96d03b68cb5839edafde0 [file] [log] [blame]
Kenneth Russelldb8ae162014-08-25 19:02:35 -07001//
2// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7#include "gmock/gmock.h"
8#include "gtest/gtest.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -05009#include "libANGLE/TransformFeedback.h"
10#include "libANGLE/renderer/TransformFeedbackImpl.h"
Kenneth Russelldb8ae162014-08-25 19:02:35 -070011
12namespace {
13
14class MockTransformFeedbackImpl : public rx::TransformFeedbackImpl
15{
16 public:
17 virtual ~MockTransformFeedbackImpl() { destroy(); }
18
19 MOCK_METHOD1(begin, void(GLenum primitiveMode));
20 MOCK_METHOD0(end, void());
21 MOCK_METHOD0(pause, void());
22 MOCK_METHOD0(resume, void());
23
24 MOCK_METHOD0(destroy, void());
25};
26
27class TransformFeedbackTest : public testing::Test
28{
29 protected:
30 virtual void SetUp()
31 {
32 mImpl = new MockTransformFeedbackImpl;
33 EXPECT_CALL(*mImpl, destroy());
34 mFeedback = new gl::TransformFeedback(mImpl, 1);
35 mFeedback->addRef();
36 }
37
38 virtual void TearDown()
39 {
40 mFeedback->release();
41 }
42
43 MockTransformFeedbackImpl* mImpl;
44 gl::TransformFeedback* mFeedback;
45};
46
47TEST_F(TransformFeedbackTest, DestructionDeletesImpl)
48{
49 MockTransformFeedbackImpl* impl = new MockTransformFeedbackImpl;
50 EXPECT_CALL(*impl, destroy()).Times(1).RetiresOnSaturation();
51
52 gl::TransformFeedback* feedback = new gl::TransformFeedback(impl, 1);
53 feedback->addRef();
54 feedback->release();
55
56 // Only needed because the mock is leaked if bugs are present,
57 // which logs an error, but does not cause the test to fail.
58 // Ordinarily mocks are verified when destroyed.
59 testing::Mock::VerifyAndClear(impl);
60}
61
62TEST_F(TransformFeedbackTest, SideEffectsOfStartAndStop)
63{
64 testing::InSequence seq;
65
Geoff Langbb0a0bb2015-03-27 12:16:57 -040066 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070067 EXPECT_CALL(*mImpl, begin(GL_TRIANGLES));
Geoff Langbb0a0bb2015-03-27 12:16:57 -040068 mFeedback->begin(GL_TRIANGLES);
69 EXPECT_TRUE(mFeedback->isActive());
70 EXPECT_EQ(static_cast<GLenum>(GL_TRIANGLES), mFeedback->getPrimitiveMode());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070071 EXPECT_CALL(*mImpl, end());
Geoff Langbb0a0bb2015-03-27 12:16:57 -040072 mFeedback->end();
73 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070074}
75
76TEST_F(TransformFeedbackTest, SideEffectsOfPauseAndResume)
77{
78 testing::InSequence seq;
79
Geoff Langbb0a0bb2015-03-27 12:16:57 -040080 EXPECT_FALSE(mFeedback->isActive());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070081 EXPECT_CALL(*mImpl, begin(GL_TRIANGLES));
Geoff Langbb0a0bb2015-03-27 12:16:57 -040082 mFeedback->begin(GL_TRIANGLES);
83 EXPECT_FALSE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070084 EXPECT_CALL(*mImpl, pause());
85 mFeedback->pause();
Geoff Langbb0a0bb2015-03-27 12:16:57 -040086 EXPECT_TRUE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070087 EXPECT_CALL(*mImpl, resume());
88 mFeedback->resume();
Geoff Langbb0a0bb2015-03-27 12:16:57 -040089 EXPECT_FALSE(mFeedback->isPaused());
Kenneth Russelldb8ae162014-08-25 19:02:35 -070090 EXPECT_CALL(*mImpl, end());
Geoff Langbb0a0bb2015-03-27 12:16:57 -040091 mFeedback->end();
Kenneth Russelldb8ae162014-08-25 19:02:35 -070092}
93
94} // namespace