1 // 2 // Copyright 2015 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 // compiler_test.h: 7 // utilities for compiler unit tests. 8 9 #ifndef TESTS_TEST_UTILS_COMPILER_TEST_H_ 10 #define TESTS_TEST_UTILS_COMPILER_TEST_H_ 11 12 #include <map> 13 #include <regex> 14 #include <vector> 15 16 #include "gtest/gtest.h" 17 18 #include "GLSLANG/ShaderLang.h" 19 #include "angle_gl.h" 20 #include "compiler/translator/TranslatorESSL.h" 21 #include "compiler/translator/tree_util/FindSymbolNode.h" 22 23 namespace sh 24 { 25 26 bool compileTestShader(GLenum type, 27 ShShaderSpec spec, 28 ShShaderOutput output, 29 const std::string &shaderString, 30 ShBuiltInResources *resources, 31 ShCompileOptions compileOptions, 32 std::string *translatedCode, 33 std::string *infoLog); 34 35 bool compileTestShader(GLenum type, 36 ShShaderSpec spec, 37 ShShaderOutput output, 38 const std::string &shaderString, 39 ShCompileOptions compileOptions, 40 std::string *translatedCode, 41 std::string *infoLog); 42 43 class MatchOutputCodeTest : public testing::Test 44 { 45 protected: 46 MatchOutputCodeTest(GLenum shaderType, 47 ShCompileOptions defaultCompileOptions, 48 ShShaderOutput outputType); 49 50 void addOutputType(const ShShaderOutput outputType); 51 52 ShBuiltInResources *getResources(); 53 54 // Compile functions clear any results from earlier calls to them. 55 void compile(const std::string &shaderString); 56 void compile(const std::string &shaderString, const ShCompileOptions compileOptions); 57 foundInESSLCode(const char * stringToFind)58 bool foundInESSLCode(const char *stringToFind) const 59 { 60 return foundInCode(SH_ESSL_OUTPUT, stringToFind); 61 } 62 foundInGLSLCode(const char * stringToFind)63 bool foundInGLSLCode(const char *stringToFind) const 64 { 65 return foundInCode(SH_GLSL_COMPATIBILITY_OUTPUT, stringToFind); 66 } 67 68 bool foundInCode(ShShaderOutput output, const char *stringToFind) const; 69 bool foundInCodeRegex(ShShaderOutput output, 70 const std::regex ®exToFind, 71 std::smatch *match = nullptr) const; 72 73 // Test that the strings are found in the specified output in the specified order. 74 bool foundInCodeInOrder(ShShaderOutput output, std::vector<const char *> stringsToFind); 75 76 // Test that the string occurs for exactly expectedOccurrences times 77 bool foundInCode(ShShaderOutput output, 78 const char *stringToFind, 79 const int expectedOccurrences) const; 80 81 // Test that the string is found in all outputs 82 bool foundInCode(const char *stringToFind) const; 83 bool foundInCodeRegex(const std::regex ®exToFind, std::smatch *match = nullptr) const; 84 85 // Test that the string occurs for exactly expectedOccurrences times in all outputs 86 bool foundInCode(const char *stringToFind, const int expectedOccurrences) const; 87 88 // Test that the strings are found in all outputs in the specified order. 89 bool foundInCodeInOrder(std::vector<const char *> stringsToFind); 90 91 // Test that the string is found in none of the outputs 92 bool notFoundInCode(const char *stringToFind) const; 93 94 private: 95 bool compileWithSettings(ShShaderOutput output, 96 const std::string &shaderString, 97 ShCompileOptions compileOptions, 98 std::string *translatedCode, 99 std::string *infoLog); 100 101 GLenum mShaderType; 102 ShCompileOptions mDefaultCompileOptions; 103 ShBuiltInResources mResources; 104 105 std::map<ShShaderOutput, std::string> mOutputCode; 106 }; 107 108 // Returns a pointer to a function call node with a mangled name functionName. 109 const TIntermAggregate *FindFunctionCallNode(TIntermNode *root, const TString &functionName); 110 } // namespace sh 111 112 #endif // TESTS_TEST_UTILS_COMPILER_TEST_H_ 113