export const description = ` Flow control tests for while-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('while_basic') .desc('Test that flow control executes a while-loop body the correct number of times') .params(u => u.combine('preventValueOptimizations', [true, false])) .fn(t => { runFlowControlTest( t, f => ` ${f.expect_order(0)} var i = ${f.value(0)}; while (i < ${f.value(5)}) { ${f.expect_order(1, 2, 3, 4, 5)} i++; } ${f.expect_order(6)} ` ); }); g.test('while_break') .desc('Test that flow control exits a while-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)}; while (i < ${f.value(5)}) { ${f.expect_order(1, 3, 5, 7)} if (i == 3) { break; ${f.expect_not_reached()} } ${f.expect_order(2, 4, 6)} i++; } ${f.expect_order(8)} ` ); }); g.test('while_continue') .desc('Test flow control for a while-loop continue statement') .params(u => u.combine('preventValueOptimizations', [true, false])) .fn(t => { runFlowControlTest( t, f => ` ${f.expect_order(0)} var i = ${f.value(0)}; while (i < ${f.value(5)}) { ${f.expect_order(1, 3, 5, 7, 8)} if (i == 3) { i++; continue; ${f.expect_not_reached()} } ${f.expect_order(2, 4, 6, 9)} i++; } ${f.expect_order(10)} ` ); }); g.test('while_nested_break') .desc('Test that flow control exits a nested while-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)}; while (i < ${f.value(3)}) { ${f.expect_order(1, 5, 11)} i++; var j = ${f.value(0)}; while (j < i) { ${f.expect_order(2, 6, 8, 12)} j++; if ((i+j) & 2) == 0 { ${f.expect_order(9, 13)} break; ${f.expect_not_reached()} } ${f.expect_order(3, 7)} } ${f.expect_order(4, 10, 14)} } ${f.expect_order(15)} ` ); }); g.test('while_nested_continue') .desc('Test flow control for a nested while-loop with a continue statement') .params(u => u.combine('preventValueOptimizations', [true, false])) .fn(t => { runFlowControlTest( t, f => ` ${f.expect_order(0)} var i = ${f.value(0)}; while (i < ${f.value(3)}) { ${f.expect_order(1, 5, 11)} i++; var j = ${f.value(0)}; while (j < i) { ${f.expect_order(2, 6, 8, 12, 14, 16)} j++; if ((i+j) & 2) == 0 { ${f.expect_order(9, 13, 15)} continue; ${f.expect_not_reached()} } ${f.expect_order(3, 7, 17)} } ${f.expect_order(4, 10, 18)} } ${f.expect_order(19)} ` ); }); g.test('while_logical_and_condition') .desc('Test flow control for a while-loop with a logical and condition') .params(u => u.combine('preventValueOptimizations', [true, false])) .fn(t => { runFlowControlTest(t, f => ({ entrypoint: ` ${f.expect_order(0)} var i = ${f.value(0)}; while (a(i) && b(i)) { ${f.expect_order(3, 6)} i++; } ${f.expect_order(8)} `, extra: ` fn a(i : i32) -> bool { ${f.expect_order(1, 4, 7)} return i < ${f.value(2)}; } fn b(i : i32) -> bool { ${f.expect_order(2, 5)} return i < ${f.value(5)}; } `, })); }); g.test('while_logical_or_condition') .desc('Test flow control for a while-loop with a logical or condition') .params(u => u.combine('preventValueOptimizations', [true, false])) .fn(t => { runFlowControlTest(t, f => ({ entrypoint: ` ${f.expect_order(0)} var i = ${f.value(0)}; while (a(i) || b(i)) { ${f.expect_order(2, 4, 7, 10)} i++; } ${f.expect_order(13)} `, extra: ` fn a(i : i32) -> bool { ${f.expect_order(1, 3, 5, 8, 11)} return i < ${f.value(2)}; } fn b(i : i32) -> bool { ${f.expect_order(6, 9, 12)} return i < ${f.value(4)}; } `, })); });