//
// 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.
//

// TextureImpl_mock.h: Defines a mock of the TextureImpl class.

#ifndef LIBANGLE_RENDERER_TEXTUREIMPLMOCK_H_
#define LIBANGLE_RENDERER_TEXTUREIMPLMOCK_H_

#include "gmock/gmock.h"

#include "libANGLE/renderer/TextureImpl.h"

namespace rx
{

class MockTextureImpl : public TextureImpl
{
  public:
    MockTextureImpl() : TextureImpl(mMockState), mMockState(gl::TextureType::_2D) {}
    virtual ~MockTextureImpl() { destructor(); }
    MOCK_METHOD8(setImage,
                 angle::Result(const gl::Context *,
                               const gl::ImageIndex &,
                               GLenum,
                               const gl::Extents &,
                               GLenum,
                               GLenum,
                               const gl::PixelUnpackState &,
                               const uint8_t *));
    MOCK_METHOD8(setSubImage,
                 angle::Result(const gl::Context *,
                               const gl::ImageIndex &,
                               const gl::Box &,
                               GLenum,
                               GLenum,
                               const gl::PixelUnpackState &,
                               gl::Buffer *,
                               const uint8_t *));
    MOCK_METHOD7(setCompressedImage,
                 angle::Result(const gl::Context *,
                               const gl::ImageIndex &,
                               GLenum,
                               const gl::Extents &,
                               const gl::PixelUnpackState &,
                               size_t,
                               const uint8_t *));
    MOCK_METHOD7(setCompressedSubImage,
                 angle::Result(const gl::Context *,
                               const gl::ImageIndex &,
                               const gl::Box &,
                               GLenum,
                               const gl::PixelUnpackState &,
                               size_t,
                               const uint8_t *));
    MOCK_METHOD5(copyImage,
                 angle::Result(const gl::Context *,
                               const gl::ImageIndex &,
                               const gl::Rectangle &,
                               GLenum,
                               gl::Framebuffer *));
    MOCK_METHOD5(copySubImage,
                 angle::Result(const gl::Context *,
                               const gl::ImageIndex &,
                               const gl::Offset &,
                               const gl::Rectangle &,
                               gl::Framebuffer *));
    MOCK_METHOD9(copyTexture,
                 angle::Result(const gl::Context *,
                               const gl::ImageIndex &,
                               GLenum,
                               GLenum,
                               size_t,
                               bool,
                               bool,
                               bool,
                               const gl::Texture *));
    MOCK_METHOD9(copySubTexture,
                 angle::Result(const gl::Context *,
                               const gl::ImageIndex &,
                               const gl::Offset &,
                               size_t,
                               const gl::Box &,
                               bool,
                               bool,
                               bool,
                               const gl::Texture *));
    MOCK_METHOD2(copyCompressedTexture,
                 angle::Result(const gl::Context *, const gl::Texture *source));
    MOCK_METHOD5(
        setStorage,
        angle::Result(const gl::Context *, gl::TextureType, size_t, GLenum, const gl::Extents &));
    MOCK_METHOD7(setStorageExternalMemory,
                 angle::Result(const gl::Context *,
                               gl::TextureType,
                               size_t,
                               GLenum,
                               const gl::Extents &,
                               gl::MemoryObject *,
                               GLuint64));
    MOCK_METHOD4(setImageExternal,
                 angle::Result(const gl::Context *,
                               gl::TextureType,
                               egl::Stream *,
                               const egl::Stream::GLTextureDescription &));
    MOCK_METHOD3(setEGLImageTarget,
                 angle::Result(const gl::Context *, gl::TextureType, egl::Image *));
    MOCK_METHOD1(generateMipmap, angle::Result(const gl::Context *));
    MOCK_METHOD2(bindTexImage, angle::Result(const gl::Context *, egl::Surface *));
    MOCK_METHOD1(releaseTexImage, angle::Result(const gl::Context *));

    MOCK_METHOD5(getAttachmentRenderTarget,
                 angle::Result(const gl::Context *,
                               GLenum,
                               const gl::ImageIndex &,
                               GLsizei,
                               FramebufferAttachmentRenderTarget **));

    MOCK_METHOD6(setStorageMultisample,
                 angle::Result(const gl::Context *,
                               gl::TextureType,
                               GLsizei,
                               GLint,
                               const gl::Extents &,
                               bool));

    MOCK_METHOD2(setBaseLevel, angle::Result(const gl::Context *, GLuint));

    MOCK_METHOD2(syncState, angle::Result(const gl::Context *, const gl::Texture::DirtyBits &));

    MOCK_METHOD0(destructor, void());

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

#endif  // LIBANGLE_RENDERER_TEXTUREIMPLMOCK_H_
