556 lines
14 KiB
Python
556 lines
14 KiB
Python
# 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 SpecializedString
|
|
from environment import File, Directory
|
|
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyIncludeOneSibling(expect.StdoutMatch):
|
|
"""Tests #including a sibling file."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert', '#version 140\ncontent a\n#include "b"\n'),
|
|
File('b', 'content b\n')])
|
|
|
|
glslc_args = ['-E', 'a.vert']
|
|
|
|
expected_stdout = \
|
|
"""#version 140
|
|
#extension GL_GOOGLE_include_directive : enable
|
|
#line 0 "a.vert"
|
|
|
|
content a
|
|
#line 0 "b"
|
|
content b
|
|
#line 3 "a.vert"
|
|
|
|
"""
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyIncludeNotFound(expect.ErrorMessage):
|
|
"""Tests #including a not existing sibling file."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert', '#version 140\ncontent a\n#include "b"\n')])
|
|
|
|
glslc_args = ['-E', 'a.vert']
|
|
expected_error = [
|
|
"a.vert:3: error: '#include' : Cannot find or open include file. for header name: b\n",
|
|
'1 error generated.\n'
|
|
]
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyCompileIncludeOneSibling(expect.ValidObjectFile):
|
|
"""Tests #including a sibling file via full compilation."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert', '#version 140\nvoid foo(){}\n#include "b"\n'),
|
|
File('b', 'void main(){foo();}\n')])
|
|
|
|
glslc_args = ['a.vert']
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyIncludeWithoutNewline(expect.ErrorMessageSubstr):
|
|
"""Tests a #include without a newline."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert', '#version 140\n#include "b"'),
|
|
File('b', 'content b\n')])
|
|
|
|
glslc_args = ['-E', 'a.vert']
|
|
|
|
expected_error_substr = 'expected newline after header name: b'
|
|
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyCompileIncludeWithoutNewline(expect.ValidObjectFile):
|
|
"""Tests a #include without a newline via full compilation."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert',
|
|
"""#version 140
|
|
void main
|
|
#include "b"
|
|
"""),
|
|
File('b',
|
|
"""#define PAR ()
|
|
PAR{}
|
|
""")])
|
|
|
|
glslc_args = ['a.vert']
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyIncludeTwoSiblings(expect.StdoutMatch):
|
|
"""Tests #including two sibling files."""
|
|
|
|
environment = Directory('.', [
|
|
File('b.vert', '#version 140\n#include "a"\ncontent b\n#include "c"\n'),
|
|
File('a', 'content a\n'),
|
|
File('c', 'content c\n')])
|
|
|
|
glslc_args = ['-E', 'b.vert']
|
|
|
|
expected_stdout = \
|
|
"""#version 140
|
|
#extension GL_GOOGLE_include_directive : enable
|
|
#line 0 "b.vert"
|
|
|
|
#line 0 "a"
|
|
content a
|
|
#line 2 "b.vert"
|
|
content b
|
|
#line 0 "c"
|
|
content c
|
|
#line 4 "b.vert"
|
|
|
|
"""
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyCompileIncludeTwoSiblings(expect.ValidObjectFile):
|
|
"""Tests #including two sibling files via full compilation."""
|
|
|
|
environment = Directory('.', [
|
|
File('b.vert',
|
|
"""#version 140
|
|
#include "a"
|
|
void bfun(){afun();}
|
|
#include "c"
|
|
"""),
|
|
File('a',
|
|
"""void afun(){}
|
|
#define BODY {}
|
|
"""),
|
|
File('c', 'void main() BODY\n')])
|
|
|
|
glslc_args = ['b.vert']
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyNestedIncludeAmongSiblings(expect.StdoutMatch):
|
|
"""Tests #include inside #included sibling files."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert', '#version 140\n#include "b"\ncontent a\n'),
|
|
File('b', 'content b\n#include "c"\n'),
|
|
File('c', 'content c\n')])
|
|
|
|
glslc_args = ['-E', 'a.vert']
|
|
|
|
expected_stdout = \
|
|
"""#version 140
|
|
#extension GL_GOOGLE_include_directive : enable
|
|
#line 0 "a.vert"
|
|
|
|
#line 0 "b"
|
|
content b
|
|
#line 0 "c"
|
|
content c
|
|
#line 2 "b"
|
|
#line 2 "a.vert"
|
|
content a
|
|
"""
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyCompileNestedIncludeAmongSiblings(expect.ValidObjectFile):
|
|
"""Tests #include inside #included sibling files via full compilation."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert',
|
|
"""#version 140
|
|
#define BODY {}
|
|
#include "b"
|
|
void main(){cfun();}
|
|
"""),
|
|
File('b',
|
|
"""void bfun() BODY
|
|
#include "c"
|
|
"""),
|
|
File('c',
|
|
"""#define BF bfun()
|
|
void cfun(){BF;}
|
|
""")])
|
|
|
|
glslc_args = ['a.vert']
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyIncludeSubdir(expect.StdoutMatch):
|
|
"""Tests #including a file from a subdirectory."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert', '#version 140\ncontent a1\n#include "subdir/a"\ncontent a2\n'),
|
|
Directory('subdir', [File('a', 'content suba\n')])])
|
|
|
|
glslc_args = ['-E', 'a.vert']
|
|
|
|
expected_stdout = \
|
|
"""#version 140
|
|
#extension GL_GOOGLE_include_directive : enable
|
|
#line 0 "a.vert"
|
|
|
|
content a1
|
|
#line 0 "subdir/a"
|
|
content suba
|
|
#line 3 "a.vert"
|
|
content a2
|
|
"""
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyCompileIncludeSubdir(expect.ValidObjectFile):
|
|
"""Tests #including a file from a subdirectory via full compilation."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert',
|
|
"""#version 140
|
|
#define BODY {}
|
|
#include "subdir/a"
|
|
void afun()BODY
|
|
"""),
|
|
Directory('subdir', [File('a', 'void main() BODY\n')])])
|
|
|
|
glslc_args = ['a.vert']
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyIncludeDeepSubdir(expect.StdoutMatch):
|
|
"""Tests #including a file from a subdirectory nested a few levels down."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert',
|
|
'#version 140\ncontent a1\n#include "dir/subdir/subsubdir/a"\ncontent a2\n'),
|
|
Directory('dir', [
|
|
Directory('subdir', [
|
|
Directory('subsubdir', [File('a', 'content incl\n')])])])])
|
|
|
|
glslc_args = ['-E', 'a.vert']
|
|
|
|
expected_stdout = \
|
|
"""#version 140
|
|
#extension GL_GOOGLE_include_directive : enable
|
|
#line 0 "a.vert"
|
|
|
|
content a1
|
|
#line 0 "dir/subdir/subsubdir/a"
|
|
content incl
|
|
#line 3 "a.vert"
|
|
content a2
|
|
"""
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyCompileIncludeDeepSubdir(expect.ValidObjectFile):
|
|
"""Tests #including a file from a subdirectory nested a few levels down
|
|
via full compilation."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert',
|
|
"""#version 140
|
|
#define BODY {}
|
|
#include "dir/subdir/subsubdir/a"
|
|
void afun()BODY
|
|
"""),
|
|
Directory('dir', [
|
|
Directory('subdir', [
|
|
Directory('subsubdir', [File('a', 'void main() BODY\n')])])])])
|
|
|
|
glslc_args = ['a.vert']
|
|
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class TestWrongPoundVersionInIncludingFile(expect.ValidObjectFileWithWarning):
|
|
"""Tests that warning message for #version directive in the including file
|
|
has the correct filename."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert', '#version 100000000\n#include "b.glsl"\n'),
|
|
File('b.glsl', 'void main() {}\n')])
|
|
glslc_args = ['-c', '-std=400', 'a.vert']
|
|
|
|
expected_warning = [
|
|
'a.vert: warning: (version, profile) forced to be (400, none),'
|
|
' while in source code it is (100000000, none)\n'
|
|
'1 warning generated.\n'
|
|
]
|
|
|
|
|
|
# TODO(antiagainst): now #version in included files results in an error.
|
|
# Fix this after #version in included files are supported.
|
|
# TODO(dneto): I'm not sure what the expected result should be.
|
|
@inside_glslc_testsuite('Include')
|
|
class TestWrongPoundVersionInIncludedFile(expect.ErrorMessage):
|
|
"""Tests that warning message for #version directive in the included file
|
|
has the correct filename."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert', '#version 140\n#include "b.glsl"\nvoid main() {}'),
|
|
File('b.glsl', '#version 10000000\n')])
|
|
glslc_args = ['-E', 'a.vert']
|
|
|
|
expected_error = [
|
|
"b.glsl:1: error: '#version' : must occur first in shader\n",
|
|
'1 error generated.\n'
|
|
]
|
|
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyRelativeInclude(expect.StdoutMatch):
|
|
"""Tests #including a relative sibling."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert', '#version 140\ncontent a\n#include "foo/b.glsl"\n'),
|
|
Directory('foo', [
|
|
File('b.glsl', '#include "c.glsl"\ncontent b\n'),
|
|
File('c.glsl', 'content c\n')
|
|
])])
|
|
|
|
glslc_args = ['-E', 'a.vert']
|
|
|
|
expected_stdout = \
|
|
"""#version 140
|
|
#extension GL_GOOGLE_include_directive : enable
|
|
#line 0 "a.vert"
|
|
|
|
content a
|
|
#line 0 "foo/b.glsl"
|
|
#line 0 "foo/c.glsl"
|
|
content c
|
|
#line 1 "foo/b.glsl"
|
|
content b
|
|
#line 3 "a.vert"
|
|
|
|
"""
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyNestedRelativeInclude(expect.StdoutMatch):
|
|
"""Tests #including a relative child file."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert', '#version 140\ncontent a\n#include "foo/b.glsl"\n'),
|
|
Directory('foo', [
|
|
File('b.glsl', '#include "bar/c.glsl"\ncontent b\n'),
|
|
Directory('bar', [
|
|
File('c.glsl', 'content c\n')
|
|
])
|
|
])
|
|
])
|
|
|
|
glslc_args = ['-E', 'a.vert']
|
|
|
|
expected_stdout = \
|
|
"""#version 140
|
|
#extension GL_GOOGLE_include_directive : enable
|
|
#line 0 "a.vert"
|
|
|
|
content a
|
|
#line 0 "foo/b.glsl"
|
|
#line 0 "foo/bar/c.glsl"
|
|
content c
|
|
#line 1 "foo/b.glsl"
|
|
content b
|
|
#line 3 "a.vert"
|
|
|
|
"""
|
|
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyRelativeIncludeWithDashI(expect.StdoutMatch):
|
|
"""Tests #including a relative file from a -I directory."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert', '#version 140\ncontent a\n#include "bar/b.glsl"\n'),
|
|
Directory('foo', [
|
|
Directory('bar', [
|
|
File('b.glsl', '#include "c.glsl"\ncontent b\n'),
|
|
]),
|
|
File('c.glsl', 'content c\n')
|
|
])
|
|
])
|
|
|
|
glslc_args = ['-E', 'a.vert', '-Ifoo']
|
|
|
|
expected_stdout = \
|
|
"""#version 140
|
|
#extension GL_GOOGLE_include_directive : enable
|
|
#line 0 "a.vert"
|
|
|
|
content a
|
|
#line 0 "foo/bar/b.glsl"
|
|
#line 0 "foo/c.glsl"
|
|
content c
|
|
#line 1 "foo/bar/b.glsl"
|
|
content b
|
|
#line 3 "a.vert"
|
|
|
|
"""
|
|
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyRelativeOverridesDashI(expect.StdoutMatch):
|
|
"""Tests that relative includes override -I parameters."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert', '#version 140\ncontent a\n#include "b.glsl"\n'),
|
|
File('b.glsl', 'content base_b\n'),
|
|
Directory('foo', [
|
|
File('b.glsl', '#include "c.glsl"\ncontent b\n'),
|
|
File('c.glsl', 'content c\n')
|
|
])
|
|
])
|
|
|
|
glslc_args = ['-E', 'a.vert', '-Ifoo']
|
|
|
|
expected_stdout = \
|
|
"""#version 140
|
|
#extension GL_GOOGLE_include_directive : enable
|
|
#line 0 "a.vert"
|
|
|
|
content a
|
|
#line 0 "b.glsl"
|
|
content base_b
|
|
#line 3 "a.vert"
|
|
|
|
"""
|
|
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyRelativeParent(expect.StdoutMatch):
|
|
"""Tests #including a parent file."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert', '#version 140\ncontent a\n#include "b.glsl"\n'),
|
|
File('c.glsl', 'content c\n'),
|
|
Directory('foo', [
|
|
File('b.glsl', '#include "../c.glsl"\ncontent b\n')
|
|
])
|
|
])
|
|
|
|
glslc_args = ['-E', 'a.vert', '-Ifoo']
|
|
|
|
expected_stdout = \
|
|
"""#version 140
|
|
#extension GL_GOOGLE_include_directive : enable
|
|
#line 0 "a.vert"
|
|
|
|
content a
|
|
#line 0 "foo/b.glsl"
|
|
#line 0 "foo/../c.glsl"
|
|
content c
|
|
#line 1 "foo/b.glsl"
|
|
content b
|
|
#line 3 "a.vert"
|
|
|
|
"""
|
|
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyRelativeNeighbourDirectory(expect.StdoutMatch):
|
|
"""Tests #including a relative file in a neighbour directory."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert', '#version 140\ncontent a\n#include "foo/b.glsl"\n'),
|
|
Directory('foo', [
|
|
File('b.glsl', '#include "../bar/c.glsl"\ncontent b\n')
|
|
]),
|
|
Directory('bar', [
|
|
File('c.glsl', 'content c\n')
|
|
])
|
|
])
|
|
|
|
glslc_args = ['-E', 'a.vert']
|
|
|
|
expected_stdout = \
|
|
"""#version 140
|
|
#extension GL_GOOGLE_include_directive : enable
|
|
#line 0 "a.vert"
|
|
|
|
content a
|
|
#line 0 "foo/b.glsl"
|
|
#line 0 "foo/../bar/c.glsl"
|
|
content c
|
|
#line 1 "foo/b.glsl"
|
|
content b
|
|
#line 3 "a.vert"
|
|
|
|
"""
|
|
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyRelativeOnlyToSelf(expect.ErrorMessage):
|
|
"""Tests that a relative includes are only relative to yourself."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert', '#version 140\ncontent a\n#include "foo/b.glsl"\n'),
|
|
File('c.glsl', 'content c\n'),
|
|
Directory('foo', [
|
|
File('b.glsl', '#include "c.glsl"\ncontent b\n')
|
|
]),
|
|
])
|
|
|
|
glslc_args = ['-E', 'a.vert']
|
|
|
|
expected_error = [
|
|
"foo/b.glsl:1: error: '#include' : "
|
|
'Cannot find or open include file. for header name: c.glsl\n',
|
|
'1 error generated.\n'
|
|
]
|
|
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyRelativeFromAbsolutePath(expect.StdoutMatch):
|
|
"""Tests that absolute files can relatively include."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert', '#version 140\ncontent a\n#include "b.glsl"\n'),
|
|
File('b.glsl', 'content b\n')
|
|
])
|
|
|
|
glslc_args = ['-E', SpecializedString('$directory/a.vert')]
|
|
|
|
expected_stdout = SpecializedString(
|
|
"""#version 140
|
|
#extension GL_GOOGLE_include_directive : enable
|
|
#line 0 "$directory/a.vert"
|
|
|
|
content a
|
|
#line 0 "$directory/b.glsl"
|
|
content b
|
|
#line 3 "$directory/a.vert"
|
|
|
|
""")
|
|
|
|
|
|
@inside_glslc_testsuite('Include')
|
|
class VerifyDashIAbsolutePath(expect.StdoutMatch):
|
|
"""Tests that -I parameters can be absolute paths."""
|
|
|
|
environment = Directory('.', [
|
|
File('a.vert', '#version 140\ncontent a\n#include "b.glsl"\n'),
|
|
Directory('foo', {
|
|
File('b.glsl', 'content b\n')
|
|
})
|
|
])
|
|
|
|
glslc_args = ['-E', 'a.vert', '-I', SpecializedString('$directory/foo')]
|
|
|
|
expected_stdout = SpecializedString(
|
|
"""#version 140
|
|
#extension GL_GOOGLE_include_directive : enable
|
|
#line 0 "a.vert"
|
|
|
|
content a
|
|
#line 0 "$directory/foo/b.glsl"
|
|
content b
|
|
#line 3 "a.vert"
|
|
|
|
""")
|