#ifndef _XEBATCHRESULT_HPP
#define _XEBATCHRESULT_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 batch result.
 *//*--------------------------------------------------------------------*/

#include "xeDefs.hpp"
#include "xeTestCase.hpp"
#include "xeTestCaseResult.hpp"
#include "deSharedPtr.hpp"

#include <string>
#include <vector>
#include <map>

namespace xe
{

class SessionInfo
{
public:
	// Produced by test binary.
	std::string			releaseName;
	std::string			releaseId;
	std::string			targetName;
	std::string			qpaCommandLineParameters;

	// Produced by Candy.
	std::string			candyTargetName;
	std::string			configName;
	std::string			resultName;
	std::string			timestamp;
};

class InfoLog
{
public:
							InfoLog			(void);

	size_t					getSize			(void) const { return m_data.size();							}
	const deUint8*			getBytes		(void) const { return !m_data.empty() ? &m_data[0] : DE_NULL;	}

	void					append			(const deUint8* bytes, size_t numBytes);

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

	std::vector<deUint8>	m_data;
};

class TestCaseResultData
{
public:
								TestCaseResultData				(const char* casePath);
								~TestCaseResultData				(void);

	const char*					getTestCasePath					(void) const	{ return m_casePath.c_str();		}

	void						setTestResult					(TestStatusCode code, const char* details);

	TestStatusCode				getStatusCode					(void) const	{ return m_statusCode;				}
	const char*					getStatusDetails				(void) const	{ return m_statusDetails.c_str();	}

	int							getDataSize						(void) const	{ return (int)m_data.size();		}
	void						setDataSize						(int size)		{ m_data.resize(size);				}

	const deUint8*				getData							(void) const	{ return !m_data.empty() ? &m_data[0] : DE_NULL;	}
	deUint8*					getData							(void)			{ return !m_data.empty() ? &m_data[0] : DE_NULL;	}

	void						clear							(void);

private:
	// \note statusCode and statusDetails are either set by BatchExecutor or later parsed from data.
	std::string					m_casePath;
	TestStatusCode				m_statusCode;
	std::string					m_statusDetails;
	std::vector<deUint8>		m_data;
};

typedef de::SharedPtr<TestCaseResultData>			TestCaseResultPtr;
typedef de::SharedPtr<const TestCaseResultData>		ConstTestCaseResultPtr;

class BatchResult
{
public:
										BatchResult				(void);
										~BatchResult			(void);

	const SessionInfo&					getSessionInfo			(void) const	{ return m_sessionInfo;	}
	SessionInfo&						getSessionInfo			(void)			{ return m_sessionInfo;	}

	int									getNumTestCaseResults	(void) const	{ return (int)m_testCaseResults.size();							}
	ConstTestCaseResultPtr				getTestCaseResult		(int ndx) const	{ return ConstTestCaseResultPtr(m_testCaseResults[ndx]);		}
	TestCaseResultPtr					getTestCaseResult		(int ndx)		{ return m_testCaseResults[ndx];								}

	bool								hasTestCaseResult		(const char* casePath) const;
	ConstTestCaseResultPtr				getTestCaseResult		(const char* casePath) const;
	TestCaseResultPtr					getTestCaseResult		(const char* casePath);

	TestCaseResultPtr					createTestCaseResult	(const char* casePath);

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

	SessionInfo							m_sessionInfo;
	std::vector<TestCaseResultPtr>		m_testCaseResults;
	std::map<std::string, int>			m_resultMap;
};

} // xe

#endif // _XEBATCHRESULT_HPP
