// // Copyright 2017 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. // // RegenerateStructNames_test.cpp: // Tests for regenerating struct names. // #include "GLSLANG/ShaderLang.h" #include "angle_gl.h" #include "gtest/gtest.h" #include "tests/test_utils/compiler_test.h" using namespace sh; class RegenerateStructNamesTest : public MatchOutputCodeTest { public: RegenerateStructNamesTest() : MatchOutputCodeTest(GL_FRAGMENT_SHADER, SH_REGENERATE_STRUCT_NAMES, SH_ESSL_OUTPUT) {} }; // Test that a struct defined in a function scope is renamed. The global struct that's used as a // type of a uniform cannot be renamed. TEST_F(RegenerateStructNamesTest, GlobalStructAndLocalStructWithTheSameName) { const std::string &shaderString = R"(precision mediump float; struct myStruct { float foo; }; uniform myStruct us; void main() { struct myStruct { vec2 bar; }; myStruct scoped; scoped.bar = vec2(1.0, 2.0) * us.foo; gl_FragColor = vec4(scoped.bar, 0.0, 1.0); })"; compile(shaderString); EXPECT_TRUE(foundInCode("struct _umyStruct")); EXPECT_TRUE(foundInCode("struct _u_webgl_struct_")); } // Test that a nameless struct is handled gracefully. TEST_F(RegenerateStructNamesTest, NamelessStruct) { const std::string &shaderString = R"(precision mediump float; uniform float u; void main() { struct { vec2 bar; } scoped; scoped.bar = vec2(1.0, 2.0) * u; gl_FragColor = vec4(scoped.bar, 0.0, 1.0); })"; compile(shaderString); EXPECT_TRUE(foundInCode("struct")); }