| # Copyright 2015 The Shaderc Authors. All rights reserved. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| import expect |
| from glslc_test_framework import inside_glslc_testsuite |
| from placeholder import FileShader |
| |
| |
| def core_vert_shader_without_version(): |
| # gl_ClipDistance doesn't exist in es profile (at least until 3.10). |
| return 'void main() { gl_ClipDistance[0] = 5.; }' |
| |
| |
| def core_frag_shader_without_version(): |
| # gl_SampleID appears in core profile from 4.00. |
| # gl_sampleID doesn't exsit in es profile (at least until 3.10). |
| return 'void main() { int temp = gl_SampleID; }' |
| |
| |
| @inside_glslc_testsuite('OptionStd') |
| class TestStdNoArg(expect.ErrorMessage): |
| """Tests -std alone.""" |
| |
| glslc_args = ['-std'] |
| expected_error = ["glslc: error: unknown argument: '-std'\n"] |
| |
| |
| @inside_glslc_testsuite('OptionStd') |
| class TestStdEqNoArg(expect.ErrorMessage): |
| """Tests -std= with no argument.""" |
| |
| glslc_args = ['-std='] |
| expected_error = ["glslc: error: invalid value '' in '-std='\n"] |
| |
| |
| @inside_glslc_testsuite('OptionStd') |
| class TestStdEqSpaceArg(expect.ErrorMessage): |
| """Tests -std= <version-profile>.""" |
| |
| shader = FileShader(core_frag_shader_without_version(), '.frag') |
| glslc_args = ['-c', '-std=', '450core', shader] |
| expected_error = ["glslc: error: invalid value '' in '-std='\n"] |
| |
| # TODO(dneto): The error message changes with different versions of glslang. |
| @inside_glslc_testsuite('OptionStd') |
| class TestMissingVersionAndStd(expect.ErrorMessageSubstr): |
| """Tests that missing both #version and -std results in errors.""" |
| |
| shader = FileShader(core_frag_shader_without_version(), '.frag') |
| glslc_args = ['-c', shader] |
| expected_error_substr = ['error:'] |
| |
| |
| @inside_glslc_testsuite('OptionStd') |
| class TestMissingVersionButHavingStd(expect.ValidObjectFile): |
| """Tests that correct -std fixes missing #version.""" |
| |
| shader = FileShader(core_frag_shader_without_version(), '.frag') |
| glslc_args = ['-c', '-std=450core', shader] |
| |
| |
| @inside_glslc_testsuite('OptionStd') |
| class TestMissingVersionAndWrongStd(expect.ErrorMessage): |
| """Tests missing #version and wrong -std results in errors.""" |
| |
| shader = FileShader(core_frag_shader_without_version(), '.frag') |
| glslc_args = ['-c', '-std=310es', shader] |
| expected_error = [ |
| shader, ":1: error: 'gl_SampleID' : required extension not requested: " |
| 'GL_OES_sample_variables\n1 error generated.\n'] |
| |
| |
| @inside_glslc_testsuite('OptionStd') |
| class TestConflictingVersionAndStd(expect.ValidObjectFileWithWarning): |
| """Tests that with both #version and -std, -std takes precedence.""" |
| |
| # Wrong #version here on purpose. |
| shader = FileShader( |
| '#version 310 es\n' + core_frag_shader_without_version(), '.frag') |
| # -std overwrites the wrong #version. |
| glslc_args = ['-c', '-std=450core', shader] |
| |
| expected_warning = [ |
| shader, ': warning: (version, profile) forced to be (450, core), while ' |
| 'in source code it is (310, es)\n1 warning generated.\n'] |
| |
| |
| @inside_glslc_testsuite('OptionStd') |
| class TestMultipleStd(expect.ValidObjectFile): |
| """Tests that for multiple -std, the last one takes effect.""" |
| |
| shader = FileShader(core_frag_shader_without_version(), '.frag') |
| glslc_args = ['-c', '-std=100', '-std=310es', shader, '-std=450core'] |
| |
| |
| @inside_glslc_testsuite('OptionStd') |
| class TestMultipleFiles(expect.ValidObjectFileWithWarning): |
| """Tests that -std covers all files.""" |
| |
| shader1 = FileShader(core_frag_shader_without_version(), '.frag') |
| shader2 = FileShader(core_vert_shader_without_version(), '.vert') |
| shader3 = FileShader( |
| '#version 310 es\n' + core_frag_shader_without_version(), '.frag') |
| glslc_args = ['-c', '-std=450compatibility', shader1, shader2, shader3] |
| |
| expected_warning = [ |
| shader3, ': warning: (version, profile) forced to be (450, ' |
| 'compatibility), while in source code it is (310, es)\n' |
| '1 warning generated.\n'] |
| |
| |
| @inside_glslc_testsuite('OptionStd') |
| class TestUnkownProfile(expect.ErrorMessage): |
| """Tests that -std rejects unknown profile.""" |
| |
| shader = FileShader(core_frag_shader_without_version(), '.frag') |
| glslc_args = ['-c', '-std=450google', shader] |
| expected_error = [ |
| "glslc: error: invalid value '450google' in '-std=450google'\n"] |
| |
| |
| @inside_glslc_testsuite('OptionStd') |
| class TestUnkownVersion(expect.ErrorMessage): |
| """Tests that -std rejects unknown version.""" |
| |
| shader = FileShader(core_frag_shader_without_version(), '.frag') |
| glslc_args = ['-c', '-std=42core', shader] |
| expected_error = [ |
| "glslc: error: invalid value '42core' in '-std=42core'\n"] |
| |
| |
| @inside_glslc_testsuite('OptionStd') |
| class TestTotallyWrongStdValue(expect.ErrorMessage): |
| """Tests that -std rejects totally wrong -std value.""" |
| |
| shader = FileShader(core_vert_shader_without_version(), '.vert') |
| glslc_args = ['-c', '-std=wrong42', shader] |
| |
| expected_error = [ |
| "glslc: error: invalid value 'wrong42' in '-std=wrong42'\n"] |
| |
| |
| @inside_glslc_testsuite('OptionStd') |
| class TestVersionInsideSlashSlashComment(expect.ValidObjectFileWithWarning): |
| """Tests that -std substitutes the correct #version string.""" |
| |
| # The second #version string should be substituted and this shader |
| # should compile successfully with -std=450core. |
| shader = FileShader( |
| '// #version 310 es\n#version 310 es\n' + |
| core_vert_shader_without_version(), '.vert') |
| glslc_args = ['-c', '-std=450core', shader] |
| |
| expected_warning = [ |
| shader, ': warning: (version, profile) forced to be (450, core), while ' |
| 'in source code it is (310, es)\n1 warning generated.\n'] |
| |
| |
| @inside_glslc_testsuite('OptionStd') |
| class TestVersionInsideSlashStarComment(expect.ValidObjectFileWithWarning): |
| """Tests that -std substitutes the correct #version string.""" |
| |
| # The second #version string should be substituted and this shader |
| # should compile successfully with -std=450core. |
| shader = FileShader( |
| '/* #version 310 es */\n#version 310 es\n' + |
| core_vert_shader_without_version(), '.vert') |
| glslc_args = ['-c', '-std=450core', shader] |
| |
| expected_warning = [ |
| shader, ': warning: (version, profile) forced to be (450, core), while ' |
| 'in source code it is (310, es)\n1 warning generated.\n'] |
| |
| |
| @inside_glslc_testsuite('OptionStd') |
| class TestCommentBeforeVersion(expect.ValidObjectFileWithWarning): |
| """Tests that comments before #version (same line) is correctly handled.""" |
| |
| shader = FileShader( |
| '/* some comment */ #version 150\n' + |
| core_vert_shader_without_version(), '.vert') |
| glslc_args = ['-c', '-std=450', shader] |
| |
| expected_warning = [ |
| shader, ': warning: (version, profile) forced to be (450, none), while ' |
| 'in source code it is (150, none)\n1 warning generated.\n'] |
| |
| |
| @inside_glslc_testsuite('OptionStd') |
| class TestCommentAfterVersion(expect.ValidObjectFileWithWarning): |
| """Tests that multiple-line comments after #version is correctly handled.""" |
| |
| shader = FileShader( |
| '#version 150 compatibility ' + |
| '/* start \n second line \n end */\n' + |
| core_vert_shader_without_version(), '.vert') |
| glslc_args = ['-c', '-std=450core', shader] |
| |
| expected_warning = [ |
| shader, ': warning: (version, profile) forced to be (450, core), while ' |
| 'in source code it is (150, compatibility)\n1 warning generated.\n'] |
| |
| |
| # The following test case is disabled because of a bug in glslang. |
| # When checking non-newline whitespaces, glslang only recognizes |
| # ' ' and '\t', leaving '\v' and '\f' unhandled. The following test |
| # case exposes this problem. It should be turned on once a fix for |
| # glslang is landed. |
| #@inside_glslc_testsuite('OptionStd') |
| class TestSpaceAroundVersion(expect.ValidObjectFileWithWarning): |
| """Tests that space around #version is correctly handled.""" |
| |
| shader = FileShader( |
| '\t \t # \t \f\f version \v \t\t 310 \v\v \t es \n' + |
| core_vert_shader_without_version(), '.vert') |
| glslc_args = ['-c', '-std=450core', shader] |
| |
| expected_warning = [ |
| shader, ': warning: (version, profile) forced to be (450, core), while ' |
| 'in source code it is (310, es)\n1 warning generated.\n'] |
| |
| |
| @inside_glslc_testsuite('OptionStd') |
| class TestVersionInsideCrazyComment(expect.ValidObjectFileWithWarning): |
| """Tests that -std substitutes the correct #version string.""" |
| |
| # The fourth #version string should be substituted and this shader |
| # should compile successfully with -std=450core. |
| shader = FileShader( |
| '/* */ /* // /* #version 310 es */\n' + # /*-style comment |
| '// /* */ /* /* // #version 310 es\n' + # //-style comment |
| '///*////*//*/*/ #version 310 es*/\n' + # //-style comment |
| '#version 310 es\n' + core_vert_shader_without_version(), '.vert') |
| glslc_args = ['-c', '-std=450core', shader] |
| |
| expected_warning = [ |
| shader, ': warning: (version, profile) forced to be (450, core), while ' |
| 'in source code it is (310, es)\n1 warning generated.\n'] |
| |
| |
| @inside_glslc_testsuite('OptionStd') |
| class TestVersionMissingProfile(expect.ErrorMessage): |
| """Tests that missing required profile in -std results in an error.""" |
| |
| shader = FileShader('#version 140\nvoid main() {}', '.vert') |
| glslc_args = ['-c', '-std=310', shader] |
| |
| expected_error = [ |
| shader, ': error: #version: versions 300 and 310 require ', |
| "specifying the 'es' profile\n1 error generated.\n"] |
| |
| |
| @inside_glslc_testsuite('OptionStd') |
| class TestVersionRedundantProfile(expect.ErrorMessageSubstr): |
| """Tests that adding non-required profile in -std results in an error.""" |
| |
| shader = FileShader('#version 140\nvoid main() {}', '.vert') |
| glslc_args = ['-c', '-std=100core', shader] |
| |
| expected_error_substr = [ |
| shader, ': error: #version: versions before 150 do not allow ' |
| 'a profile token\n'] |