| // Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import "package:expect/expect.dart"; |
| |
| main() { |
| switchSingleCase(); |
| ifCase(); |
| sharedCaseUseInBody(); |
| sharedCaseOnlyGuards(); |
| } |
| |
| /// Guard and body use same variables when cases are not shared. |
| void switchSingleCase() { |
| _closures.clear(); |
| switch (['one', 'two']) { |
| case [var a, var b] when _capture(() => a) && _capture(() => b): |
| Expect.equals('one two', _runClosures()); |
| Expect.equals('one', a); |
| Expect.equals('two', b); |
| |
| a = 'after'; |
| b = 'then'; |
| Expect.equals('after', a); |
| Expect.equals('then', b); |
| |
| // Guard closures see update. |
| Expect.equals('after then', _runClosures()); |
| } |
| } |
| |
| /// Guard and body use same variables in if-case statements. |
| void ifCase() { |
| _closures.clear(); |
| if (['one', 'two'] |
| case [var a, var b] when _capture(() => a) && _capture(() => b)) { |
| Expect.equals('one two', _runClosures()); |
| Expect.equals('one', a); |
| Expect.equals('two', b); |
| |
| a = 'after'; |
| b = 'then'; |
| Expect.equals('after', a); |
| Expect.equals('then', b); |
| |
| // Guard closures see update. |
| Expect.equals('after then', _runClosures()); |
| } |
| } |
| |
| /// Guards and body get separate variable when cases are shared. |
| void sharedCaseUseInBody() { |
| _closures.clear(); |
| switch (['one', 'two', 'three']) { |
| case [var a, _, _] when _capture(() => a, false): |
| case [_, var a, _] when _capture(() => a, false): |
| case [_, _, var a] when _capture(() => a, true): |
| Expect.equals('three', a); |
| Expect.equals('one two three', _runClosures()); |
| |
| a = 'after'; |
| Expect.equals('after', a); |
| |
| // Guard closures are unaffected. |
| Expect.equals('one two three', _runClosures()); |
| } |
| } |
| |
| /// Guards each have their own separate variables even when the variable isn't |
| /// used in the body. |
| void sharedCaseOnlyGuards() { |
| _closures.clear(); |
| switch (['one', 'two', 'three']) { |
| case [var a, _, _] when _capture(() => a, false): |
| case [_, var a, _] when _capture(() => a, false): |
| case [_, _, var a] when _capture(() => a, true): |
| Expect.equals('one two three', _runClosures()); |
| } |
| } |
| |
| final _closures = <Object Function()>[]; |
| |
| bool _capture(Object Function() closure, [bool result = true]) { |
| _closures.add(closure); |
| return result; |
| } |
| |
| String _runClosures() => _closures.map((closure) => closure()).join(' '); |