| // | |
| // Copyright 2014 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| // angle_test_instantiate.h: Adds support for filtering parameterized | |
| // tests by platform, so we skip unsupported configs. | |
| #ifndef ANGLE_TEST_INSTANTIATE_H_ | |
| #define ANGLE_TEST_INSTANTIATE_H_ | |
| #include <gtest/gtest.h> | |
| namespace angle | |
| { | |
| struct SystemInfo; | |
| struct PlatformParameters; | |
| // Operating systems | |
| bool IsAndroid(); | |
| bool IsLinux(); | |
| bool IsOSX(); | |
| bool IsOzone(); | |
| bool IsWindows(); | |
| bool IsWindows7(); | |
| bool IsFuchsia(); | |
| // Android devices | |
| bool IsNexus5X(); | |
| bool IsNexus6P(); | |
| bool IsNexus9(); | |
| bool IsPixelXL(); | |
| bool IsPixel2(); | |
| bool IsPixel2XL(); | |
| bool IsNVIDIAShield(); | |
| // Desktop devices. | |
| bool IsIntel(); | |
| bool IsAMD(); | |
| bool IsNVIDIA(); | |
| bool IsPlatformAvailable(const PlatformParameters ¶m); | |
| // This functions is used to filter which tests should be registered, | |
| // T must be or inherit from angle::PlatformParameters. | |
| template <typename T> | |
| std::vector<T> FilterTestParams(const T *params, size_t numParams) | |
| { | |
| std::vector<T> filtered; | |
| for (size_t i = 0; i < numParams; i++) | |
| { | |
| if (IsPlatformAvailable(params[i])) | |
| { | |
| filtered.push_back(params[i]); | |
| } | |
| } | |
| return filtered; | |
| } | |
| template <typename T> | |
| std::vector<T> FilterTestParams(const std::vector<T> ¶ms) | |
| { | |
| return FilterTestParams(params.data(), params.size()); | |
| } | |
| // Used to generate valid test names out of testing::PrintToStringParamName used in combined tests. | |
| struct CombinedPrintToStringParamName | |
| { | |
| template <class ParamType> | |
| std::string operator()(const testing::TestParamInfo<ParamType> &info) const | |
| { | |
| std::string name = testing::PrintToStringParamName()(info); | |
| std::string sanitized; | |
| for (const char c : name) | |
| { | |
| if (c == ',') | |
| { | |
| sanitized += '_'; | |
| } | |
| else if (isalnum(c) || c == '_') | |
| { | |
| sanitized += c; | |
| } | |
| } | |
| return sanitized; | |
| } | |
| }; | |
| #define ANGLE_INSTANTIATE_TEST_PLATFORMS(testName, ...) \ | |
| testing::ValuesIn(::angle::FilterTestParams(testName##__VA_ARGS__##params, \ | |
| ArraySize(testName##__VA_ARGS__##params))) | |
| // Instantiate the test once for each extra argument. The types of all the | |
| // arguments must match, and getRenderer must be implemented for that type. | |
| #define ANGLE_INSTANTIATE_TEST(testName, first, ...) \ | |
| const decltype(first) testName##params[] = {first, ##__VA_ARGS__}; \ | |
| INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \ | |
| testing::PrintToStringParamName()) | |
| #define ANGLE_ALL_TEST_PLATFORMS_ES1 \ | |
| ES1_D3D11(), ES1_OPENGL(), ES1_OPENGLES(), ES1_VULKAN(), ES1_VULKAN_SWIFTSHADER() | |
| #define ANGLE_ALL_TEST_PLATFORMS_ES2 \ | |
| ES2_D3D9(), ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES(), ES2_VULKAN(), ES2_VULKAN_SWIFTSHADER(), \ | |
| ES2_METAL() | |
| #define ANGLE_ALL_TEST_PLATFORMS_ES3 \ | |
| ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN(), ES3_VULKAN_SWIFTSHADER() | |
| #define ANGLE_ALL_TEST_PLATFORMS_ES31 \ | |
| ES31_D3D11(), ES31_OPENGL(), ES31_OPENGLES(), ES31_VULKAN(), ES31_VULKAN_SWIFTSHADER() | |
| #define ANGLE_ALL_TEST_PLATFORMS_NULL ES2_NULL(), ES3_NULL(), ES31_NULL() | |
| // Instantiate the test once for each GLES1 platform | |
| #define ANGLE_INSTANTIATE_TEST_ES1(testName) \ | |
| const PlatformParameters testName##params[] = {ANGLE_ALL_TEST_PLATFORMS_ES1}; \ | |
| INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \ | |
| testing::PrintToStringParamName()) | |
| // Instantiate the test once for each GLES2 platform | |
| #define ANGLE_INSTANTIATE_TEST_ES2(testName) \ | |
| const PlatformParameters testName##params[] = {ANGLE_ALL_TEST_PLATFORMS_ES2}; \ | |
| INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \ | |
| testing::PrintToStringParamName()) | |
| // Instantiate the test once for each GLES3 platform | |
| #define ANGLE_INSTANTIATE_TEST_ES3(testName) \ | |
| const PlatformParameters testName##params[] = {ANGLE_ALL_TEST_PLATFORMS_ES3}; \ | |
| INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \ | |
| testing::PrintToStringParamName()) | |
| // Instantiate the test once for each GLES31 platform | |
| #define ANGLE_INSTANTIATE_TEST_ES31(testName) \ | |
| const PlatformParameters testName##params[] = {ANGLE_ALL_TEST_PLATFORMS_ES31}; \ | |
| INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \ | |
| testing::PrintToStringParamName()) | |
| // Multiple ES Version macros | |
| #define ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(testName) \ | |
| const PlatformParameters testName##params[] = {ANGLE_ALL_TEST_PLATFORMS_ES2, \ | |
| ANGLE_ALL_TEST_PLATFORMS_ES3}; \ | |
| INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \ | |
| testing::PrintToStringParamName()) | |
| #define ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND_ES31(testName) \ | |
| const PlatformParameters testName##params[] = {ANGLE_ALL_TEST_PLATFORMS_ES2, \ | |
| ANGLE_ALL_TEST_PLATFORMS_ES3, \ | |
| ANGLE_ALL_TEST_PLATFORMS_ES31}; \ | |
| INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \ | |
| testing::PrintToStringParamName()) | |
| #define ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND_ES31_AND_NULL(testName) \ | |
| const PlatformParameters testName##params[] = { \ | |
| ANGLE_ALL_TEST_PLATFORMS_ES2, ANGLE_ALL_TEST_PLATFORMS_ES3, ANGLE_ALL_TEST_PLATFORMS_ES31, \ | |
| ANGLE_ALL_TEST_PLATFORMS_NULL}; \ | |
| INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \ | |
| testing::PrintToStringParamName()) | |
| #define ANGLE_INSTANTIATE_TEST_ES3_AND_ES31(testName) \ | |
| const PlatformParameters testName##params[] = {ANGLE_ALL_TEST_PLATFORMS_ES3, \ | |
| ANGLE_ALL_TEST_PLATFORMS_ES31}; \ | |
| INSTANTIATE_TEST_SUITE_P(, testName, ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \ | |
| testing::PrintToStringParamName()) | |
| // Instantiate the test for a combination of N parameters and the enumeration of platforms in the | |
| // extra args, similar to ANGLE_INSTANTIATE_TEST. The macros are defined only for the Ns currently | |
| // in use, and can be expanded as necessary. | |
| #define ANGLE_INSTANTIATE_TEST_COMBINE_1(testName, print, combine1, first, ...) \ | |
| const decltype(first) testName##params[] = {first, ##__VA_ARGS__}; \ | |
| INSTANTIATE_TEST_SUITE_P( \ | |
| , testName, testing::Combine(ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), combine1), print) | |
| #define ANGLE_INSTANTIATE_TEST_COMBINE_4(testName, print, combine1, combine2, combine3, combine4, \ | |
| first, ...) \ | |
| const decltype(first) testName##params[] = {first, ##__VA_ARGS__}; \ | |
| INSTANTIATE_TEST_SUITE_P(, testName, \ | |
| testing::Combine(ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \ | |
| combine1, combine2, combine3, combine4), \ | |
| print) | |
| #define ANGLE_INSTANTIATE_TEST_COMBINE_5(testName, print, combine1, combine2, combine3, combine4, \ | |
| combine5, first, ...) \ | |
| const decltype(first) testName##params[] = {first, ##__VA_ARGS__}; \ | |
| INSTANTIATE_TEST_SUITE_P(, testName, \ | |
| testing::Combine(ANGLE_INSTANTIATE_TEST_PLATFORMS(testName), \ | |
| combine1, combine2, combine3, combine4, combine5), \ | |
| print) | |
| // Checks if a config is expected to be supported by checking a system-based white list. | |
| bool IsConfigWhitelisted(const SystemInfo &systemInfo, const PlatformParameters ¶m); | |
| // Determines if a config is supported by trying to initialize it. Does not require SystemInfo. | |
| bool IsConfigSupported(const PlatformParameters ¶m); | |
| // Returns shared test system information. Can be used globally in the tests. | |
| SystemInfo *GetTestSystemInfo(); | |
| // Returns a list of all enabled test platform names. For use in configuration enumeration. | |
| std::vector<std::string> GetAvailableTestPlatformNames(); | |
| // Active config (e.g. ES2_Vulkan). | |
| extern std::string gSelectedConfig; | |
| // Use a separate isolated process per test config. This works around driver flakiness when using | |
| // multiple APIs/windows/etc in the same process. | |
| extern bool gSeparateProcessPerConfig; | |
| } // namespace angle | |
| #endif // ANGLE_TEST_INSTANTIATE_H_ |