Commit ea878cb9 by Geoff Lang

Use typed tests for the gles conformance tests.

BUG=angle:497 Change-Id: I396411cc7c07047ef2fab70605de39287aaea879 Reviewed-on: https://chromium-review.googlesource.com/239515Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent cf5d48fa
...@@ -28,13 +28,19 @@ def GetTestName(testName): ...@@ -28,13 +28,19 @@ def GetTestName(testName):
def GenerateTests(outFile, testNames): def GenerateTests(outFile, testNames):
# Remove duplicate tests # Remove duplicate tests
testNames = list(set(testNames)) testNames = list(set(testNames))
testSuites = []
outFile.write("#include \"gles_conformance_tests.h\"\n\n") outFile.write("#include \"gles_conformance_tests.h\"\n\n")
for test in testNames: for test in testNames:
outFile.write("TEST(" + GetSuiteName(test) + ", " + GetTestName(test) + ")\n") testSuite = GetSuiteName(test)
if not testSuite in testSuites:
outFile.write("DEFINE_CONFORMANCE_TEST_CLASS(" + testSuite + ");\n\n")
testSuites.append(testSuite)
outFile.write("TYPED_TEST(" + testSuite + ", " + GetTestName(test) + ")\n")
outFile.write("{\n") outFile.write("{\n")
outFile.write(" RunConformanceTest(\"" + test + "\", GetCurrentConfig());\n") outFile.write(" run(\"" + test + "\");\n")
outFile.write("}\n\n") outFile.write("}\n\n")
def GenerateTestList(sourceFile, rootDir): def GenerateTestList(sourceFile, rootDir):
......
...@@ -7,18 +7,6 @@ ...@@ -7,18 +7,6 @@
#include <sstream> #include <sstream>
#include <stdarg.h> #include <stdarg.h>
static ConformanceConfig kCurrentConfig = { 64, 64, EGL_DEFAULT_DISPLAY };
void SetCurrentConfig(const ConformanceConfig& config)
{
kCurrentConfig = config;
}
const ConformanceConfig& GetCurrentConfig()
{
return kCurrentConfig;
}
static std::vector<char> FormatArg(const char* fmt, ...) static std::vector<char> FormatArg(const char* fmt, ...)
{ {
va_list vararg; va_list vararg;
...@@ -58,20 +46,20 @@ static std::string GetExecutableDirectory() ...@@ -58,20 +46,20 @@ static std::string GetExecutableDirectory()
return executableLocation; return executableLocation;
} }
void RunConformanceTest(const std::string &testPath, const ConformanceConfig& config) void RunConformanceTest(const std::string &testPath, EGLNativeDisplayType nativeDisplay)
{ {
std::vector<char*> args; std::vector<char*> args;
// Empty first argument for the program name // Empty first argument for the program name
args.push_back(""); args.push_back("");
std::vector<char> widthArg = FormatArg("-width=%u", config.width); std::vector<char> widthArg = FormatArg("-width=%u", 64);
args.push_back(widthArg.data()); args.push_back(widthArg.data());
std::vector<char> heightArg = FormatArg("-height=%u", config.height); std::vector<char> heightArg = FormatArg("-height=%u", 64);
args.push_back(heightArg.data()); args.push_back(heightArg.data());
std::vector<char> displayArg = FormatArg("-d=%u", config.displayType); std::vector<char> displayArg = FormatArg("-d=%llu", nativeDisplay);
args.push_back(displayArg.data()); args.push_back(displayArg.data());
std::vector<char> runArg = FormatArg("-run=%s/conformance_tests/%s", GetExecutableDirectory().c_str(), testPath.c_str()); std::vector<char> runArg = FormatArg("-run=%s/conformance_tests/%s", GetExecutableDirectory().c_str(), testPath.c_str());
......
...@@ -8,19 +8,62 @@ ...@@ -8,19 +8,62 @@
#define CONFORMANCE_TESTS_CONFORMANCE_TEST_H_ #define CONFORMANCE_TESTS_CONFORMANCE_TEST_H_
#include "gtest/gtest.h" #include "gtest/gtest.h"
#include <EGL/egl.h> #include <EGL/egl.h>
#include <EGL/eglext.h>
#include <string> #include <string>
struct ConformanceConfig struct D3D9
{
static EGLNativeDisplayType GetNativeDisplay()
{
return EGL_DEFAULT_DISPLAY;
}
};
struct D3D11
{ {
size_t width; static EGLNativeDisplayType GetNativeDisplay()
size_t height; {
EGLNativeDisplayType displayType; return EGL_D3D11_ONLY_DISPLAY_ANGLE;
}
}; };
void SetCurrentConfig(const ConformanceConfig& config); #define CONFORMANCE_TESTS_ES2 2
const ConformanceConfig& GetCurrentConfig(); #define CONFORMANCE_TESTS_ES3 3
#if CONFORMANCE_TESTS_TYPE == CONFORMANCE_TESTS_ES2
typedef testing::Types<D3D9, D3D11> ConformanceTestTypes;
#elif CONFORMANCE_TESTS_TYPE == CONFORMANCE_TESTS_ES3
typedef testing::Types<D3D11> ConformanceTestTypes;
#else
# error "Unknown CONFORMANCE_TESTS_TYPE"
#endif
#define DEFINE_CONFORMANCE_TEST_CLASS(name) \
template <typename T> class name : public ConformanceTest<T> { }; \
TYPED_TEST_CASE(name, ConformanceTestTypes);
template <typename T>
class ConformanceTest : public testing::Test
{
public:
ConformanceTest()
: mNativeDisplay(T::GetNativeDisplay())
{
}
protected:
void run(const std::string &testPath)
{
RunConformanceTest(testPath, mNativeDisplay);
}
private:
EGLNativeDisplayType mNativeDisplay;
};
void RunConformanceTest(const std::string &testPath, const ConformanceConfig& config); void RunConformanceTest(const std::string &testPath, EGLNativeDisplayType nativeDisplay);
#endif // CONFORMANCE_TESTS_CONFORMANCE_TEST_H_ #endif // CONFORMANCE_TESTS_CONFORMANCE_TEST_H_
...@@ -15,57 +15,9 @@ ...@@ -15,57 +15,9 @@
#include <string> #include <string>
#include <vector> #include <vector>
#define CONFORMANCE_TESTS_ES2 2
#define CONFORMANCE_TESTS_ES3 3
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
testing::InitGoogleTest(&argc, argv); testing::InitGoogleTest(&argc, argv);
int rt = RUN_ALL_TESTS();
typedef std::pair<std::string, EGLNativeDisplayType> NameDisplayTypePair;
typedef std::map<std::string, EGLNativeDisplayType> DisplayTypeMap;
DisplayTypeMap allDisplays;
#if CONFORMANCE_TESTS_TYPE == CONFORMANCE_TESTS_ES2
allDisplays["d3d9"] = EGL_DEFAULT_DISPLAY;
allDisplays["d3d11"] = EGL_D3D11_ONLY_DISPLAY_ANGLE;
#elif CONFORMANCE_TESTS_TYPE == CONFORMANCE_TESTS_ES3
allDisplays["d3d11"] = EGL_D3D11_ONLY_DISPLAY_ANGLE;
#else
# error "Unknown CONFORMANCE_TESTS_TYPE"
#endif
// Iterate through the command line arguments and check if they are config names
std::vector<NameDisplayTypePair> requestedDisplays;
for (size_t i = 1; i < static_cast<size_t>(argc); i++)
{
DisplayTypeMap::const_iterator iter = allDisplays.find(argv[i]);
if (iter != allDisplays.end())
{
requestedDisplays.push_back(*iter);
}
}
// If no configs were requested, run them all
if (requestedDisplays.empty())
{
for (DisplayTypeMap::const_iterator i = allDisplays.begin(); i != allDisplays.end(); i++)
{
requestedDisplays.push_back(*i);
}
}
// Run each requested config
int rt = 0;
for (size_t i = 0; i < requestedDisplays.size(); i++)
{
ConformanceConfig config = { 64, 64, requestedDisplays[i].second };
SetCurrentConfig(config);
std::cout << "Running test configuration \"" << requestedDisplays[i].first << "\".\n";
rt |= RUN_ALL_TESTS();
}
return rt; return rt;
} }
...@@ -246,6 +246,14 @@ ...@@ -246,6 +246,14 @@
[ [
'CONFORMANCE_TESTS_TYPE=CONFORMANCE_TESTS_ES2', 'CONFORMANCE_TESTS_TYPE=CONFORMANCE_TESTS_ES2',
], ],
'msvs_settings':
{
'VCCLCompilerTool':
{
# MSVS has trouble compiling this due to the obj files becoming too large.
'AdditionalOptions': [ '/bigobj' ],
},
},
'actions': 'actions':
[ [
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment