mod common;
#[test]
fn nested_static_args() {
common::verify_both(
r#"int IntCallback();
int callbackTarget() { return 1; }
int innerTemplate(IntCallback cbi) {
return cbi();
}
int outerTemplate(IntCallback cbo) {
return innerTemplate(cbo);
}
void main() {
outerTemplate(callbackTarget);
}"#,
r#"int callbackTarget() { return 1; }
int _glslt_innerTemplate_1() {
return callbackTarget();
}
int _glslt_outerTemplate_0() {
return _glslt_innerTemplate_1();
}
void main() {
_glslt_outerTemplate_0();
}"#,
"main",
);
}
#[test]
fn nested_static_args_with_arg() {
common::verify_both(
r#"int IntCallback(int x);
int callbackTarget(int x) { return x; }
int innerTemplate(IntCallback cbi) {
return cbi(1);
}
int outerTemplate(IntCallback cbo) {
return innerTemplate(cbo);
}
void main() {
outerTemplate(callbackTarget);
}"#,
r#"int callbackTarget(int x) { return x; }
int _glslt_innerTemplate_1() {
return callbackTarget(1);
}
int _glslt_outerTemplate_0() {
return _glslt_innerTemplate_1();
}
void main() {
_glslt_outerTemplate_0();
}"#,
"main",
);
}
#[test]
fn nested_lambda_with_arg() {
common::verify_both(
r#"int IntCallback(int x);
int innerTemplate(IntCallback cbi) {
return cbi(1);
}
int outerTemplate(IntCallback cbo) {
return innerTemplate(cbo);
}
void main() {
outerTemplate(_1);
}"#,
r#"int _glslt_innerTemplate_1() {
return 1;
}
int _glslt_outerTemplate_0() {
return _glslt_innerTemplate_1();
}
void main() {
_glslt_outerTemplate_0();
}"#,
"main",
);
}
#[test]
fn doubly_nested_lambda_with_arg() {
common::verify_both(
r#"int IntCallback(int x);
int innerTemplate(IntCallback cbi) {
return cbi(1);
}
int outerTemplate(IntCallback cbo) {
return innerTemplate(2 * cbo(_1));
}
void main() {
outerTemplate(_1);
}"#,
r#"int _glslt_innerTemplate_1() {
return 2 * 1;
}
int _glslt_outerTemplate_0() {
return _glslt_innerTemplate_1();
}
void main() {
_glslt_outerTemplate_0();
}"#,
"main",
);
}
#[test]
fn nested_complex() {
common::verify_both(
r#"vec4 PathInfill(float p);
vec4 pathFillSegment(float ph, float width, PathInfill infill) {
return infill(ph) * vec4(1., 1., 1., 0.5);
}
vec4 infillSolidBorder(float p, float width, PathInfill color) {
return pathFillSegment(p, width, color(p));
}
void main() {
gl_FragColor = infillSolidBorder(0.25, 5.0, vec4(1.));
}"#,
r#"vec4 _glslt_pathFillSegment_0(float ph, float width) {
return vec4(1.) * vec4(1., 1., 1., 0.5);
}
vec4 _glslt_infillSolidBorder_0(float p, float width) {
return _glslt_pathFillSegment_0(p, width);
}
void main() {
gl_FragColor = _glslt_infillSolidBorder_0(0.25, 5.0);
}"#,
"main",
);
}
#[test]
fn nested_complex_lambda() {
common::verify_both(
r#"vec4 PathInfill(float p);
vec4 pathFillSegment(float ph, float width, PathInfill infill) {
return infill(ph) * vec4(1., 1., 1., 0.5);
}
vec4 infillSolidBorder(float p, float width, PathInfill color) {
return pathFillSegment(p, width, color(p));
}
void main() {
gl_FragColor = infillSolidBorder(0.25, 5.0, vec4(_1));
}"#,
r#"vec4 _glslt_pathFillSegment_0(float ph, float width, float _glslt_lp0) {
return vec4(_glslt_lp0) * vec4(1., 1., 1., 0.5);
}
vec4 _glslt_infillSolidBorder_0(float p, float width) {
return _glslt_pathFillSegment_0(p, width, p);
}
void main() {
gl_FragColor = _glslt_infillSolidBorder_0(0.25, 5.0);
}"#,
"main",
);
}
#[test]
fn nested_complex_lambda2() {
common::verify_both(
r#"vec4 PathInfill(float p);
vec4 pathFillSegment(float ph, float width, PathInfill infill) {
return infill(ph) * vec4(1., 1., 1., 0.5);
}
vec4 infillSolidBorder(float p, float width, PathInfill color) {
return pathFillSegment(p, width, color(p));
}
void main() {
gl_FragColor = infillSolidBorder(0.25, 5.0, vec4(1., 2., 3., 4.));
}"#,
r#"vec4 _glslt_pathFillSegment_0(float ph, float width) {
return vec4(1., 2., 3., 4.) * vec4(1., 1., 1., 0.5);
}
vec4 _glslt_infillSolidBorder_0(float p, float width) {
return _glslt_pathFillSegment_0(p, width);
}
void main() {
gl_FragColor = _glslt_infillSolidBorder_0(0.25, 5.0);
}"#,
"main",
);
}