export const description = `Validation tests for binding`; 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 = { const_expr: { src: `const z = 5; const y = 2; @binding(z + y)`, pass: true, }, override_expr: { src: `override z = 5; @binding(z)`, pass: false, }, zero: { src: `@binding(0)`, pass: true, }, one: { src: `@binding(1)`, pass: true, }, comment: { src: `@/* comment */binding(1)`, pass: true, }, split_line: { src: '@ \n binding(1)', pass: true, }, trailing_comma: { src: `@binding(1,)`, pass: true, }, int_literal: { src: `@binding(1i)`, pass: true, }, uint_literal: { src: `@binding(1u)`, pass: true, }, hex_literal: { src: `@binding(0x1)`, pass: true, }, negative: { src: `@binding(-1)`, pass: false, }, missing_value: { src: `@binding()`, pass: false, }, missing_left_paren: { src: `@binding 1)`, pass: false, }, missing_right_paren: { src: `@binding(1`, pass: false, }, multiple_values: { src: `@binding(1,2)`, pass: false, }, f32_val_literal: { src: `@binding(1.0)`, pass: false, }, f32_val: { src: `@binding(1f)`, pass: false, }, no_params: { src: `@binding`, pass: false, }, misspelling: { src: `@abinding(1)`, pass: false, }, multi_binding: { src: `@binding(1) @binding(1)`, pass: false, }, }; g.test('binding') .desc(`Test validation of binding`) .params(u => u.combine('attr', keysOf(kTests))) .fn(t => { const code = ` ${kTests[t.params.attr].src} @group(1) var a: i32; @workgroup_size(1, 1, 1) @compute fn main() { _ = a; }`; t.expectCompileResult(kTests[t.params.attr].pass, code); }); g.test('binding_f16') .desc(`Test validation of binding with f16`) .fn(t => { const code = ` @group(1) @binding(1h) var a: i32; @workgroup_size(1, 1, 1) @compute fn main() { _ = a; }`; t.expectCompileResult(false, code); });