/*-------------------------------------------------------------------------
* drawElements Internal Test Module
* ---------------------------------
*
* 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 Build information tests.
*//*--------------------------------------------------------------------*/
#include "ditBuildInfoTests.hpp"
#include "tcuTestLog.hpp"
#include "deStringUtil.hpp"
using tcu::TestLog;
namespace dit
{
static const char* getOsName (int os)
{
switch (os)
{
case DE_OS_VANILLA: return "DE_OS_VANILLA";
case DE_OS_WIN32: return "DE_OS_WIN32";
case DE_OS_UNIX: return "DE_OS_UNIX";
case DE_OS_WINCE: return "DE_OS_WINCE";
case DE_OS_OSX: return "DE_OS_OSX";
case DE_OS_ANDROID: return "DE_OS_ANDROID";
case DE_OS_SYMBIAN: return "DE_OS_SYMBIAN";
case DE_OS_IOS: return "DE_OS_IOS";
default:
return DE_NULL;
}
}
static const char* getCompilerName (int compiler)
{
switch (compiler)
{
case DE_COMPILER_VANILLA: return "DE_COMPILER_VANILLA";
case DE_COMPILER_MSC: return "DE_COMPILER_MSC";
case DE_COMPILER_GCC: return "DE_COMPILER_GCC";
case DE_COMPILER_CLANG: return "DE_COMPILER_CLANG";
default:
return DE_NULL;
}
}
static const char* getCpuName (int cpu)
{
switch (cpu)
{
case DE_CPU_VANILLA: return "DE_CPU_VANILLA";
case DE_CPU_ARM: return "DE_CPU_ARM";
case DE_CPU_X86: return "DE_CPU_X86";
case DE_CPU_X86_64: return "DE_CPU_X86_64";
case DE_CPU_ARM_64: return "DE_CPU_ARM_64";
case DE_CPU_MIPS: return "DE_CPU_MIPS";
case DE_CPU_MIPS_64: return "DE_CPU_MIPS_64";
default:
return DE_NULL;
}
}
static const char* getEndiannessName (int endianness)
{
switch (endianness)
{
case DE_BIG_ENDIAN: return "DE_BIG_ENDIAN";
case DE_LITTLE_ENDIAN: return "DE_LITTLE_ENDIAN";
default:
return DE_NULL;
}
}
class BuildInfoStringCase : public tcu::TestCase
{
public:
BuildInfoStringCase (tcu::TestContext& testCtx, const char* name, const char* valueName, const char* value)
: tcu::TestCase (testCtx, name, valueName)
, m_valueName (valueName)
, m_value (value)
{
}
IterateResult iterate (void)
{
m_testCtx.getLog() << TestLog::Message << m_valueName << " = " << m_value << TestLog::EndMessage;
m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
return STOP;
}
private:
std::string m_valueName;
std::string m_value;
};
class BuildEnumCase : public tcu::TestCase
{
public:
typedef const char* (*GetStringFunc) (int value);
BuildEnumCase (tcu::TestContext& testCtx, const char* name, const char* varName, int value, GetStringFunc getString)
: tcu::TestCase (testCtx, name, varName)
, m_varName (varName)
, m_value (value)
, m_getString (getString)
{
}
IterateResult iterate (void)
{
const char* valueName = m_getString(m_value);
const bool isOk = valueName != DE_NULL;
std::string logValue = valueName ? std::string(valueName) : de::toString(m_value);
m_testCtx.getLog() << TestLog::Message << m_varName << " = " << logValue << TestLog::EndMessage;
m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
isOk ? "Pass" : "No enum name found");
return STOP;
}
private:
std::string m_varName;
int m_value;
GetStringFunc m_getString;
};
class EndiannessConsistencyCase : public tcu::TestCase
{
public:
EndiannessConsistencyCase (tcu::TestContext& context, const char* name, const char* description)
: tcu::TestCase(context, name, description)
{
}
IterateResult iterate (void)
{
const deUint16 multiByte = (deUint16)0x0102;
#if DE_ENDIANNESS == DE_BIG_ENDIAN
const bool isOk = *((const deUint8*)&multiByte) == (deUint8)0x01;
#elif DE_ENDIANNESS == DE_LITTLE_ENDIAN
const bool isOk = *((const deUint8*)&multiByte) == (deUint8)0x02;
#endif
m_testCtx.getLog()
<< TestLog::Message
<< "Verifying DE_ENDIANNESS matches actual behavior"
<< TestLog::EndMessage;
m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL,
isOk ? "Pass" : "Configured endianness inconsistent");
return STOP;
}
};
BuildInfoTests::BuildInfoTests (tcu::TestContext& testCtx)
: tcu::TestCaseGroup(testCtx, "build_info", "Build Info Tests")
{
}
BuildInfoTests::~BuildInfoTests (void)
{
}
void BuildInfoTests::init (void)
{
#if defined(DE_DEBUG)
const bool isDebug = true;
#else
const bool isDebug = false;
#endif
addChild(new BuildInfoStringCase (m_testCtx, "de_debug", "DE_DEBUG", isDebug ? "1" : "not defined"));
addChild(new BuildEnumCase (m_testCtx, "de_os", "DE_OS", DE_OS, getOsName));
addChild(new BuildEnumCase (m_testCtx, "de_cpu", "DE_CPU", DE_CPU, getCpuName));
addChild(new BuildEnumCase (m_testCtx, "de_compiler", "DE_COMPILER", DE_COMPILER, getCompilerName));
addChild(new BuildInfoStringCase (m_testCtx, "de_ptr_size", "DE_PTR_SIZE", de::toString(DE_PTR_SIZE).c_str()));
addChild(new BuildEnumCase (m_testCtx, "de_endianness", "DE_ENDIANNESS", DE_ENDIANNESS, getEndiannessName));
addChild(new EndiannessConsistencyCase (m_testCtx, "de_endianness_consistent", "DE_ENDIANNESS"));
}
} // dit