/*------------------------------------------------------------------------
 * Vulkan Conformance Tests
 * ------------------------
 *
 * Copyright (c) 2020 The Khronos Group Inc.
 *
 * 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 Experimental crash postmortem tests
 */
/*--------------------------------------------------------------------*/

#include "vktPostmortemTests.hpp"
#include "vktPostmortemShaderTimeoutTests.hpp"
#include "vktPostmortemUseAfterFreeTests.hpp"
#include "vktTestGroupUtil.hpp"

namespace vkt
{
namespace postmortem
{
namespace
{

void createChildren(tcu::TestCaseGroup *postmortemTests)
{
	tcu::TestContext &testCtx = postmortemTests->getTestContext();
	postmortemTests->addChild(createShaderTimeoutTests(testCtx));
	postmortemTests->addChild(createUseAfterFreeTests(testCtx));
}

} // namespace

tcu::TestCaseGroup *createTests(tcu::TestContext &testCtx)
{
	return createTestGroup(testCtx, "postmortem", "Crash postmortem tests", createChildren);
}

} // namespace postmortem
} // namespace vkt
