export const description = `Parser validation tests for enable`;

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 kCases = {
  f16: { code: `enable f16;`, pass: true },
  decl_before: {
    code: `alias i = i32;
enable f16;`,
    pass: false,
  },
  decl_after: {
    code: `enable f16;
alias i = i32;`,
    pass: true,
  },
  requires_before: {
    code: `requires readonly_and_readwrite_storage_textures;
enable f16;`,
    pass: true,
  },
  diagnostic_before: {
    code: `diagnostic(info, derivative_uniformity);
enable f16;`,
    pass: true,
  },
  const_assert_before: {
    code: `const_assert 1 == 1;
enable f16;`,
    pass: false,
  },
  const_assert_after: {
    code: `enable f16;
const_assert 1 == 1;`,
    pass: true,
  },
  embedded_comment: {
    code: `/* comment

*/enable f16;`,
    pass: true,
  },
  parens: {
    code: `enable(f16);`,
    pass: false,
  },
  multi_line: {
    code: `enable
f16;`,
    pass: true,
  },
  multiple_enables: {
    code: `enable f16;
enable f16;`,
    pass: true,
  },
  multiple_entries: {
    code: `enable f16, f16, f16;`,
    pass: true,
  },
  unknown: {
    code: `enable unknown;`,
    pass: false,
  },
  subgroups: {
    code: `enable subgroups;`,
    pass: true,
  },
  subgroups_f16_pass1: {
    code: `
    enable f16;
    enable subgroups;`,
    pass: true,
  },
  subgroups_f16_pass2: {
    code: `
    enable subgroups;
    enable f16;`,
    pass: true,
  },
  in_comment_f16: {
    code: `
    /* enable f16; */
    var<private> v: f16;
    `,
    pass: false,
  },
};

g.test('enable')
  .desc(`Tests that enables are validated correctly`)
  .params(u => u.combine('case', keysOf(kCases)))
  .fn(t => {
    if (t.params.case === 'requires_before') {
      t.skipIfLanguageFeatureNotSupported('readonly_and_readwrite_storage_textures');
    }
    const c = kCases[t.params.case];
    t.expectCompileResult(c.pass, c.code);
  });
