# 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 os.path import expect from environment import File, Directory from glslc_test_framework import inside_glslc_testsuite from placeholder import FileShader MINIMAL_SHADER = '#version 140\nvoid main() {}' # @inside_glslc_testsuite('WorkDir') class TestWorkDirNoArg(expect.ErrorMessage): """Tests -working-directory. Behavior cribbed from Clang.""" glslc_args = ['-working-directory'] expected_error = [ "glslc: error: argument to '-working-directory' is missing " '(expected 1 value)\n', 'glslc: error: no input files\n'] # @inside_glslc_testsuite('WorkDir') class TestWorkDirEqNoArg(expect.ErrorMessage): """Tests -working-directory=. Behavior cribbed from Clang.""" glslc_args = ['-working-directory='] expected_error = ['glslc: error: no input files\n'] EMPTY_SHADER_IN_SUBDIR = Directory( 'subdir', [File('shader.vert', MINIMAL_SHADER)]) # @inside_glslc_testsuite('WorkDir') class TestWorkDirEqNoArgCompileFile(expect.ValidNamedObjectFile): """Tests -working-directory= when compiling input file.""" environment = Directory('.', [EMPTY_SHADER_IN_SUBDIR]) glslc_args = ['-c', '-working-directory=', 'subdir/shader.vert'] # Output file should be generated into subdir/. expected_object_filenames = ('subdir/shader.vert.spv',) # @inside_glslc_testsuite('WorkDir') class TestMultipleWorkDir(expect.ValidNamedObjectFile): """Tests that if there are multiple -working-directory= specified, only the last one takes effect.""" environment = Directory('.', [EMPTY_SHADER_IN_SUBDIR]) glslc_args = ['-c', '-working-directory=i-dont-exist', '-working-directory', 'i-think/me-neither', '-working-directory=subdir', 'shader.vert'] # Output file should be generated into subdir/. expected_object_filenames = ('subdir/shader.vert.spv',) # @inside_glslc_testsuite('WorkDir') class TestWorkDirPosition(expect.ValidNamedObjectFile): """Tests that -working-directory= affects all files before and after it on the command line.""" environment = Directory('subdir', [ File('shader.vert', MINIMAL_SHADER), File('cool.frag', MINIMAL_SHADER), File('bla.vert', MINIMAL_SHADER) ]) glslc_args = ['-c', 'shader.vert', 'bla.vert', '-working-directory=subdir', 'cool.frag'] # Output file should be generated into subdir/. expected_object_filenames = ( 'subdir/shader.vert.spv', 'subdir/cool.frag.spv', 'subdir/bla.vert.spv') # @inside_glslc_testsuite('WorkDir') class TestWorkDirDeepDir(expect.ValidNamedObjectFile): """Tests that -working-directory= works with directory hierarchies.""" environment = Directory('subdir', [ Directory('subsubdir', [ File('one.vert', MINIMAL_SHADER), File('two.frag', MINIMAL_SHADER) ]), File('zero.vert', MINIMAL_SHADER) ]) glslc_args = ['-c', 'zero.vert', 'subsubdir/one.vert', 'subsubdir/two.frag', '-working-directory=subdir'] # Output file should be generated into subdir/. expected_object_filenames = ( 'subdir/zero.vert.spv', 'subdir/subsubdir/one.vert.spv', 'subdir/subsubdir/two.frag.spv') # @inside_glslc_testsuite('WorkDir') class TestWorkDirCompileFile(expect.ValidNamedObjectFile): """Tests -working-directory= when compiling input file.""" environment = Directory('.', [EMPTY_SHADER_IN_SUBDIR]) glslc_args = ['-c', '-working-directory=subdir', 'shader.vert'] # Output file should be generated into subdir/. expected_object_filenames = ('subdir/shader.vert.spv',) # @inside_glslc_testsuite('WorkDir') class TestWorkDirCompileFileOutput(expect.ValidNamedObjectFile): """Tests -working-directory= when compiling input file and specifying output filename.""" environment = Directory('.', [ Directory('subdir', [ Directory('bin', []), File('shader.vert', MINIMAL_SHADER) ]) ]) glslc_args = ['-c', '-o', 'bin/spv', '-working-directory=subdir', 'shader.vert'] # Output file should be generated into subdir/bin/. expected_object_filenames = ('subdir/bin/spv',) # @inside_glslc_testsuite('WorkDir') class TestWorkDirArgNoEq(expect.ValidNamedObjectFile): """Tests -working-directory .""" environment = Directory('.', [EMPTY_SHADER_IN_SUBDIR]) glslc_args = ['-working-directory', 'subdir', 'shader.vert'] expected_object_filenames = ('a.spv',) # @inside_glslc_testsuite('WorkDir') class TestWorkDirEqInArg(expect.ValidNamedObjectFile): """Tests -working-directory=.""" environment = Directory('.', [ Directory('=subdir', [File('shader.vert', MINIMAL_SHADER)]), ]) glslc_args = ['-working-directory==subdir', 'shader.vert'] expected_object_filenames = ('a.spv',) # @inside_glslc_testsuite('WorkDir') class TestWorkDirCompileFileAbsolutePath(expect.ValidObjectFile): """Tests -working-directory= when compiling input file with absolute path.""" shader = FileShader(MINIMAL_SHADER, '.vert') glslc_args = ['-c', '-working-directory=subdir', shader] # The -working-directory flag should not affect the placement of the link file. # The following tests ensure that. class WorkDirDoesntAffectLinkedFile(expect.ValidNamedObjectFile): """A base class for tests asserting that -working-directory has no impact on the location of the output link file. """ environment = Directory('.', [ Directory('subdir', [ File('shader.vert', MINIMAL_SHADER), # Try to fake glslc into putting the linked file here, though it # shouldn't (because -working-directory doesn't impact -o). Directory('bin', [])]), File('shader.vert', "fake file, doesn't compile."), Directory('bin', [])]) # @inside_glslc_testsuite('WorkDir') class TestWorkDirLinkFileDefaultLocation(WorkDirDoesntAffectLinkedFile): """Tests that -working-directory doesn't impact the default link-file location. """ glslc_args = ['-working-directory=subdir', 'shader.vert'] expected_object_filenames = ('a.spv',) # @inside_glslc_testsuite('WorkDir') class TestWorkDirLinkFileExplicit(WorkDirDoesntAffectLinkedFile): """Tests that -working-directory doesn't impact the named link-file location. """ glslc_args = ['-o', 'b.spv', '-working-directory=subdir', 'shader.vert'] expected_object_filenames = ('b.spv',) # @inside_glslc_testsuite('WorkDir') class TestWorkDirLinkFileInSubdir(WorkDirDoesntAffectLinkedFile): """Tests that -working-directory doesn't impact the link-file sent into an existing subdirectory. """ glslc_args = ['-o', 'bin/spv', '-working-directory=subdir', 'shader.vert'] expected_object_filenames = ('bin/spv',) # @inside_glslc_testsuite('WorkDir') class TestWorkDirLinkFileInvalidPath(expect.ErrorMessage): """Tests that -working-directory doesn't impact the error generated for an invalid -o path. """ environment = Directory('.', [ Directory('subdir', [ File('shader.vert', MINIMAL_SHADER), Directory('missing', [])]), # Present here, but missing in parent. File('shader.vert', "fake file, doesn't compile.")]) glslc_args = [ '-o', 'missing/spv', '-working-directory=subdir', 'shader.vert'] expected_error = ['glslc: error: cannot open output file: ', "'missing/spv': No such file or directory\n"]