#ifndef _GLSATTRIBUTELOCATIONTESTS_HPP
#define _GLSATTRIBUTELOCATIONTESTS_HPP
/*-------------------------------------------------------------------------
 * drawElements Quality Program OpenGL (ES) 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 Attribute location tests
 *//*--------------------------------------------------------------------*/

#include "tcuDefs.hpp"
#include "tcuTestCase.hpp"

#include <string>
#include <vector>

namespace glu
{
class ShaderProgram;
class RenderContext;
} // glu

namespace deqp
{
namespace gls
{
namespace AttributeLocationTestUtil
{

class AttribType
{
public:
						AttribType		(const std::string& name, deUint32 locationSize, deUint32 typeEnum);

	const std::string&	getName			(void) const { return m_name;			}
	deUint32			getLocationSize	(void) const { return m_locationSize;	}
	deUint32			getGLTypeEnum	(void) const { return m_glTypeEnum;		}

private:
	std::string			m_name;
	deUint32			m_locationSize;
	deUint32			m_glTypeEnum;
};

class Cond
{
public:
	enum ConstCond
	{
		COND_ALWAYS,
		COND_NEVER
	};

						Cond		(ConstCond cond);
	explicit			Cond		(const std::string& name, bool negate = true);
	bool				operator==	(const Cond& other)	const	{ return m_negate == other.m_negate && m_name == other.m_name;	}
	bool				operator!=	(const Cond& other)	const	{ return !(*this == other);										}
	const std::string	getName		(void) const				{ return m_name;												}
	bool				getNegate	(void) const				{ return m_negate;												}

private:
	bool				m_negate;
	std::string			m_name;
};

class Attribute
{
public:
	enum
	{
		// Location is not defined
		LOC_UNDEF = -1
	};

	enum
	{
		// Not an array
		NOT_ARRAY = -1
	};

						Attribute			(const AttribType&	type,
											 const std::string&	name,
											 deInt32			layoutLocation	= LOC_UNDEF,
											 const Cond&		cond			= Cond::COND_ALWAYS,
											 int				arraySize		= NOT_ARRAY);

	const AttribType	getType				(void) const { return m_type;			}
	const std::string&	getName				(void) const { return m_name;			}
	deInt32				getLayoutLocation	(void) const { return m_layoutLocation;	}
	const Cond&			getCondition		(void) const { return m_cond;			}
	int					getArraySize		(void) const { return m_arraySize;		}

private:
	AttribType			m_type;
	std::string			m_name;
	deInt32				m_layoutLocation;
	Cond				m_cond;
	int					m_arraySize;
};

class Bind
{
public:
						Bind				(const std::string& attribute, deUint32 location);

	const std::string&	getAttributeName	(void) const { return m_attribute;	}
	deUint32			getLocation			(void) const { return m_location;	}

private:
	std::string			m_attribute;
	deUint32			m_location;
};

} // AttributeLocationTestUtil

// Simple bind attribute test
class BindAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							BindAttributeTest	(tcu::TestContext&		testCtx,
												 glu::RenderContext&	renderCtx,
												 const AttribType&		type,
												 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);

	virtual IterateResult	iterate				(void);

private:
	glu::RenderContext&		m_renderCtx;
	const AttribType		m_type;
	const int				m_arraySize;
};

// Bind maximum number of attributes
class BindMaxAttributesTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							BindMaxAttributesTest	(tcu::TestContext&		testCtx,
													 glu::RenderContext&	renderCtx,
													 const AttribType&		type,
													 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);

	virtual IterateResult	iterate					(void);

private:
	glu::RenderContext&		m_renderCtx;
	const AttribType		m_type;
	const int				m_arraySize;
};

class BindAliasingAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							BindAliasingAttributeTest	(tcu::TestContext&		testCtx,
														 glu::RenderContext&	renderCtx,
														 const AttribType&		type,
														 int					offset = 0,
														 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);

	virtual IterateResult	iterate						(void);

private:
	glu::RenderContext&		m_renderCtx;
	const AttribType		m_type;
	const int				m_offset;
	const int				m_arraySize;
};

class BindMaxAliasingAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							BindMaxAliasingAttributeTest	(tcu::TestContext&	testCtx,
															glu::RenderContext&	renderCtx,
															const AttribType&	type,
															int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);

	virtual IterateResult	iterate							(void);

private:
	glu::RenderContext&		m_renderCtx;
	const AttribType		m_type;
	const int				m_arraySize;
};

class BindInactiveAliasingAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							BindInactiveAliasingAttributeTest	(tcu::TestContext&		testCtx,
																 glu::RenderContext&	renderCtx,
																 const AttribType&		type,
																 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);

	virtual IterateResult	iterate								(void);

private:
	glu::RenderContext&		m_renderCtx;
	const AttribType		m_type;
	const int				m_arraySize;
};

class BindHoleAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							BindHoleAttributeTest		(tcu::TestContext&		testCtx,
														 glu::RenderContext&	renderCtx,
														 const AttribType&		type,
														 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);

	virtual IterateResult	iterate						(void);

private:
	glu::RenderContext&		m_renderCtx;
	const AttribType		m_type;
	const int				m_arraySize;
};

class PreAttachBindAttributeTest : public tcu::TestCase
{
public:
							PreAttachBindAttributeTest	(tcu::TestContext&		testCtx,
														 glu::RenderContext&	renderCtx);

	virtual IterateResult	iterate						(void);

private:
	glu::RenderContext&		m_renderCtx;
};

class PreLinkBindAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							PreLinkBindAttributeTest	(tcu::TestContext&		testCtx,
														 glu::RenderContext&	renderCtx);

	virtual IterateResult	iterate						(void);

private:
	glu::RenderContext&		m_renderCtx;
};

class PostLinkBindAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							PostLinkBindAttributeTest	(tcu::TestContext&		testCtx,
														 glu::RenderContext&	renderCtx);

	virtual IterateResult	iterate						(void);

private:
	glu::RenderContext&		m_renderCtx;
};

class BindReattachAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							BindReattachAttributeTest	(tcu::TestContext&		testCtx,
														 glu::RenderContext&	renderCtx);

	virtual IterateResult	iterate						(void);

private:
	glu::RenderContext&		m_renderCtx;
};

class LocationAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							LocationAttributeTest	(tcu::TestContext&		testCtx,
													 glu::RenderContext&	renderCtx,
													 const AttribType&		type,
													 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);

	virtual IterateResult	iterate					(void);

private:
	glu::RenderContext&		m_renderCtx;
	const AttribType		m_type;
	const int				m_arraySize;
};

class LocationMaxAttributesTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							LocationMaxAttributesTest	(tcu::TestContext&		testCtx,
														 glu::RenderContext&	renderCtx,
														 const AttribType&		type,
														 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);

	virtual IterateResult	iterate						(void);

private:
	glu::RenderContext&		m_renderCtx;
	const AttribType		m_type;
	const int				m_arraySize;
};

class LocationHoleAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							LocationHoleAttributeTest	(tcu::TestContext&		testCtx,
														 glu::RenderContext&	renderCtx,
														 const AttribType&		type,
														 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);

	virtual IterateResult	iterate						(void);

private:
	glu::RenderContext&		m_renderCtx;
	const AttribType		m_type;
	const int				m_arraySize;
};

class MixedAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							MixedAttributeTest	(tcu::TestContext&		testCtx,
												 glu::RenderContext&	renderCtx,
												 const AttribType&		type,
												 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);

	virtual IterateResult	iterate				(void);

private:
	glu::RenderContext&		m_renderCtx;
	const AttribType		m_type;
	const int				m_arraySize;
};

class MixedMaxAttributesTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							MixedMaxAttributesTest	(tcu::TestContext&		testCtx,
													 glu::RenderContext&	renderCtx,
													 const AttribType&		type,
													 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);

	virtual IterateResult	iterate					(void);

private:
	glu::RenderContext&		m_renderCtx;
	const AttribType		m_type;
	const int				m_arraySize;
};

class MixedHoleAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							MixedHoleAttributeTest	(tcu::TestContext&		testCtx,
													 glu::RenderContext&	renderCtx,
													 const AttribType&		type,
													 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);

	virtual IterateResult	iterate					(void);

private:
	glu::RenderContext&		m_renderCtx;
	const AttribType		m_type;
	const int				m_arraySize;
};

class BindRelinkAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							BindRelinkAttributeTest	(tcu::TestContext&		testCtx,
													 glu::RenderContext&	renderCtx);

	virtual IterateResult	iterate					(void);

private:
	glu::RenderContext&		m_renderCtx;
};

class BindRelinkHoleAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							BindRelinkHoleAttributeTest	(tcu::TestContext&		testCtx,
														 glu::RenderContext&	renderCtx,
														 const AttribType&		type,
														 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);

	virtual IterateResult	iterate						(void);

private:
	glu::RenderContext&		m_renderCtx;
	const AttribType		m_type;
	const int				m_arraySize;
};

class MixedRelinkHoleAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							MixedRelinkHoleAttributeTest	(tcu::TestContext&		testCtx,
															 glu::RenderContext&	renderCtx,
															 const AttribType&		type,
															 int					arraySize = AttributeLocationTestUtil::Attribute::NOT_ARRAY);

	virtual IterateResult	iterate							(void);

private:
	glu::RenderContext&		m_renderCtx;
	const AttribType		m_type;
	const int				m_arraySize;
};

class PreAttachMixedAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							PreAttachMixedAttributeTest	(tcu::TestContext&		testCtx,
														 glu::RenderContext&	renderCtx);

	virtual IterateResult	iterate						(void);

private:
	glu::RenderContext&		m_renderCtx;
};

class PreLinkMixedAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							PreLinkMixedAttributeTest	(tcu::TestContext&		testCtx,
														 glu::RenderContext&	renderCtx);

	virtual IterateResult	iterate						(void);

private:
	glu::RenderContext&		m_renderCtx;
};

class PostLinkMixedAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							PostLinkMixedAttributeTest	(tcu::TestContext&		testCtx,
														 glu::RenderContext&	renderCtx);

	virtual IterateResult	iterate						(void);

private:
	glu::RenderContext&		m_renderCtx;
};

class MixedReattachAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							MixedReattachAttributeTest		(tcu::TestContext&		testCtx,
															 glu::RenderContext&	renderCtx);

	virtual IterateResult	iterate							(void);

private:
	glu::RenderContext&		m_renderCtx;
};

class MixedRelinkAttributeTest : public tcu::TestCase
{
public:
	typedef AttributeLocationTestUtil::AttribType AttribType;

							MixedRelinkAttributeTest(tcu::TestContext&		testCtx,
													 glu::RenderContext&	renderCtx);

	virtual IterateResult	iterate					(void);

private:
	glu::RenderContext&								m_renderCtx;
};

} // gls
} // deqp

#endif // _GLSATTRIBUTELOCATIONTESTS_HPP
