/*-------------------------------------------------------------------------
 * 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 OpenGL ES 3.1 Test Package
 *//*--------------------------------------------------------------------*/

#include "tes31TestPackage.hpp"
#include "tes31InfoTests.hpp"
#include "es31fFunctionalTests.hpp"
#include "es31sStressTests.hpp"

namespace deqp
{
namespace gles31
{

PackageContext::PackageContext (tcu::TestContext& testCtx)
	: m_context		(DE_NULL)
	, m_caseWrapper	(DE_NULL)
{
	try
	{
		m_context		= new Context(testCtx);
		m_caseWrapper	= new TestCaseWrapper(testCtx, m_context->getRenderContext());
	}
	catch (...)
	{
		delete m_caseWrapper;
		delete m_context;

		throw;
	}
}

PackageContext::~PackageContext (void)
{
	delete m_caseWrapper;
	delete m_context;
}

TestPackage::TestPackage (tcu::TestContext& testCtx)
	: tcu::TestPackage	(testCtx, "dEQP-GLES31", "dEQP OpenGL ES 3.1 Tests")
	, m_packageCtx		(DE_NULL)
	, m_archive			(testCtx.getRootArchive(), "gles31/")
{
}

TestPackage::~TestPackage (void)
{
	// Destroy children first since destructors may access context.
	TestNode::deinit();
	delete m_packageCtx;
}

void TestPackage::init (void)
{
	try
	{
		// Create context
		m_packageCtx = new PackageContext(m_testCtx);

		// Add main test groups
		addChild(new InfoTests						(m_packageCtx->getContext()));
		addChild(new Functional::FunctionalTests	(m_packageCtx->getContext()));
		addChild(new Stress::StressTests			(m_packageCtx->getContext()));
	}
	catch (...)
	{
		delete m_packageCtx;
		m_packageCtx = DE_NULL;

		throw;
	}
}

void TestPackage::deinit (void)
{
	TestNode::deinit();
	delete m_packageCtx;
	m_packageCtx = DE_NULL;
}

} // gles31
} // deqp
