#ifndef _ESEXTCTEXTURECUBEMAPARRAYTEX3DVALIDATION_HPP
#define _ESEXTCTEXTURECUBEMAPARRAYTEX3DVALIDATION_HPP
/*-------------------------------------------------------------------------
 * OpenGL Conformance Test Suite
 * -----------------------------
 *
 * Copyright (c) 2014-2016 The Khronos Group Inc.
 *
 * 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
 */ /*-------------------------------------------------------------------*/

/*!
 * \file  esextcTextureCubeMapArrayTex3DValidation.hpp
 * \brief texture_cube_map_array extension - Tex3DValidation (Test 4)
 */ /*-------------------------------------------------------------------*/

#include "../esextcTestCaseBase.hpp"

namespace glcts
{
/** Implementation of Test 4 from CTS_EXT_texture_cube_map_array.
 *   Test description follows:
 *
 *   Make sure specified errors are generated if glTexImage3D() or glTexStorage3D()
 *   is called for a GL_TEXTURE_CUBE_MAP_ARRAY_EXT texture target with invalid
 *   arguments
 *
 *   Category: Coverage.
 *   Priority: Must-have.
 *
 *   Make sure that GL_INVALID_VALUE error is generated if glTexImage3D() or
 *   glTexStorage3D() is called for GL_TEXTURE_CUBE_MAP_ARRAY_EXT texture target,
 *   and width or height arguments are not equal.
 *   Make sure that GL_INVALID_VALUE error is generated if glTexImage3D() or
 *   glTexStorage3D() is called for GL_TEXTURE_CUBE_MAP_ARRAY_EXT texture target,
 *   and depth is not a multiple of six.
 *   Make sure GL_INVALID_OPERATION error is generated by glTexStorage3D(),
 *   if the function is called for GL_TEXTURE_CUBE_MAP_ARRAY_EXT texture target,
 *   and levels argument is greater than floor(log2(max(width, height))) + 1;
 **/
class TextureCubeMapArrayTex3DValidation : public TestCaseBase
{
public:
	/* Public methods */
	TextureCubeMapArrayTex3DValidation(Context& context, const ExtParameters& extParams, const char* name,
									   const char* description);

	virtual ~TextureCubeMapArrayTex3DValidation(void)
	{
	}

	virtual void		  deinit(void);
	virtual IterateResult iterate(void);

private:
	/* Private methods */
	bool checkError(glw::GLint expectedError, const char* message);
	void createTexture(void);
	void deleteTexture(void);

	/* Private variables */
	glw::GLuint m_to_id;
};

} /* glcts */

#endif // _ESEXTCTEXTURECUBEMAPARRAYTEX3DVALIDATION_HPP
