14e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos/*-------------------------------------------------------------------------
24e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos * drawElements Quality Program Tester Core
34e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos * ----------------------------------------
44e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos *
54e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos * Copyright 2014 The Android Open Source Project
64e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos *
74e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
84e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos * you may not use this file except in compliance with the License.
94e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos * You may obtain a copy of the License at
104e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos *
114e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
124e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos *
134e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos * Unless required by applicable law or agreed to in writing, software
144e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
154e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
164e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos * See the License for the specific language governing permissions and
174e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos * limitations under the License.
184e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos *
194e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos *//*!
204e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos * \file
214e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos * \brief Test case hierarchy iterator.
224e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos *//*--------------------------------------------------------------------*/
234e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
244e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos#include "tcuTestHierarchyIterator.hpp"
254e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos#include "tcuCommandLine.hpp"
264e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
274e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulosnamespace tcu
284e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos{
294e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
304e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulosusing std::string;
314e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulosusing std::vector;
324e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
334e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos// TestHierarchyInflater
344e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
354e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry HaulosTestHierarchyInflater::TestHierarchyInflater (void)
364e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos{
374e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos}
384e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
394e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry HaulosTestHierarchyInflater::~TestHierarchyInflater (void)
404e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos{
414e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos}
424e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
434e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos// DefaultHierarchyInflater
444e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
454e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry HaulosDefaultHierarchyInflater::DefaultHierarchyInflater (TestContext& testCtx)
464e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	: m_testCtx(testCtx)
474e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos{
484e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos}
494e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
504e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry HaulosDefaultHierarchyInflater::~DefaultHierarchyInflater (void)
514e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos{
524e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos}
534e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
544e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulosvoid DefaultHierarchyInflater::enterTestPackage (TestPackage* testPackage, vector<TestNode*>& children)
554e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos{
564e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	{
574e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		Archive* const	pkgArchive	= testPackage->getArchive();
584e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
594e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		if (pkgArchive)
604e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			m_testCtx.setCurrentArchive(*pkgArchive);
614e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		else
624e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			m_testCtx.setCurrentArchive(m_testCtx.getRootArchive());
634e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	}
644e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
654e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	testPackage->init();
664e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	testPackage->getChildren(children);
674e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos}
684e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
694e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulosvoid DefaultHierarchyInflater::leaveTestPackage (TestPackage* testPackage)
704e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos{
714e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	m_testCtx.setCurrentArchive(m_testCtx.getRootArchive());
724e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	testPackage->deinit();
734e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos}
744e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
754e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulosvoid DefaultHierarchyInflater::enterGroupNode (TestCaseGroup* testGroup, vector<TestNode*>& children)
764e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos{
774e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	testGroup->init();
784e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	testGroup->getChildren(children);
794e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos}
804e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
814e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulosvoid DefaultHierarchyInflater::leaveGroupNode (TestCaseGroup* testGroup)
824e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos{
834e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	testGroup->deinit();
844e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos}
854e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
864e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos// TestHierarchyIterator
874e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
884e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry HaulosTestHierarchyIterator::TestHierarchyIterator (TestPackageRoot&			rootNode,
894e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos											  TestHierarchyInflater&	inflater,
904e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos											  const CommandLine&		cmdLine)
914e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	: m_inflater	(inflater)
924e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	, m_cmdLine		(cmdLine)
934e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos{
944e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	// Init traverse state and "seek" to first reportable node.
954e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	NodeIter iter(&rootNode);
964e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	iter.setState(NodeIter::STATE_ENTER); // Root is never reported
974e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	m_sessionStack.push_back(iter);
984e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	next();
994e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos}
1004e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
1014e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry HaulosTestHierarchyIterator::~TestHierarchyIterator (void)
1024e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos{
1034e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	// Tear down inflated nodes in m_sessionStack
1044e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	for (vector<NodeIter>::reverse_iterator iter = m_sessionStack.rbegin(); iter != m_sessionStack.rend(); ++iter)
1054e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	{
1064e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		TestNode* const		node		= iter->node;
1074e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		const TestNodeType	nodeType	= node->getNodeType();
1084e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
1094e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		switch (nodeType)
1104e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		{
1114e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			case NODETYPE_ROOT:		/* root is not de-initialized */								break;
1124e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			case NODETYPE_PACKAGE:	m_inflater.leaveTestPackage(static_cast<TestPackage*>(node));	break;
1134e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			case NODETYPE_GROUP:	m_inflater.leaveGroupNode(static_cast<TestCaseGroup*>(node));	break;
1144e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			default:
1154e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				break;
1164e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		}
1174e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	}
1184e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos}
1194e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
1204e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry HaulosTestHierarchyIterator::State TestHierarchyIterator::getState (void) const
1214e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos{
1224e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	if (!m_sessionStack.empty())
1234e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	{
1244e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		const NodeIter&	iter	= m_sessionStack.back();
1254e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
1264e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		DE_ASSERT(iter.getState() == NodeIter::STATE_ENTER ||
1274e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				  iter.getState() == NodeIter::STATE_LEAVE);
1284e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
1294e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		return iter.getState() == NodeIter::STATE_ENTER ? STATE_ENTER_NODE : STATE_LEAVE_NODE;
1304e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	}
1314e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	else
1324e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		return STATE_FINISHED;
1334e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos}
1344e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
1354e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry HaulosTestNode* TestHierarchyIterator::getNode (void) const
1364e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos{
1374e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	DE_ASSERT(getState() != STATE_FINISHED);
1384e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	return m_sessionStack.back().node;
1394e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos}
1404e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
1414e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulosconst std::string& TestHierarchyIterator::getNodePath (void) const
1424e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos{
1434e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	DE_ASSERT(getState() != STATE_FINISHED);
1444e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	return m_nodePath;
1454e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos}
1464e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
1474e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulosstd::string TestHierarchyIterator::buildNodePath (const vector<NodeIter>& nodeStack)
1484e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos{
1494e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	string nodePath;
1504e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	for (size_t ndx = 1; ndx < nodeStack.size(); ndx++)
1514e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	{
1524e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		const NodeIter& iter = nodeStack[ndx];
1534e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		if (ndx > 1) // ignore root package
1544e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			nodePath += ".";
1554e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		nodePath += iter.node->getName();
1564e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	}
1574e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	return nodePath;
1584e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos}
1594e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
1604e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulosvoid TestHierarchyIterator::next (void)
1614e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos{
1624e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	while (!m_sessionStack.empty())
1634e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	{
1644e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		NodeIter&			iter		= m_sessionStack.back();
1654e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		TestNode* const		node		= iter.node;
1664e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		const bool			isLeaf		= isTestNodeTypeExecutable(node->getNodeType());
1674e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
1684e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		switch (iter.getState())
1694e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		{
1704e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			case NodeIter::STATE_INIT:
1714e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			{
1724e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				const std::string nodePath = buildNodePath(m_sessionStack);
1734e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
1744e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				// Return to parent if name doesn't match filter.
1754e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				if (!(isLeaf ? m_cmdLine.checkTestCaseName(nodePath.c_str()) : m_cmdLine.checkTestGroupName(nodePath.c_str())))
1764e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				{
1774e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos					m_sessionStack.pop_back();
1784e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos					break;
1794e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				}
1804e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
1814e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				m_nodePath = nodePath;
1824e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				iter.setState(NodeIter::STATE_ENTER);
1834e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				return; // Yield enter event
1844e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			}
1854e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
1864e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			case NodeIter::STATE_ENTER:
1874e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			{
1884e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				if (isLeaf)
1894e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				{
1904e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos					iter.setState(NodeIter::STATE_LEAVE);
1914e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos					return; // Yield leave event
1924e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				}
1934e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				else
1944e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				{
1954e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos					iter.setState(NodeIter::STATE_TRAVERSE_CHILDREN);
1964e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos					iter.children.clear();
1974e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
1984e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos					switch (node->getNodeType())
1994e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos					{
2004e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos						case NODETYPE_ROOT:		static_cast<TestPackageRoot*>(node)->getChildren(iter.children);				break;
2014e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos						case NODETYPE_PACKAGE:	m_inflater.enterTestPackage(static_cast<TestPackage*>(node), iter.children);	break;
2024e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos						case NODETYPE_GROUP:	m_inflater.enterGroupNode(static_cast<TestCaseGroup*>(node), iter.children);	break;
2034e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos						default:
2044e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos							DE_ASSERT(false);
2054e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos					}
2064e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				}
2074e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
2084e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				break;
2094e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			}
2104e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
2114e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			case NodeIter::STATE_TRAVERSE_CHILDREN:
2124e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			{
2134e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				int numChildren = (int)iter.children.size();
2144e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				if (++iter.curChildNdx < numChildren)
2154e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				{
2164e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos					// Push child to stack.
2174e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos					TestNode* childNode = iter.children[iter.curChildNdx];
2184e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos					m_sessionStack.push_back(NodeIter(childNode));
2194e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				}
2204e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				else
2214e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				{
2224e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos					iter.setState(NodeIter::STATE_LEAVE);
2234e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos					if (node->getNodeType() != NODETYPE_ROOT)
2244e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos						return; // Yield leave event
2254e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				}
2264e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
2274e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				break;
2284e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			}
2294e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
2304e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			case NodeIter::STATE_LEAVE:
2314e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			{
2324e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				// Leave node.
2334e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				if (!isLeaf)
2344e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				{
2354e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos					switch (node->getNodeType())
2364e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos					{
2374e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos						case NODETYPE_ROOT:		/* root is not de-initialized */								break;
2384e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos						case NODETYPE_PACKAGE:	m_inflater.leaveTestPackage(static_cast<TestPackage*>(node));	break;
2394e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos						case NODETYPE_GROUP:	m_inflater.leaveGroupNode(static_cast<TestCaseGroup*>(node));	break;
2404e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos						default:
2414e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos							DE_ASSERT(false);
2424e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos					}
2434e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				}
2444e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
2454e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				m_sessionStack.pop_back();
2464e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				m_nodePath = buildNodePath(m_sessionStack);
2474e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				break;
2484e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			}
2494e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
2504e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos			default:
2514e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				DE_ASSERT(false);
2524e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos				return;
2534e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos		}
2544e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	}
2554e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
2564e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos	DE_ASSERT(m_sessionStack.empty() && getState() == STATE_FINISHED);
2574e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos}
2584e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos
2594e3ea87b79b12195e79d28ef6ab2be0a847b5d9aPyry Haulos} // tcu
260