<!DOCTYPE html>
<html>
<head>
    <script src="../../../resources/js-test.js" type="text/javascript"></script>
    <script src="resources/webgl-test.js" type="text/javascript"></script>
    <script src="resources/webgl-test-utils.js"> </script>
    
</head>
<body>
    <canvas id="webgl-canvas" width="100px" height="100px"></canvas>
    <script>
    var wtu = WebGLTestUtils;
    
    function runShaderTest(gl, vShaderSource, fshaderSource, errorShouldBeText)
    {
        var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
        var program = gl.createProgram();
        var vertexShader = gl.createShader(gl.VERTEX_SHADER);
        gl.shaderSource(vertexShader, vShaderSource);
        gl.compileShader(vertexShader);
        gl.shaderSource(fragmentShader, fshaderSource);
        gl.compileShader(fragmentShader);
        gl.attachShader(program, vertexShader);
        gl.attachShader(program, fragmentShader);
        gl.linkProgram(program);
        gl.useProgram(program);
        gl.drawArrays(gl.TRIANGLES, 0, 3);
        
        wtu.glErrorShouldBe(gl,0,errorShouldBeText);
        gl.deleteProgram(program)
        gl.deleteShader(vertexShader);
        gl.deleteShader(fragmentShader);
    }
    function runTest()
    {
        description("Tests that program compiling/linking with a reserved keyword.");
        var canvas = document.getElementById('webgl-canvas');
        var gl = canvas.getContext("webgl2");
        {
            var vShaderSource = '#version 300 es\n in vec2 pos;\nvoid main() { gl_Position = vec4(pos, 0, 1); }'
            var fshaderSource = '#version 300 es\n precision mediump float;\n out vec4 color;\n struct s { float metal; };\n float helper(s _s) { return _s.metal; }\n void main() { s _s; float a = helper(_s); color = vec4(a,0.8,0,1); }\n'
            runShaderTest(gl, vShaderSource, fshaderSource, "no error for using reserved keyword in struct")
        }
        
        {
            var vShaderSource = '#version 300 es\n in vec2 pos;\nvoid main() { gl_Position = vec4(pos, 0, 1); }'
            var fshaderSource = '#version 300 es\n precision mediump float;\n out vec4 color;\n struct s { float a; };\n float helper(s _s) { return _s.a; }\n void main() { s metal; float a = helper(metal); color = vec4(a,0.8,0,1); }\n'
            runShaderTest(gl, vShaderSource, fshaderSource, "no error for using reserved keyword in variable name")
        }
        {
            var vShaderSource = '#version 300 es\n in vec2 pos;\nvoid main() { gl_Position = vec4(pos, 0, 1); }'
            var fshaderSource = '#version 300 es\n precision mediump float;\n out vec4 color;\n struct metal { float a; };\n float helper(metal _s) { return _s.a; }\n void main() { metal _s; float a = helper(_s); color = vec4(a,0.8,0,1); }\n'
            runShaderTest(gl, vShaderSource, fshaderSource, "no error for using reserved keyword for struct name")
        }
        
        {
            var vShaderSource = '#version 300 es\n in vec2 pos;\nvoid main() { gl_Position = vec4(pos, 0, 1); }'
            var fshaderSource = '#version 300 es\n precision mediump float;\n out vec4 color;\n struct metal { float a; } _s;\n float helper(metal _s) { return _s.a; }\n void main() { metal _s; float a = helper(_s); color = vec4(a,0.8,0,1); }\n'
            runShaderTest(gl, vShaderSource, fshaderSource, "no error for using reserved keyword for struct name with global struct ")
        }
        {
            var vShaderSource = '#version 300 es\n in vec2 pos;\nvoid main() { gl_Position = vec4(pos, 0, 1); }'
            var fshaderSource = '#version 300 es\n precision mediump float;\n out vec4 color;\n struct s { float metal; } _s;\n float helper(s _s) { return _s.metal; }\n void main() { _s.metal = 1.0f; float a = helper(_s); color = vec4(a,0.8,0,1); }\n'
            runShaderTest(gl, vShaderSource, fshaderSource, "no error for using reserved keyword in type with global struct ")
        }
        {
            var vShaderSource = '#version 300 es\n in vec2 pos;\nvoid main() { gl_Position = vec4(pos, 0, 1); }'
            var fshaderSource = '#version 300 es\n precision mediump float;\n out vec4 color;\n struct metal { float a; } _s;\n float helper(metal _s) { return _s.a; }\n void main() { _s.a = 1.0f; float a = helper(_s); color = vec4(a,0.8,0,1); }\n'
            runShaderTest(gl, vShaderSource, fshaderSource, "no error for using reserved keyword for struct name  with global struct ")
        }
        {
            var vShaderSource = '#version 300 es\n in vec2 pos;\nvoid main() { gl_Position = vec4(pos, 0, 1); }'
            var fshaderSource = '#version 300 es\n precision mediump float;\n out vec4 color;\n struct s { float a; } metal;\n float helper(s _s) { return _s.a; }\n void main() { metal.a = 1.0f; float a = helper(metal); color = vec4(a,0.8,0,1); }\n'
            runShaderTest(gl, vShaderSource, fshaderSource, "no error for using reserved keyword for variable name with global struct ")
        }
        {
            var vShaderSource = '#version 300 es\n in vec2 pos;\nvoid main() { gl_Position = vec4(pos, 0, 1); }'
            var fshaderSource = '#version 300 es\n precision mediump float;\n out vec4 color;\n struct threadgroup_imageblock { float a; } metal;\n float helper(threadgroup_imageblock _s) { return _s.a; }\n void main() { metal.a = 1.0f; float a = helper(metal); color = vec4(a,0.8,0,1); }\n'
            runShaderTest(gl, vShaderSource, fshaderSource, "no error for using reserved keyword for variable name and struct name with global struct ")
        }
        {
            var vShaderSource = '#version 300 es\n in vec2 pos;\nvoid main() { gl_Position = vec4(pos, 0, 1); }'
            var fshaderSource = '#version 300 es\n precision mediump float;\n out vec4 color;\n struct s { float metal; };\n struct p { s q; };\n float helper(s _s) { return _s.metal; }\n void main() { p _p; float a = helper(_p.q); color = vec4(a,0.8,0,1); }\n'
            runShaderTest(gl, vShaderSource, fshaderSource, "no error for using reserved keyword in nested struct")
        }
        {
            var vShaderSource = '#version 300 es\n in vec2 pos;\nvoid main() { gl_Position = vec4(pos, 0, 1); }'
            var fshaderSource = '#version 300 es\n precision mediump float;\n out vec4 color;\n struct s { float metal; };\n struct p { s metal; };\n float helper(s _s) { return _s.metal; }\n void main() { p _p; float a = helper(_p.metal); color = vec4(a,0.8,0,1); }\n'
            runShaderTest(gl, vShaderSource, fshaderSource, "no error for using reserved keyword to access nested struct")
        }
        
        

    }
    runTest();

    </script>
</body>
</html>
