/*
 * Copyright (C) 2016 Intel Corporation. All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sub license, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice (including the
 * next paragraph) shall be included in all copies or substantial portions
 * of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#ifndef TESTVAAPI_test_va_api_fixture_h
#define TESTVAAPI_test_va_api_fixture_h

#include "test.h"
#include "test_data.h"
#include "test_defs.h"
#include "test_streamable.h"

namespace VAAPI {

// The fixture for testing class Foo.
class VAAPIFixture : public ::testing::Test {
public:
    VAAPIFixture();

    virtual ~VAAPIFixture();

    VADisplay getDisplay();
    VADisplay doInitialize();
    void doTerminate();

    void doCreateContext(const Resolution&,
        const VAStatus& expectation = VA_STATUS_SUCCESS);
    void doDestroyContext(const VAStatus& expectation = VA_STATUS_SUCCESS);

    void queryConfigProfiles(Profiles&) const;
    void queryConfigEntrypoints(const VAProfile&, Entrypoints&,
        const VAStatus& = VA_STATUS_SUCCESS) const;
    VAStatus getSupportStatus(const VAProfile&, const VAEntrypoint&) const;
    bool isSupported(const VAProfile&, const VAEntrypoint&) const;

    void getConfigAttributes(const VAProfile&, const VAEntrypoint&,
        ConfigAttributes&, const VAStatus& = VA_STATUS_SUCCESS) const;
    void createConfig(const VAProfile&, const VAEntrypoint&,
        const ConfigAttributes& = ConfigAttributes(),
        const VAStatus& = VA_STATUS_SUCCESS);
    void queryConfigAttributes(const VAProfile&, const VAEntrypoint&,
        ConfigAttributes&, const VAStatus& = VA_STATUS_SUCCESS) const;
    void destroyConfig(const VAStatus& = VA_STATUS_SUCCESS);

    void querySurfaceAttributes(SurfaceAttributes&) const;
    void getMinMaxSurfaceResolution(Resolution&, Resolution&) const;
    void createSurfaces(Surfaces&, const unsigned format, const Resolution&,
        const SurfaceAttributes& = SurfaceAttributes(),
        const VAStatus& = VA_STATUS_SUCCESS) const;
    void destroySurfaces(Surfaces&) const;

    void createBuffer(const VABufferType&, const size_t,
        const VAStatus& = VA_STATUS_SUCCESS);
    void destroyBuffer(const VAStatus& = VA_STATUS_SUCCESS);

    void skipTest(const std::string& message);
    void skipTest(const VAProfile&, const VAEntrypoint&);

protected:
    // You can remove any or all of the following functions if its body
    // is empty.

    // If the constructor and destructor are not enough for setting up
    // and cleaning up each test, you can define the following methods:

    virtual void SetUp()
    {
	// Code here will be called immediately after the constructor (right
	// before each test).
    }

    virtual void TearDown()
    {
	// Code here will be called immediately after each test (right
	// before the destructor).
    }

    // Objects declared here can be used by all tests in the test case for
    // VAAPIFixture.
    VADisplay m_vaDisplay;

private:
    char *m_restoreDriverName;
    int m_drmHandle;

    VAConfigID m_configID;
    VAContextID m_contextID;
    VABufferID m_bufferID;

    std::string m_skip;
};

} // namespace VAAPI

#endif
