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

#include "test_va_api_fixture.h"

#include <sstream>

namespace VAAPI {

typedef VAAPIFixture VAAPICreateContextToFail;

TEST_F(VAAPICreateContextToFail, CreateContextWithNoConfig)
{
    // There's no need to test all inputs for this to be a good test
    // as long as there's no config the expected error should be
    // returned
    doInitialize();
    doCreateContext({1920, 1080}, VA_STATUS_ERROR_INVALID_CONFIG);
    doTerminate();
}

class VAAPICreateContext
    : public VAAPIFixture
    , public ::testing::WithParamInterface<
          std::tuple<VAProfile, VAEntrypoint, Resolution> >
{
public:
    VAAPICreateContext()
        : profile(::testing::get<0>(GetParam()))
        , entrypoint(::testing::get<1>(GetParam()))
        , resolution(::testing::get<2>(GetParam()))
    { }

protected:
    const VAProfile& profile;
    const VAEntrypoint& entrypoint;
    const Resolution& resolution;

    virtual void SetUp()
    {
        VAAPIFixture::SetUp();
        doInitialize();
    }

    virtual void TearDown()
    {
        doTerminate();
        VAAPIFixture::TearDown();
    }
};

TEST_P(VAAPICreateContext, CreateContext)
{
    // vaCreateContext requires a valid VAConfigID, vaCreateConfig requires a
    // supported profile and entrypoint

    if (not isSupported(profile, entrypoint)) {
        skipTest(profile, entrypoint);
        return;
    }

    // profile and entrypoint are supported
    createConfig(profile, entrypoint);

    Resolution minRes, maxRes;
    getMinMaxSurfaceResolution(minRes, maxRes);

    std::ostringstream oss;
    oss << "resolution: min=" << minRes << "; max=" << maxRes
        << "; current=" << resolution;
    SCOPED_TRACE(oss.str());

    if (not resolution.isWithin(minRes, maxRes)) {
        doCreateContext(resolution, VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED);
        doDestroyContext(VA_STATUS_ERROR_INVALID_CONTEXT);
    } else {
        doCreateContext(resolution);
        doDestroyContext();
    }

    destroyConfig();
}

INSTANTIATE_TEST_CASE_P(
    CreateContext, VAAPICreateContext,
    ::testing::Combine(::testing::ValuesIn(g_vaProfiles),
        ::testing::ValuesIn(g_vaEntrypoints),
        ::testing::ValuesIn(g_vaResolutions)));

} // namespace VAAPI
