13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Internal Test Module
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ---------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Miscellaneous framework tests.
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "ditFrameworkTests.hpp"
25e2145884f87cdca749a754abfd246cdfe01ea2c1Pyry Haulos#include "ditTextureFormatTests.hpp"
26efb83e1354edd463650ad0404b18e9a7efc307e4Pyry Haulos#include "ditAstcTests.hpp"
270820e8d122596ff51f723f8a4f32fa755fbbda23Pyry Haulos#include "ditVulkanTests.hpp"
280820e8d122596ff51f723f8a4f32fa755fbbda23Pyry Haulos
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuFloatFormat.hpp"
30f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi#include "tcuEither.hpp"
31ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos#include "tcuTestLog.hpp"
32ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos#include "tcuCommandLine.hpp"
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
34f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos#include "rrRenderer.hpp"
35f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos#include "tcuTextureUtil.hpp"
36f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos#include "tcuVectorUtil.hpp"
37f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos#include "tcuFloat.hpp"
38f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
39d6148171f88da1301f053e2e0236afc69416137cJarkko Pöyry#include "deRandom.hpp"
40d6148171f88da1301f053e2e0236afc69416137cJarkko Pöyry#include "deArrayUtil.hpp"
41d6148171f88da1301f053e2e0236afc69416137cJarkko Pöyry
42c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos#include <stdexcept>
43c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace dit
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
47ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosnamespace
48ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos{
49ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
50ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosusing std::string;
51ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosusing std::vector;
52ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosusing tcu::TestLog;
53ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
54ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosstruct MatchCase
55ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos{
56ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	enum Expected { NO_MATCH, MATCH_GROUP, MATCH_CASE, EXPECTED_LAST };
57ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
58ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	const char*	path;
59ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	Expected	expected;
60ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos};
61ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
62ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosconst char* getMatchCaseExpectedDesc (MatchCase::Expected expected)
63ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos{
64ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	static const char* descs[] =
65ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
66ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		"no match",
67ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		"group to match",
68ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		"case to match"
69ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	};
70ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	return de::getSizedArrayElement<MatchCase::EXPECTED_LAST>(descs, expected);
71ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos}
72ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
73ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosclass CaseListParserCase : public tcu::TestCase
74ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos{
75ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulospublic:
76ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	CaseListParserCase (tcu::TestContext& testCtx, const char* name, const char* caseList, const MatchCase* subCases, int numSubCases)
77ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		: tcu::TestCase	(testCtx, name, "")
78ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		, m_caseList	(caseList)
79ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		, m_subCases	(subCases)
80ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		, m_numSubCases	(numSubCases)
81ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
82ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
83ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
84ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	IterateResult iterate (void)
85ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
86c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos		TestLog&							log		= m_testCtx.getLog();
87c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos		tcu::CommandLine					cmdLine;
88c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos		de::MovePtr<tcu::CaseListFilter>	caseListFilter;
89c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos		int									numPass	= 0;
90ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
91ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		log << TestLog::Message << "Input:\n\"" << m_caseList << "\"" << TestLog::EndMessage;
92ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
93ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
94ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			const char* argv[] =
95ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
96ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"deqp",
97ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"--deqp-caselist",
98ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				m_caseList
99ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
100ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
101ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			if (!cmdLine.parse(DE_LENGTH_OF_ARRAY(argv), argv))
102c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos				TCU_FAIL("Failed to parse command line");
103ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
104ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
105c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos		caseListFilter = cmdLine.createCaseListFilter(m_testCtx.getArchive());
106c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos
107ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		for (int subCaseNdx = 0; subCaseNdx < m_numSubCases; subCaseNdx++)
108ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
109ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			const MatchCase&	curCase		= m_subCases[subCaseNdx];
110ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			bool				matchGroup;
111ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			bool				matchCase;
112ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
113ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			log << TestLog::Message << "Checking \"" << curCase.path << "\""
114ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos									<< ", expecting " << getMatchCaseExpectedDesc(curCase.expected)
115ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				<< TestLog::EndMessage;
116ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
117c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos			matchGroup	= caseListFilter->checkTestGroupName(curCase.path);
118c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos			matchCase	= caseListFilter->checkTestCaseName(curCase.path);
119ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
120ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			if ((matchGroup	== (curCase.expected == MatchCase::MATCH_GROUP)) &&
121ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				(matchCase	== (curCase.expected == MatchCase::MATCH_CASE)))
122ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
123ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				log << TestLog::Message << "   pass" << TestLog::EndMessage;
124ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				numPass += 1;
125ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			}
126ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			else
127ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				log << TestLog::Message << "   FAIL!" << TestLog::EndMessage;
128ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
129ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
130ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		m_testCtx.setTestResult((numPass == m_numSubCases) ? QP_TEST_RESULT_PASS	: QP_TEST_RESULT_FAIL,
131ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos								(numPass == m_numSubCases) ? "All passed"			: "Unexpected match result");
132ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
133ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		return STOP;
134ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
135ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
136ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosprivate:
137ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	const char* const			m_caseList;
138ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	const MatchCase* const		m_subCases;
139ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	const int					m_numSubCases;
140ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos};
141ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
142ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosclass NegativeCaseListCase : public tcu::TestCase
143ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos{
144ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulospublic:
145ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	NegativeCaseListCase (tcu::TestContext& testCtx, const char* name, const char* caseList)
146ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		: tcu::TestCase	(testCtx, name, "")
147ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		, m_caseList	(caseList)
148ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
149ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
150ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
151ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	IterateResult iterate (void)
152ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
153ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		TestLog&			log		= m_testCtx.getLog();
154ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		tcu::CommandLine	cmdLine;
155ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
156ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		log << TestLog::Message << "Input:\n\"" << m_caseList << "\"" << TestLog::EndMessage;
157ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
158ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
159ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			const char* argv[] =
160ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
161ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"deqp",
162ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"--deqp-caselist",
163ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				m_caseList
164ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
165ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
166c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos			TCU_CHECK(cmdLine.parse(DE_LENGTH_OF_ARRAY(argv), argv));
167c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos
168c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos			try
169c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos			{
170c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos				de::UniquePtr<tcu::CaseListFilter>	filter	(cmdLine.createCaseListFilter(m_testCtx.getArchive()));
171c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos
172ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Parsing passed, should have failed");
173c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos			}
174c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos			catch (const std::invalid_argument& e)
175c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos			{
176c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos				log << TestLog::Message << e.what() << TestLog::EndMessage;
177ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Parsing failed as expected");
178c5cf5cb5dd01910d08bb5e600fea7179d89f9a68Pyry Haulos			}
179ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
180ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
181ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		return STOP;
182ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
183ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
184ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosprivate:
185ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	const char* const	m_caseList;
186ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos};
187ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
188ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosclass TrieParserTests : public tcu::TestCaseGroup
189ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos{
190ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulospublic:
191ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	TrieParserTests (tcu::TestContext& testCtx)
192ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		: tcu::TestCaseGroup(testCtx, "trie", "Test case trie parser tests")
193ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
194ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
195ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
196ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	void init (void)
197ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
198ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
199ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "{test}";
200ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
201ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
202ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "test",		MatchCase::MATCH_CASE	},
203ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "test.cd",	MatchCase::NO_MATCH		},
204ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
205ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "single_case", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
206ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
207ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
208ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "{a{b}}";
209ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
210ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
211ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
212ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
213ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
214ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
215ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
216ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "simple_group_1", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
217ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
218ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
219ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "{a{b,c}}";
220ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
221ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
222ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
223ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
224ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
225ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
226ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::MATCH_CASE	},
227ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
228ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "simple_group_2", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
229ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
230ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
231ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "{a{b},c{d,e}}";
232ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
233ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
234ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
235ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
236ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
237ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::NO_MATCH		},
238ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.d",	MatchCase::NO_MATCH		},
239ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.e",	MatchCase::NO_MATCH		},
240ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c",		MatchCase::MATCH_GROUP	},
241ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.b",	MatchCase::NO_MATCH		},
242ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.d",	MatchCase::MATCH_CASE	},
243ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.e",	MatchCase::MATCH_CASE	},
244ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
245ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "two_groups", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
246ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
247ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
248ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "{a,c{d,e}}";
249ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
250ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
251ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_CASE	},
252ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
253ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::NO_MATCH		},
254ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::NO_MATCH		},
255ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.d",	MatchCase::NO_MATCH		},
256ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.e",	MatchCase::NO_MATCH		},
257ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c",		MatchCase::MATCH_GROUP	},
258ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.b",	MatchCase::NO_MATCH		},
259ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.d",	MatchCase::MATCH_CASE	},
260ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.e",	MatchCase::MATCH_CASE	},
261ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
262ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "case_group", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
263ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
264ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
265ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "{c{d,e},a}";
266ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
267ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
268ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_CASE	},
269ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
270ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::NO_MATCH		},
271ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::NO_MATCH		},
272ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.d",	MatchCase::NO_MATCH		},
273ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.e",	MatchCase::NO_MATCH		},
274ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c",		MatchCase::MATCH_GROUP	},
275ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.b",	MatchCase::NO_MATCH		},
276ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.d",	MatchCase::MATCH_CASE	},
277ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.e",	MatchCase::MATCH_CASE	},
278ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
279ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "group_case", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
280ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
281831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		{
282831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			static const char* const	caseList	= "{test}\r";
283831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			static const MatchCase		subCases[]	=
284831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			{
285831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry				{ "test",		MatchCase::MATCH_CASE	},
286831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry				{ "test.cd",	MatchCase::NO_MATCH		},
287831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			};
288831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			addChild(new CaseListParserCase(m_testCtx, "trailing_cr", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
289831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		}
290831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		{
291831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			static const char* const	caseList	= "{test}\n";
292831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			static const MatchCase		subCases[]	=
293831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			{
294831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry				{ "test",		MatchCase::MATCH_CASE	},
295831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry				{ "test.cd",	MatchCase::NO_MATCH		},
296831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			};
297831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			addChild(new CaseListParserCase(m_testCtx, "trailing_lf", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
298831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		}
299831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		{
300831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			static const char* const	caseList	= "{test}\r\n";
301831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			static const MatchCase		subCases[]	=
302831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			{
303831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry				{ "test",		MatchCase::MATCH_CASE	},
304831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry				{ "test.cd",	MatchCase::NO_MATCH		},
305831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			};
306831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry			addChild(new CaseListParserCase(m_testCtx, "trailing_crlf", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
307831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		}
308ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
309ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		// Negative tests
310ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_string",			""));
311831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		addChild(new NegativeCaseListCase(m_testCtx, "empty_line",				"\n"));
312ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_root",				"{}"));
313ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_group",				"{test{}}"));
314ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_group_name_1",		"{{}}"));
315ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_group_name_2",		"{{test}}"));
316ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_1",		"{"));
317ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_2",		"{test"));
318ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_3",		"{test,"));
319ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_4",		"{test{a}"));
320ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_5",		"{a,b"));
321ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_group_1",	"{test{"));
322ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_group_2",	"{test{a"));
323ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_group_3",	"{test{a,"));
324ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_group_4",	"{test{a,b"));
325ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_case_name_1",		"{a,,b}"));
326ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_case_name_2",		"{,b}"));
327ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_case_name_3",		"{a,}"));
328ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "no_separator",			"{a{b}c}"));
329ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "invalid_char_1",			"{a.b}"));
330ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "invalid_char_2",			"{a[]}"));
331ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "trailing_char_1",			"{a}}"));
332ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "trailing_char_2",			"{a}x"));
333831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_1",		"{\na}"));
334831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_2",		"{a\n,b}"));
335831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_3",		"{a,\nb}"));
336831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_4",		"{a{b\n}}"));
337831962c779a19a1822b0074012763b604ac42d24Jarkko Pöyry		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_5",		"{a{b}\n}"));
338ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
339ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos};
340ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
341ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosclass ListParserTests : public tcu::TestCaseGroup
342ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos{
343ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulospublic:
344ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	ListParserTests (tcu::TestContext& testCtx)
345ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		: tcu::TestCaseGroup(testCtx, "list", "Test case list parser tests")
346ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
347ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
348ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
349ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	void init (void)
350ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
351ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
352ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "test";
353ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
354ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
355ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "test",		MatchCase::MATCH_CASE	},
356ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "test.cd",	MatchCase::NO_MATCH		},
357ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
358ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "single_case", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
359ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
360ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
361ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b";
362ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
363ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
364ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
365ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
366ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
367ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
368ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
369ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "simple_group_1", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
370ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
371ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
372ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b\na.c";
373ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
374ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
375ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
376ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
377ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
378ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
379ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::MATCH_CASE	},
380ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
381ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "simple_group_2", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
382ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
383ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
384ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b\na.c";
385ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
386ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
387ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
388ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
389ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
390ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
391ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::MATCH_CASE	},
392ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
393ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "separator_ln", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
394ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
395ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
396ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b\ra.c";
397ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
398ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
399ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
400ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
401ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
402ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
403ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::MATCH_CASE	},
404ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
405ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "separator_cr", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
406ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
407ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
408ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b\r\na.c";
409ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
410ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
411ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
412ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
413ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
414ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
415ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::MATCH_CASE	},
416ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
417ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "separator_crlf", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
418ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
419ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
420ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b\na.c\n";
421ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
422ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
423ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
424ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
425ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
426ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
427ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::MATCH_CASE	},
428ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
429ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "end_ln", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
430ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
431ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
432ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b\na.c\r";
433ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
434ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
435ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
436ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
437ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
438ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
439ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::MATCH_CASE	},
440ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
441ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "end_cr", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
442ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
443ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
444ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b\na.c\r\n";
445ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
446ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
447ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
448ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
449ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
450ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",	MatchCase::NO_MATCH		},
451ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::MATCH_CASE	},
452ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
453ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "end_crlf", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
454ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
455ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
456ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b\nc.d\nc.e";
457ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
458ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
459ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_GROUP	},
460ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
461ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::MATCH_CASE	},
462ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::NO_MATCH		},
463ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.d",	MatchCase::NO_MATCH		},
464ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.e",	MatchCase::NO_MATCH		},
465ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c",		MatchCase::MATCH_GROUP	},
466ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.b",	MatchCase::NO_MATCH		},
467ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.d",	MatchCase::MATCH_CASE	},
468ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.e",	MatchCase::MATCH_CASE	},
469ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
470ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "two_groups", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
471ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
472ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
473ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a\nc.d\nc.e";
474ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
475ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
476ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_CASE	},
477ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
478ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::NO_MATCH		},
479ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::NO_MATCH		},
480ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.d",	MatchCase::NO_MATCH		},
481ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.e",	MatchCase::NO_MATCH		},
482ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c",		MatchCase::MATCH_GROUP	},
483ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.b",	MatchCase::NO_MATCH		},
484ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.d",	MatchCase::MATCH_CASE	},
485ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.e",	MatchCase::MATCH_CASE	},
486ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
487ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "case_group", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
488ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
489ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
490ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "c.d\nc.e\na";
491ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
492ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
493ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",		MatchCase::MATCH_CASE	},
494ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",		MatchCase::NO_MATCH		},
495ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",	MatchCase::NO_MATCH		},
496ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.c",	MatchCase::NO_MATCH		},
497ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.d",	MatchCase::NO_MATCH		},
498ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.e",	MatchCase::NO_MATCH		},
499ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c",		MatchCase::MATCH_GROUP	},
500ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.b",	MatchCase::NO_MATCH		},
501ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.d",	MatchCase::MATCH_CASE	},
502ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "c.e",	MatchCase::MATCH_CASE	},
503ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
504ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "group_case", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
505ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
506ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
507ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	= "a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.x";
508ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
509ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
510ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",												MatchCase::MATCH_GROUP	},
511ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "b",												MatchCase::NO_MATCH		},
512ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",											MatchCase::MATCH_GROUP	},
513ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.x",	MatchCase::MATCH_CASE	},
514ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
515ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "long_name", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
516ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
517ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
518ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	=
519ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"a.b.c.d.e\n"
520ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"a.b.c.f\n"
521ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"x.y.z\n"
522ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"a.b.c.d.g\n"
523ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"a.b.c.x\n";
524ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
525ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
526ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",				MatchCase::MATCH_GROUP	},
527ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b",			MatchCase::MATCH_GROUP	},
528ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b.c.d.e",		MatchCase::MATCH_CASE	},
529ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b.c.d.g",		MatchCase::MATCH_CASE	},
530ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "x.y",			MatchCase::MATCH_GROUP	},
531ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "x.y.z",			MatchCase::MATCH_CASE	},
532ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b.c.f",		MatchCase::MATCH_CASE	},
533ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b.c.x",		MatchCase::MATCH_CASE	},
534ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
535ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "partial_prefix", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
536ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
537ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		{
538ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const char* const	caseList	=
539ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"a.a.c.d\n"
540ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				"a.b.c.d\n";
541ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			static const MatchCase		subCases[]	=
542ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			{
543ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a",				MatchCase::MATCH_GROUP	},
544ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.a",			MatchCase::MATCH_GROUP	},
545ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b.c.d",		MatchCase::MATCH_CASE	},
546ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos				{ "a.b.c.d",		MatchCase::MATCH_CASE	},
547ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			};
548ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos			addChild(new CaseListParserCase(m_testCtx, "reparenting", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
549ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		}
550ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
551ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		// Negative tests
552ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_string",			""));
553ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_line",				"\n"));
554ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_group_name",		".test"));
555ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new NegativeCaseListCase(m_testCtx, "empty_case_name",			"test."));
556ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
557ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos};
558ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
559ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulosclass CaseListParserTests : public tcu::TestCaseGroup
560ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos{
561ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulospublic:
562ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	CaseListParserTests (tcu::TestContext& testCtx)
563ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		: tcu::TestCaseGroup(testCtx, "case_list_parser", "Test case list parser tests")
564ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
565ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
566ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
567ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	void init (void)
568ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	{
569ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new TrieParserTests(m_testCtx));
570ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos		addChild(new ListParserTests(m_testCtx));
571ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos	}
572ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos};
573ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
574f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulosinline deUint32 ulpDiff (float a, float b)
575f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos{
576f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	const deUint32 ab = tcu::Float32(a).bits();
577f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	const deUint32 bb = tcu::Float32(b).bits();
578f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	return de::max(ab, bb) - de::min(ab, bb);
579f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos}
580f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
581f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulostemplate<int Size>
582f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulosinline tcu::Vector<deUint32, Size> ulpDiff (const tcu::Vector<float, Size>& a, const tcu::Vector<float,  Size>& b)
583f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos{
584f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	tcu::Vector<deUint32, Size> res;
585f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	for (int ndx = 0; ndx < Size; ndx++)
586f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		res[ndx] = ulpDiff(a[ndx], b[ndx]);
587f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	return res;
588f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos}
589f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
590f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulosclass ConstantInterpolationTest : public tcu::TestCase
591f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos{
592f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulospublic:
593f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	ConstantInterpolationTest (tcu::TestContext& testCtx)
594f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		: tcu::TestCase(testCtx, "const_interpolation", "Constant value interpolation")
595f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	{
596f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		const int supportedMsaaLevels[] = {1, 2, 4, 8, 16};
597f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
598f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		for (int msaaNdx = 0; msaaNdx < DE_LENGTH_OF_ARRAY(supportedMsaaLevels); msaaNdx++)
599f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		{
600f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const int numSamples = supportedMsaaLevels[msaaNdx];
601f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
602f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				SubCase c;
603f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.rtSize	= tcu::IVec3(128, 128, numSamples);
604f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[0]	= tcu::Vec4(-1.0f, -1.0f, 0.5f, 1.0f);
605f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[1]	= tcu::Vec4(-1.0f, +1.0f, 0.5f, 1.0f);
606f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[2]	= tcu::Vec4(+1.0f, -1.0f, 0.5f, 1.0f);
607f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.varying	= tcu::Vec4(0.0f, 1.0f, 8.0f, -8.0f);
608f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				m_cases.push_back(c);
609f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			}
610f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
611f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
612f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				SubCase c;
613f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.rtSize	= tcu::IVec3(128, 128, numSamples);
614f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[0]	= tcu::Vec4(-1.0f, +1.0f, 0.5f, 1.0f);
615f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[1]	= tcu::Vec4(+1.0f, -1.0f, 0.5f, 1.0f);
616f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[2]	= tcu::Vec4(+1.0f, +1.0f, 0.5f, 1.0f);
617f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.varying	= tcu::Vec4(0.0f, 1.0f, 8.0f, -8.0f);
618f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				m_cases.push_back(c);
619f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			}
620f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
621f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				SubCase c;
622f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.rtSize	= tcu::IVec3(129, 113, numSamples);
623f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[0]	= tcu::Vec4(-1.0f, -1.0f, 0.5f, 1.0f);
624f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[1]	= tcu::Vec4(-1.0f, +1.0f, 0.5f, 1.0f);
625f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[2]	= tcu::Vec4(+1.0f, -1.0f, 0.5f, 1.0f);
626f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.varying	= tcu::Vec4(0.0f, 1.0f, 8.0f, -8.0f);
627f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				m_cases.push_back(c);
628f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			}
629f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
630f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				SubCase c;
631f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.rtSize	= tcu::IVec3(107, 131, numSamples);
632f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[0]	= tcu::Vec4(-1.0f, +1.0f, 0.5f, 1.0f);
633f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[1]	= tcu::Vec4(+1.0f, -1.0f, 0.5f, 1.0f);
634f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.vtx[2]	= tcu::Vec4(+1.0f, +1.0f, 0.5f, 1.0f);
635f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.varying	= tcu::Vec4(0.0f, 1.0f, 8.0f, -8.0f);
636f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				m_cases.push_back(c);
637f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			}
638f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		}
639f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
640f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		{
641f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			de::Random rnd(0x89423f);
642f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			for (int ndx = 0; ndx < 25; ndx++)
643f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
644f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				const float	depth	= rnd.getFloat()*2.0f - 1.0f;
645f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				SubCase		c;
646f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
647f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.rtSize.x() = rnd.getInt(16, 256);
648f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.rtSize.y() = rnd.getInt(16, 256);
649f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				c.rtSize.z() = rnd.choose<int>(DE_ARRAY_BEGIN(supportedMsaaLevels), DE_ARRAY_END(supportedMsaaLevels));
650f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
651f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				for (int vtxNdx = 0; vtxNdx < DE_LENGTH_OF_ARRAY(c.vtx); vtxNdx++)
652f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				{
653f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					c.vtx[vtxNdx].x() = rnd.getFloat()*2.0f - 1.0f;
654f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					c.vtx[vtxNdx].y() = rnd.getFloat()*2.0f - 1.0f;
655f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					c.vtx[vtxNdx].z() = depth;
656f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					c.vtx[vtxNdx].w() = 1.0f;
657f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				}
658f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
659f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				for (int compNdx = 0; compNdx < 4; compNdx++)
660f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				{
661f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					float v;
662f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					do
663f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					{
664f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						v = tcu::Float32(rnd.getUint32()).asFloat();
665f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					} while (deFloatIsInf(v) || deFloatIsNaN(v));
666f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					c.varying[compNdx] = v;
667f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				}
668f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				m_cases.push_back(c);
669f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			}
670f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		}
671f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	}
672f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
673f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	void init (void)
674f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	{
675f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		m_caseIter = m_cases.begin();
676f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "All iterations passed");
677f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	}
678f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
679f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	IterateResult iterate (void)
680f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	{
681f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		{
682f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			tcu::ScopedLogSection section(m_testCtx.getLog(), "SubCase", "");
683f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			runCase(*m_caseIter);
684f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		}
685f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		return (++m_caseIter != m_cases.end()) ? CONTINUE : STOP;
686f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	}
687f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
688f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulosprotected:
689f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	struct SubCase
690f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	{
691f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		tcu::IVec3	rtSize;	// (width, height, samples)
692f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		tcu::Vec4	vtx[3];
693f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		tcu::Vec4	varying;
694f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	};
695f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
696f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	void runCase (const SubCase& subCase)
697f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	{
698f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		using namespace tcu;
699f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
700f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		const deUint32	maxColorUlpDiff	= 2;
701f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		const deUint32	maxDepthUlpDiff	= 0;
702f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
703f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		const int		width			= subCase.rtSize.x();
704f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		const int		height			= subCase.rtSize.y();
705f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		const int		numSamples		= subCase.rtSize.z();
706f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		const float		zn				= 0.0f;
707f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		const float		zf				= 1.0f;
708f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
709f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		TextureLevel	interpolated	(TextureFormat(TextureFormat::RGBA, TextureFormat::FLOAT), numSamples, width, height);
710f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		TextureLevel	depthStencil	(TextureFormat(TextureFormat::DS, TextureFormat::FLOAT_UNSIGNED_INT_24_8_REV), numSamples, width, height);
711f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
712f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		m_testCtx.getLog() << TestLog::Message
713f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						   << "RT size (w, h, #samples) = " << subCase.rtSize << "\n"
714f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						   << "vtx[0] = " << subCase.vtx[0] << "\n"
715f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						   << "vtx[1] = " << subCase.vtx[1] << "\n"
716f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						   << "vtx[2] = " << subCase.vtx[2] << "\n"
717f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						   << "color = " << subCase.varying
718f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						   << TestLog::EndMessage;
719f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
720f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		clear			(interpolated.getAccess(), subCase.varying - Vec4(0.0f, 0.0f, 0.0f, 1.0f));
721f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		clearDepth		(depthStencil.getAccess(), 0.0f);
722f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		clearStencil	(depthStencil.getAccess(), 0);
723f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
724f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		{
725f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			class VtxShader : public rr::VertexShader
726f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
727f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			public:
728f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				VtxShader (void)
729f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					: rr::VertexShader(2, 1)
730f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				{
731f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					m_inputs[0].type	= rr::GENERICVECTYPE_FLOAT;
732f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					m_inputs[1].type	= rr::GENERICVECTYPE_FLOAT;
733f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					m_outputs[0].type	= rr::GENERICVECTYPE_FLOAT;
734f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				}
735f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
736f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				void shadeVertices (const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const
737f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				{
738f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					for (int packetNdx = 0; packetNdx < numPackets; packetNdx++)
739f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					{
740f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						rr::readVertexAttrib(packets[packetNdx]->position, inputs[0], packets[packetNdx]->instanceNdx, packets[packetNdx]->vertexNdx);
741f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						packets[packetNdx]->outputs[0] = rr::readVertexAttribFloat(inputs[1], packets[packetNdx]->instanceNdx, packets[packetNdx]->vertexNdx);
742f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					}
743f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				}
744f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			} vtxShader;
745f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
746f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			class FragShader : public rr::FragmentShader
747f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
748f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			public:
749f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				FragShader (void)
750f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					: rr::FragmentShader(1, 1)
751f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				{
752f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					m_inputs[0].type	= rr::GENERICVECTYPE_FLOAT;
753f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					m_outputs[0].type	= rr::GENERICVECTYPE_FLOAT;
754f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				}
755f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
756f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				void shadeFragments (rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const
757f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				{
758f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					for (int packetNdx = 0; packetNdx < numPackets; packetNdx++)
759f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					{
760f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						for (int fragNdx = 0; fragNdx < rr::NUM_FRAGMENTS_PER_PACKET; fragNdx++)
761f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						{
762f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							const tcu::Vec4 interp = rr::readTriangleVarying<float>(packets[packetNdx], context, 0, fragNdx);
763f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							rr::writeFragmentOutput(context, packetNdx, fragNdx, 0, interp);
764f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						}
765f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					}
766f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				}
767f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			} fragShader;
768f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
769f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const rr::Program						program			(&vtxShader, &fragShader);
770f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
771f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const rr::MultisamplePixelBufferAccess	colorAccess		= rr::MultisamplePixelBufferAccess::fromMultisampleAccess(interpolated.getAccess());
772f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const rr::MultisamplePixelBufferAccess	dsAccess		= rr::MultisamplePixelBufferAccess::fromMultisampleAccess(depthStencil.getAccess());
773f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const rr::RenderTarget					renderTarget	(colorAccess, dsAccess, dsAccess);
774f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const rr::VertexAttrib					vertexAttribs[]	=
775f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
776f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				rr::VertexAttrib(rr::VERTEXATTRIBTYPE_FLOAT, 4, 0, 0, subCase.vtx),
777f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				rr::VertexAttrib(subCase.varying)
778f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			};
779f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			rr::ViewportState						viewport		(colorAccess);
780f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			rr::RenderState							state			(viewport);
781f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const rr::DrawCommand					drawCmd			(state, renderTarget, program, DE_LENGTH_OF_ARRAY(vertexAttribs), vertexAttribs, rr::PrimitiveList(rr::PRIMITIVETYPE_TRIANGLES, 3, 0));
782f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const rr::Renderer						renderer;
783f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
784f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			viewport.zn	= zn;
785f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			viewport.zf	= zf;
786f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
787f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			state.fragOps.depthTestEnabled							= true;
788f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			state.fragOps.depthFunc									= rr::TESTFUNC_ALWAYS;
789f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			state.fragOps.stencilTestEnabled						= true;
790f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			state.fragOps.stencilStates[rr::FACETYPE_BACK].func		= rr::TESTFUNC_ALWAYS;
791f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			state.fragOps.stencilStates[rr::FACETYPE_BACK].dpPass	= rr::STENCILOP_INCR;
792f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			state.fragOps.stencilStates[rr::FACETYPE_FRONT]			= state.fragOps.stencilStates[rr::FACETYPE_BACK];
793f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
794f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			renderer.draw(drawCmd);
795f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		}
796f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
797f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		// Verify interpolated values
798f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		{
799f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			TextureLevel					resolvedColor			(interpolated.getFormat(), width, height); // For debugging
800f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			TextureLevel					resolvedDepthStencil	(depthStencil.getFormat(), width, height); // For debugging
801f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			TextureLevel					errorMask				(TextureFormat(TextureFormat::RGB, TextureFormat::UNORM_INT8), width, height);
802f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const ConstPixelBufferAccess	interpAccess			= interpolated.getAccess();
803f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const ConstPixelBufferAccess	dsAccess				= depthStencil.getAccess();
804f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const PixelBufferAccess			errorAccess				= errorMask.getAccess();
805f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			int								numCoveredSamples		= 0;
806f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			int								numFailedColorSamples	= 0;
807f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			int								numFailedDepthSamples	= 0;
808f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const bool						verifyDepth				= (subCase.vtx[0].z() == subCase.vtx[1].z()) &&
809f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos																	  (subCase.vtx[1].z() == subCase.vtx[2].z());
810f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			const float						refDepth				= subCase.vtx[0].z()*(zf - zn)/2.0f + (zn + zf)/2.0f;
811f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
812fcbb91dc538f174f8798417e5a44f74ec2b092c0Jarkko Pöyry			rr::resolveMultisampleBuffer(resolvedColor.getAccess(), rr::MultisampleConstPixelBufferAccess::fromMultisampleAccess(interpolated.getAccess()));
813fcbb91dc538f174f8798417e5a44f74ec2b092c0Jarkko Pöyry			rr::resolveMultisampleBuffer(resolvedDepthStencil.getAccess(), rr::MultisampleConstPixelBufferAccess::fromMultisampleAccess(depthStencil.getAccess()));
814f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			clear(errorAccess, Vec4(0.0f, 1.0f, 0.0f, 1.0f));
815f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
816f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			for (int y = 0; y < height; y++)
817f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
818f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				for (int x = 0; x < width; x++)
819f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				{
820f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					for (int sampleNdx = 0; sampleNdx < numSamples; sampleNdx++)
821f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					{
822f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						if (dsAccess.getPixStencil(sampleNdx, x, y) != 0)
823f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						{
824f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							const Vec4		color		= interpAccess.getPixel(sampleNdx, x, y);
825f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							const UVec4		colorDiff	= ulpDiff(color, subCase.varying);
826f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							const bool		colorOk		= boolAll(lessThanEqual(colorDiff, tcu::UVec4(maxColorUlpDiff)));
827f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
828f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							const float		depth		= dsAccess.getPixDepth(sampleNdx, x, y);
829f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							const deUint32	depthDiff	= ulpDiff(depth, refDepth);
830f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							const bool		depthOk		= verifyDepth && (depthDiff <= maxDepthUlpDiff);
831f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
832f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							const int		maxMsgs		= 10;
833f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
834f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							numCoveredSamples += 1;
835f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
836f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							if (!colorOk)
837f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							{
838f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos								numFailedColorSamples += 1;
839f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
840f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos								if (numFailedColorSamples <= maxMsgs)
841f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos									m_testCtx.getLog() << TestLog::Message
842f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos													   << "FAIL: " << tcu::IVec3(x, y, sampleNdx)
843f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos													   << " color ulp diff = " << colorDiff
844f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos													   << TestLog::EndMessage;
845f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							}
846f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
847f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							if (!depthOk)
848f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos								numFailedDepthSamples += 1;
849f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
850f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							if (!colorOk || !depthOk)
851f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos								errorAccess.setPixel(errorAccess.getPixel(x, y) + Vec4(1.0f, -1.0f, 0.0f, 0.0f) / float(numSamples-1), x, y);
852f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos						}
853f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					}
854f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				}
855f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			}
856f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
857f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			m_testCtx.getLog() << TestLog::Image("ResolvedColor", "Resolved colorbuffer", resolvedColor)
858f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos							   << TestLog::Image("ResolvedDepthStencil", "Resolved depth- & stencilbuffer", resolvedDepthStencil);
859f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
860f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			if (numFailedColorSamples != 0 || numFailedDepthSamples != 0)
861f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			{
862f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				m_testCtx.getLog() << TestLog::Image("ErrorMask", "Error mask", errorMask);
863f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
864f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				if (numFailedColorSamples != 0)
865f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					m_testCtx.getLog() << TestLog::Message << "FAIL: Found " << numFailedColorSamples << " invalid color samples!" << TestLog::EndMessage;
866f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
867f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				if (numFailedDepthSamples != 0)
868f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					m_testCtx.getLog() << TestLog::Message << "FAIL: Found " << numFailedDepthSamples << " invalid depth samples!" << TestLog::EndMessage;
869f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
870f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos				if (m_testCtx.getTestResult() == QP_TEST_RESULT_PASS)
871f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos					m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Invalid samples found");
872f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			}
873f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
874f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			m_testCtx.getLog() << TestLog::Message << (numCoveredSamples-numFailedColorSamples) << " / " << numCoveredSamples << " color samples passed" << TestLog::EndMessage;
875f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos			m_testCtx.getLog() << TestLog::Message << (numCoveredSamples-numFailedDepthSamples) << " / " << numCoveredSamples << " depth samples passed" << TestLog::EndMessage;
876f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		}
877f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	}
878f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
879f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	vector<SubCase>					m_cases;
880f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	vector<SubCase>::const_iterator	m_caseIter;
881f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos};
882f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
8833c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass CommonFrameworkTests : public tcu::TestCaseGroup
8843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8853c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
8863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	CommonFrameworkTests (tcu::TestContext& testCtx)
8873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: tcu::TestCaseGroup(testCtx, "common", "Tests for the common utility framework")
8883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void init (void)
8923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
8933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		addChild(new SelfCheckCase(m_testCtx, "float_format","tcu::FloatFormat_selfTest()",
8943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry								   tcu::FloatFormat_selfTest));
895f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi		addChild(new SelfCheckCase(m_testCtx, "either","tcu::Either_selfTest()",
896f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi								   tcu::Either_selfTest));
8973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
8983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
8993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
900f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulosclass ReferenceRendererTests : public tcu::TestCaseGroup
901f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos{
902f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulospublic:
903f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	ReferenceRendererTests (tcu::TestContext& testCtx)
904f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		: tcu::TestCaseGroup(testCtx, "reference_renderer", "Reference renderer tests")
905f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	{
906f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	}
907f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
908f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	void init (void)
909f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	{
910f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos		addChild(new ConstantInterpolationTest(m_testCtx));
911f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	}
912f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos};
913f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos
914ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos} // anonymous
915ee2e173d445e87e1f98245f4377f66b081cc320dPyry Haulos
9163c827367444ee418f129b2c238299f49d3264554Jarkko PoyryFrameworkTests::FrameworkTests (tcu::TestContext& testCtx)
9173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	: tcu::TestCaseGroup(testCtx, "framework", "Miscellaneous framework tests")
9183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9213c827367444ee418f129b2c238299f49d3264554Jarkko PoyryFrameworkTests::~FrameworkTests (void)
9223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
9233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
9253c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid FrameworkTests::init (void)
9263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
927ee2e92c10d529b2be9ef1279655f9b65a3f1a407Jarkko Pöyry	addChild(new CommonFrameworkTests	(m_testCtx));
928ee2e92c10d529b2be9ef1279655f9b65a3f1a407Jarkko Pöyry	addChild(new CaseListParserTests	(m_testCtx));
929f4238ec8ad0e9b0995142dc3b0b9a18de167ae3fPyry Haulos	addChild(new ReferenceRendererTests	(m_testCtx));
930e2145884f87cdca749a754abfd246cdfe01ea2c1Pyry Haulos	addChild(createTextureFormatTests	(m_testCtx));
931efb83e1354edd463650ad0404b18e9a7efc307e4Pyry Haulos	addChild(createAstcTests			(m_testCtx));
9320820e8d122596ff51f723f8a4f32fa755fbbda23Pyry Haulos	addChild(createVulkanTests			(m_testCtx));
9333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
9343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
935e2145884f87cdca749a754abfd246cdfe01ea2c1Pyry Haulos} // dit
936