#ifndef _GLSFBOCOMPLETENESSTESTS_HPP
#define _GLSFBOCOMPLETENESSTESTS_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 Common parts for ES2/3 framebuffer completeness tests.
 *//*--------------------------------------------------------------------*/

#include "tcuTestCase.hpp"
#include "gluRenderContext.hpp"
#include "glsFboUtil.hpp"
#include "glwDefs.hpp"
#include "glwEnums.hpp"
#include "tcuTestCase.hpp"
#include "tcuTestLog.hpp"

namespace deqp
{
namespace gls
{
namespace fboc
{

namespace details
{

using glu::RenderContext;
using tcu::TestCase;
using tcu::TestContext;
typedef TestCase::IterateResult IterateResult;
using tcu::TestCaseGroup;
using tcu::TestLog;
using std::string;

using namespace glw;
using namespace deqp::gls::FboUtil;
using namespace deqp::gls::FboUtil::config;

class Context
{
public:
							Context					(TestContext& testCtx,
													 RenderContext& renderCtx,
													 CheckerFactory& factory);
	RenderContext&			getRenderContext		(void) const { return m_renderCtx; }
	TestContext&			getTestContext			(void) const { return m_testCtx; }
	const FboVerifier&		getVerifier				(void) const { return m_verifier; }
	const FormatDB&			getCoreFormats			(void) const { return m_coreFormats; }
	const FormatDB&			getCtxFormats			(void) const { return m_ctxFormats; }
	const FormatDB&			getAllFormats			(void) const { return m_allFormats; }
	bool					haveMultiColorAtts		(void) const { return m_haveMultiColorAtts; }
	void					setHaveMulticolorAtts	(bool have) { m_haveMultiColorAtts = have; }
	void					addFormats				(FormatEntries fmtRange);
	void					addExtFormats			(FormatExtEntries extRange);
	TestCaseGroup*			createRenderableTests	(void);
	TestCaseGroup*			createAttachmentTests	(void);
	TestCaseGroup*			createSizeTests			(void);
private:
	TestContext&			m_testCtx;
	RenderContext&			m_renderCtx;
	FormatDB				m_coreFormats;
	FormatDB				m_ctxFormats;
	FormatDB				m_allFormats;
	FboVerifier				m_verifier;
	bool					m_haveMultiColorAtts;
};

class TestBase : public TestCase
{
public:
	Context&				getContext			(void) const { return m_ctx; }

protected:

							TestBase			(Context& ctx,
												 const string& name, const string& desc)
								: TestCase		(ctx.getTestContext(),
												 name.c_str(), desc.c_str())
								, m_ctx			(ctx) {}
	void					fail				(const char* msg);
	void					qualityWarning		(const char* msg);
	void					pass				(void);
	void					checkFbo			(FboBuilder& builder);
	ImageFormat				getDefaultFormat	(GLenum attPoint, GLenum bufType) const;

	IterateResult			iterate				(void);

	virtual IterateResult	build				(FboBuilder& builder);

	void					attachTargetToNew	(GLenum target, GLenum bufType,
												 ImageFormat format,
												 GLsizei width, GLsizei height,
												 FboBuilder& builder);
	Context&				m_ctx;
};

	// Utilities for building
Image*				makeImage			(GLenum bufType, ImageFormat format,
										 GLsizei width, GLsizei height, FboBuilder& builder);
Attachment*			makeAttachment		(GLenum bufType, ImageFormat format,
										 GLsizei width, GLsizei height, FboBuilder& builder);

template <typename P>
class ParamTest : public TestBase
{
public:
	typedef P	Params;
				ParamTest		(Context& ctx, const Params& params)
					: TestBase	(ctx, Params::getName(params), Params::getDescription(params))
					, m_params	(params) {}

protected:
	Params		m_params;
};

// Shorthand utility
const glw::Functions& gl (const TestBase& test);

} // details

using details::Context;
using details::TestBase;
using details::ParamTest;
using details::gl;

} // fboc
} // gls
} // deqp

#endif // _GLSFBOCOMPLETENESSTESTS_HPP
