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)};}`,}));});