#ifndef _ES31FUNIFORMLOCATIONTESTS_HPP
#define _ES31FUNIFORMLOCATIONTESTS_HPP
/*-------------------------------------------------------------------------
 * drawElements Quality Program OpenGL ES 3.1 Module
 * -------------------------------------------------
 *
 * Copyright 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
 * \brief Explicit uniform location tests
 *//*--------------------------------------------------------------------*/

#include "tcuDefs.hpp"
#include "tes31TestCase.hpp"

namespace glu
{
class StructType;
}

namespace deqp
{
namespace gles31
{
namespace Functional
{

typedef std::vector<glu::StructType *> StructList;

class UniformLocationTests : public TestCaseGroup
{
public:
    UniformLocationTests(Context &context, bool isGL45);
    virtual ~UniformLocationTests(void);

    void init(void);

private:
    UniformLocationTests(const UniformLocationTests &other);
    UniformLocationTests &operator=(const UniformLocationTests &other);

    StructList structTypes;

    bool m_isGL45;
};

} // namespace Functional
} // namespace gles31
} // namespace deqp

#endif // _ES31FUNIFORMLOCATIONTESTS_HPP
