//
// Copyright 2015 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

// BufferImpl_mock.h: Defines a mock of the BufferImpl class.

#ifndef LIBANGLE_RENDERER_BUFFERIMPLMOCK_H_
#define LIBANGLE_RENDERER_BUFFERIMPLMOCK_H_

#include "gmock/gmock.h"

#include "libANGLE/Buffer.h"
#include "libANGLE/renderer/BufferImpl.h"

namespace rx
{
class MockBufferImpl : public BufferImpl
{
  public:
    MockBufferImpl() : BufferImpl(mMockState) {}
    ~MockBufferImpl() { destructor(); }

    MOCK_METHOD7(setData,
                 angle::Result(const gl::Context *,
                               gl::BufferBinding,
                               const void *,
                               size_t,
                               gl::BufferUsage,
                               BufferFeedback *,
                               gl::ZeroFillRequired));
    MOCK_METHOD6(setSubData,
                 angle::Result(const gl::Context *,
                               gl::BufferBinding,
                               const void *,
                               size_t,
                               size_t,
                               BufferFeedback *));
    MOCK_METHOD6(copySubData,
                 angle::Result(const gl::Context *contextImpl,
                               BufferImpl *,
                               GLintptr,
                               GLintptr,
                               GLsizeiptr,
                               BufferFeedback *));
    MOCK_METHOD4(map,
                 angle::Result(const gl::Context *contextImpl, GLenum, void **, BufferFeedback *));
    MOCK_METHOD6(mapRange,
                 angle::Result(const gl::Context *contextImpl,
                               size_t,
                               size_t,
                               GLbitfield,
                               void **,
                               BufferFeedback *));
    MOCK_METHOD3(unmap,
                 angle::Result(const gl::Context *contextImpl,
                               GLboolean *result,
                               BufferFeedback *));

    MOCK_METHOD6(getIndexRange,
                 angle::Result(const gl::Context *,
                               gl::DrawElementsType,
                               size_t,
                               size_t,
                               bool,
                               gl::IndexRange *));

    MOCK_METHOD0(destructor, void());

  protected:
    gl::BufferState mMockState;
};
}  // namespace rx

#endif  // LIBANGLE_RENDERER_BUFFERIMPLMOCK_H_
