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