blob: f4048cee82b8f6ed0583abc89068907731b037aa [file] [log] [blame]
group basic "Basic Tests"
case correct_phases
expect compile_fail
both ""
#define e +1
void main()
{
mediump int n = 1e;
}
""
end
case invalid_identifier
expect compile_fail
both ""
#define e +1
void main()
{
mediump int 1xyz = 1;
}
""
end
case null_directive
values { output float out0 = 0.0; }
both ""
precision mediump float;
${DECLARATIONS}
#
# // comment
/*sfd*/ # /* */
void main()
{
out0 = 0.0;
${OUTPUT}
}
""
end
case invalid_directive
expect compile_fail
both ""
#defin AAA
void main()
{
}
""
end
case missing_identifier
expect compile_fail
both ""
#define
void main()
{
}
""
end
case empty_object
values { output float out0 = -1.0; }
both ""
precision mediump float;
${DECLARATIONS}
# define VALUE
void main()
{
out0 = VALUE - 1.0;
${OUTPUT}
}
""
end
case empty_function
values { output float out0 = -1.0; }
both ""
precision mediump float;
${DECLARATIONS}
# define VALUE(a)
void main()
{
out0 = VALUE(2.0) - 1.0;
${OUTPUT}
}
""
end
case empty_directive
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
#
void main()
{
out0 = 1.0;
${OUTPUT}
}
""
end
case identifier_with_double_underscore
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 6.0; }
both ""
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
expect compile_fail
both ""
precision mediump float;
#define VAL 2.0
#undef VAL sdflkjfds
#define VAL 1.0
void main()
{
${POSITION_FRAG_COLOR} = vec4(VAL);
}
""
end
case undefine_invalid_object_1
expect compile_fail
both ""
precision mediump float;
#undef __LINE__
void main()
{
${POSITION_FRAG_COLOR} = vec4(__LINE__);
}
""
end
case undefine_invalid_object_2
expect compile_fail
both ""
precision mediump float;
#undef __FILE__
void main()
{
${POSITION_FRAG_COLOR} = vec4(__FILE__);
}
""
end
case undefine_invalid_object_3
expect compile_fail
both ""
precision mediump float;
#undef __VERSION__
void main()
{
${POSITION_FRAG_COLOR} = vec4(__VERSION__);
}
""
end
case undefine_invalid_object_4
expect compile_fail
both ""
precision mediump float;
#undef GL_ES
void main()
{
${POSITION_FRAG_COLOR} = vec4(GL_ES);
}
""
end
case undefine_function
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
#define FUNCTION(a,b) a+b
#undef FUNCTION
#define FUNCTION(a,b) a-b
void main()
{
out0 = FUNCTION(3.0, 2.0);
${OUTPUT}
}
""
end
end # definitions
group invalid_definitions "Invalid Definition Tests"
case define_non_identifier
expect compile_fail
both ""
precision mediump float;
#define 123 321
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case undef_non_identifier_1
expect compile_fail
both ""
precision mediump float;
#undef 123
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case undef_non_identifier_2
expect compile_fail
both ""
precision mediump float;
#undef foo.bar
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
end # invalid_definitions
group object_redefinitions "Object Redefinition Tests"
case invalid_object_ident
expect compile_fail
both ""
precision mediump float;
# 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
expect compile_fail
both ""
precision mediump float;
# 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
expect compile_fail
both ""
precision mediump float;
# 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
expect compile_fail
both ""
precision mediump float;
# 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
expect compile_fail
both ""
precision mediump float;
# 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
expect compile_fail
both ""
precision mediump float;
# define AAA 2
# define VALUE (AAA - 1)
# define VALUE (AAA - 2)
void main()
{
${POSITION_FRAG_COLOR} = vec4(VALUE);
}
""
end
case invalid_object_intval_2
expect compile_fail
both ""
precision mediump float;
# define AAA 2
# define VALUE (AAA - 1)
# define VALUE (AAA - 0x1)
void main()
{
${POSITION_FRAG_COLOR} = vec4(VALUE);
}
""
end
case redefine_object_1
values { output float out0 = 6.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 6.0; }
both ""
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
values { output float out0 = 6.0; }
both ""
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
expect compile_fail
both ""
precision mediump float;
# 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
values { output float out0 = 4.2; }
both ""
precision mediump float;
${DECLARATIONS}
#define VALUE /* current
value */ 4.2
void main()
{
out0 = VALUE;
${OUTPUT}
}
""
end
case nested_comment
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
out0 = 0.0;
/* /* */
out0 = 1.0;
// */
${OUTPUT}
}
""
end
case comment_trick_1
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
/*/
out0 = 0.0;
/*/
out0 = 1.0;
/**/
${OUTPUT}
}
""
end
case comment_trick_2
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
/**/
out0 = 1.0;
/*/
out0 = 0.0;
/**/
${OUTPUT}
}
""
end
case invalid_comment
expect compile_fail
both ""
precision mediump float;
void main()
{
/* /* */ */
${POSITION_FRAG_COLOR} = 1.0;
}
""
end
case unterminated_comment_1
expect compile_fail
both ""
precision mediump float;
void main()
{
/*
}
""
end
case unterminated_comment_2
expect compile_fail
both ""
/*
precision mediump float;
void main()
{
}
""
end
end # comments
group function_definitions "Function Definitions Tests"
case same_object_and_function_param
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 518.5; }
both ""
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
values { output float out0 = 3.0; }
both ""
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
expect compile_fail
both ""
precision mediump float;
# define AAA AAA
void main()
{
${POSITION_FRAG_COLOR} = vec4(AAA);
}
""
end
case recursion_2
expect compile_fail
both ""
precision mediump float;
# define AAA BBB
#define BBB AAA
void main()
{
${POSITION_FRAG_COLOR} = vec4(AAA);
}
""
end
case recursion_3
expect compile_fail
both ""
precision mediump float;
# define AAA (1.0+BBB)
#define BBB (2.0+AAA)
void main()
{
${POSITION_FRAG_COLOR} = vec4(AAA);
}
""
end
case recursion_4
expect compile_fail
both ""
precision mediump float;
# define AAA(a) AAA(a)
void main()
{
${POSITION_FRAG_COLOR} = vec4(AAA(1.0));
}
""
end
case recursion_5
expect compile_fail
both ""
precision mediump float;
# 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
values { output float out0 = 3.0; }
both ""
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
values { output float out0 = 3.0; }
both ""
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
values { output float out0 = 3.0; }
both ""
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
expect compile_fail
both ""
precision mediump float;
# define FUNC(a,b) a+b
# define FUNC(A,b) A+b
void main()
{
${POSITION_FRAG_COLOR} = vec4(FUNC(1.0, 2.0));
}
""
end
case invalid_function_redefinition_param_2
expect compile_fail
both ""
precision mediump float;
# define FUNC(a,b) a+b
# define FUNC(a,b,c) a+b+c
void main()
{
${POSITION_FRAG_COLOR} = vec4(FUNC(1.0, 2.0, 3.0));
}
""
end
case invalid_function_redefinition_param_3
expect compile_fail
both ""
precision mediump float;
# define FUNC(a,b) a+b
# define FUNC(a,b) b+a
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
expect compile_fail
both ""
precision mediump float;
# define FUNC(a,b) a+b
void main()
{
${POSITION_FRAG_COLOR} = vec4(FUNC);
}
""
end
case arguments_2
expect compile_fail
both ""
precision mediump float;
# define FUNC(a,b) a+b
void main()
{
${POSITION_FRAG_COLOR} = vec4(FUNC());
}
""
end
case arguments_3
expect compile_fail
both ""
precision mediump float;
# define FUNC(a,b) a+b
void main()
{
${POSITION_FRAG_COLOR} = vec4(FUNC((();
}
""
end
case arguments_4
expect compile_fail
both ""
precision mediump float;
# define FUNC(a,b) a+b
void main()
{
${POSITION_FRAG_COLOR} = vec4(FUNC));
}
""
end
case arguments_5
expect compile_fail
both ""
precision mediump float;
# define FUNC(a,b) a+b
void main()
{
${POSITION_FRAG_COLOR} = vec4(FUNC(1.0));
}
""
end
case arguments_6
expect compile_fail
both ""
precision mediump float;
# define FUNC(a,b) a+b
void main()
{
${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0);
}
""
end
case arguments_7
expect compile_fail
both ""
precision mediump float;
# define FUNC(a,b) a+b
void main()
{
${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,));
}
""
end
case arguments_8
expect compile_fail
both ""
precision mediump float;
# define FUNC(a,b) a+b
void main()
{
${POSITION_FRAG_COLOR} = vec4(FUNC(1.0, 2.0, 3.0));
}
""
end
case unique_param_name
expect compile_fail
both ""
precision mediump float;
# define FUNC(a,a) a+a
void main()
{
${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0));
}
""
end
case argument_list_1
expect compile_fail
both ""
precision mediump float;
# define FUNC(a b) a+b
void main()
{
${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0));
}
""
end
case argument_list_2
expect compile_fail
both ""
precision mediump float;
# define FUNC(a + b) a+b
void main()
{
${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0));
}
""
end
case argument_list_3
expect compile_fail
both ""
precision mediump float;
# define FUNC(,a,b) a+b
void main()
{
${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0));
}
""
end
case no_closing_parenthesis_1
expect compile_fail
both ""
precision mediump float;
# define FUNC(
void main()
{
${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0));
}
""
end
case no_closing_parenthesis_2
expect compile_fail
both ""
precision mediump float;
# define FUNC(A a+b
void main()
{
${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0));
}
""
end
case no_closing_parenthesis_3
expect compile_fail
both ""
precision mediump float;
# define FUNC(A,B,C a+b
void main()
{
${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0));
}
""
end
case no_closing_parenthesis_4
expect compile_fail
both ""
precision mediump float;
# define FUNC(
""
end
end # invalid_function_definitions
group semantic "Semantic Tests"
case ops_as_arguments
values { output float out0 = 20.0; }
both ""
precision mediump float;
${DECLARATIONS}
#define FOO(a, b) (1 a 9) b 2
void main()
{
out0 = float(FOO(+, *));
${OUTPUT}
}
""
end
case correct_order
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 100.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#define AAA __VERSION__
out0 = float(AAA);
${OUTPUT}
}
""
end
case gl_es_1
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
out0 = float(GL_ES);
${OUTPUT}
}
""
end
case gl_es_2
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
#define AAA(A) A
void main()
{
out0 = float(AAA(GL_ES));
${OUTPUT}
}
""
end
case line_1
values { output float out0 = 1.0; }
both ""
const mediump int line = __LINE__;
precision mediump float;
${DECLARATIONS}
void main()
{
out0 = float(line);
${OUTPUT}
}
""
end
case line_2
# Note: Arguments are macro replaced in the first stage.
# Macro replacement list is expanded in the last stage.
values { output vec4 out0 = vec4(11.0, 11.0, 9.0, 10.0); }
both ""
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
values { output float out0 = 0.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
out0 = float(__FILE__);
${OUTPUT}
}
""
end
case if_gl_es
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#if GL_ES
out0 = 1.0;
#else
out0 = -1.0;
#endif
${OUTPUT}
}
""
end
case if_version
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#if __VERSION__ == 100
out0 = 1.0;
#else
out0 = -1.0;
#endif
${OUTPUT}
}
""
end
end # predefined_macros
group conditional_inclusion "Conditional Inclusion Tests"
case basic_1
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#define AAA defined(BBB)
#if !AAA
out0 = 1.0;
#else
out0 = 0.0;
#endif
${OUTPUT}
}
""
end
case basic_3
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#if !((~2 >> 1) & 1)
out0 = 1.0;
#else
out0 = -1.0;
#endif
${OUTPUT}
}
""
end
case unary_ops_2
values { output float out0 = 1.0; }
both ""
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
expect compile_fail
both ""
precision mediump float;
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
expect compile_fail
both ""
precision mediump float;
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
expect compile_fail
both ""
precision mediump float;
#define AAA 1
void main()
{
#if defined
${POSITION_FRAG_COLOR} = vec4(1.0);
#endif
}
""
end
case invalid_defined_expected_identifier_2
expect compile_fail
both ""
precision mediump float;
#define AAA 1
void main()
{
#if defined()
${POSITION_FRAG_COLOR} = vec4(1.0);
#endif
}
""
end
case invalid_defined_expected_identifier_3
expect compile_fail
both ""
precision mediump float;
#define AAA 1
void main()
{
#if defined(
${POSITION_FRAG_COLOR} = vec4(1.0);
#endif
}
""
end
case invalid_defined_expected_identifier_4
expect compile_fail
both ""
precision mediump float;
#define AAA 1
void main()
{
#if defined)
${POSITION_FRAG_COLOR} = vec4(1.0);
#endif
}
""
end
case invalid_defined_expected_identifier_5
expect compile_fail
both ""
precision mediump float;
#define AAA 1
void main()
{
#if defined((AAA))
${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0);
#endif
}
""
end
case invalid_defined_expected_rparen
expect compile_fail
both ""
precision mediump float;
#define AAA 1
void main()
{
#if defined(AAA
${POSITION_FRAG_COLOR} = vec4(1.0);
#endif
}
""
end
case defined_define
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#if 1 || AAA
out0 = 1.0;
#else
out0 = -1.0;
#endif
${OUTPUT}
}
""
end
case valid_undefined_identifier_2
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#if 0 && AAA
out0 = -1.0;
#else
out0 = 1.0;
#endif
${OUTPUT}
}
""
end
case undefined_identifier_1
expect compile_fail
both ""
precision mediump float;
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
expect compile_fail
both ""
precision mediump float;
void main()
{
#if !A
${POSITION_FRAG_COLOR} = vec4(1.0);
#else
${POSITION_FRAG_COLOR} = vec4(-1.0);
#endif
}
""
end
case undefined_identifier_3
expect compile_fail
both ""
precision mediump float;
void main()
{
#if -A
${POSITION_FRAG_COLOR} = vec4(1.0);
#else
${POSITION_FRAG_COLOR} = vec4(-1.0);
#endif
}
""
end
case undefined_identifier_4
expect compile_fail
both ""
precision mediump float;
void main()
{
#if ~A
${POSITION_FRAG_COLOR} = vec4(1.0);
#else
${POSITION_FRAG_COLOR} = vec4(-1.0);
#endif
}
""
end
case undefined_identifier_5
expect compile_fail
both ""
precision mediump float;
void main()
{
#if A && B
${POSITION_FRAG_COLOR} = vec4(1.0);
#else
${POSITION_FRAG_COLOR} = vec4(-1.0);
#endif
}
""
end
case undefined_identifier_6
expect compile_fail
both ""
precision mediump float;
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
expect compile_fail
both ""
precision mediump float;
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
expect compile_fail
both ""
precision mediump float;
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
expect compile_fail
both ""
precision mediump float;
void main()
{
#if A || B
${POSITION_FRAG_COLOR} = vec4(1.0);
#else
${POSITION_FRAG_COLOR} = vec4(-1.0);
#endif
}
""
end
case undefined_identifier_10
expect compile_fail
both ""
precision mediump float;
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
expect compile_fail
both ""
precision mediump float;
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
expect compile_fail
both ""
precision mediump float;
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
expect compile_fail
both ""
precision mediump float;
void main()
{
#if
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case empty_ifdef
expect compile_fail
both ""
precision mediump float;
void main()
{
#ifdef
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case empty_ifndef
expect compile_fail
both ""
precision mediump float;
void main()
{
#ifndef
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case empty_if_defined
expect compile_fail
both ""
precision mediump float;
void main()
{
#if defined
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case unterminated_if_1
expect compile_fail
both ""
precision mediump float;
void main()
{
#if 1
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case unterminated_if_2
expect compile_fail
both ""
precision mediump float;
void main()
{
#if 0
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case unterminated_ifdef
expect compile_fail
both ""
precision mediump float;
void main()
{
#ifdef FOOBAR
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case unterminated_ifndef
expect compile_fail
both ""
precision mediump float;
void main()
{
#ifndef GL_ES
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case unterminated_else_1
expect compile_fail
both ""
precision mediump float;
void main()
{
#if 1
#else
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case unterminated_else_2
expect compile_fail
both ""
precision mediump float;
void main()
{
#if 0
#else
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case unterminated_elif_1
expect compile_fail
both ""
precision mediump float;
void main()
{
#if 0
#elif 1
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case unterminated_elif_2
expect compile_fail
both ""
precision mediump float;
void main()
{
#if 1
#elif 0
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case unterminated_elif_3
expect compile_fail
both ""
precision mediump float;
void main()
{
#if 0
#elif 0
${POSITION_FRAG_COLOR} = vec4(2.0);
}
""
end
case elif_after_else
expect compile_fail
both ""
precision mediump float;
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
expect compile_fail
both ""
precision mediump float;
void main()
{
#else
${POSITION_FRAG_COLOR} = vec4(1.0);
#endif
}
""
end
case elif_without_if
expect compile_fail
both ""
precision mediump float;
void main()
{
#elif 1
${POSITION_FRAG_COLOR} = vec4(1.0);
#endif
}
""
end
case endif_without_if
expect compile_fail
both ""
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
#endif
}
""
end
case else_after_else
expect compile_fail
both ""
precision mediump float;
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
expect compile_fail
both ""
precision mediump float;
void main()
{
#if 1
${POSITION_FRAG_COLOR} = vec4(1.0);
# elif
${POSITION_FRAG_COLOR} = vec4(0.0);
# endif
#endif
}
""
end
case if_float
expect compile_fail
both ""
precision mediump float;
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
expect compile_fail
both ""
precision mediump float;
void main()
{
#if 1 foobar
${POSITION_FRAG_COLOR} = vec4(1.0);
#endif
}
""
end
case tokens_after_elif
expect compile_fail
both ""
precision mediump float;
void main()
{
#if 0
#elif foobar
${POSITION_FRAG_COLOR} = vec4(1.0);
#endif
}
""
end
case tokens_after_else
expect compile_fail
both ""
precision mediump float;
void main()
{
#if 1
#else foobar 1.231
#endif
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case tokens_after_endif
expect compile_fail
both ""
precision mediump float;
void main()
{
#if 1
#else
#endif foobar
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case tokens_after_ifdef
expect compile_fail
both ""
precision mediump float;
void main()
{
#ifdef FOOBAR foobar
#else
#endif
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case tokens_after_ifndef
expect compile_fail
both ""
precision mediump float;
void main()
{
#ifndef FOOBAR ,, +- << barbar
#else
#endif
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
end # invalid_conditionals
group conditionals "Conditionals Tests"
case unterminated_nested_blocks
expect compile_fail
both ""
precision mediump float;
void main()
{
#if 1
# if 1
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case ifdef_1
values { output float out0 = 1.0; }
both ""
#define AAA
precision mediump float;
${DECLARATIONS}
void main()
{
#ifdef AAA
out0 = 1.0;
#else
out0 = -1.0;
#endif
${OUTPUT}
}
""
end
case ifdef_2
values { output float out0 = 1.0; }
both ""
#define AAA
precision mediump float;
${DECLARATIONS}
void main()
{
#if defined ( AAA)
out0 = 1.0;
#else
out0 = -1.0;
#endif
${OUTPUT}
}
""
end
case ifdef_3
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#ifdef AAA
out0 = -1.0;
#else
out0 = 1.0;
#endif
${OUTPUT}
}
""
end
case invalid_ifdef
expect compile_fail
both ""
precision mediump float;
void main()
{
#ifdef 1
${POSITION_FRAG_COLOR} = vec4(1.0);
#endif
}
""
end
case ifndef_1
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#ifndef AAA
out0 = 1.0;
#else
out0 = -1.0;
#endif
${OUTPUT}
}
""
end
case ifndef_2
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
#define AAA
void main()
{
#ifndef AAA
out0 = -1.0;
#else
out0 = 1.0;
#endif
${OUTPUT}
}
""
end
case invalid_ifndef
expect compile_fail
both ""
precision mediump float;
void main()
{
#ifndef 1
${POSITION_FRAG_COLOR} = vec4(1.0);
#endif
}
""
end
case mixed_conditional_inclusion
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#ifndef AAA
out0 = 1.0;
#elif 1
out0 = -1.0;
#endif
${OUTPUT}
}
""
end
case nested_if_1
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#if GL_ES
# if __VERSION__ != 100
out0 = -1.0;
# else
out0 = 1.0;
# endif
#endif
${OUTPUT}
}
""
end
case nested_if_2
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
/* asdf */
#version 100
precision mediump float;
${DECLARATIONS}
void main()
{
out0 = 1.0;
${OUTPUT}
}
""
end
case version_is_less
expect compile_fail
both ""
#version 99
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case version_is_more
expect compile_fail
both ""
#version 101
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case version_missing
expect compile_fail
both ""
#version
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case version_not_first_statement_1
expect compile_fail
both ""
precision mediump float;
#version 100
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case version_not_first_statement_2
expect compile_fail
both ""
#define FOO BAR
#version 100
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case version_invalid_token_1
expect compile_fail
both ""
#version 100.0
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case version_invalid_token_2
expect compile_fail
both ""
#version foobar
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case invalid_version
expect compile_fail
both ""
#version AAA
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case additional_tokens
expect compile_fail
both ""
#version 100 foobar
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case error_with_no_tokens
expect compile_fail
both ""
#error
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case error
expect compile_fail
both ""
#define AAA asdf
#error 1 * AAA /* comment */
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
end # directive
group builtin "Built-in Symbol Tests"
case line
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#line 1
out0 = float(__LINE__);
${OUTPUT}
}
""
end
case line_and_file
values { output vec4 out0 = vec4(234.0, 234.0, 10.0, 10.0); }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#line 234 10
out0 = vec4(__LINE__, __LINE__, __FILE__, __FILE__);
${OUTPUT}
}
""
end
case line_defined_1
values { output float out0 = 4.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#define A 4
#line A
out0 = float(__LINE__);
${OUTPUT}
}
""
end
case line_defined_2
values { output vec4 out0 = vec4(234.0, 234.0, 10.0, 10.0); }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#define A 10
#line 234 A
out0 = vec4(__LINE__, __LINE__, __FILE__, __FILE__);
${OUTPUT}
}
""
end
case empty_line
expect compile_fail
both ""
precision mediump float;
void main()
{
#line
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case invalid_line_file_1
expect compile_fail
both ""
precision mediump float;
void main()
{
#line 22 1.234
${POSITION_FRAG_COLOR} = vec4(__LINE__, __LINE__, __FILE__, __FILE__);
}
""
end
case invalid_line_file_3
expect compile_fail
both ""
precision mediump float;
void main()
{
#line 233 10 2
${POSITION_FRAG_COLOR} = vec4(__LINE__, __LINE__, __FILE__, __FILE__);
}
""
end
case invalid_line_file_4
expect compile_fail
both ""
precision mediump float;
void main()
{
#line foobar
${POSITION_FRAG_COLOR} = vec4(__LINE__, __LINE__, __FILE__, __FILE__);
}
""
end
end # builtin
group pragmas "Pragma Tests"
case pragma_vertex
values { output float out0 = 1.0; }
vertex ""
#pragma
#pragma STDGL invariant(all)
#pragma debug(off)
#pragma optimize(off)
precision mediump float;
${VERTEX_DECLARATIONS}
varying float v_val;
void main()
{
v_val = 1.0;
${VERTEX_OUTPUT}
}
""
fragment ""
precision mediump float;
${FRAGMENT_DECLARATIONS}
invariant varying float v_val;
void main()
{
out0 = v_val;
${FRAGMENT_OUTPUT}
}
""
end
case pragma_fragment
values { output float out0 = 1.0; }
vertex ""
precision mediump float;
${VERTEX_DECLARATIONS}
varying float v_val;
void main()
{
v_val = 1.0;
${VERTEX_OUTPUT}
}
""
fragment ""
#pragma
#pragma STDGL invariant(all)
#pragma debug(off)
#pragma optimize(off)
precision mediump float;
${FRAGMENT_DECLARATIONS}
varying float v_val;
void main()
{
out0 = v_val;
${FRAGMENT_OUTPUT}
}
""
end
case pragma_macro_exp
values { output float out0 = 1.0; }
both ""
#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
expect build_successful
both ""
#pragma debug(1.23)
// unrecognized preprocessor token
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case pragma_unrecognized_token
expect build_successful
both ""
#pragma ¤¤½
// trailing bytes form a valid but unrecognized preprocessor token
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
end # pragmas
group extensions "Extension Tests"
case basic
values { output float out0 = 1.0; }
both ""
#extension all : warn
precision mediump float;
${DECLARATIONS}
void main()
{
out0 = 1.0;
${OUTPUT}
}
""
end
case macro_exp
values { output float out0 = 1.0; }
both ""
#define warn enable
#extension all : warn
precision mediump float;
${DECLARATIONS}
void main()
{
out0 = 1.0;
${OUTPUT}
}
""
end
case missing_extension_name
expect compile_fail
both ""
#extension
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case invalid_extension_name
expect compile_fail
both ""
#extension 2 : all
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case missing_colon
expect compile_fail
both ""
#extension all
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case expected_colon
expect compile_fail
both ""
#extension all ;
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case missing_behavior
expect compile_fail
both ""
#extension all :
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case invalid_behavior_1
expect compile_fail
both ""
#extension all : WARN
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case invalid_behavior_2
expect compile_fail
both ""
#extension all : require
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case invalid_char_in_name
expect compile_fail
both ""
#extension all¤ : warn
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case invalid_char_in_behavior
expect compile_fail
both ""
#extension all : war¤n
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case unterminated_comment
expect compile_fail
both ""
#extension all : warn /*asd
precision mediump float;
void main()
{
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case after_non_preprocessing_tokens
expect compile_fail
both ""
#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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#define VAL 6
out0 = 0.0;
#if (VAL | 5) == 7
out0 = 1.0;
#endif
${OUTPUT}
}
""
end
case and
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#define VAL 6
out0 = 0.0;
#if (VAL & 5) == 4
out0 = 1.0;
#endif
${OUTPUT}
}
""
end
case xor
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#define VAL 6
out0 = 0.0;
#if (VAL ^ 5) == 3
out0 = 1.0;
#endif
${OUTPUT}
}
""
end
case mod
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#define VAL (( (4 ) ) )
out0 = 0.0;
#if VAL >= 4
out0 = 1.0;
#endif
${OUTPUT}
}
""
end
case parenthesis_tricky
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#define VAL 4
out0 = 0.0;
#if VAL >= 4
out0 = 1.0;
#endif
${OUTPUT}
}
""
end
case parenthesis_if
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#if -4 + 5 == 1
out0 = 1.0;
#else
out0 = 0.0;
#endif
${OUTPUT}
}
""
end
case eval_basic_1
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
precision mediump float;
${DECLARATIONS}
void main()
{
#if 2 - 2 / 2 == 1
out0 = 1.0;
#else
out0 = 0.0;
#endif
${OUTPUT}
}
""
end
case defined_1
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
values { output float out0 = 1.0; }
both ""
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
expect compile_fail
both ""
precision mediump float;
void main()
{
#if !
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case invalid_binary_expr
expect compile_fail
both ""
precision mediump float;
void main()
{
#if 3+4+
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case missing_expr
expect compile_fail
both ""
precision mediump float;
void main()
{
#if
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case invalid_expr_1
expect compile_fail
both ""
precision mediump float;
void main()
{
#if 4 4
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case invalid_expr_2
expect compile_fail
both ""
precision mediump float;
void main()
{
#if 4 * * 4
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case invalid_expr_3
expect compile_fail
both ""
precision mediump float;
void main()
{
#if (4)(4)
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case unopened_parenthesis
expect compile_fail
both ""
precision mediump float;
void main()
{
#if 4)
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
case unclosed_parenthesis
expect compile_fail
both ""
precision mediump float;
void main()
{
#if ((4 + 7)
${POSITION_FRAG_COLOR} = vec4(1.0);
}
""
end
end # invalid_expressions
group operator_precedence "Operator precedence"
case modulo_vs_not
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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
values { output float out0 = 1.0; }
both ""
#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