Home | History | Annotate | Download | only in internal
      1 /*-------------------------------------------------------------------------
      2  * drawElements Internal Test Module
      3  * ---------------------------------
      4  *
      5  * Copyright 2014 The Android Open Source Project
      6  *
      7  * Licensed under the Apache License, Version 2.0 (the "License");
      8  * you may not use this file except in compliance with the License.
      9  * You may obtain a copy of the License at
     10  *
     11  *      http://www.apache.org/licenses/LICENSE-2.0
     12  *
     13  * Unless required by applicable law or agreed to in writing, software
     14  * distributed under the License is distributed on an "AS IS" BASIS,
     15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16  * See the License for the specific language governing permissions and
     17  * limitations under the License.
     18  *
     19  *//*!
     20  * \file
     21  * \brief Miscellaneous framework tests.
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "ditFrameworkTests.hpp"
     25 #include "tcuFloatFormat.hpp"
     26 #include "tcuTestLog.hpp"
     27 #include "tcuCommandLine.hpp"
     28 
     29 namespace dit
     30 {
     31 
     32 namespace
     33 {
     34 
     35 using std::string;
     36 using std::vector;
     37 using tcu::TestLog;
     38 
     39 struct MatchCase
     40 {
     41 	enum Expected { NO_MATCH, MATCH_GROUP, MATCH_CASE, EXPECTED_LAST };
     42 
     43 	const char*	path;
     44 	Expected	expected;
     45 };
     46 
     47 const char* getMatchCaseExpectedDesc (MatchCase::Expected expected)
     48 {
     49 	static const char* descs[] =
     50 	{
     51 		"no match",
     52 		"group to match",
     53 		"case to match"
     54 	};
     55 	return de::getSizedArrayElement<MatchCase::EXPECTED_LAST>(descs, expected);
     56 }
     57 
     58 class CaseListParserCase : public tcu::TestCase
     59 {
     60 public:
     61 	CaseListParserCase (tcu::TestContext& testCtx, const char* name, const char* caseList, const MatchCase* subCases, int numSubCases)
     62 		: tcu::TestCase	(testCtx, name, "")
     63 		, m_caseList	(caseList)
     64 		, m_subCases	(subCases)
     65 		, m_numSubCases	(numSubCases)
     66 	{
     67 	}
     68 
     69 	IterateResult iterate (void)
     70 	{
     71 		TestLog&			log		= m_testCtx.getLog();
     72 		tcu::CommandLine	cmdLine;
     73 		int					numPass	= 0;
     74 
     75 		log << TestLog::Message << "Input:\n\"" << m_caseList << "\"" << TestLog::EndMessage;
     76 
     77 		{
     78 			const char* argv[] =
     79 			{
     80 				"deqp",
     81 				"--deqp-caselist",
     82 				m_caseList
     83 			};
     84 
     85 			if (!cmdLine.parse(DE_LENGTH_OF_ARRAY(argv), argv))
     86 				TCU_FAIL("Failed to parse case list");
     87 		}
     88 
     89 		for (int subCaseNdx = 0; subCaseNdx < m_numSubCases; subCaseNdx++)
     90 		{
     91 			const MatchCase&	curCase		= m_subCases[subCaseNdx];
     92 			bool				matchGroup;
     93 			bool				matchCase;
     94 
     95 			log << TestLog::Message << "Checking \"" << curCase.path << "\""
     96 									<< ", expecting " << getMatchCaseExpectedDesc(curCase.expected)
     97 				<< TestLog::EndMessage;
     98 
     99 			matchGroup	= cmdLine.checkTestGroupName(curCase.path);
    100 			matchCase	= cmdLine.checkTestCaseName(curCase.path);
    101 
    102 			if ((matchGroup	== (curCase.expected == MatchCase::MATCH_GROUP)) &&
    103 				(matchCase	== (curCase.expected == MatchCase::MATCH_CASE)))
    104 			{
    105 				log << TestLog::Message << "   pass" << TestLog::EndMessage;
    106 				numPass += 1;
    107 			}
    108 			else
    109 				log << TestLog::Message << "   FAIL!" << TestLog::EndMessage;
    110 		}
    111 
    112 		m_testCtx.setTestResult((numPass == m_numSubCases) ? QP_TEST_RESULT_PASS	: QP_TEST_RESULT_FAIL,
    113 								(numPass == m_numSubCases) ? "All passed"			: "Unexpected match result");
    114 
    115 		return STOP;
    116 	}
    117 
    118 private:
    119 	const char* const			m_caseList;
    120 	const MatchCase* const		m_subCases;
    121 	const int					m_numSubCases;
    122 };
    123 
    124 class NegativeCaseListCase : public tcu::TestCase
    125 {
    126 public:
    127 	NegativeCaseListCase (tcu::TestContext& testCtx, const char* name, const char* caseList)
    128 		: tcu::TestCase	(testCtx, name, "")
    129 		, m_caseList	(caseList)
    130 	{
    131 	}
    132 
    133 	IterateResult iterate (void)
    134 	{
    135 		TestLog&			log		= m_testCtx.getLog();
    136 		tcu::CommandLine	cmdLine;
    137 
    138 		log << TestLog::Message << "Input:\n\"" << m_caseList << "\"" << TestLog::EndMessage;
    139 
    140 		{
    141 			const char* argv[] =
    142 			{
    143 				"deqp",
    144 				"--deqp-caselist",
    145 				m_caseList
    146 			};
    147 
    148 			if (cmdLine.parse(DE_LENGTH_OF_ARRAY(argv), argv))
    149 				m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Parsing passed, should have failed");
    150 			else
    151 				m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Parsing failed as expected");
    152 		}
    153 
    154 		return STOP;
    155 	}
    156 
    157 private:
    158 	const char* const	m_caseList;
    159 };
    160 
    161 class TrieParserTests : public tcu::TestCaseGroup
    162 {
    163 public:
    164 	TrieParserTests (tcu::TestContext& testCtx)
    165 		: tcu::TestCaseGroup(testCtx, "trie", "Test case trie parser tests")
    166 	{
    167 	}
    168 
    169 	void init (void)
    170 	{
    171 		{
    172 			static const char* const	caseList	= "{test}";
    173 			static const MatchCase		subCases[]	=
    174 			{
    175 				{ "test",		MatchCase::MATCH_CASE	},
    176 				{ "test.cd",	MatchCase::NO_MATCH		},
    177 			};
    178 			addChild(new CaseListParserCase(m_testCtx, "single_case", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    179 		}
    180 		{
    181 			static const char* const	caseList	= "{a{b}}";
    182 			static const MatchCase		subCases[]	=
    183 			{
    184 				{ "a",		MatchCase::MATCH_GROUP	},
    185 				{ "b",		MatchCase::NO_MATCH		},
    186 				{ "a.b",	MatchCase::MATCH_CASE	},
    187 				{ "a.a",	MatchCase::NO_MATCH		},
    188 			};
    189 			addChild(new CaseListParserCase(m_testCtx, "simple_group_1", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    190 		}
    191 		{
    192 			static const char* const	caseList	= "{a{b,c}}";
    193 			static const MatchCase		subCases[]	=
    194 			{
    195 				{ "a",		MatchCase::MATCH_GROUP	},
    196 				{ "b",		MatchCase::NO_MATCH		},
    197 				{ "a.b",	MatchCase::MATCH_CASE	},
    198 				{ "a.a",	MatchCase::NO_MATCH		},
    199 				{ "a.c",	MatchCase::MATCH_CASE	},
    200 			};
    201 			addChild(new CaseListParserCase(m_testCtx, "simple_group_2", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    202 		}
    203 		{
    204 			static const char* const	caseList	= "{a{b},c{d,e}}";
    205 			static const MatchCase		subCases[]	=
    206 			{
    207 				{ "a",		MatchCase::MATCH_GROUP	},
    208 				{ "b",		MatchCase::NO_MATCH		},
    209 				{ "a.b",	MatchCase::MATCH_CASE	},
    210 				{ "a.c",	MatchCase::NO_MATCH		},
    211 				{ "a.d",	MatchCase::NO_MATCH		},
    212 				{ "a.e",	MatchCase::NO_MATCH		},
    213 				{ "c",		MatchCase::MATCH_GROUP	},
    214 				{ "c.b",	MatchCase::NO_MATCH		},
    215 				{ "c.d",	MatchCase::MATCH_CASE	},
    216 				{ "c.e",	MatchCase::MATCH_CASE	},
    217 			};
    218 			addChild(new CaseListParserCase(m_testCtx, "two_groups", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    219 		}
    220 		{
    221 			static const char* const	caseList	= "{a,c{d,e}}";
    222 			static const MatchCase		subCases[]	=
    223 			{
    224 				{ "a",		MatchCase::MATCH_CASE	},
    225 				{ "b",		MatchCase::NO_MATCH		},
    226 				{ "a.b",	MatchCase::NO_MATCH		},
    227 				{ "a.c",	MatchCase::NO_MATCH		},
    228 				{ "a.d",	MatchCase::NO_MATCH		},
    229 				{ "a.e",	MatchCase::NO_MATCH		},
    230 				{ "c",		MatchCase::MATCH_GROUP	},
    231 				{ "c.b",	MatchCase::NO_MATCH		},
    232 				{ "c.d",	MatchCase::MATCH_CASE	},
    233 				{ "c.e",	MatchCase::MATCH_CASE	},
    234 			};
    235 			addChild(new CaseListParserCase(m_testCtx, "case_group", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    236 		}
    237 		{
    238 			static const char* const	caseList	= "{c{d,e},a}";
    239 			static const MatchCase		subCases[]	=
    240 			{
    241 				{ "a",		MatchCase::MATCH_CASE	},
    242 				{ "b",		MatchCase::NO_MATCH		},
    243 				{ "a.b",	MatchCase::NO_MATCH		},
    244 				{ "a.c",	MatchCase::NO_MATCH		},
    245 				{ "a.d",	MatchCase::NO_MATCH		},
    246 				{ "a.e",	MatchCase::NO_MATCH		},
    247 				{ "c",		MatchCase::MATCH_GROUP	},
    248 				{ "c.b",	MatchCase::NO_MATCH		},
    249 				{ "c.d",	MatchCase::MATCH_CASE	},
    250 				{ "c.e",	MatchCase::MATCH_CASE	},
    251 			};
    252 			addChild(new CaseListParserCase(m_testCtx, "group_case", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    253 		}
    254 		{
    255 			static const char* const	caseList	= "{test}\r";
    256 			static const MatchCase		subCases[]	=
    257 			{
    258 				{ "test",		MatchCase::MATCH_CASE	},
    259 				{ "test.cd",	MatchCase::NO_MATCH		},
    260 			};
    261 			addChild(new CaseListParserCase(m_testCtx, "trailing_cr", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    262 		}
    263 		{
    264 			static const char* const	caseList	= "{test}\n";
    265 			static const MatchCase		subCases[]	=
    266 			{
    267 				{ "test",		MatchCase::MATCH_CASE	},
    268 				{ "test.cd",	MatchCase::NO_MATCH		},
    269 			};
    270 			addChild(new CaseListParserCase(m_testCtx, "trailing_lf", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    271 		}
    272 		{
    273 			static const char* const	caseList	= "{test}\r\n";
    274 			static const MatchCase		subCases[]	=
    275 			{
    276 				{ "test",		MatchCase::MATCH_CASE	},
    277 				{ "test.cd",	MatchCase::NO_MATCH		},
    278 			};
    279 			addChild(new CaseListParserCase(m_testCtx, "trailing_crlf", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    280 		}
    281 
    282 		// Negative tests
    283 		addChild(new NegativeCaseListCase(m_testCtx, "empty_string",			""));
    284 		addChild(new NegativeCaseListCase(m_testCtx, "empty_line",				"\n"));
    285 		addChild(new NegativeCaseListCase(m_testCtx, "empty_root",				"{}"));
    286 		addChild(new NegativeCaseListCase(m_testCtx, "empty_group",				"{test{}}"));
    287 		addChild(new NegativeCaseListCase(m_testCtx, "empty_group_name_1",		"{{}}"));
    288 		addChild(new NegativeCaseListCase(m_testCtx, "empty_group_name_2",		"{{test}}"));
    289 		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_1",		"{"));
    290 		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_2",		"{test"));
    291 		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_3",		"{test,"));
    292 		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_4",		"{test{a}"));
    293 		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_root_5",		"{a,b"));
    294 		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_group_1",	"{test{"));
    295 		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_group_2",	"{test{a"));
    296 		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_group_3",	"{test{a,"));
    297 		addChild(new NegativeCaseListCase(m_testCtx, "unterminated_group_4",	"{test{a,b"));
    298 		addChild(new NegativeCaseListCase(m_testCtx, "empty_case_name_1",		"{a,,b}"));
    299 		addChild(new NegativeCaseListCase(m_testCtx, "empty_case_name_2",		"{,b}"));
    300 		addChild(new NegativeCaseListCase(m_testCtx, "empty_case_name_3",		"{a,}"));
    301 		addChild(new NegativeCaseListCase(m_testCtx, "no_separator",			"{a{b}c}"));
    302 		addChild(new NegativeCaseListCase(m_testCtx, "invalid_char_1",			"{a.b}"));
    303 		addChild(new NegativeCaseListCase(m_testCtx, "invalid_char_2",			"{a[]}"));
    304 		addChild(new NegativeCaseListCase(m_testCtx, "trailing_char_1",			"{a}}"));
    305 		addChild(new NegativeCaseListCase(m_testCtx, "trailing_char_2",			"{a}x"));
    306 		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_1",		"{\na}"));
    307 		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_2",		"{a\n,b}"));
    308 		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_3",		"{a,\nb}"));
    309 		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_4",		"{a{b\n}}"));
    310 		addChild(new NegativeCaseListCase(m_testCtx, "embedded_newline_5",		"{a{b}\n}"));
    311 	}
    312 };
    313 
    314 class ListParserTests : public tcu::TestCaseGroup
    315 {
    316 public:
    317 	ListParserTests (tcu::TestContext& testCtx)
    318 		: tcu::TestCaseGroup(testCtx, "list", "Test case list parser tests")
    319 	{
    320 	}
    321 
    322 	void init (void)
    323 	{
    324 		{
    325 			static const char* const	caseList	= "test";
    326 			static const MatchCase		subCases[]	=
    327 			{
    328 				{ "test",		MatchCase::MATCH_CASE	},
    329 				{ "test.cd",	MatchCase::NO_MATCH		},
    330 			};
    331 			addChild(new CaseListParserCase(m_testCtx, "single_case", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    332 		}
    333 		{
    334 			static const char* const	caseList	= "a.b";
    335 			static const MatchCase		subCases[]	=
    336 			{
    337 				{ "a",		MatchCase::MATCH_GROUP	},
    338 				{ "b",		MatchCase::NO_MATCH		},
    339 				{ "a.b",	MatchCase::MATCH_CASE	},
    340 				{ "a.a",	MatchCase::NO_MATCH		},
    341 			};
    342 			addChild(new CaseListParserCase(m_testCtx, "simple_group_1", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    343 		}
    344 		{
    345 			static const char* const	caseList	= "a.b\na.c";
    346 			static const MatchCase		subCases[]	=
    347 			{
    348 				{ "a",		MatchCase::MATCH_GROUP	},
    349 				{ "b",		MatchCase::NO_MATCH		},
    350 				{ "a.b",	MatchCase::MATCH_CASE	},
    351 				{ "a.a",	MatchCase::NO_MATCH		},
    352 				{ "a.c",	MatchCase::MATCH_CASE	},
    353 			};
    354 			addChild(new CaseListParserCase(m_testCtx, "simple_group_2", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    355 		}
    356 		{
    357 			static const char* const	caseList	= "a.b\na.c";
    358 			static const MatchCase		subCases[]	=
    359 			{
    360 				{ "a",		MatchCase::MATCH_GROUP	},
    361 				{ "b",		MatchCase::NO_MATCH		},
    362 				{ "a.b",	MatchCase::MATCH_CASE	},
    363 				{ "a.a",	MatchCase::NO_MATCH		},
    364 				{ "a.c",	MatchCase::MATCH_CASE	},
    365 			};
    366 			addChild(new CaseListParserCase(m_testCtx, "separator_ln", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    367 		}
    368 		{
    369 			static const char* const	caseList	= "a.b\ra.c";
    370 			static const MatchCase		subCases[]	=
    371 			{
    372 				{ "a",		MatchCase::MATCH_GROUP	},
    373 				{ "b",		MatchCase::NO_MATCH		},
    374 				{ "a.b",	MatchCase::MATCH_CASE	},
    375 				{ "a.a",	MatchCase::NO_MATCH		},
    376 				{ "a.c",	MatchCase::MATCH_CASE	},
    377 			};
    378 			addChild(new CaseListParserCase(m_testCtx, "separator_cr", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    379 		}
    380 		{
    381 			static const char* const	caseList	= "a.b\r\na.c";
    382 			static const MatchCase		subCases[]	=
    383 			{
    384 				{ "a",		MatchCase::MATCH_GROUP	},
    385 				{ "b",		MatchCase::NO_MATCH		},
    386 				{ "a.b",	MatchCase::MATCH_CASE	},
    387 				{ "a.a",	MatchCase::NO_MATCH		},
    388 				{ "a.c",	MatchCase::MATCH_CASE	},
    389 			};
    390 			addChild(new CaseListParserCase(m_testCtx, "separator_crlf", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    391 		}
    392 		{
    393 			static const char* const	caseList	= "a.b\na.c\n";
    394 			static const MatchCase		subCases[]	=
    395 			{
    396 				{ "a",		MatchCase::MATCH_GROUP	},
    397 				{ "b",		MatchCase::NO_MATCH		},
    398 				{ "a.b",	MatchCase::MATCH_CASE	},
    399 				{ "a.a",	MatchCase::NO_MATCH		},
    400 				{ "a.c",	MatchCase::MATCH_CASE	},
    401 			};
    402 			addChild(new CaseListParserCase(m_testCtx, "end_ln", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    403 		}
    404 		{
    405 			static const char* const	caseList	= "a.b\na.c\r";
    406 			static const MatchCase		subCases[]	=
    407 			{
    408 				{ "a",		MatchCase::MATCH_GROUP	},
    409 				{ "b",		MatchCase::NO_MATCH		},
    410 				{ "a.b",	MatchCase::MATCH_CASE	},
    411 				{ "a.a",	MatchCase::NO_MATCH		},
    412 				{ "a.c",	MatchCase::MATCH_CASE	},
    413 			};
    414 			addChild(new CaseListParserCase(m_testCtx, "end_cr", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    415 		}
    416 		{
    417 			static const char* const	caseList	= "a.b\na.c\r\n";
    418 			static const MatchCase		subCases[]	=
    419 			{
    420 				{ "a",		MatchCase::MATCH_GROUP	},
    421 				{ "b",		MatchCase::NO_MATCH		},
    422 				{ "a.b",	MatchCase::MATCH_CASE	},
    423 				{ "a.a",	MatchCase::NO_MATCH		},
    424 				{ "a.c",	MatchCase::MATCH_CASE	},
    425 			};
    426 			addChild(new CaseListParserCase(m_testCtx, "end_crlf", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    427 		}
    428 		{
    429 			static const char* const	caseList	= "a.b\nc.d\nc.e";
    430 			static const MatchCase		subCases[]	=
    431 			{
    432 				{ "a",		MatchCase::MATCH_GROUP	},
    433 				{ "b",		MatchCase::NO_MATCH		},
    434 				{ "a.b",	MatchCase::MATCH_CASE	},
    435 				{ "a.c",	MatchCase::NO_MATCH		},
    436 				{ "a.d",	MatchCase::NO_MATCH		},
    437 				{ "a.e",	MatchCase::NO_MATCH		},
    438 				{ "c",		MatchCase::MATCH_GROUP	},
    439 				{ "c.b",	MatchCase::NO_MATCH		},
    440 				{ "c.d",	MatchCase::MATCH_CASE	},
    441 				{ "c.e",	MatchCase::MATCH_CASE	},
    442 			};
    443 			addChild(new CaseListParserCase(m_testCtx, "two_groups", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    444 		}
    445 		{
    446 			static const char* const	caseList	= "a\nc.d\nc.e";
    447 			static const MatchCase		subCases[]	=
    448 			{
    449 				{ "a",		MatchCase::MATCH_CASE	},
    450 				{ "b",		MatchCase::NO_MATCH		},
    451 				{ "a.b",	MatchCase::NO_MATCH		},
    452 				{ "a.c",	MatchCase::NO_MATCH		},
    453 				{ "a.d",	MatchCase::NO_MATCH		},
    454 				{ "a.e",	MatchCase::NO_MATCH		},
    455 				{ "c",		MatchCase::MATCH_GROUP	},
    456 				{ "c.b",	MatchCase::NO_MATCH		},
    457 				{ "c.d",	MatchCase::MATCH_CASE	},
    458 				{ "c.e",	MatchCase::MATCH_CASE	},
    459 			};
    460 			addChild(new CaseListParserCase(m_testCtx, "case_group", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    461 		}
    462 		{
    463 			static const char* const	caseList	= "c.d\nc.e\na";
    464 			static const MatchCase		subCases[]	=
    465 			{
    466 				{ "a",		MatchCase::MATCH_CASE	},
    467 				{ "b",		MatchCase::NO_MATCH		},
    468 				{ "a.b",	MatchCase::NO_MATCH		},
    469 				{ "a.c",	MatchCase::NO_MATCH		},
    470 				{ "a.d",	MatchCase::NO_MATCH		},
    471 				{ "a.e",	MatchCase::NO_MATCH		},
    472 				{ "c",		MatchCase::MATCH_GROUP	},
    473 				{ "c.b",	MatchCase::NO_MATCH		},
    474 				{ "c.d",	MatchCase::MATCH_CASE	},
    475 				{ "c.e",	MatchCase::MATCH_CASE	},
    476 			};
    477 			addChild(new CaseListParserCase(m_testCtx, "group_case", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    478 		}
    479 		{
    480 			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";
    481 			static const MatchCase		subCases[]	=
    482 			{
    483 				{ "a",												MatchCase::MATCH_GROUP	},
    484 				{ "b",												MatchCase::NO_MATCH		},
    485 				{ "a.b",											MatchCase::MATCH_GROUP	},
    486 				{ "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	},
    487 			};
    488 			addChild(new CaseListParserCase(m_testCtx, "long_name", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    489 		}
    490 		{
    491 			static const char* const	caseList	=
    492 				"a.b.c.d.e\n"
    493 				"a.b.c.f\n"
    494 				"x.y.z\n"
    495 				"a.b.c.d.g\n"
    496 				"a.b.c.x\n";
    497 			static const MatchCase		subCases[]	=
    498 			{
    499 				{ "a",				MatchCase::MATCH_GROUP	},
    500 				{ "a.b",			MatchCase::MATCH_GROUP	},
    501 				{ "a.b.c.d.e",		MatchCase::MATCH_CASE	},
    502 				{ "a.b.c.d.g",		MatchCase::MATCH_CASE	},
    503 				{ "x.y",			MatchCase::MATCH_GROUP	},
    504 				{ "x.y.z",			MatchCase::MATCH_CASE	},
    505 				{ "a.b.c.f",		MatchCase::MATCH_CASE	},
    506 				{ "a.b.c.x",		MatchCase::MATCH_CASE	},
    507 			};
    508 			addChild(new CaseListParserCase(m_testCtx, "partial_prefix", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    509 		}
    510 		{
    511 			static const char* const	caseList	=
    512 				"a.a.c.d\n"
    513 				"a.b.c.d\n";
    514 			static const MatchCase		subCases[]	=
    515 			{
    516 				{ "a",				MatchCase::MATCH_GROUP	},
    517 				{ "a.a",			MatchCase::MATCH_GROUP	},
    518 				{ "a.b.c.d",		MatchCase::MATCH_CASE	},
    519 				{ "a.b.c.d",		MatchCase::MATCH_CASE	},
    520 			};
    521 			addChild(new CaseListParserCase(m_testCtx, "reparenting", caseList, subCases, DE_LENGTH_OF_ARRAY(subCases)));
    522 		}
    523 
    524 		// Negative tests
    525 		addChild(new NegativeCaseListCase(m_testCtx, "empty_string",			""));
    526 		addChild(new NegativeCaseListCase(m_testCtx, "empty_line",				"\n"));
    527 		addChild(new NegativeCaseListCase(m_testCtx, "empty_group_name",		".test"));
    528 		addChild(new NegativeCaseListCase(m_testCtx, "empty_case_name",			"test."));
    529 	}
    530 };
    531 
    532 class CaseListParserTests : public tcu::TestCaseGroup
    533 {
    534 public:
    535 	CaseListParserTests (tcu::TestContext& testCtx)
    536 		: tcu::TestCaseGroup(testCtx, "case_list_parser", "Test case list parser tests")
    537 	{
    538 	}
    539 
    540 	void init (void)
    541 	{
    542 		addChild(new TrieParserTests(m_testCtx));
    543 		addChild(new ListParserTests(m_testCtx));
    544 	}
    545 };
    546 
    547 class CommonFrameworkTests : public tcu::TestCaseGroup
    548 {
    549 public:
    550 	CommonFrameworkTests (tcu::TestContext& testCtx)
    551 		: tcu::TestCaseGroup(testCtx, "common", "Tests for the common utility framework")
    552 	{
    553 	}
    554 
    555 	void init (void)
    556 	{
    557 		addChild(new SelfCheckCase(m_testCtx, "float_format","tcu::FloatFormat_selfTest()",
    558 								   tcu::FloatFormat_selfTest));
    559 		addChild(new CaseListParserTests(m_testCtx));
    560 	}
    561 };
    562 
    563 } // anonymous
    564 
    565 FrameworkTests::FrameworkTests (tcu::TestContext& testCtx)
    566 	: tcu::TestCaseGroup(testCtx, "framework", "Miscellaneous framework tests")
    567 {
    568 }
    569 
    570 FrameworkTests::~FrameworkTests (void)
    571 {
    572 }
    573 
    574 void FrameworkTests::init (void)
    575 {
    576 	addChild(new CommonFrameworkTests(m_testCtx));
    577 }
    578 
    579 }
    580