/*-------------------------------------------------------------------------
 * drawElements Quality Program OpenGL ES 2.0 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 Object lifetime tests.
 *//*--------------------------------------------------------------------*/

#include "es2fLifetimeTests.hpp"

#include "deUniquePtr.hpp"
#include "glsLifetimeTests.hpp"

namespace deqp
{
namespace gles2
{
namespace Functional
{
namespace
{

using de::MovePtr;
using glu::RenderContext;
namespace lt = gls::LifetimeTests;
using namespace lt;
using namespace glw;

class TestGroup : public TestCaseGroup
{
public:
							TestGroup		(Context& context)
								: TestCaseGroup	(context, "lifetime", "Object lifetime tests")
							{}
	void					init			(void);

private:
	MovePtr<Types>			m_types;
};

void TestGroup::init (void)
{
	gles2::Context&	ctx		= getContext();
	lt::Context		ltCtx	(ctx.getRenderContext(), ctx.getTestContext());

	m_types = MovePtr<Types>(new ES2Types(ltCtx));
	addTestCases(*this, *m_types);
}

} // anonymous

TestCaseGroup* createLifetimeTests (Context& context)
{
	return new TestGroup(context);
}

} // Functional
} // gles2
} // deqp
