export const description = `Validation tests for id`; 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); const kTests = { zero: { src: `@id(0)`, pass: true, }, one: { src: `@id(1)`, pass: true, }, hex: { src: `@id(0x1)`, pass: true, }, trailing_comma: { src: `@id(1,)`, pass: true, }, i32: { src: `@id(1i)`, pass: true, }, ui32: { src: `@id(1u)`, pass: true, }, largest: { src: `@id(65535)`, pass: true, }, newline: { src: '@\nid(1)', pass: true, }, comment: { src: `@/* comment */id(1)`, pass: true, }, const_expr: { src: `const z = 5; const y = 2; @id(z + y)`, pass: true, }, misspelling: { src: `@aid(1)`, pass: false, }, empty: { src: `@id()`, pass: false, }, missing_left_paren: { src: `@id 1)`, pass: false, }, missing_right_paren: { src: `@id(1`, pass: false, }, multi_value: { src: `@id(1, 2)`, pass: false, }, overide_expr: { src: `override z = 5; override y = 2; @id(z + y)`, pass: false, }, f32_literal: { src: `@id(1.0)`, pass: false, }, f32: { src: `@id(1f)`, pass: false, }, negative: { src: `@id(-1)`, pass: false, }, too_large: { src: `@id(65536)`, pass: false, }, no_params: { src: `@id`, pass: false, }, duplicate: { src: `@id(1) @id(1)`, pass: false, }, }; g.test('id') .desc(`Test validation of id`) .params(u => u.combine('attr', keysOf(kTests))) .fn(t => { const code = ` ${kTests[t.params.attr].src} override a = 4; @workgroup_size(1, 1, 1) @compute fn main() {}`; t.expectCompileResult(kTests[t.params.attr].pass, code); }); g.test('id_fp16') .desc(`Test validation of id with fp16`) .params(u => u.combine('ext', ['', 'h'])) .fn(t => { const code = ` @id(1${t.params.ext}) override a = 4; @workgroup_size(1, 1, 1) @compute fn main() {}`; t.expectCompileResult(t.params.ext === '', code); }); g.test('id_struct_member') .desc(`Test validation of id with struct member`) .params(u => u.combine('id', ['@id(1) override', '@id(1)', ''])) .fn(t => { const code = ` struct S { ${t.params.id} a: i32, } @workgroup_size(1, 1, 1) @compute fn main() {}`; t.expectCompileResult(t.params.id === '', code); }); g.test('id_non_override') .desc(`Test validation of id with non-override`) .params(u => u.combine('type', ['var', 'const', 'override'])) .fn(t => { const code = ` @id(1) ${t.params['type']} a = 4; @workgroup_size(1, 1, 1) @compute fn main() {}`; t.expectCompileResult(t.params['type'] === 'override', code); }); g.test('id_in_function') .desc(`Test validation of id inside a function`) .params(u => u.combine('id', ['@id(1)', ''])) .fn(t => { const code = ` @workgroup_size(1, 1, 1) @compute fn main() { ${t.params['id']} var a = 4; }`; t.expectCompileResult(t.params['id'] === '', code); });