1e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
2e5c31af7Sopenharmony_ci * drawElements Quality Program Test Executor
3e5c31af7Sopenharmony_ci * ------------------------------------------
4e5c31af7Sopenharmony_ci *
5e5c31af7Sopenharmony_ci * Copyright 2014 The Android Open Source Project
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
8e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
9e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
10e5c31af7Sopenharmony_ci *
11e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
14e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
15e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
17e5c31af7Sopenharmony_ci * limitations under the License.
18e5c31af7Sopenharmony_ci *
19e5c31af7Sopenharmony_ci *//*!
20e5c31af7Sopenharmony_ci * \file
21e5c31af7Sopenharmony_ci * \brief Test case list parser.
22e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
23e5c31af7Sopenharmony_ci
24e5c31af7Sopenharmony_ci#include "xeTestCaseListParser.hpp"
25e5c31af7Sopenharmony_ci#include "deString.h"
26e5c31af7Sopenharmony_ci
27e5c31af7Sopenharmony_ciusing std::vector;
28e5c31af7Sopenharmony_ciusing std::string;
29e5c31af7Sopenharmony_ci
30e5c31af7Sopenharmony_cinamespace xe
31e5c31af7Sopenharmony_ci{
32e5c31af7Sopenharmony_ci
33e5c31af7Sopenharmony_cistatic TestCaseType getTestCaseType (const char* caseType)
34e5c31af7Sopenharmony_ci{
35e5c31af7Sopenharmony_ci	// \todo [2012-06-11 pyry] Use hashes for speedup.
36e5c31af7Sopenharmony_ci	static const struct
37e5c31af7Sopenharmony_ci	{
38e5c31af7Sopenharmony_ci		const char*		name;
39e5c31af7Sopenharmony_ci		TestCaseType	caseType;
40e5c31af7Sopenharmony_ci	} s_caseTypeMap[] =
41e5c31af7Sopenharmony_ci	{
42e5c31af7Sopenharmony_ci		{ "SelfValidate",	TESTCASETYPE_SELF_VALIDATE	},
43e5c31af7Sopenharmony_ci		{ "Capability",		TESTCASETYPE_CAPABILITY		},
44e5c31af7Sopenharmony_ci		{ "Accuracy",		TESTCASETYPE_ACCURACY		},
45e5c31af7Sopenharmony_ci		{ "Performance",	TESTCASETYPE_PERFORMANCE	}
46e5c31af7Sopenharmony_ci	};
47e5c31af7Sopenharmony_ci
48e5c31af7Sopenharmony_ci	for (int ndx = 0; ndx < DE_LENGTH_OF_ARRAY(s_caseTypeMap); ndx++)
49e5c31af7Sopenharmony_ci	{
50e5c31af7Sopenharmony_ci		if (deStringEqual(caseType, s_caseTypeMap[ndx].name))
51e5c31af7Sopenharmony_ci			return s_caseTypeMap[ndx].caseType;
52e5c31af7Sopenharmony_ci	}
53e5c31af7Sopenharmony_ci
54e5c31af7Sopenharmony_ci	XE_FAIL((string("Unknown test case type '") + caseType + "'").c_str());
55e5c31af7Sopenharmony_ci}
56e5c31af7Sopenharmony_ci
57e5c31af7Sopenharmony_ciTestCaseListParser::TestCaseListParser (void)
58e5c31af7Sopenharmony_ci	: m_root(DE_NULL)
59e5c31af7Sopenharmony_ci{
60e5c31af7Sopenharmony_ci}
61e5c31af7Sopenharmony_ci
62e5c31af7Sopenharmony_ciTestCaseListParser::~TestCaseListParser (void)
63e5c31af7Sopenharmony_ci{
64e5c31af7Sopenharmony_ci}
65e5c31af7Sopenharmony_ci
66e5c31af7Sopenharmony_civoid TestCaseListParser::clear (void)
67e5c31af7Sopenharmony_ci{
68e5c31af7Sopenharmony_ci	m_xmlParser.clear();
69e5c31af7Sopenharmony_ci	m_nodeStack.clear();
70e5c31af7Sopenharmony_ci	m_root = DE_NULL;
71e5c31af7Sopenharmony_ci}
72e5c31af7Sopenharmony_ci
73e5c31af7Sopenharmony_civoid TestCaseListParser::init (TestGroup* rootGroup)
74e5c31af7Sopenharmony_ci{
75e5c31af7Sopenharmony_ci	clear();
76e5c31af7Sopenharmony_ci	m_root = rootGroup;
77e5c31af7Sopenharmony_ci}
78e5c31af7Sopenharmony_ci
79e5c31af7Sopenharmony_civoid TestCaseListParser::parse (const deUint8* bytes, int numBytes)
80e5c31af7Sopenharmony_ci{
81e5c31af7Sopenharmony_ci	DE_ASSERT(m_root);
82e5c31af7Sopenharmony_ci	m_xmlParser.feed(bytes, numBytes);
83e5c31af7Sopenharmony_ci
84e5c31af7Sopenharmony_ci	for (;;)
85e5c31af7Sopenharmony_ci	{
86e5c31af7Sopenharmony_ci		xml::Element element = m_xmlParser.getElement();
87e5c31af7Sopenharmony_ci
88e5c31af7Sopenharmony_ci		if (element == xml::ELEMENT_INCOMPLETE ||
89e5c31af7Sopenharmony_ci			element == xml::ELEMENT_END_OF_STRING)
90e5c31af7Sopenharmony_ci			break;
91e5c31af7Sopenharmony_ci
92e5c31af7Sopenharmony_ci		if (element == xml::ELEMENT_START || element == xml::ELEMENT_END)
93e5c31af7Sopenharmony_ci		{
94e5c31af7Sopenharmony_ci			bool		isStart		= element == xml::ELEMENT_START;
95e5c31af7Sopenharmony_ci			const char* elemName	= m_xmlParser.getElementName();
96e5c31af7Sopenharmony_ci
97e5c31af7Sopenharmony_ci			if (deStringEqual(elemName, "TestCase"))
98e5c31af7Sopenharmony_ci			{
99e5c31af7Sopenharmony_ci				if (isStart)
100e5c31af7Sopenharmony_ci				{
101e5c31af7Sopenharmony_ci					XE_CHECK_MSG(!m_nodeStack.empty(), "<TestCase> outside of <TestCaseList>");
102e5c31af7Sopenharmony_ci
103e5c31af7Sopenharmony_ci					TestNode*		parent		= m_nodeStack.back();
104e5c31af7Sopenharmony_ci					const char*		name		= m_xmlParser.hasAttribute("Name")			? m_xmlParser.getAttribute("Name")			: DE_NULL;
105e5c31af7Sopenharmony_ci					const char*		description	= m_xmlParser.hasAttribute("Description")	? m_xmlParser.getAttribute("Description")	: DE_NULL;
106e5c31af7Sopenharmony_ci					const char*		caseType	= m_xmlParser.hasAttribute("CaseType")		? m_xmlParser.getAttribute("CaseType")		: DE_NULL;
107e5c31af7Sopenharmony_ci
108e5c31af7Sopenharmony_ci					XE_CHECK_MSG(name && description && caseType, "Missing attribute in <TestCase>");
109e5c31af7Sopenharmony_ci					XE_CHECK_MSG(parent->getNodeType() == TESTNODETYPE_GROUP, "Only TestGroups are allowed to have child nodes");
110e5c31af7Sopenharmony_ci
111e5c31af7Sopenharmony_ci					bool			isGroup		= deStringEqual(caseType, "TestGroup") == DE_TRUE;
112e5c31af7Sopenharmony_ci					TestNode*		node		= isGroup ? static_cast<TestNode*>(static_cast<TestGroup*>(parent)->createGroup(name))
113e5c31af7Sopenharmony_ci														  : static_cast<TestNode*>(static_cast<TestGroup*>(parent)->createCase(getTestCaseType(caseType), name));
114e5c31af7Sopenharmony_ci
115e5c31af7Sopenharmony_ci					m_nodeStack.push_back(node);
116e5c31af7Sopenharmony_ci				}
117e5c31af7Sopenharmony_ci				else
118e5c31af7Sopenharmony_ci				{
119e5c31af7Sopenharmony_ci					XE_CHECK_MSG(m_nodeStack.size() >= 2, "Unexpected </TestCase>");
120e5c31af7Sopenharmony_ci					m_nodeStack.pop_back();
121e5c31af7Sopenharmony_ci				}
122e5c31af7Sopenharmony_ci			}
123e5c31af7Sopenharmony_ci			else if (deStringEqual(elemName, "TestCaseList"))
124e5c31af7Sopenharmony_ci			{
125e5c31af7Sopenharmony_ci				if (isStart)
126e5c31af7Sopenharmony_ci				{
127e5c31af7Sopenharmony_ci					XE_CHECK_MSG(m_nodeStack.empty(), "Unexpected <TestCaseList>");
128e5c31af7Sopenharmony_ci					m_nodeStack.push_back(m_root);
129e5c31af7Sopenharmony_ci				}
130e5c31af7Sopenharmony_ci				else
131e5c31af7Sopenharmony_ci				{
132e5c31af7Sopenharmony_ci					XE_CHECK_MSG(m_nodeStack.size() == 1, "Unexpected </TestCaseList>");
133e5c31af7Sopenharmony_ci					m_nodeStack.pop_back();
134e5c31af7Sopenharmony_ci				}
135e5c31af7Sopenharmony_ci			}
136e5c31af7Sopenharmony_ci			else
137e5c31af7Sopenharmony_ci				XE_FAIL((string("Unexpected <") + elemName + ">").c_str());
138e5c31af7Sopenharmony_ci		}
139e5c31af7Sopenharmony_ci		else if (element != xml::ELEMENT_DATA)
140e5c31af7Sopenharmony_ci			DE_ASSERT(false); // \note Data elements are just ignored, they should be whitespace anyway.
141e5c31af7Sopenharmony_ci
142e5c31af7Sopenharmony_ci		m_xmlParser.advance();
143e5c31af7Sopenharmony_ci	}
144e5c31af7Sopenharmony_ci}
145e5c31af7Sopenharmony_ci
146e5c31af7Sopenharmony_ci} // xe
147