1e5c31af7Sopenharmony_ci#ifndef _VKTTESTGROUPUTIL_HPP
2e5c31af7Sopenharmony_ci#define _VKTTESTGROUPUTIL_HPP
3e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci * Vulkan Conformance Tests
5e5c31af7Sopenharmony_ci * ------------------------
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Copyright (c) 2016 Google Inc.
8e5c31af7Sopenharmony_ci *
9e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
10e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
11e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
14e5c31af7Sopenharmony_ci *
15e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
16e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
17e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
19e5c31af7Sopenharmony_ci * limitations under the License.
20e5c31af7Sopenharmony_ci *
21e5c31af7Sopenharmony_ci *//*!
22e5c31af7Sopenharmony_ci * \file
23e5c31af7Sopenharmony_ci * \brief TestCaseGroup utilities
24e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
25e5c31af7Sopenharmony_ci
26e5c31af7Sopenharmony_ci#include "tcuDefs.hpp"
27e5c31af7Sopenharmony_ci#include "tcuTestCase.hpp"
28e5c31af7Sopenharmony_ci
29e5c31af7Sopenharmony_cinamespace vkt
30e5c31af7Sopenharmony_ci{
31e5c31af7Sopenharmony_ci
32e5c31af7Sopenharmony_ciclass TestGroupHelper0 : public tcu::TestCaseGroup
33e5c31af7Sopenharmony_ci{
34e5c31af7Sopenharmony_cipublic:
35e5c31af7Sopenharmony_ci	typedef void (*CreateChildrenFunc) (tcu::TestCaseGroup* testGroup);
36e5c31af7Sopenharmony_ci	typedef void (*CleanupGroupFunc) (tcu::TestCaseGroup* testGroup);
37e5c31af7Sopenharmony_ci
38e5c31af7Sopenharmony_ci								TestGroupHelper0	(tcu::TestContext&		testCtx,
39e5c31af7Sopenharmony_ci													 const std::string&		name,
40e5c31af7Sopenharmony_ci													 const std::string&		description,
41e5c31af7Sopenharmony_ci													 CreateChildrenFunc		createChildren,
42e5c31af7Sopenharmony_ci													 CleanupGroupFunc		cleanupGroup)
43e5c31af7Sopenharmony_ci									: tcu::TestCaseGroup(testCtx, name.c_str(), description.c_str())
44e5c31af7Sopenharmony_ci									, m_createChildren(createChildren)
45e5c31af7Sopenharmony_ci									, m_cleanupGroup(cleanupGroup)
46e5c31af7Sopenharmony_ci								{
47e5c31af7Sopenharmony_ci								}
48e5c31af7Sopenharmony_ci
49e5c31af7Sopenharmony_ci								~TestGroupHelper0	(void)
50e5c31af7Sopenharmony_ci								{
51e5c31af7Sopenharmony_ci								}
52e5c31af7Sopenharmony_ci
53e5c31af7Sopenharmony_ci	void						init				(void)
54e5c31af7Sopenharmony_ci								{
55e5c31af7Sopenharmony_ci									m_createChildren(this);
56e5c31af7Sopenharmony_ci								}
57e5c31af7Sopenharmony_ci
58e5c31af7Sopenharmony_ci	void						deinit				(void)
59e5c31af7Sopenharmony_ci								{
60e5c31af7Sopenharmony_ci									if (m_cleanupGroup)
61e5c31af7Sopenharmony_ci										m_cleanupGroup(this);
62e5c31af7Sopenharmony_ci								}
63e5c31af7Sopenharmony_ci
64e5c31af7Sopenharmony_ciprivate:
65e5c31af7Sopenharmony_ci	const CreateChildrenFunc	m_createChildren;
66e5c31af7Sopenharmony_ci	const CleanupGroupFunc		m_cleanupGroup;
67e5c31af7Sopenharmony_ci};
68e5c31af7Sopenharmony_ci
69e5c31af7Sopenharmony_citemplate<typename Arg0>
70e5c31af7Sopenharmony_ciclass TestGroupHelper1 : public tcu::TestCaseGroup
71e5c31af7Sopenharmony_ci{
72e5c31af7Sopenharmony_cipublic:
73e5c31af7Sopenharmony_ci	typedef void (*CreateChildrenFunc) (tcu::TestCaseGroup* testGroup, Arg0 arg0);
74e5c31af7Sopenharmony_ci	typedef void (*CleanupGroupFunc) (tcu::TestCaseGroup* testGroup, Arg0 arg0);
75e5c31af7Sopenharmony_ci
76e5c31af7Sopenharmony_ci								TestGroupHelper1	(tcu::TestContext&		testCtx,
77e5c31af7Sopenharmony_ci													 const std::string&		name,
78e5c31af7Sopenharmony_ci													 const std::string&		description,
79e5c31af7Sopenharmony_ci													 CreateChildrenFunc		createChildren,
80e5c31af7Sopenharmony_ci													 const Arg0&			arg0,
81e5c31af7Sopenharmony_ci													 CleanupGroupFunc		cleanupGroup)
82e5c31af7Sopenharmony_ci									: tcu::TestCaseGroup	(testCtx, name.c_str(), description.c_str())
83e5c31af7Sopenharmony_ci									, m_createChildren		(createChildren)
84e5c31af7Sopenharmony_ci									, m_cleanupGroup		(cleanupGroup)
85e5c31af7Sopenharmony_ci									, m_arg0				(arg0)
86e5c31af7Sopenharmony_ci								{}
87e5c31af7Sopenharmony_ci
88e5c31af7Sopenharmony_ci	void						init				(void) { m_createChildren(this, m_arg0); }
89e5c31af7Sopenharmony_ci	void						deinit				(void) { if (m_cleanupGroup) m_cleanupGroup(this, m_arg0); }
90e5c31af7Sopenharmony_ci
91e5c31af7Sopenharmony_ciprivate:
92e5c31af7Sopenharmony_ci	const CreateChildrenFunc	m_createChildren;
93e5c31af7Sopenharmony_ci	const CleanupGroupFunc		m_cleanupGroup;
94e5c31af7Sopenharmony_ci	const Arg0					m_arg0;
95e5c31af7Sopenharmony_ci};
96e5c31af7Sopenharmony_ci
97e5c31af7Sopenharmony_citemplate<typename Arg0, typename Arg1>
98e5c31af7Sopenharmony_ciclass TestGroupHelper2 : public tcu::TestCaseGroup
99e5c31af7Sopenharmony_ci{
100e5c31af7Sopenharmony_cipublic:
101e5c31af7Sopenharmony_ci	typedef void(*CreateChildrenFunc) (tcu::TestCaseGroup* testGroup, Arg0 arg0, Arg1 arg1);
102e5c31af7Sopenharmony_ci	typedef void(*CleanupGroupFunc) (tcu::TestCaseGroup* testGroup, Arg0 arg0, Arg1 arg1);
103e5c31af7Sopenharmony_ci
104e5c31af7Sopenharmony_ci								TestGroupHelper2(tcu::TestContext&		testCtx,
105e5c31af7Sopenharmony_ci												const std::string&		name,
106e5c31af7Sopenharmony_ci												const std::string&		description,
107e5c31af7Sopenharmony_ci												CreateChildrenFunc		createChildren,
108e5c31af7Sopenharmony_ci												const Arg0&				arg0,
109e5c31af7Sopenharmony_ci												const Arg1&				arg1,
110e5c31af7Sopenharmony_ci												CleanupGroupFunc		cleanupGroup)
111e5c31af7Sopenharmony_ci									: tcu::TestCaseGroup	(testCtx, name.c_str(), description.c_str())
112e5c31af7Sopenharmony_ci									, m_createChildren		(createChildren)
113e5c31af7Sopenharmony_ci									, m_cleanupGroup		(cleanupGroup)
114e5c31af7Sopenharmony_ci									, m_arg0				(arg0)
115e5c31af7Sopenharmony_ci									, m_arg1				(arg1)
116e5c31af7Sopenharmony_ci								{}
117e5c31af7Sopenharmony_ci
118e5c31af7Sopenharmony_ci	void						init		(void) { m_createChildren(this, m_arg0, m_arg1); }
119e5c31af7Sopenharmony_ci	void						deinit		(void) { if (m_cleanupGroup) m_cleanupGroup(this, m_arg0, m_arg1); }
120e5c31af7Sopenharmony_ci
121e5c31af7Sopenharmony_ciprivate:
122e5c31af7Sopenharmony_ci	const CreateChildrenFunc	m_createChildren;
123e5c31af7Sopenharmony_ci	const CleanupGroupFunc		m_cleanupGroup;
124e5c31af7Sopenharmony_ci	const Arg0					m_arg0;
125e5c31af7Sopenharmony_ci	const Arg1					m_arg1;
126e5c31af7Sopenharmony_ci};
127e5c31af7Sopenharmony_ci
128e5c31af7Sopenharmony_ciinline tcu::TestCaseGroup* createTestGroup (tcu::TestContext&										testCtx,
129e5c31af7Sopenharmony_ci											const std::string&										name,
130e5c31af7Sopenharmony_ci											const std::string&										description,
131e5c31af7Sopenharmony_ci											TestGroupHelper0::CreateChildrenFunc					createChildren,
132e5c31af7Sopenharmony_ci											TestGroupHelper0::CleanupGroupFunc						cleanupGroup = DE_NULL)
133e5c31af7Sopenharmony_ci{
134e5c31af7Sopenharmony_ci	return new TestGroupHelper0(testCtx, name, description, createChildren, cleanupGroup);
135e5c31af7Sopenharmony_ci}
136e5c31af7Sopenharmony_ci
137e5c31af7Sopenharmony_citemplate<typename Arg0>
138e5c31af7Sopenharmony_citcu::TestCaseGroup* createTestGroup (tcu::TestContext&										testCtx,
139e5c31af7Sopenharmony_ci									 const std::string&										name,
140e5c31af7Sopenharmony_ci									 const std::string&										description,
141e5c31af7Sopenharmony_ci									 typename TestGroupHelper1<Arg0>::CreateChildrenFunc	createChildren,
142e5c31af7Sopenharmony_ci									 Arg0													arg0,
143e5c31af7Sopenharmony_ci									 typename TestGroupHelper1<Arg0>::CleanupGroupFunc		cleanupGroup = DE_NULL)
144e5c31af7Sopenharmony_ci{
145e5c31af7Sopenharmony_ci	return new TestGroupHelper1<Arg0>(testCtx, name, description, createChildren, arg0, cleanupGroup);
146e5c31af7Sopenharmony_ci}
147e5c31af7Sopenharmony_citemplate<typename Arg0, typename Arg1>
148e5c31af7Sopenharmony_citcu::TestCaseGroup* createTestGroup (tcu::TestContext&											testCtx,
149e5c31af7Sopenharmony_ci									 const std::string&											name,
150e5c31af7Sopenharmony_ci									 const std::string&											description,
151e5c31af7Sopenharmony_ci									 typename TestGroupHelper2<Arg0, Arg1>::CreateChildrenFunc	createChildren,
152e5c31af7Sopenharmony_ci									 Arg0														arg0,
153e5c31af7Sopenharmony_ci									 Arg1														arg1,
154e5c31af7Sopenharmony_ci									 typename TestGroupHelper2<Arg0, Arg1>::CleanupGroupFunc	cleanupGroup = DE_NULL)
155e5c31af7Sopenharmony_ci{
156e5c31af7Sopenharmony_ci	return new TestGroupHelper2<Arg0, Arg1>(testCtx, name, description, createChildren, arg0, arg1, cleanupGroup);
157e5c31af7Sopenharmony_ci}
158e5c31af7Sopenharmony_ci
159e5c31af7Sopenharmony_ciinline void addTestGroup (tcu::TestCaseGroup*					parent,
160e5c31af7Sopenharmony_ci						  const std::string&					name,
161e5c31af7Sopenharmony_ci						  const std::string&					description,
162e5c31af7Sopenharmony_ci						  TestGroupHelper0::CreateChildrenFunc	createChildren)
163e5c31af7Sopenharmony_ci{
164e5c31af7Sopenharmony_ci	parent->addChild(createTestGroup(parent->getTestContext(), name, description, createChildren));
165e5c31af7Sopenharmony_ci}
166e5c31af7Sopenharmony_ci
167e5c31af7Sopenharmony_citemplate<typename Arg0>
168e5c31af7Sopenharmony_civoid addTestGroup (tcu::TestCaseGroup*									parent,
169e5c31af7Sopenharmony_ci				   const std::string&									name,
170e5c31af7Sopenharmony_ci				   const std::string&									description,
171e5c31af7Sopenharmony_ci				   typename TestGroupHelper1<Arg0>::CreateChildrenFunc	createChildren,
172e5c31af7Sopenharmony_ci				   Arg0													arg0,
173e5c31af7Sopenharmony_ci				   typename TestGroupHelper1<Arg0>::CleanupGroupFunc	cleanupGroup = DE_NULL)
174e5c31af7Sopenharmony_ci{
175e5c31af7Sopenharmony_ci	parent->addChild(createTestGroup<Arg0>(parent->getTestContext(), name, description, createChildren, arg0, cleanupGroup));
176e5c31af7Sopenharmony_ci}
177e5c31af7Sopenharmony_ci
178e5c31af7Sopenharmony_citemplate<typename Arg0, typename Arg1>
179e5c31af7Sopenharmony_civoid addTestGroup(tcu::TestCaseGroup*					parent,
180e5c31af7Sopenharmony_ci	const std::string&									name,
181e5c31af7Sopenharmony_ci	const std::string&									description,
182e5c31af7Sopenharmony_ci	typename TestGroupHelper2<Arg0,Arg1>::CreateChildrenFunc	createChildren,
183e5c31af7Sopenharmony_ci	Arg0												arg0,
184e5c31af7Sopenharmony_ci	Arg1												arg1,
185e5c31af7Sopenharmony_ci	typename TestGroupHelper2<Arg0,Arg1>::CleanupGroupFunc	cleanupGroup = DE_NULL)
186e5c31af7Sopenharmony_ci{
187e5c31af7Sopenharmony_ci	parent->addChild(createTestGroup<Arg0,Arg1>(parent->getTestContext(), name, description, createChildren, arg0, arg1, cleanupGroup));
188e5c31af7Sopenharmony_ci}
189e5c31af7Sopenharmony_ci
190e5c31af7Sopenharmony_ci} // vkt
191e5c31af7Sopenharmony_ci
192e5c31af7Sopenharmony_ci#endif // _VKTTESTGROUPUTIL_HPP
193