| export const description = `Validation tests for blankspace handling`; |
| |
| import { makeTestGroup } from '../../../../common/framework/test_group.js'; |
| import { ShaderValidationTest } from '../shader_validation_test.js'; |
| |
| export const g = makeTestGroup(ShaderValidationTest); |
| |
| g.test('null_characters') |
| .desc(`Test that WGSL source containing a null character is rejected.`) |
| .params(u => |
| u |
| .combine('contains_null', [true, false]) |
| .combine('placement', ['comment', 'delimiter', 'eol']) |
| .beginSubcases() |
| ) |
| .fn(t => { |
| let code = ''; |
| if (t.params.placement === 'comment') { |
| code = `// Here is a ${t.params.contains_null ? '\0' : 'Z'} character`; |
| } else if (t.params.placement === 'delimiter') { |
| code = `const${t.params.contains_null ? '\0' : ' '}name : i32 = 0;`; |
| } else if (t.params.placement === 'eol') { |
| code = `const name : i32 = 0;${t.params.contains_null ? '\0' : ''}`; |
| } |
| t.expectCompileResult(!t.params.contains_null, code); |
| }); |
| |
| g.test('blankspace') |
| .desc(`Test that all blankspace characters act as delimiters.`) |
| .params(u => |
| u |
| .combine('blankspace', [ |
| ['\u0020', 'space'], |
| ['\u0009', 'horizontal_tab'], |
| ['\u000a', 'line_feed'], |
| ['\u000b', 'vertical_tab'], |
| ['\u000c', 'form_feed'], |
| ['\u000d', 'carriage_return'], |
| ['\u0085', 'next_line'], |
| ['\u200e', 'left_to_right_mark'], |
| ['\u200f', 'right_to_left_mark'], |
| ['\u2028', 'line_separator'], |
| ['\u2029', 'paragraph_separator'], |
| ]) |
| .beginSubcases() |
| ) |
| .fn(t => { |
| const code = `const${t.params.blankspace[0]}ident : i32 = 0;`; |
| t.expectCompileResult(true, code); |
| }); |
| |
| g.test('bom') |
| .desc( |
| `Tests that including a BOM causes a shader compile error. |
| |
| Note, per RFC 2632, for protocols which forbit the use of U+FEFF then the BOM is treated as a |
| "ZERO WIDTH NO-BREAK SPACE". The "ZERO WIDTH NO-BREAK SPACE" is not a valid WGSL blankspace code |
| point, so the BOM ends up as a shader compilation error. |
| ` |
| ) |
| .params(u => u.combine('include_bom', [true, false])) |
| .fn(t => { |
| const code = `${t.params.include_bom ? '\uFEFF' : ''}const name : i32 = 0;`; |
| t.expectCompileResult(!t.params.include_bom, code); |
| }); |