| export const description = `Parser validation tests for requires`; |
| |
| import { makeTestGroup } from '../../../../common/framework/test_group.js'; |
| import { keysOf } from '../../../../common/util/data_tables.js'; |
| import { kKnownWGSLLanguageFeatures } from '../../../capability_info.js'; |
| import { ShaderValidationTest } from '../shader_validation_test.js'; |
| |
| export const g = makeTestGroup(ShaderValidationTest); |
| |
| const kCases = { |
| valid: { code: `requires readonly_and_readwrite_storage_textures;`, pass: true }, |
| decl_before: { |
| code: `alias i = i32; |
| requires readonly_and_readwrite_storage_textures;`, |
| pass: false, |
| }, |
| decl_after: { |
| code: `requires readonly_and_readwrite_storage_textures; |
| alias i = i32;`, |
| pass: true, |
| }, |
| enable_before: { |
| code: `enable f16; |
| requires readonly_and_readwrite_storage_textures;`, |
| pass: true, |
| }, |
| diagnostic_before: { |
| code: `diagnostic(info, derivative_uniformity); |
| requires readonly_and_readwrite_storage_textures;`, |
| pass: true, |
| }, |
| const_assert_before: { |
| code: `const_assert 1 == 1; |
| requires readonly_and_readwrite_storage_textures;`, |
| pass: false, |
| }, |
| const_assert_after: { |
| code: `requires readonly_and_readwrite_storage_textures; |
| const_assert 1 == 1;`, |
| pass: true, |
| }, |
| embedded_comment: { |
| code: `/* comment |
| |
| */requires readonly_and_readwrite_storage_textures;`, |
| pass: true, |
| }, |
| parens: { |
| code: `requires(readonly_and_readwrite_storage_textures);`, |
| pass: false, |
| }, |
| multi_line: { |
| code: `requires |
| readonly_and_readwrite_storage_textures;`, |
| pass: true, |
| }, |
| multiple_requires_duplicate: { |
| code: `requires readonly_and_readwrite_storage_textures; |
| requires readonly_and_readwrite_storage_textures;`, |
| pass: true, |
| }, |
| multiple_requires_different: { |
| code: `requires readonly_and_readwrite_storage_textures; |
| requires packed_4x8_integer_dot_product;`, |
| pass: true, |
| }, |
| multiple_entries_duplicate: { |
| code: `requires readonly_and_readwrite_storage_textures, readonly_and_readwrite_storage_textures, readonly_and_readwrite_storage_textures;`, |
| pass: true, |
| }, |
| multiple_entries_different: { |
| code: `requires readonly_and_readwrite_storage_textures, packed_4x8_integer_dot_product;`, |
| pass: true, |
| }, |
| unknown: { |
| code: `requires unknown;`, |
| pass: false, |
| }, |
| }; |
| |
| g.test('requires') |
| .desc(`Tests that requires are validated correctly.`) |
| .params(u => u.combine('case', keysOf(kCases))) |
| .fn(t => { |
| t.skipIfLanguageFeatureNotSupported('readonly_and_readwrite_storage_textures'); |
| t.skipIfLanguageFeatureNotSupported('packed_4x8_integer_dot_product'); |
| |
| const c = kCases[t.params.case]; |
| t.expectCompileResult(c.pass, c.code); |
| }); |
| |
| g.test('wgsl_matches_api') |
| .desc(`Tests that language features are accepted iff the API reports support for them.`) |
| .params(u => u.combine('feature', kKnownWGSLLanguageFeatures)) |
| .fn(t => { |
| const code = `requires ${t.params.feature};`; |
| t.expectCompileResult(t.hasLanguageFeature(t.params.feature), code); |
| }); |