diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /dom/canvas/test/webgl-conf/checkout/deqp/data/gles3/shaders/preprocessor.test | |
parent | Initial commit. (diff) | |
download | firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/canvas/test/webgl-conf/checkout/deqp/data/gles3/shaders/preprocessor.test')
-rw-r--r-- | dom/canvas/test/webgl-conf/checkout/deqp/data/gles3/shaders/preprocessor.test | 5256 |
1 files changed, 5256 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-conf/checkout/deqp/data/gles3/shaders/preprocessor.test b/dom/canvas/test/webgl-conf/checkout/deqp/data/gles3/shaders/preprocessor.test new file mode 100644 index 0000000000..ebe3851965 --- /dev/null +++ b/dom/canvas/test/webgl-conf/checkout/deqp/data/gles3/shaders/preprocessor.test @@ -0,0 +1,5256 @@ +group basic "Basic Tests" + + case correct_phases + version 300 es + expect compile_fail + both "" + #version 300 es + #define e +1 + ${DECLARATIONS} + void main() + { + mediump int n = 1e; + ${OUTPUT} + } + "" + end + + case invalid_identifier + version 300 es + expect compile_fail + both "" + #version 300 es + #define e +1 + ${DECLARATIONS} + void main() + { + mediump int 1xyz = 1; + ${OUTPUT} + } + "" + end + + case null_directive + version 300 es + values { output float out0 = 0.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + + # + # // comment + /*sfd*/ # /* */ + + void main() + { + out0 = 0.0; + ${OUTPUT} + } + "" + end + + case invalid_directive + version 300 es + expect compile_fail + both "" + #version 300 es + #defin AAA + ${DECLARATIONS} + + void main() + { + ${OUTPUT} + } + "" + end + + case missing_identifier + version 300 es + expect compile_fail + both "" + #version 300 es + #define + ${DECLARATIONS} + + void main() + { + ${OUTPUT} + } + "" + end + + case empty_object + version 300 es + values { output float out0 = -1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + + # define VALUE + + void main() + { + out0 = VALUE - 1.0; + ${OUTPUT} + } + "" + end + + case empty_function + version 300 es + values { output float out0 = -1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + + # define VALUE(a) + + void main() + { + out0 = VALUE(2.0) - 1.0; + ${OUTPUT} + } + "" + end + + case empty_directive + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + + # + + void main() + { + out0 = 1.0; + ${OUTPUT} + } + "" + end + + case identifier_with_double_underscore + values { output float out0 = 1.0; } + version 300 es + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + # define __VALUE__ 1 + + void main() + { + // __VALUE__ not used since it might be set by an "underlying software layer" + out0 = float(1.0); + ${OUTPUT} + } + "" + end +end # basic + +group definitions "Symbol Definition Tests" + + case define_value_and_function + version 300 es + values { output float out0 = 6.0; } + + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS:single-line} + # define VALUE (1.5 + 2.5) + # define FUNCTION(__LINE__, b) __LINE__+b + + void main() + { + out0 = FUNCTION(VALUE, ((0.2) + 1.8) ); + ${OUTPUT} + } + "" + end + + case undefine_object_invalid_syntax + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + #define VAL 2.0 + #undef VAL sdflkjfds + #define VAL 1.0 + ${DECLARATIONS} + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(VAL); + } + "" + end + + case undefine_invalid_object_1 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + #undef __LINE__ + ${DECLARATIONS} + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(__LINE__); + } + "" + end + + case undefine_invalid_object_2 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + #undef __FILE__ + ${DECLARATIONS} + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(__FILE__); + } + "" + end + + case undefine_invalid_object_3 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + #undef __VERSION__ + ${DECLARATIONS} + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(__VERSION__); + } + "" + end + + case undefine_invalid_object_4 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + #undef GL_ES + ${DECLARATIONS} + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(GL_ES); + } + "" + end + + case undefine_function + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + #define FUNCTION(a,b) a+b + #undef FUNCTION + #define FUNCTION(a,b) a-b + ${DECLARATIONS} + + void main() + { + out0 = FUNCTION(3.0, 2.0); + ${OUTPUT} + } + "" + end + +end # definitions + +group invalid_definitions "Invalid Definition Tests" + + case define_non_identifier + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + #define 123 321 + ${DECLARATIONS} + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case undef_non_identifier_1 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + #undef 123 + ${DECLARATIONS} + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case undef_non_identifier_2 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + #undef foo.bar + ${DECLARATIONS} + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + +end # invalid_definitions + +group object_redefinitions "Object Redefinition Tests" + + case invalid_object_ident + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + # define AAA 2.0 + # define AAAA 2.1 + # define VALUE (AAA - 1.0) + # define VALUE (AAAA - 1.0) + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(VALUE); + } + "" + end + + case invalid_object_whitespace + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + # define AAA 2.0 + # define VALUE (AAA - 1.0) + # define VALUE (AAA- 1.0) + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(VALUE); + } + "" + end + + case invalid_object_op + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + # define AAA 2.0 + # define VALUE (AAA - 1.0) + # define VALUE (AAA + 1.0) + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(VALUE); + } + "" + end + + case invalid_object_floatval_1 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + # define AAA 2.0 + # define VALUE (AAA - 1.0) + # define VALUE (AAA - 1.1) + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(VALUE); + } + "" + end + + case invalid_object_floatval_2 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + # define AAA 2.0 + # define VALUE (AAA - 1.0) + # define VALUE (AAA - 1.0e-1) + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(VALUE); + } + "" + end + + case invalid_object_intval_1 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + # define AAA 2 + # define VALUE (AAA - 1) + # define VALUE (AAA - 2) + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(VALUE); + } + "" + end + + case invalid_object_intval_2 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + # define AAA 2 + # define VALUE (AAA - 1) + # define VALUE (AAA - 0x1) + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(VALUE); + } + "" + end + + case redefine_object_1 + version 300 es + values { output float out0 = 6.0; } + + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + # define VAL1 1.0 + #define VAL2 2.0 + + #define RES2 (RES1 * VAL2) + #define RES1 (VAL2 / VAL1) + #define RES2 (RES1 * VAL2) + #define VALUE (RES2 + RES1) + + void main() + { + out0 = VALUE; + ${OUTPUT} + } + "" + end + + case redefine_object_ifdef + version 300 es + values { output float out0 = 1.0; } + + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define ADEFINE 1 + #define ADEFINE 1 + + #ifdef ADEFINE + #define VALUE 1.0 + #else + #define VALUE 0.0 + #endif + + void main() + { + out0 = VALUE; + ${OUTPUT} + } + "" + end + + case redefine_object_undef_ifdef + version 300 es + values { output float out0 = 1.0; } + + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define ADEFINE 1 + #define ADEFINE 1 + #undef ADEFINE + + #ifdef ADEFINE + #define VALUE 0.0 + #else + #define VALUE 1.0 + #endif + + void main() + { + out0 = VALUE; + ${OUTPUT} + } + "" + end + + case redefine_object_ifndef + version 300 es + values { output float out0 = 1.0; } + + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define ADEFINE 1 + #define ADEFINE 1 + + #ifndef ADEFINE + #define VALUE 0.0 + #else + #define VALUE 1.0 + #endif + + void main() + { + out0 = VALUE; + ${OUTPUT} + } + "" + end + + case redefine_object_defined_1 + version 300 es + values { output float out0 = 1.0; } + + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define ADEFINE 1 + #define ADEFINE 1 + + #if defined(ADEFINE) + #define VALUE 1.0 + #else + #define VALUE 0.0 + #endif + + void main() + { + out0 = VALUE; + ${OUTPUT} + } + "" + end + + case redefine_object_defined_2 + version 300 es + values { output float out0 = 1.0; } + + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define ADEFINE 1 + #define ADEFINE 1 + + #if defined ADEFINE + #define VALUE 1.0 + #else + #define VALUE 0.0 + #endif + + void main() + { + out0 = VALUE; + ${OUTPUT} + } + "" + end + + case redefine_object_comment + version 300 es + values { output float out0 = 6.0; } + + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + # define VAL1 1.0 + #define VAL2 2.0 + + #define RES2 /* fdsjklfdsjkl dsfjkhfdsjkh fdsjklhfdsjkh */ (RES1 * VAL2) + #define RES1 (VAL2 / VAL1) + #define RES2 /* ewrlkjhsadf */ (RES1 * VAL2) + #define VALUE (RES2 + RES1) + + void main() + { + out0 = VALUE; + ${OUTPUT} + } + "" + end + + case redefine_object_multiline_comment + version 300 es + values { output float out0 = 6.0; } + + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + # define VAL1 1.0 + #define VAL2 2.0 + + #define RES2 /* fdsjklfdsjkl + dsfjkhfdsjkh + fdsjklhfdsjkh */ (RES1 * VAL2) + #define RES1 (VAL2 / VAL1) + #define RES2 /* ewrlkjhsadf */ (RES1 * VAL2) + #define VALUE (RES2 + RES1) + + void main() + { + out0 = VALUE; + ${OUTPUT} + } + "" + end + +end # object_redefinitions + +group invalid_redefinitions "Invalid Redefinitions Tests" + + case invalid_identifier_2 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + # define GL_VALUE 1.0 + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(GL_VALUE); + } + "" + end + +end # invalid_redefinitions + +group comments "Comment Tests" + + case multiline_comment_define + version 300 es + values { output float out0 = 4.2; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define VALUE /* current + value */ 4.2 + + void main() + { + out0 = VALUE; + ${OUTPUT} + } + "" + end + + case nested_comment + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = 0.0; + /* /* */ + out0 = 1.0; + // */ + ${OUTPUT} + } + "" + end + + case comment_trick_1 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + /*/ + out0 = 0.0; + /*/ + out0 = 1.0; + /**/ + ${OUTPUT} + } + "" + end + + case comment_trick_2 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + /**/ + out0 = 1.0; + /*/ + out0 = 0.0; + /**/ + ${OUTPUT} + } + "" + end + + case invalid_comment + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + /* /* */ */ + ${POSITION_FRAG_COLOR} = 1.0; + } + "" + end + + case unterminated_comment_1 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + /* + } + "" + end + + case unterminated_comment_2 + version 300 es + expect compile_fail + both "" + #version 300 es + /* + precision mediump float; + ${DECLARATIONS} + void main() + { + } + "" + end + + case backslash_in_a_comment_1 + version 300 es + expect build_successful + both "" + #version 300 es + // \\note these are some declarations + precision mediump float; + ${DECLARATIONS} + // \\note this is the main function + void main() + { + // \\note this is a function body + ${OUTPUT} + } + "" + end + + case backslash_in_a_comment_2 + version 300 es + expect build_successful + both "" + #version 300 es + /* \\note these are some declarations */ + precision mediump float; + ${DECLARATIONS} + /* \\note this is the main function */ + void main() + { + /* \\note this is a function body */ + ${OUTPUT} + } + "" + end +end # comments + +group line_continuation "Line Continuation Tests" + + case comment + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + + void main () + { + out0 = 1.0; + // comment \\ + out0 = -1.0; + ${OUTPUT} + } + "" + end + + case define + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define A(X) \\ + (-1.0*(X)) + + void main () + { + out0 = A(-1.0); + ${OUTPUT} + } + "" + end + + case preprocessing_token + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #def\\ + ine A(X) (-1.0*(X)) + + void main () + { + out0 = A(-1.0); + ${OUTPUT} + } + "" + end + + case token + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + + void main () + { + float f\\ + oo = 1.0; + out0 = foo; + ${OUTPUT} + } + "" + end + + case middle_of_line + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define A a \\ b + #define B 1.0 + + void main () + { + out0 = B; + ${OUTPUT} + } + "" + end + +end # line_continuation + +group function_definitions "Function Definitions Tests" + + case same_object_and_function_param + version 300 es + values { output float out0 = 1.0; } + + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define VALUE 1.0 + #define FUNCTION(VALUE, B) (VALUE-B) + + void main() + { + out0 = FUNCTION(3.0, 2.0); + ${OUTPUT} + } + "" + end + + case complex_func + version 300 es + values { output float out0 = 518.5; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define AAA(a,b) a*(BBB(a,b)) + #define BBB(a,b) a-b + + void main() + { + out0 = BBB(AAA(8.0/4.0, 2.0)*BBB(2.0*2.0,0.75*2.0), AAA(40.0,10.0*BBB(5.0,3.0))); + ${OUTPUT} + } + "" + end + + case function_definition_with_comments + version 300 es + values { output float out0 = 3.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + /* sdfljk */ #/* sdfljk */define /* sdfljk */ FUNC( /* jklsfd*/a /*sfdjklh*/, /*sdfklj */b /*sdfklj*/) a+b + + void main() + { + out0 = FUNC(1.0, 2.0); + ${OUTPUT} + } + "" + end + +end # function_definitions + +group recursion "Recursions Tests" + + case recursion_1 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + # define AAA AAA + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(AAA); + } + "" + end + + case recursion_2 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + # define AAA BBB + #define BBB AAA + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(AAA); + } + "" + end + + case recursion_3 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + # define AAA (1.0+BBB) + #define BBB (2.0+AAA) + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(AAA); + } + "" + end + + case recursion_4 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + # define AAA(a) AAA(a) + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(AAA(1.0)); + } + "" + end + + case recursion_5 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + # define AAA(a, b) AAA(b, a) + + void main() + { + ${POSITION_FRAG_COLOR} = vec4(AAA(1.0, 2.0)); + } + "" + end + +end # recursion + +group function_redefinitions "Function Redefinition Tests" + + case function_redefinition_1 + version 300 es + values { output float out0 = 3.0; } + both "" + #version 300 es + precision mediump float; + # define FUNC(a,b) a+b + # define FUNC( a, b) a+b + + ${DECLARATIONS} + void main() + { + out0 = FUNC(1.0, 2.0); + ${OUTPUT} + } + "" + end + + case function_redefinition_2 + version 300 es + values { output float out0 = 3.0; } + both "" + #version 300 es + precision mediump float; + # define FUNC(a,b) (a +b) + # define FUNC( a, b )(a +b) + + ${DECLARATIONS} + void main() + { + out0 = FUNC(1.0, 2.0); + ${OUTPUT} + } + "" + end + + case function_redefinition_3 + version 300 es + values { output float out0 = 3.0; } + both "" + #version 300 es + precision mediump float; + # define FUNC(a,b) (a +b) + # define FUNC(a,b)(a /* comment + */ +b) + + ${DECLARATIONS} + void main() + { + out0 = FUNC(1.0, 2.0); + ${OUTPUT} + } + "" + end + + case invalid_function_redefinition_param_1 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC(a,b) a+b + # define FUNC(A,b) A+b + + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0, 2.0)); + } + "" + end + + case invalid_function_redefinition_param_2 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC(a,b) a+b + # define FUNC(a,b,c) a+b+c + + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0, 2.0, 3.0)); + } + "" + end + + case invalid_function_redefinition_param_3 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC(a,b) a+b + # define FUNC(a,b) b+a + + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0, 2.0)); + } + "" + end + +end # functions_redefinitions + +group invalid_function_definitions "Invalid Function Definition Tests" + + case arguments_1 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC(a,b) a+b + + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(FUNC); + } + "" + end + + case arguments_2 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC(a,b) a+b + + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(FUNC()); + } + "" + end + + case arguments_3 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC(a,b) a+b + + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(FUNC(((); + } + "" + end + + case arguments_4 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC(a,b) a+b + + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(FUNC)); + } + "" + end + + case arguments_5 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC(a,b) a+b + + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0)); + } + "" + end + + case arguments_6 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC(a,b) a+b + + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0); + } + "" + end + + case arguments_7 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC(a,b) a+b + + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,)); + } + "" + end + + case arguments_8 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC(a,b) a+b + + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0, 2.0, 3.0)); + } + "" + end + + case unique_param_name + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC(a,a) a+a + + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0)); + } + "" + end + + case argument_list_1 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC(a b) a+b + + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0)); + } + "" + end + + case argument_list_2 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC(a + b) a+b + + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0)); + } + "" + end + + case argument_list_3 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC(,a,b) a+b + + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0)); + } + "" + end + + case no_closing_parenthesis_1 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC( + + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0)); + } + "" + end + + case no_closing_parenthesis_2 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC(A a+b + + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0)); + } + "" + end + + case no_closing_parenthesis_3 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC(A,B,C a+b + + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0)); + } + "" + end + + case no_closing_parenthesis_4 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + # define FUNC( + "" + end + +end # invalid_function_definitions + +group semantic "Semantic Tests" + + case ops_as_arguments + version 300 es + values { output float out0 = 20.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define FOO(a, b) (1 a 9) b 2 + + void main() + { + out0 = float(FOO(+, *)); + ${OUTPUT} + } + "" + end + + case correct_order + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define FUNC(A) A + #define A 2.0 + + void main() + { + out0 = FUNC(A - 1.0); + ${OUTPUT} + } + "" + end + +end # semantic + +group predefined_macros "Predefined Macros Tests" + + case version + version 300 es + values { output float out0 = 300.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define AAA __VERSION__ + out0 = float(AAA); + ${OUTPUT} + } + "" + end + + case gl_es_1 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + + void main() + { + out0 = float(GL_ES); + ${OUTPUT} + } + "" + end + + case gl_es_2 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define AAA(A) A + + void main() + { + out0 = float(AAA(GL_ES)); + ${OUTPUT} + } + "" + end + + case line_1 + version 300 es + values { output float out0 = 2.0; } + both "" + #version 300 es + const mediump int line = __LINE__; + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = float(line); + ${OUTPUT} + } + "" + end + + case line_2 + version 300 es + # Note: Arguments are macro replaced in the first stage. + # Macro replacement list is expanded in the last stage. + values { output vec4 out0 = vec4(12.0, 12.0, 10.0, 11.0); } + + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS:single-line} + #define BBB __LINE__, /* + */ __LINE__ + #define AAA(a,b) BBB, a, b + + void main() + { + out0 = vec4(AAA(__LINE__, + __LINE__ + )); + ${OUTPUT} + } + "" + end + + case file + version 300 es + values { output float out0 = 0.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = float(__FILE__); + ${OUTPUT} + } + "" + end + + case if_gl_es + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if GL_ES + out0 = 1.0; + #else + out0 = -1.0; + #endif + ${OUTPUT} + } + "" + end + + case if_version + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if __VERSION__ == 300 + out0 = 1.0; + #else + out0 = -1.0; + #endif + ${OUTPUT} + } + "" + end + +end # predefined_macros + +group conditional_inclusion "Conditional Inclusion Tests" + + case basic_1 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define AAA asdf + + #if defined AAA && !defined(BBB) + out0 = 1.0; + #else + out0 = 0.0; + #endif + ${OUTPUT} + } + "" + end + + case basic_2 + version 300 es + values { output float out0 = 1.0; } + # Note: this is expected to fail contrary to native dEQP, + # see https://github.com/KhronosGroup/WebGL/pull/1523 + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define AAA defined(BBB) + + #if !AAA + out0 = 1.0; + #else + out0 = 0.0; + #endif + ${OUTPUT} + } + "" + end + + case defined_macro_defined_test + version 300 es + values { output float out0 = 1.0; } + # Note: this is expected to fail contrary to native dEQP, + # see https://github.com/KhronosGroup/WebGL/pull/1523 + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define AAA defined + + #if AAA AAA + out0 = 1.0; + #else + out0 = 0.0; + #endif + ${OUTPUT} + } + "" + end + + case defined_macro_undef + version 300 es + values { output float out0 = 1.0; } + # Note: this is expected to fail contrary to native dEQP, + # see https://github.com/KhronosGroup/WebGL/pull/1523 + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define BBB 1 + #define AAA defined(BBB) + #undef BBB + + #if !AAA + out0 = 1.0; + #else + out0 = 0.0; + #endif + ${OUTPUT} + } + "" + end + + case define_defined + version 300 es + values { output float out0 = 1.0; } + # Note: this is expected to fail contrary to native dEQP, + # see https://github.com/KhronosGroup/WebGL/pull/1523 + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define CCC 1 + #define defined BBB + #define AAA defined + + #if AAA CCC + out0 = 1.0; + #else + out0 = 0.0; + #endif + ${OUTPUT} + } + "" + end + + case define_defined_outside_if + version 300 es + values { output float out0 = 1.0; } + # Note: this is expected to fail contrary to native dEQP, + # see https://github.com/KhronosGroup/WebGL/pull/1523 + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define CCC - 0.5 + #define defined 0.5 + #define AAA defined + out0 = 1.0 - (AAA CCC); + ${OUTPUT} + } + "" + end + + case defined_invalid_before_all_macros_replaced + version 300 es + expect compile_fail + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define FOO 1 + #define OPEN defined( + #define CLOSE FOO) + + #if OPEN CLOSE + out0 = 1.0; + #else + out0 = 0.0; + #endif + ${OUTPUT} + } + "" + end + + case basic_3 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 0 + out0 = -1.0; + #elif 0 + out0 = -2.0; + #elif 1 + out0 = 1.0; + #else + out0 = -3.0; + #endif + ${OUTPUT} + } + "" + end + + case basic_4 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 0 + out0 = -1.0; + #elif 0 + out0 = -2.0; + #else + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case basic_5 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 1 + out0 = 1.0; + #elif 0 + out0 = -2.0; + #else + out0 = -1.0; + #endif + ${OUTPUT} + } + "" + end + + case unary_ops_1 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if !((~2 >> 1) & 1) + out0 = 1.0; + #else + out0 = -1.0; + #endif + ${OUTPUT} + } + "" + end + + case unary_ops_2 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if !((~(- - - - - 1 + + + + + +1) >> 1) & 1) + out0 = -1.0; + #else + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + +end # conditional_inclusion + +group invalid_ops "Invalid Operations Tests" + + case invalid_op_1 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if !((~(+ ++1 - - - -1) >> 1) & 1) + ${POSITION_FRAG_COLOR} = vec4(-1.0); + #else + ${POSITION_FRAG_COLOR} = vec4(1.0); + #endif + } + "" + end + + case invalid_op_2 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if !((~(+ + +1 - -- -1) >> 1) & 1) + ${POSITION_FRAG_COLOR} = vec4(-1.0); + #else + ${POSITION_FRAG_COLOR} = vec4(1.0); + #endif + } + "" + end + + case invalid_defined_expected_identifier_1 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + #define AAA 1 + + ${DECLARATIONS} + void main() + { + #if defined + ${POSITION_FRAG_COLOR} = vec4(1.0); + #endif + } + "" + end + + case invalid_defined_expected_identifier_2 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + #define AAA 1 + + ${DECLARATIONS} + void main() + { + #if defined() + ${POSITION_FRAG_COLOR} = vec4(1.0); + #endif + } + "" + end + + case invalid_defined_expected_identifier_3 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + #define AAA 1 + + ${DECLARATIONS} + void main() + { + #if defined( + ${POSITION_FRAG_COLOR} = vec4(1.0); + #endif + } + "" + end + + case invalid_defined_expected_identifier_4 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + #define AAA 1 + + ${DECLARATIONS} + void main() + { + #if defined) + ${POSITION_FRAG_COLOR} = vec4(1.0); + #endif + } + "" + end + + case invalid_defined_expected_identifier_5 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + #define AAA 1 + + ${DECLARATIONS} + void main() + { + #if defined((AAA)) + ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0); + #endif + } + "" + end + + case invalid_defined_expected_rparen + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + #define AAA 1 + + ${DECLARATIONS} + void main() + { + #if defined(AAA + ${POSITION_FRAG_COLOR} = vec4(1.0); + #endif + } + "" + end + + case defined_define + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define define 1 + #define AAA 1.0 + + void main() + { + out0 = AAA; + ${OUTPUT} + } + "" + end + +end # invalid_ops + +group undefined_identifiers "Undefined Identifiers Tests" + + case valid_undefined_identifier_1 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 1 || AAA + out0 = 1.0; + #else + out0 = -1.0; + #endif + ${OUTPUT} + } + "" + end + + case valid_undefined_identifier_2 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 0 && AAA + out0 = -1.0; + #else + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case undefined_identifier_1 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 1 - CCC + (-AAA || BBB) + ${POSITION_FRAG_COLOR} = vec4(1.0); + #else + ${POSITION_FRAG_COLOR} = vec4(-1.0); + #endif + } + "" + end + + case undefined_identifier_2 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if !A + ${POSITION_FRAG_COLOR} = vec4(1.0); + #else + ${POSITION_FRAG_COLOR} = vec4(-1.0); + #endif + } + "" + end + + case undefined_identifier_3 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if -A + ${POSITION_FRAG_COLOR} = vec4(1.0); + #else + ${POSITION_FRAG_COLOR} = vec4(-1.0); + #endif + } + "" + end + + case undefined_identifier_4 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if ~A + ${POSITION_FRAG_COLOR} = vec4(1.0); + #else + ${POSITION_FRAG_COLOR} = vec4(-1.0); + #endif + } + "" + end + + case undefined_identifier_5 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if A && B + ${POSITION_FRAG_COLOR} = vec4(1.0); + #else + ${POSITION_FRAG_COLOR} = vec4(-1.0); + #endif + } + "" + end + + case undefined_identifier_6 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define A 1 + #if A && B + ${POSITION_FRAG_COLOR} = vec4(1.0); + #else + ${POSITION_FRAG_COLOR} = vec4(-1.0); + #endif + } + "" + end + + case undefined_identifier_7 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define B 1 + #if A && B + ${POSITION_FRAG_COLOR} = vec4(1.0); + #else + ${POSITION_FRAG_COLOR} = vec4(-1.0); + #endif + } + "" + end + + case undefined_identifier_8 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define B 1 + #define A 2 + #undef A + #if A && B + ${POSITION_FRAG_COLOR} = vec4(1.0); + #else + ${POSITION_FRAG_COLOR} = vec4(-1.0); + #endif + } + "" + end + + case undefined_identifier_9 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if A || B + ${POSITION_FRAG_COLOR} = vec4(1.0); + #else + ${POSITION_FRAG_COLOR} = vec4(-1.0); + #endif + } + "" + end + + case undefined_identifier_10 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define A 0 + #if A || B + ${POSITION_FRAG_COLOR} = vec4(1.0); + #else + ${POSITION_FRAG_COLOR} = vec4(-1.0); + #endif + } + "" + end + + case undefined_identifier_11 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define A 0 + #define B 2 + #undef B + #if A || B + ${POSITION_FRAG_COLOR} = vec4(1.0); + #else + ${POSITION_FRAG_COLOR} = vec4(-1.0); + #endif + } + "" + end + + case undefined_identifier_12 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define B 1 + #if A || B + ${POSITION_FRAG_COLOR} = vec4(1.0); + #else + ${POSITION_FRAG_COLOR} = vec4(-1.0); + #endif + } + "" + end + +end # undefined_identifiers + +group invalid_conditionals "Invalid Conditionals Tests" + + case empty_if + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case empty_ifdef + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #ifdef + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case empty_ifndef + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #ifndef + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case invalid_ifdef + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #ifdef 1 + ${POSITION_FRAG_COLOR} = vec4(1.0); + #endif + } + "" + end + + case invalid_ifndef + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #ifndef 1 + ${POSITION_FRAG_COLOR} = vec4(1.0); + #endif + } + "" + end + + case empty_if_defined + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if defined + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case unterminated_if_1 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 1 + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case unterminated_if_2 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 0 + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case unterminated_ifdef + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #ifdef FOOBAR + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case unterminated_ifndef + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #ifndef GL_ES + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case unterminated_else_1 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 1 + #else + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case unterminated_else_2 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 0 + #else + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case unterminated_elif_1 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 0 + #elif 1 + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case unterminated_elif_2 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 1 + #elif 0 + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case unterminated_elif_3 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 0 + #elif 0 + ${POSITION_FRAG_COLOR} = vec4(2.0); + } + "" + end + + case elif_after_else + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 0 + ${POSITION_FRAG_COLOR} = vec4(1.0); + #else + ${POSITION_FRAG_COLOR} = vec4(-1.0); + #elif 1 + ${POSITION_FRAG_COLOR} = vec4(0.0); + #endif + } + "" + end + + case else_without_if + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #else + ${POSITION_FRAG_COLOR} = vec4(1.0); + #endif + } + "" + end + + case elif_without_if + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #elif 1 + ${POSITION_FRAG_COLOR} = vec4(1.0); + #endif + } + "" + end + + case endif_without_if + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + #endif + } + "" + end + + case else_after_else + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if !GL_ES + ${POSITION_FRAG_COLOR} = vec4(1.0); + #else + ${POSITION_FRAG_COLOR} = vec4(-1.0); + #else + ${POSITION_FRAG_COLOR} = vec4(-1.0); + #endif + } + "" + end + + case nested_elif_without_if + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 1 + ${POSITION_FRAG_COLOR} = vec4(1.0); + # elif + ${POSITION_FRAG_COLOR} = vec4(0.0); + # endif + #endif + } + "" + end + + case if_float + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 1.231 + ${POSITION_FRAG_COLOR} = vec4(1.0); + # elif + ${POSITION_FRAG_COLOR} = vec4(0.0); + # endif + #endif + } + "" + end + + case tokens_after_if + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 1 foobar + ${POSITION_FRAG_COLOR} = vec4(1.0); + #endif + } + "" + end + + case tokens_after_elif + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 0 + #elif foobar + ${POSITION_FRAG_COLOR} = vec4(1.0); + #endif + } + "" + end + + case tokens_after_else + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 1 + #else foobar 1.231 + #endif + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case tokens_after_endif + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 1 + #else + #endif foobar + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case tokens_after_ifdef + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #ifdef FOOBAR foobar + #else + #endif + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case tokens_after_ifndef + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #ifndef FOOBAR ,, +- << barbar + #else + #endif + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case unterminated_nested_blocks + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 1 + # if 1 + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + +end # invalid_conditionals + +group conditionals "Conditionals Tests" + + case ifdef_1 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #define AAA + precision mediump float; + ${DECLARATIONS} + void main() + { + #ifdef AAA + out0 = 1.0; + #else + out0 = -1.0; + #endif + ${OUTPUT} + } + "" + end + + case ifdef_2 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #define AAA + precision mediump float; + ${DECLARATIONS} + void main() + { + #if defined ( AAA) + out0 = 1.0; + #else + out0 = -1.0; + #endif + ${OUTPUT} + } + "" + end + + case ifdef_3 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #ifdef AAA + out0 = -1.0; + #else + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case ifndef_1 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #ifndef AAA + out0 = 1.0; + #else + out0 = -1.0; + #endif + ${OUTPUT} + } + "" + end + + case ifndef_2 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define AAA + void main() + { + #ifndef AAA + out0 = -1.0; + #else + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case mixed_conditional_inclusion + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #ifndef AAA + out0 = 1.0; + #elif 1 + out0 = -1.0; + #endif + ${OUTPUT} + } + "" + end + + case nested_if_1 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if GL_ES + # if __VERSION__ != 300 + out0 = -1.0; + # else + out0 = 1.0; + # endif + #endif + ${OUTPUT} + } + "" + end + + case nested_if_2 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 1 + # if 0 + out0 = -1.0; + # else + # if 0 + out0 = -1.0; + # elif 1 + out0 = 1.0; + # else + out0 = -1.0; + # endif + # endif + #endif + ${OUTPUT} + } + "" + end + + case nested_if_3 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 0 + # if 1 + out0 = -1.0; + # endif + #else + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + +end # conditionals + +group directive "Directive Tests" + + case version_is_less + expect compile_fail + version 300 es + both "" + #version 299 es + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case version_is_more + expect compile_fail + version 300 es + both "" + #version 301 es + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case version_missing_es + expect compile_fail + version 300 es + both "" + #version 300 + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case version_missing + expect compile_fail + version 300 es + both "" + #version + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case version_not_first_statement_1 + expect compile_fail + version 300 es + both "" + precision mediump float; + #version 300 es + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case version_not_first_statement_2 + expect compile_fail + version 300 es + both "" + #define FOO BAR + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case version_invalid_token_1 + expect compile_fail + version 300 es + both "" + #version 300 es.0 + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case version_invalid_token_2 + expect compile_fail + version 300 es + both "" + #version foobar + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case invalid_version + expect compile_fail + version 300 es + both "" + #version AAA + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case additional_tokens + expect compile_fail + version 300 es + both "" + #version 300 es foobar + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case error_with_no_tokens + version 300 es + expect compile_fail + both "" + #version 300 es + #error + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case error + version 300 es + expect compile_fail + both "" + #version 300 es + #define AAA asdf + #error 1 * AAA /* comment */ + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + +end # directive + +group builtin "Built-in Symbol Tests" + + case line + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #line 1 + out0 = float(__LINE__); + ${OUTPUT} + } + "" + end + + case line_and_file + version 300 es + values { output vec4 out0 = vec4(234.0, 234.0, 10.0, 10.0); } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #line 234 10 + out0 = vec4(__LINE__, __LINE__, __FILE__, __FILE__); + ${OUTPUT} + } + "" + end + + case line_expression + version 300 es + values { output float out0 = 20.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #line +20 + out0 = float(__LINE__); + ${OUTPUT} + } + "" + end + + case line_and_file_expression + version 300 es + values { output vec4 out0 = vec4(243.0, 243.0, 10.0, 10.0); } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #line (233 +10) (+10) + out0 = vec4(__LINE__, __LINE__, __FILE__, __FILE__); + ${OUTPUT} + } + "" + end + + case line_defined_1 + version 300 es + values { output float out0 = 4.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define A 4 + #line A + out0 = float(__LINE__); + ${OUTPUT} + } + "" + end + + case line_defined_2 + version 300 es + values { output vec4 out0 = vec4(234.0, 234.0, 10.0, 10.0); } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define A 10 + #line 234 A + out0 = vec4(__LINE__, __LINE__, __FILE__, __FILE__); + ${OUTPUT} + } + "" + end + + case empty_line + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #line + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case invalid_line_file_1 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #line 22 1.234 + ${POSITION_FRAG_COLOR} = vec4(__LINE__, __LINE__, __FILE__, __FILE__); + } + "" + end + + case invalid_line_file_3 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #line 233 10 2 + ${POSITION_FRAG_COLOR} = vec4(__LINE__, __LINE__, __FILE__, __FILE__); + } + "" + end + + case invalid_line_file_4 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #line foobar + ${POSITION_FRAG_COLOR} = vec4(__LINE__, __LINE__, __FILE__, __FILE__); + } + "" + end + +end # builtin + +group pragmas "Pragma Tests" + + case pragma_vertex + version 300 es + values { output float out0 = 1.0; } + vertex "" + #version 300 es + #pragma + #pragma STDGL invariant(all) + #pragma debug(off) + #pragma optimize(off) + + ${VERTEX_DECLARATIONS} + void main() + { + ${VERTEX_OUTPUT} + } + "" + fragment "" + #version 300 es + precision mediump float; + ${FRAGMENT_DECLARATIONS} + void main() + { + out0 = 1.0; + ${FRAGMENT_OUTPUT} + } + "" + end + + case pragma_fragment + version 300 es + values { output float out0 = 1.0; } + vertex "" + #version 300 es + ${VERTEX_DECLARATIONS} + void main() + { + ${VERTEX_OUTPUT} + } + "" + fragment "" + #version 300 es + #pragma + #pragma debug(off) + #pragma optimize(off) + + precision mediump float; + ${FRAGMENT_DECLARATIONS} + void main() + { + out0 = 1.0; + ${FRAGMENT_OUTPUT} + } + "" + end + + case pragma_macro_exp + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #define off INVALID + /* pragma line not macro expanded */ + #pragma debug(off) + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = 1.0; + ${OUTPUT} + } + "" + end + + case pragma_unrecognized_debug + version 300 es + expect build_successful + both "" + #version 300 es + #pragma debug(1.23) + + // unrecognized preprocessor token + + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case pragma_unrecognized_token + # Note: upstream dEQP uses unicode characters here but we can't test + # this in WebGL because it requires strings passed to glShaderSource + # to be ASCII. This would cause the test to fail at glShaderSource + # instead of glCompileShader, which is not what we want to test. + version 300 es + expect build_successful + both "" + #version 300 es + #pragma **% + + // trailing bytes form a valid but unrecognized preprocessor token + + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + +end # pragmas + +group extensions "Extension Tests" + + case basic + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #extension all : warn + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = 1.0; + ${OUTPUT} + } + "" + end + + case macro_exp + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #define warn enable + + #extension all : warn + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = 1.0; + ${OUTPUT} + } + "" + end + + case missing_extension_name + version 300 es + expect compile_fail + both "" + #version 300 es + #extension + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case invalid_extension_name + version 300 es + expect compile_fail + both "" + #version 300 es + #extension 2 : all + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case missing_colon + version 300 es + expect compile_fail + both "" + #version 300 es + #extension all + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case expected_colon + version 300 es + expect compile_fail + both "" + #version 300 es + #extension all ; + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case missing_behavior + version 300 es + expect compile_fail + both "" + #version 300 es + #extension all : + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case invalid_behavior_1 + version 300 es + expect compile_fail + both "" + #version 300 es + #extension all : WARN + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case invalid_behavior_2 + version 300 es + expect compile_fail + both "" + #version 300 es + #extension all : require + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case invalid_char_in_name + # Note: upstream dEQP uses unicode characters here but we can't test + # this in WebGL because it requires strings passed to glShaderSource + # to be ASCII. This would cause the test to fail at glShaderSource + # instead of glCompileShader, which is not what we want to test. + version 300 es + expect compile_fail + both "" + #version 300 es + #extension all* : warn + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case invalid_char_in_behavior + # Note: upstream dEQP uses unicode characters here but we can't test + # this in WebGL because it requires strings passed to glShaderSource + # to be ASCII. This would cause the test to fail at glShaderSource + # instead of glCompileShader, which is not what we want to test. + version 300 es + expect compile_fail + both "" + #version 300 es + #extension all : war*n + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case unterminated_comment + version 300 es + expect compile_fail + both "" + #version 300 es + #extension all : warn /*asd + precision mediump float; + ${DECLARATIONS} + void main() + { + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case after_non_preprocessing_tokens + version 300 es + expect compile_fail + both "" + #version 300 es + #extension all : warn + + precision mediump float; + ${DECLARATIONS} + void main() + { + #extension all : disable + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end +end # extensions + +group expressions "Expression Tests" + + case shift_left + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define VAL 4 + out0 = 0.0; + #if (VAL << 2) == 16 + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case shift_right + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define VAL 5 + out0 = 0.0; + #if (VAL >> 1) == 2 + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case cmp_less_than + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define VAL 5 + out0 = 0.0; + #if (VAL < 6) && (-VAL < -4) + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case less_or_equal + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define VAL 6 + out0 = 0.0; + #if (VAL <= 6) && (-VAL <= -6) + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case or + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define VAL 6 + out0 = 0.0; + #if (VAL | 5) == 7 + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case and + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define VAL 6 + out0 = 0.0; + #if (VAL & 5) == 4 + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case xor + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define VAL 6 + out0 = 0.0; + #if (VAL ^ 5) == 3 + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case mod + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define VAL 12 + out0 = 0.0; + #if (VAL % 5) == 2 + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case parenthesis_value + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define VAL (( (4 ) ) ) + out0 = 0.0; + #if VAL >= 4 + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case parenthesis_tricky + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define VAL (( (4 ) ) + out0 = 0.0; + #if VAL) >= 4 + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case parenthesis_if_no + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define VAL 4 + out0 = 0.0; + #if VAL >= 4 + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case parenthesis_if + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define VAL 4 + out0 = 0.0; + #if (VAL >= 4) + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case parenthesis_multi_if + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define VAL (4) + out0 = 0.0; + #if (((VAL)) >= (4)) + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case parenthesis_single_if + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define VAL 4 + out0 = 0.0; + #if (VAL >= 4) + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case parenthesis_ifelse_true + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define VAL 4 + #if (VAL >= 4) + out0 = 1.0; + #else + out0 = 0.0; + #endif + ${OUTPUT} + } + "" + end + + case parenthesis_ifelse_false + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #define VAL 4 + #if (VAL > 4) + out0 = 0.0; + #else + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case eval_basic_0 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if -4 + 5 == 1 + out0 = 1.0; + #else + out0 = 0.0; + #endif + ${OUTPUT} + } + "" + end + + case eval_basic_1 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if (2 * 2) - 3 >= 0 + out0 = 1.0; + #else + out0 = 0.0; + #endif + ${OUTPUT} + } + "" + end + + case eval_simple_precedence_0 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 2 * 3 - 3 == 3 + out0 = 1.0; + #else + out0 = 0.0; + #endif + ${OUTPUT} + } + "" + end + + case eval_simple_precedence_1 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 2 - 2 / 2 == 1 + out0 = 1.0; + #else + out0 = 0.0; + #endif + ${OUTPUT} + } + "" + end + + case defined_1 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define X 0 + void main() + { + #if defined(X) + out0 = 1.0; + #else + out0 = 0.0; + #endif + ${OUTPUT} + } + "" + end + + case defined_2 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define X 0 + #define Y 1 + void main() + { + #if defined(X) == Y + out0 = 1.0; + #else + out0 = 0.0; + #endif + ${OUTPUT} + } + "" + end + + case defined_3 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define X 0 + #define Y 1 + void main() + { + #if defined(X) && defined(Y) + out0 = 1.0; + #else + out0 = 0.0; + #endif + ${OUTPUT} + } + "" + end + + case defined_4 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define X 0 + #define Y 1 + #undef X + void main() + { + #if defined(X) && defined(Y) + out0 = 0.0; + #else + out0 = 1.0; + #endif + ${OUTPUT} + } + "" + end + + case defined_5 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define X 0 + #define Y 1 + #undef X + void main() + { + #if defined(X) || defined(Y) + out0 = 1.0; + #else + out0 = 0.0; + #endif + ${OUTPUT} + } + "" + end + + case defined_6 + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + #define X 0 + #define Y 1 + #undef Y + void main() + { + #if defined(X) && (defined(Y) || (X == 0)) + out0 = 1.0; + #else + out0 = 0.0; + #endif + ${OUTPUT} + } + "" + end + +end # expressions + +group invalid_expressions "Invalid Expression Tests" + + case invalid_unary_expr + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if ! + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case invalid_binary_expr + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 3+4+ + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case missing_expr + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case invalid_expr_1 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 4 4 + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case invalid_expr_2 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 4 * * 4 + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case invalid_expr_3 + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if (4)(4) + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case unopened_parenthesis + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if 4) + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + + case unclosed_parenthesis + version 300 es + expect compile_fail + both "" + #version 300 es + precision mediump float; + ${DECLARATIONS} + void main() + { + #if ((4 + 7) + ${POSITION_FRAG_COLOR} = vec4(1.0); + } + "" + end + +end # invalid_expressions + +group operator_precedence "Operator precedence" + + + case modulo_vs_not + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 % ! 0 ) == 0 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case div_vs_not + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 / ! 0 ) == 8 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case mul_vs_not + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 * ! 0 ) == 8 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case modulo_vs_bit_invert + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 % ~ 4 ) == 3 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case modulo_vs_minus + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 % - 2 ) == 0 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case modulo_vs_plus + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 % + 2 ) == 0 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case div_vs_bit_invert + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 / ~ 2 ) == -2 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case div_vs_minus + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 / - 2 ) == -4 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case div_vs_plus + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 / + 2 ) == 4 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case mul_vs_bit_invert + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 * ~ 2 ) == -24 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case mul_vs_minus + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 * - 2 ) == -16 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case mul_vs_plus + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 * + 2 ) == 16 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case sub_vs_modulo + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 - 3 % 2 ) == 7 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case sub_vs_div + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 - 3 / 2 ) == 7 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case sub_vs_mul + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 - 3 * 2 ) == 2 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case add_vs_modulo + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 + 3 % 2 ) == 9 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case add_vs_div + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 + 3 / 2 ) == 9 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case add_vs_mul + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 + 3 * 2 ) == 14 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case rshift_vs_sub + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 >> 3 - 2 ) == 4 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case rshift_vs_add + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 >> 3 + 2 ) == 0 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case lshift_vs_sub + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 << 3 - 2 ) == 16 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case lshift_vs_add + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 << 3 + 2 ) == 256 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case greater_or_equal_vs_rshift + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 >= 3 >> 2 ) == 1 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case greater_or_equal_vs_lshift + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 >= 3 << 2 ) == 0 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case less_or_equal_vs_rshift + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 <= 3 >> 2 ) == 0 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case less_or_equal_vs_lshift + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 <= 3 << 2 ) == 1 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case greater_vs_rshift + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 > 3 >> 2 ) == 1 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case greater_vs_lshift + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 > 3 << 2 ) == 0 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case less_vs_rshift + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 < 3 >> 2 ) == 0 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case less_vs_lshift + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 < 3 << 2 ) == 1 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case not_equal_vs_greater_or_equal + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 != 3 >= 2 ) == 1 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case not_equal_vs_less_or_equal + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 != 3 <= 2 ) == 1 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case not_equal_vs_greater + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 != 3 > 2 ) == 1 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case not_equal_vs_less + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 != 3 < 2 ) == 1 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case equal_vs_greater_or_equal + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 == 3 >= 2 ) == 0 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case equal_vs_less_or_equal + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 == 3 <= 2 ) == 0 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case equal_vs_greater + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 == 3 > 2 ) == 0 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case equal_vs_less + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 == 3 < 2 ) == 0 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case bitwise_and_vs_not_equal + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 & 3 != 2 ) == 0 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case bitwise_and_vs_equal + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 & 3 == 2 ) == 0 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case xor_vs_bitwise_and + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 ^ 3 & 2 ) == 10 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case bitwise_or_vs_xor + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 8 | 3 ^ 2 ) == 9 + #define VAL 1.0 + #else + #define VAL 0.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case logical_and_vs_bitwise_or + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 0 && 3 | 2 ) + #define VAL 0.0 + #else + #define VAL 1.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case logical_and_vs_bitwise_and + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 0 && 4 & 2 ) + #define VAL 0.0 + #else + #define VAL 1.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + + case logical_or_vs_logical_and + version 300 es + values { output float out0 = 1.0; } + both "" + #version 300 es + #if ( 0 || 4 && 0 ) + #define VAL 0.0 + #else + #define VAL 1.0 + #endif + + precision mediump float; + ${DECLARATIONS} + void main() + { + out0 = VAL; + ${OUTPUT} + } + "" + end + +end # operator_precedence |