blob: bd87f9d33fcaa0938cd49d4f5c47fbe81dc983bf [file] [log] [blame]
export const description = `
Flow control tests for switch statements.
`;
import { makeTestGroup } from '../../../../common/framework/test_group.js';
import { AllFeaturesMaxLimitsGPUTest } from '../../../gpu_test.js';
import { runFlowControlTest } from './harness.js';
export const g = makeTestGroup(AllFeaturesMaxLimitsGPUTest);
g.test('switch')
.desc('Test that flow control executes the correct switch case block')
.params(u => u.combine('preventValueOptimizations', [true, false]))
.fn(t => {
runFlowControlTest(
t,
f => `
${f.expect_order(0)}
switch (${f.value(1)}) {
case 0: {
${f.expect_not_reached()}
break;
}
case 1: {
${f.expect_order(1)}
break;
}
case 2: {
${f.expect_not_reached()}
break;
}
default: {
${f.expect_not_reached()}
break;
}
}
${f.expect_order(2)}
`
);
});
g.test('switch_multiple_case')
.desc(
'Test that flow control executes the correct switch case block with multiple cases per block'
)
.params(u => u.combine('preventValueOptimizations', [true, false]))
.fn(t => {
runFlowControlTest(
t,
f => `
${f.expect_order(0)}
switch (${f.value(2)}) {
case 0, 1: {
${f.expect_not_reached()}
break;
}
case 2, 3: {
${f.expect_order(1)}
break;
}
default: {
${f.expect_not_reached()}
break;
}
}
${f.expect_order(2)}
`
);
});
g.test('switch_multiple_case_default')
.desc(
'Test that flow control executes the correct switch case block with multiple cases per block (combined with default)'
)
.params(u => u.combine('preventValueOptimizations', [true, false]))
.fn(t => {
runFlowControlTest(
t,
f => `
${f.expect_order(0)}
switch (${f.value(2)}) {
case 0, 1: {
${f.expect_not_reached()}
break;
}
case 2, 3, default: {
${f.expect_order(1)}
break;
}
}
${f.expect_order(2)}
switch (${f.value(1)}) {
case 0, 1: {
${f.expect_order(3)}
break;
}
case 2, 3, default: {
${f.expect_not_reached()}
break;
}
}
${f.expect_order(4)}
`
);
});
g.test('switch_default')
.desc('Test that flow control executes the switch default block')
.params(u => u.combine('preventValueOptimizations', [true, false]))
.fn(t => {
runFlowControlTest(
t,
f => `
${f.expect_order(0)}
switch (${f.value(4)}) {
case 0: {
${f.expect_not_reached()}
break;
}
case 1: {
${f.expect_not_reached()}
break;
}
case 2: {
${f.expect_not_reached()}
break;
}
default: {
${f.expect_order(1)}
break;
}
}
${f.expect_order(2)}
`
);
});
g.test('switch_default_only')
.desc('Test that flow control executes the switch default block, which is the only case')
.params(u => u.combine('preventValueOptimizations', [true, false]))
.fn(t => {
runFlowControlTest(
t,
f => `
${f.expect_order(0)}
switch (${f.value(4)}) {
default: {
${f.expect_order(1)}
break;
}
}
${f.expect_order(2)}
`
);
});
g.test('switch_inside_loop_with_continue')
.desc('Test that flow control executes correct for a switch calling continue inside a loop')
.params(u => u.combine('preventValueOptimizations', [true, false]))
.fn(t => {
runFlowControlTest(
t,
f => `
${f.expect_order(0)}
var i = ${f.value(0)};
loop {
switch (i) {
case 1: {
${f.expect_order(4)}
continue;
}
default: {
${f.expect_order(1)}
break;
}
}
${f.expect_order(2)}
continuing {
${f.expect_order(3, 5)}
i++;
break if i >= 2;
}
}
${f.expect_order(6)}
`
);
});