Improve unit tests for switch-case and enum error handling.
These tests verify that switches and enums only work with constant
integral values. Floats or uniforms should be rejected with an easy-to-
understand error message.
Change-Id: Ib634cb1ca1734a4b66ba53a3476e9ee539a63e3e
Bug: oss-fuzz:24889, skia:10615
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/310396
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
diff --git a/tests/SkSLErrorTest.cpp b/tests/SkSLErrorTest.cpp
index 50181c7..43f79ac 100644
--- a/tests/SkSLErrorTest.cpp
+++ b/tests/SkSLErrorTest.cpp
@@ -477,12 +477,36 @@
test_failure(r,
"void main() { switch (1) { case float2(1): break; } }",
"error: 1: expected 'int', but found 'float2'\n1 error\n");
+ test_failure(r,
+ "void main() { switch (1) { case 0.5: break; } }",
+ "error: 1: expected 'int', but found 'float'\n1 error\n");
+ test_failure(r,
+ "void main() { switch (1) { case 1.0: break; } }",
+ "error: 1: expected 'int', but found 'float'\n1 error\n");
+ test_failure(r,
+ "uniform float x = 1; void main() { switch (1) { case x: break; } }",
+ "error: 1: expected 'int', but found 'float'\n1 error\n");
+ test_failure(r,
+ "const float x = 1; void main() { switch (1) { case x: break; } }",
+ "error: 1: expected 'int', but found 'float'\n1 error\n");
+ test_failure(r,
+ "const float x = 1; void main() { switch (x) { case 1: break; } }",
+ "error: 1: expected 'int', but found 'float'\n1 error\n");
+ test_success(r,
+ "const int x = 1; void main() { switch (x) { case 1: break; } }");
}
DEF_TEST(SkSLNonConstantCase, r) {
test_failure(r,
+ "uniform int x = 1; void main() { switch (1) { case x: break; } }",
+ "error: 1: case value must be a constant integer\n1 error\n");
+ test_failure(r,
"void main() { int x = 1; switch (1) { case x: break; } }",
"error: 1: case value must be a constant integer\n1 error\n");
+ test_success(r,
+ "uniform int x = 1; void main() { switch (x) { case 1: break; } }");
+ test_success(r,
+ "void main() { const int x = 1; switch (1) { case x: break; } }");
}
DEF_TEST(SkSLDuplicateCase, r) {
@@ -556,3 +580,28 @@
"void main() { float x; x = 1.5 2.5; }",
"error: 1: expected ';', but found '2.5'\n1 error\n");
}
+
+DEF_TEST(SkSLMustBeConstantIntegralEnum, r) {
+ test_failure(r,
+ "enum class E { a = 0.5 }; void main() {}",
+ "error: 1: enum value must be a constant integer\n1 error\n");
+ test_failure(r,
+ "enum class E { a = float(1) }; void main() {}",
+ "error: 1: enum value must be a constant integer\n1 error\n");
+ test_failure(r,
+ "enum class E { a = 1.0 }; void main() {}",
+ "error: 1: enum value must be a constant integer\n1 error\n");
+ test_failure(r,
+ "uniform float f; enum class E { a = f }; void main() {}",
+ "error: 1: enum value must be a constant integer\n1 error\n");
+ test_failure(r,
+ "const float f = 1.0; enum class E { a = f }; void main() {}",
+ "error: 1: enum value must be a constant integer\n1 error\n");
+ test_failure(r,
+ "uniform int i; enum class E { a = i }; void main() {}",
+ "error: 1: enum value must be a constant integer\n1 error\n");
+ test_success(r,
+ "const int i = 1; enum class E { a = i }; void main() {}");
+ test_success(r,
+ "enum class E { a = 1 }; void main() {}");
+}