blob: f290c1ea3554ca598a20fbf184a8a8045d6dff3b [file] [log] [blame]
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; }
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; }
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; }
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; }
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; }
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_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
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
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
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()