diff options
Diffstat (limited to 'dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/compound_statement.spec.ts')
-rw-r--r-- | dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/compound_statement.spec.ts | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/compound_statement.spec.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/compound_statement.spec.ts new file mode 100644 index 0000000000..8ad89f48a8 --- /dev/null +++ b/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/compound_statement.spec.ts @@ -0,0 +1,98 @@ +export const description = ` +Validation tests for declarations in compound statements. +`; + +import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +export const g = makeTestGroup(ShaderValidationTest); + +// 9.1 Compound Statements +// When a declaration is one of those statements, its identifier is in scope from +// the start of the next statement until the end of the compound statement. +// +// Enumerating cases: Consider a declaration X inside a compound statement. +// The X declaration should be tested with potential uses and potentially +// conflicting declarations in positions [a, b, c, d, e], in the following: +// a { b; X; c; { d; } } e; + +const kConflictTests = { + a: { + src: 'let x = 1; { let x = 1; }', + pass: true, + }, + bc: { + src: '{let x = 1; let x = 1; }', + pass: false, + }, + d: { + src: '{let x = 1; { let x = 1; }}', + pass: true, + }, + e: { + src: '{let x = 1; } let x = 1;', + pass: true, + }, +}; + +g.test('decl_conflict') + .desc( + 'Test a potentially conflicting declaration relative to a declaration in a compound statement' + ) + .params(u => u.combine('case', keysOf(kConflictTests))) + .fn(t => { + const wgsl = ` +@vertex fn vtx() -> @builtin(position) vec4f { + ${kConflictTests[t.params.case].src} + return vec4f(1); +}`; + t.expectCompileResult(kConflictTests[t.params.case].pass, wgsl); + }); + +const kUseTests = { + a: { + src: 'let y = x; { let x = 1; }', + pass: false, // not visible + }, + b: { + src: '{ let y = x; let x = 1; }', + pass: false, // not visible + }, + self: { + src: '{ let x = (x);}', + pass: false, // not visible + }, + c_yes: { + src: '{ const x = 1; const_assert x == 1; }', + pass: true, + }, + c_no: { + src: '{ const x = 1; const_assert x == 2; }', + pass: false, + }, + d_yes: { + src: '{ const x = 1; { const_assert x == 1; }}', + pass: true, + }, + d_no: { + src: '{ const x = 1; { const_assert x == 2; }}', + pass: false, + }, + e: { + src: '{ const x = 1; } let y = x;', + pass: false, // not visible + }, +}; + +g.test('decl_use') + .desc('Test a use of a declaration in a compound statement') + .params(u => u.combine('case', keysOf(kUseTests))) + .fn(t => { + const wgsl = ` +@vertex fn vtx() -> @builtin(position) vec4f { + ${kUseTests[t.params.case].src} + return vec4f(1); +}`; + t.expectCompileResult(kUseTests[t.params.case].pass, wgsl); + }); |