#ifndef _TCUDEFS_HPP
#define _TCUDEFS_HPP
/*-------------------------------------------------------------------------
 * drawElements Quality Program Tester Core
 * ----------------------------------------
 *
 * 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 Basic definitions.
 *//*--------------------------------------------------------------------*/

#include "deDefs.hpp"
#include "qpTestLog.h"

#include <string>
#include <stdexcept>

/*--------------------------------------------------------------------*//*!
 * \brief dEQP Common Test Framework
 *
 * Code in this namespace doesn't require support for any specific client
 * APIs.
 *//*--------------------------------------------------------------------*/
namespace tcu
{

//! Kill program. Called when a fatal error occurs.
void	die		(const char* format, ...) DE_PRINTF_FUNC_ATTR(1, 2);

//! Print to debug console.
void	print	(const char* format, ...) DE_PRINTF_FUNC_ATTR(1, 2);

//! Base exception class for dEQP test framework.
class Exception : public std::runtime_error
{
public:
						Exception			(const char* message, const char* expr, const char* file, int line);
						Exception			(const std::string& message);
	virtual				~Exception			(void) throw() {}

	const char*			getMessage			(void) const { return m_message.c_str(); }

private:
	const std::string	m_message;
};

//! Base exception class for test exceptions that affect test result
class TestException : public Exception
{
public:
						TestException		(const char* message, const char* expr, const char* file, int line, qpTestResult result);
						TestException		(const std::string& message, qpTestResult result);
	virtual				~TestException		(void) throw() {}

	qpTestResult		getTestResult		(void) const { return m_result; }
	virtual bool		isFatal				(void) const { return false; }

private:
	const qpTestResult	m_result;
};

//! Exception for test errors.
class TestError : public TestException
{
public:
					TestError			(const char* message, const char* expr, const char* file, int line);
					TestError			(const std::string& message, const char* expr, const char* file, int line);
					TestError			(const std::string& message);
	virtual			~TestError			(void) throw() {}
};

//! Exception for internal errors.
class InternalError : public TestException
{
public:
					InternalError		(const char* message, const char* expr, const char* file, int line);
					InternalError		(const std::string& message);
	virtual			~InternalError		(void) throw() {}
};

//! Resource error. Tester will terminate if thrown out of test case.
class ResourceError : public TestException
{
public:
					ResourceError		(const char* message, const char* expr, const char* file, int line);
					ResourceError		(const std::string& message);
	virtual			~ResourceError		(void) throw() {}

	virtual bool	isFatal				(void) const { return true; }
};

//! Not supported error.
class NotSupportedError : public TestException
{
public:
					NotSupportedError	(const char* message, const char* expr, const char* file, int line);
					NotSupportedError	(const std::string& message, const char* expr, const char* file, int line);
					NotSupportedError	(const std::string& message);
	virtual			~NotSupportedError	(void) throw() {}
};

} // tcu

#define TCU_THROW_EXPR(ERRCLASS, MSG, EXPR)						\
			throw tcu::ERRCLASS(MSG, EXPR, __FILE__, __LINE__)

#define TCU_THROW(ERRCLASS, MSG)								\
			TCU_THROW_EXPR(ERRCLASS, MSG, DE_NULL)

#define TCU_CHECK_AND_THROW(ERRCLASS, X, MSG)					\
	do {														\
		if (!(!deGetFalse() && (X)))							\
			TCU_THROW_EXPR(ERRCLASS, MSG, #X);					\
	} while(deGetFalse())

//! Throw TestError.
#define TCU_FAIL(MSG)				TCU_THROW(TestError, MSG)

//! Throw TestError if condition X is not satisfied.
#define TCU_CHECK(X)			do { if (!(!deGetFalse() && (X))) throw tcu::TestError(DE_NULL, #X, __FILE__, __LINE__); } while(deGetFalse())

//! Throw TestError if condition X is not satisfied.
#define TCU_CHECK_MSG(X, MSG)	do { if (!(!deGetFalse() && (X))) throw tcu::TestError((MSG), #X, __FILE__, __LINE__); } while(deGetFalse())

//! Throw InternalError if condition X is not satisfied
#define	TCU_CHECK_INTERNAL(X)	do { if (!(!deGetFalse() && (X))) throw tcu::InternalError(DE_NULL, #X, __FILE__, __LINE__); } while(deGetFalse())

#endif // _TCUDEFS_HPP
