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