blob: 102d297b5f0a90b836db2dad37e6707afbf7d916 [file] [log] [blame]
export const description = `
Flow control tests for loops.
`;
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('loop_break')
.desc('Test that flow control exits a loop when reaching a break statement')
.params(u => u.combine('preventValueOptimizations', [true, false]))
.fn(t => {
runFlowControlTest(
t,
f =>
`
${f.expect_order(0)}
var i = ${f.value(0)};
loop {
${f.expect_order(1, 3, 5, 7)}
if i == 3 {
break;
}
${f.expect_order(2, 4, 6)}
i++;
}
${f.expect_order(8)}
`
);
});
g.test('loop_continue')
.desc('Test flow control for a loop continue statement')
.params(u => u.combine('preventValueOptimizations', [true, false]))
.fn(t => {
runFlowControlTest(
t,
f =>
`
${f.expect_order(0)}
var i = ${f.value(0)};
loop {
${f.expect_order(1, 3, 5, 7, 8)}
if i == 3 {
i++;
continue;
${f.expect_not_reached()}
}
${f.expect_order(2, 4, 6, 9)}
if i == 4 {
break;
}
i++;
}
${f.expect_order(10)}
`
);
});
g.test('loop_continuing_basic')
.desc('Test basic flow control for a loop continuing block')
.params(u => u.combine('preventValueOptimizations', [true, false]))
.fn(t => {
runFlowControlTest(
t,
f =>
`
${f.expect_order(0)}
var i = ${f.value(0)};
loop {
${f.expect_order(1, 3, 5)}
i++;
continuing {
${f.expect_order(2, 4, 6)}
break if i == 3;
}
}
${f.expect_order(7)}
`
);
});
g.test('nested_loops')
.desc('Test flow control for a loop nested in another loop')
.params(u => u.combine('preventValueOptimizations', [true, false]))
.fn(t => {
runFlowControlTest(
t,
f =>
`
${f.expect_order(0)}
var i = ${f.value(0)};
loop {
${f.expect_order(1, 11, 21)}
if i == ${f.value(6)} {
${f.expect_order(22)}
break;
${f.expect_not_reached()}
}
${f.expect_order(2, 12)}
loop {
i++;
${f.expect_order(3, 6, 9, 13, 16, 19)}
if (i % ${f.value(3)}) == 0 {
${f.expect_order(10, 20)}
break;
${f.expect_not_reached()}
}
${f.expect_order(4, 7, 14, 17)}
if (i & ${f.value(1)}) == 0 {
${f.expect_order(8, 15)}
continue;
${f.expect_not_reached()}
}
${f.expect_order(5, 18)}
}
}
${f.expect_order(23)}
`
);
});
g.test('loop_break_if_logical_and_condition')
.desc('Test flow control for a loop with a logical and break if')
.params(u => u.combine('preventValueOptimizations', [true, false]))
.fn(t => {
runFlowControlTest(t, f => ({
entrypoint: `
${f.expect_order(0)}
var i = ${f.value(0)};
loop {
${f.expect_order(1, 4, 7)}
continuing {
i++;
break if !(a(i) && b(i));
}
}
${f.expect_order(9)}
`,
extra: `
fn a(i : i32) -> bool {
${f.expect_order(2, 5, 8)}
return i < ${f.value(3)};
}
fn b(i : i32) -> bool {
${f.expect_order(3, 6)}
return i < ${f.value(5)};
}
`,
}));
});
g.test('loop_break_if_logical_or_condition')
.desc('Test flow control for a loop with a logical or break if')
.params(u => u.combine('preventValueOptimizations', [true, false]))
.fn(t => {
runFlowControlTest(t, f => ({
entrypoint: `
${f.expect_order(0)}
var i = ${f.value(0)};
loop {
${f.expect_order(1, 3, 6, 9)}
continuing {
i++;
break if !(a(i) || b(i));
}
}
${f.expect_order(12)}
`,
extra: `
fn a(i : i32) -> bool {
${f.expect_order(2, 4, 7, 10)}
return i < ${f.value(2)};
}
fn b(i : i32) -> bool {
${f.expect_order(5, 8, 11)}
return i < ${f.value(4)};
}
`,
}));
});