# Copyright 2016 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 import re from glslc_test_framework import inside_glslc_testsuite from placeholder import FileShader MINIMAL_SHADER = '#version 140\nvoid main() {}' # Regular expression patterns for the minimal shader. The magic number should # match exactly, and there should not be a trailing comma at the end of the # list. When -mfmt=c is specified, curly brackets should be presented. MINIMAL_SHADER_NUM_FORMAT_PATTERN = "^0x07230203.*[0-9a-f]$" MINIMAL_SHADER_C_FORMAT_PATTERN = "^\{0x07230203.*[0-9a-f]\}" ERROR_SHADER = '#version 140\n#error\nvoid main() {}' @inside_glslc_testsuite('OptionMfmt') class TestFmtCWorksWithDashC(expect.ValidFileContents): """Tests that -mfmt=c works with -c for single input file. SPIR-V binary code output should be emitted as a C-style initializer list in the output file. """ shader = FileShader(MINIMAL_SHADER, '.vert') glslc_args = [shader, '-c', '-mfmt=c', '-o', 'output_file'] target_filename = 'output_file' expected_file_contents = re.compile(MINIMAL_SHADER_C_FORMAT_PATTERN, re.S) @inside_glslc_testsuite('OptionMfmt') class TestFmtNumWorksWithDashC(expect.ValidFileContents): """Tests that -mfmt=num works with -c for single input file. SPIR-V binary code output should be emitted as a list of hex numbers in the output file. """ shader = FileShader(MINIMAL_SHADER, '.vert') glslc_args = [shader, '-c', '-mfmt=num', '-o', 'output_file'] target_filename = 'output_file' expected_file_contents = re.compile(MINIMAL_SHADER_NUM_FORMAT_PATTERN, re.S) @inside_glslc_testsuite('OptionMfmt') class TestFmtBinWorksWithDashC(expect.ValidObjectFile): """Tests that -mfmt=bin works with -c for single input file. This test should simply have the SPIR-V binary generated. """ shader = FileShader(MINIMAL_SHADER, '.vert') glslc_args = [shader, '-c', '-mfmt=bin'] @inside_glslc_testsuite('OptionMfmt') class TestFmtCWithLinking(expect.ValidFileContents): """Tests that -mfmt=c works when linkding is enabled (no -c specified). SPIR-V binary code should be emitted as a C-style initializer list in the output file. """ shader = FileShader(MINIMAL_SHADER, '.vert') glslc_args = [shader, '-mfmt=c'] target_filename = 'a.spv' expected_file_contents = re.compile(MINIMAL_SHADER_C_FORMAT_PATTERN, re.S) @inside_glslc_testsuite('OptionMfmt') class TestFmtNumWithLinking(expect.ValidFileContents): """Tests that -mfmt=num works when linkding is enabled (no -c specified). SPIR-V binary code should be emitted as a C-style initializer list in the output file. """ shader = FileShader(MINIMAL_SHADER, '.vert') glslc_args = [shader, '-mfmt=num'] target_filename = 'a.spv' expected_file_contents = re.compile(MINIMAL_SHADER_NUM_FORMAT_PATTERN, re.S) @inside_glslc_testsuite('OptionMfmt') class TestFmtCErrorWhenOutputDisasembly(expect.ErrorMessage): """Tests that specifying '-mfmt=c' when the compiler is set to disassembly mode should trigger an error. """ shader = FileShader(MINIMAL_SHADER, '.vert') glslc_args = [shader, '-mfmt=c', '-S', '-o', 'output_file'] expected_error = ("glslc: error: cannot emit output as a C-style " "initializer list when only preprocessing the source\n") @inside_glslc_testsuite('OptionMfmt') class TestFmtNumErrorWhenOutputDisasembly(expect.ErrorMessage): """Tests that specifying '-mfmt=num' when the compiler is set to disassembly mode should trigger an error. """ shader = FileShader(MINIMAL_SHADER, '.vert') glslc_args = [shader, '-mfmt=num', '-S', '-o', 'output_file'] expected_error = ( "glslc: error: cannot emit output as a list of hex numbers " "when only preprocessing the source\n") @inside_glslc_testsuite('OptionMfmt') class TestFmtBinErrorWhenOutputDisasembly(expect.ErrorMessage): """Tests that specifying '-mfmt=bin' when the compiler is set to disassembly mode should trigger an error. """ shader = FileShader(MINIMAL_SHADER, '.vert') glslc_args = [shader, '-mfmt=bin', '-S', '-o', 'output_file'] expected_error = ("glslc: error: cannot emit output as a binary " "when only preprocessing the source\n") @inside_glslc_testsuite('OptionMfmt') class TestFmtNumErrorWhenOutputPreprocess(expect.ErrorMessage): """Tests that specifying '-mfmt=num' when the compiler is set to preprocessing only mode should trigger an error. """ shader = FileShader(MINIMAL_SHADER, '.vert') glslc_args = [shader, '-mfmt=num', '-E', '-o', 'output_file'] expected_error = ( "glslc: error: cannot emit output as a list of hex numbers " "when only preprocessing the source\n") @inside_glslc_testsuite('OptionMfmt') class TestFmtCErrorWithDashCapM(expect.ErrorMessage): """Tests that specifying '-mfmt=c' should trigger an error when the compiler is set to dump dependency info as the output (-M or -MM is specified). """ shader = FileShader(MINIMAL_SHADER, '.vert') glslc_args = [shader, '-mfmt=c', '-M', '-o', 'output_file'] expected_error = ("glslc: error: cannot emit output as a C-style " "initializer list when only preprocessing the source\n") @inside_glslc_testsuite('OptionMfmt') class TestFmtCWorksWithDashCapMD(expect.ValidFileContents): """Tests that -mfmt=c works with '-c -MD'. SPIR-V binary code should be emitted as a C-style initializer list in the output file. """ shader = FileShader(MINIMAL_SHADER, '.vert') glslc_args = [shader, '-mfmt=c', '-c', '-MD', '-o', 'output_file'] target_filename = 'output_file' expected_file_contents = re.compile(MINIMAL_SHADER_C_FORMAT_PATTERN, re.S) @inside_glslc_testsuite('OptionMfmt') class TestFmtNumWorksWithDashCapMD(expect.ValidFileContents): """Tests that -mfmt=num works with '-c -MD'. SPIR-V binary code should be emitted as a C-style initializer list in the output file. """ shader = FileShader(MINIMAL_SHADER, '.vert') glslc_args = [shader, '-mfmt=num', '-c', '-MD', '-o', 'output_file'] target_filename = 'output_file' expected_file_contents = re.compile(MINIMAL_SHADER_NUM_FORMAT_PATTERN, re.S) @inside_glslc_testsuite('OptionMfmt') class TestFmtCExitsElegantlyWithErrorInShader(expect.ErrorMessage): """Tests that the compiler fails elegantly with -mfmt=c when there are errors in the input shader. """ shader = FileShader(ERROR_SHADER, '.vert') glslc_args = [shader, '-mfmt=c'] expected_error = [shader, ':3: error: \'#error\' :\n', '1 error generated.\n'] @inside_glslc_testsuite('OptionMfmt') class TestFmtNumExitsElegantlyWithErrorInShader(expect.ErrorMessage): """Tests that the compiler fails elegantly with -mfmt=num when there are errors in the input shader. """ shader = FileShader(ERROR_SHADER, '.vert') glslc_args = [shader, '-mfmt=num'] expected_error = [shader, ':3: error: \'#error\' :\n', '1 error generated.\n'] @inside_glslc_testsuite('OptionMfmt') class TestFmtBinExitsElegantlyWithErrorInShader(expect.ErrorMessage): """Tests that the compiler fails elegantly with -mfmt=binary when there are errors in the input shader. """ shader = FileShader(ERROR_SHADER, '.vert') glslc_args = [shader, '-mfmt=bin'] expected_error = [shader, ':3: error: \'#error\' :\n', '1 error generated.\n']