206 lines
6.0 KiB
C++
206 lines
6.0 KiB
C++
#ifndef _TCUTESTHIERARCHYITERATOR_HPP
|
|
#define _TCUTESTHIERARCHYITERATOR_HPP
|
|
/*-------------------------------------------------------------------------
|
|
* drawElements Quality Program Tester Core
|
|
* ----------------------------------------
|
|
*
|
|
* Copyright 2014 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*//*!
|
|
* \file
|
|
* \brief Test case hierarchy iterator.
|
|
*//*--------------------------------------------------------------------*/
|
|
|
|
#include "tcuDefs.hpp"
|
|
#include "tcuTestContext.hpp"
|
|
#include "tcuTestCase.hpp"
|
|
#include "tcuTestPackage.hpp"
|
|
|
|
#include <vector>
|
|
|
|
namespace tcu
|
|
{
|
|
|
|
class CaseListFilter;
|
|
|
|
/*--------------------------------------------------------------------*//*!
|
|
* \brief Test hierarchy inflater
|
|
*
|
|
* This interface is used by TestHierarchyIterator to materialize, and clean
|
|
* up, test hierarchy on-demand while walking through it.
|
|
*//*--------------------------------------------------------------------*/
|
|
class TestHierarchyInflater
|
|
{
|
|
public:
|
|
TestHierarchyInflater (void);
|
|
|
|
virtual void enterTestPackage (TestPackage* testPackage, std::vector<TestNode*>& children) = 0;
|
|
virtual void leaveTestPackage (TestPackage* testPackage) = 0;
|
|
|
|
virtual void enterGroupNode (TestCaseGroup* testGroup, std::vector<TestNode*>& children) = 0;
|
|
virtual void leaveGroupNode (TestCaseGroup* testGroup) = 0;
|
|
|
|
protected:
|
|
~TestHierarchyInflater (void);
|
|
};
|
|
|
|
// \todo [2015-02-26 pyry] Hierarchy traversal should not depend on TestContext
|
|
class DefaultHierarchyInflater : public TestHierarchyInflater
|
|
{
|
|
public:
|
|
DefaultHierarchyInflater (TestContext& testCtx);
|
|
~DefaultHierarchyInflater (void);
|
|
|
|
virtual void enterTestPackage (TestPackage* testPackage, std::vector<TestNode*>& children);
|
|
virtual void leaveTestPackage (TestPackage* testPackage);
|
|
|
|
virtual void enterGroupNode (TestCaseGroup* testGroup, std::vector<TestNode*>& children);
|
|
virtual void leaveGroupNode (TestCaseGroup* testGroup);
|
|
|
|
protected:
|
|
TestContext& m_testCtx;
|
|
};
|
|
|
|
/*--------------------------------------------------------------------*//*!
|
|
* \brief Test hierarchy iterator
|
|
*
|
|
* Test hierarchy iterator allows walking test case hierarchy in depth-first
|
|
* order. The walked sub-tree is limited by command line parameters.
|
|
*
|
|
* Iterator signals current state with getState(), which initally, and after
|
|
* each increment (next()) may report one of the following:
|
|
*
|
|
* STATE_ENTER_NODE: A test node has been entered to for the first time.
|
|
* Node can be queried with getNode() and its full path with getNodePath().
|
|
* For group nodes the iterator will next enter first matching child node.
|
|
* For executable (test case) nodes STATE_LEAVE_NODE will always be reported
|
|
* immediately after entering that node.
|
|
*
|
|
* STATE_LEAVE_NODE: Iterator is leaving a node. In case of group nodes this
|
|
* means that all child nodes and their children have been processed. For
|
|
* executable nodes the iterator will either move on to the next sibling,
|
|
* or leave the parent group if the reported node was last child of that
|
|
* group.
|
|
*
|
|
* Root node is never reported, but instead iteration will start on first
|
|
* matching test package node, if there is any.
|
|
*
|
|
* Test hierarchy is created on demand with help of TestHierarchyInflater.
|
|
* Upon entering a group node, after STATE_ENTER_NODE has been signaled,
|
|
* inflater is called to construct the list of child nodes for that group.
|
|
* Upon exiting a group node, before STATE_LEAVE_NODE is called, inflater
|
|
* is asked to clean up any resources by calling leaveGroupNode() or
|
|
* leaveTestPackage() depending on the type of the node.
|
|
*//*--------------------------------------------------------------------*/
|
|
class TestHierarchyIterator
|
|
{
|
|
public:
|
|
TestHierarchyIterator (TestPackageRoot& rootNode, TestHierarchyInflater& inflater, const CaseListFilter& caseListFilter);
|
|
~TestHierarchyIterator (void);
|
|
|
|
enum State
|
|
{
|
|
STATE_ENTER_NODE = 0,
|
|
STATE_LEAVE_NODE,
|
|
STATE_FINISHED,
|
|
|
|
STATE_LAST
|
|
};
|
|
|
|
State getState (void) const;
|
|
|
|
TestNode* getNode (void) const;
|
|
const std::string& getNodePath (void) const;
|
|
|
|
void next (void);
|
|
|
|
private:
|
|
struct NodeIter
|
|
{
|
|
enum State
|
|
{
|
|
NISTATE_INIT = 0,
|
|
NISTATE_ENTER,
|
|
NISTATE_TRAVERSE_CHILDREN,
|
|
NISTATE_LEAVE,
|
|
|
|
NISTATE_LAST
|
|
};
|
|
|
|
NodeIter (void)
|
|
: node (DE_NULL)
|
|
, curChildNdx (-1)
|
|
, m_state (NISTATE_LAST)
|
|
{
|
|
}
|
|
|
|
NodeIter (TestNode* node_)
|
|
: node (node_)
|
|
, curChildNdx (-1)
|
|
, m_state (NISTATE_INIT)
|
|
{
|
|
}
|
|
|
|
State getState (void) const
|
|
{
|
|
return m_state;
|
|
}
|
|
|
|
void setState (State newState)
|
|
{
|
|
switch (newState)
|
|
{
|
|
case NISTATE_TRAVERSE_CHILDREN:
|
|
curChildNdx = -1;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
m_state = newState;
|
|
}
|
|
|
|
TestNode* node;
|
|
std::vector<TestNode*> children;
|
|
int curChildNdx;
|
|
|
|
private:
|
|
State m_state;
|
|
};
|
|
|
|
TestHierarchyIterator (const TestHierarchyIterator&); // not allowed!
|
|
TestHierarchyIterator& operator= (const TestHierarchyIterator&); // not allowed!
|
|
|
|
bool matchFolderName (const std::string& folderName) const;
|
|
bool matchCaseName (const std::string& caseName) const;
|
|
|
|
static std::string buildNodePath (const std::vector<NodeIter>& nodeStack);
|
|
|
|
TestHierarchyInflater& m_inflater;
|
|
const CaseListFilter& m_caseListFilter;
|
|
|
|
// Current session state.
|
|
std::vector<NodeIter> m_sessionStack;
|
|
std::string m_nodePath;
|
|
|
|
// Counter that increments by one for each bottom-level test group
|
|
int m_groupNumber;
|
|
};
|
|
|
|
} // tcu
|
|
|
|
#endif // _TCUTESTHIERARCHYITERATOR_HPP
|