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