summaryrefslogtreecommitdiffstats
path: root/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/types/alias.spec.ts
diff options
context:
space:
mode:
Diffstat (limited to 'dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/types/alias.spec.ts')
-rw-r--r--dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/types/alias.spec.ts123
1 files changed, 123 insertions, 0 deletions
diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/types/alias.spec.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/types/alias.spec.ts
new file mode 100644
index 0000000000..266b4f9a12
--- /dev/null
+++ b/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/types/alias.spec.ts
@@ -0,0 +1,123 @@
+export const description = `
+Validation tests for type aliases
+`;
+
+import { makeTestGroup } from '../../../../common/framework/test_group.js';
+import { ShaderValidationTest } from '../shader_validation_test.js';
+
+export const g = makeTestGroup(ShaderValidationTest);
+
+g.test('no_direct_recursion')
+ .desc('Test that direct recursion of type aliases is rejected')
+ .params(u => u.combine('target', ['i32', 'T']))
+ .fn(t => {
+ const wgsl = `alias T = ${t.params.target};`;
+ t.expectCompileResult(t.params.target === 'i32', wgsl);
+ });
+
+g.test('no_indirect_recursion')
+ .desc('Test that indirect recursion of type aliases is rejected')
+ .params(u => u.combine('target', ['i32', 'S']))
+ .fn(t => {
+ const wgsl = `
+alias S = T;
+alias T = ${t.params.target};
+`;
+ t.expectCompileResult(t.params.target === 'i32', wgsl);
+ });
+
+g.test('no_indirect_recursion_via_vector_element')
+ .desc('Test that indirect recursion of type aliases via vector element types is rejected')
+ .params(u => u.combine('target', ['i32', 'V']))
+ .fn(t => {
+ const wgsl = `
+alias V = vec4<T>;
+alias T = ${t.params.target};
+`;
+ t.expectCompileResult(t.params.target === 'i32', wgsl);
+ });
+
+g.test('no_indirect_recursion_via_matrix_element')
+ .desc('Test that indirect recursion of type aliases via matrix element types is rejected')
+ .params(u => u.combine('target', ['f32', 'M']))
+ .fn(t => {
+ const wgsl = `
+alias M = mat4x4<T>;
+alias T = ${t.params.target};
+`;
+ t.expectCompileResult(t.params.target === 'f32', wgsl);
+ });
+
+g.test('no_indirect_recursion_via_array_element')
+ .desc('Test that indirect recursion of type aliases via array element types is rejected')
+ .params(u => u.combine('target', ['i32', 'A']))
+ .fn(t => {
+ const wgsl = `
+alias A = array<T, 4>;
+alias T = ${t.params.target};
+`;
+ t.expectCompileResult(t.params.target === 'i32', wgsl);
+ });
+
+g.test('no_indirect_recursion_via_array_size')
+ .desc('Test that indirect recursion of type aliases via array size expressions is rejected')
+ .params(u => u.combine('target', ['i32', 'A']))
+ .fn(t => {
+ const wgsl = `
+alias A = array<i32, T(1)>;
+alias T = ${t.params.target};
+`;
+ t.expectCompileResult(t.params.target === 'i32', wgsl);
+ });
+
+g.test('no_indirect_recursion_via_atomic')
+ .desc('Test that indirect recursion of type aliases via atomic types is rejected')
+ .params(u => u.combine('target', ['i32', 'A']))
+ .fn(t => {
+ const wgsl = `
+alias A = atomic<T>;
+alias T = ${t.params.target};
+`;
+ t.expectCompileResult(t.params.target === 'i32', wgsl);
+ });
+
+g.test('no_indirect_recursion_via_ptr_store_type')
+ .desc('Test that indirect recursion of type aliases via pointer store types is rejected')
+ .params(u => u.combine('target', ['i32', 'P']))
+ .fn(t => {
+ const wgsl = `
+alias P = ptr<function, T>;
+alias T = ${t.params.target};
+`;
+ t.expectCompileResult(t.params.target === 'i32', wgsl);
+ });
+
+g.test('no_indirect_recursion_via_struct_member')
+ .desc('Test that indirect recursion of type aliases via struct members is rejected')
+ .params(u => u.combine('target', ['i32', 'S']))
+ .fn(t => {
+ const wgsl = `
+struct S {
+ a : T
+}
+alias T = ${t.params.target};
+`;
+ t.expectCompileResult(t.params.target === 'i32', wgsl);
+ });
+
+g.test('no_indirect_recursion_via_struct_attribute')
+ .desc('Test that indirect recursion of type aliases via struct members is rejected')
+ .params(u =>
+ u //
+ .combine('target', ['i32', 'S'])
+ .combine('attribute', ['align', 'location', 'size'])
+ )
+ .fn(t => {
+ const wgsl = `
+struct S {
+ @${t.params.attribute}(T(4)) a : f32
+}
+alias T = ${t.params.target};
+`;
+ t.expectCompileResult(t.params.target === 'i32', wgsl);
+ });