export const description = `
This tests overrides numeric identifiers should not conflict.
`;

import { makeTestGroup } from '../../../../common/framework/test_group.js';
import { AllFeaturesMaxLimitsGPUTest } from '../../../gpu_test.js';

export const g = makeTestGroup(AllFeaturesMaxLimitsGPUTest);

g.test('id_conflict')
  .desc(
    `
Tests that overrides' explicit numeric identifier should not conflict.
`
  )
  .fn(t => {
    t.expectValidationError(() => {
      t.device.createShaderModule({
        code: `
@id(1234) override c0: u32;
@id(4321) override c1: u32;

@compute @workgroup_size(1) fn main() {
  // make sure the overridable constants are not optimized out
  _ = c0;
  _ = c1;
}
          `,
      });
    }, false);

    t.expectValidationError(() => {
      t.device.createShaderModule({
        code: `
@id(1234) override c0: u32;
@id(1234) override c1: u32;

@compute @workgroup_size(1) fn main() {
  // make sure the overridable constants are not optimized out
  _ = c0;
  _ = c1;
}
          `,
      });
    }, true);
  });

g.test('name_conflict')
  .desc(
    `
Tests that overrides' variable name should not conflict, regardless of their numeric identifiers.
`
  )
  .fn(t => {
    t.expectValidationError(() => {
      t.device.createShaderModule({
        code: `
override c0: u32;
override c0: u32;

@compute @workgroup_size(1) fn main() {
  // make sure the overridable constants are not optimized out
  _ = c0;
}
          `,
      });
    }, true);

    t.expectValidationError(() => {
      t.device.createShaderModule({
        code: `
@id(1) override c0: u32;
override c0: u32;

@compute @workgroup_size(1) fn main() {
  // make sure the overridable constants are not optimized out
  _ = c0;
}
          `,
      });
    }, true);

    t.expectValidationError(() => {
      t.device.createShaderModule({
        code: `
@id(1) override c0: u32;
@id(2) override c0: u32;

@compute @workgroup_size(1) fn main() {
  // make sure the overridable constants are not optimized out
  _ = c0;
}
          `,
      });
    }, true);
  });
