#ifndef _XETESTRESULTPARSER_HPP
#define _XETESTRESULTPARSER_HPP
/*-------------------------------------------------------------------------
 * drawElements Quality Program Test Executor
 * ------------------------------------------
 *
 * 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 result parser.
 *//*--------------------------------------------------------------------*/

#include "xeDefs.hpp"
#include "xeXMLParser.hpp"
#include "xeTestCaseResult.hpp"

#include <vector>

namespace xe
{

enum TestLogVersion
{
	TESTLOGVERSION_0_2_0 = 0,
	TESTLOGVERSION_0_3_0,
	TESTLOGVERSION_0_3_1,
	TESTLOGVERSION_0_3_2,
	TESTLOGVERSION_0_3_3,
	TESTLOGVERSION_0_3_4,

	TESTLOGVERSION_LAST
};

class TestResultParseError : public ParseError
{
public:
	TestResultParseError (const std::string& message) : ParseError(message) {}
};

class TestResultParser
{
public:
	enum ParseResult
	{
		PARSERESULT_NOT_CHANGED,
		PARSERESULT_CHANGED,
		PARSERESULT_COMPLETE,
		PARSERESULT_ERROR,

		PARSERESULT_LAST
	};

							TestResultParser			(void);
							~TestResultParser			(void);

	void					init						(TestCaseResult* dstResult);
	ParseResult				parse						(const deUint8* bytes, int numBytes);

private:
							TestResultParser			(const TestResultParser& other);
	TestResultParser&		operator=					(const TestResultParser& other);

	void					clear						(void);

	void					handleElementStart			(void);
	void					handleElementEnd			(void);
	void					handleData					(void);

	const char*				getAttribute				(const char* name);

	ri::Item*				getCurrentItem				(void);
	ri::List*				getCurrentItemList			(void);
	void					pushItem					(ri::Item* item);
	void					popItem						(void);
	void					updateCurrentItemList		(void);

	enum State
	{
		STATE_NOT_INITIALIZED = 0,
		STATE_INITIALIZED,
		STATE_IN_TEST_CASE_RESULT,
		STATE_TEST_CASE_RESULT_ENDED,

		STATE_LAST
	};

	xml::Parser				m_xmlParser;
	TestCaseResult*			m_result;

	State					m_state;
	TestLogVersion			m_logVersion;		//!< Only valid in STATE_IN_TEST_CASE_RESULT.

	std::vector<ri::Item*>	m_itemStack;
	ri::List*				m_curItemList;

	int						m_base64DecodeOffset;

	std::string				m_curNumValue;
};

// Helpers exposed to other parsers.
TestStatusCode	getTestStatusCode			(const char* statusCode);

// Parsing helpers.

class TestCaseResultData;

void			parseTestCaseResultFromData	(TestResultParser* parser, TestCaseResult* result, const TestCaseResultData& data);

} // xe

#endif // _XETESTRESULTPARSER_HPP
