| // Copyright (c) 2023, 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:test_reflective_loader/test_reflective_loader.dart'; |
| |
| import '../../../../client/completion_driver_test.dart'; |
| |
| void main() { |
| defineReflectiveSuite(() { |
| defineReflectiveTests(LabelTest); |
| }); |
| } |
| |
| @reflectiveTest |
| class LabelTest extends AbstractCompletionDriverTest with LabelTestCases {} |
| |
| mixin LabelTestCases on AbstractCompletionDriverTest { |
| @override |
| bool get includeKeywords => false; |
| |
| Future<void> test_break_ignoresLabelsOnUnrelatedStatements() async { |
| await computeSuggestions(''' |
| void f() { |
| f0: while (true) {} |
| while (true) { break ^ } |
| b0: while (true) {} |
| } |
| '''); |
| // The scope of the label defined by a labeled statement is just the |
| // statement itself, so neither "f0" nor "b0" are in scope at the caret |
| // position. |
| assertResponse(r''' |
| suggestions |
| '''); |
| } |
| |
| Future<void> test_break_ignoresLabelsOutsideClosure() async { |
| await computeSuggestions(''' |
| void g() { |
| f0: while (true) { |
| var f = () { |
| b0: while (true) { break ^ } |
| }; |
| } |
| } |
| '''); |
| // The purpose of this test is to ensure that `f0` is not suggested. |
| assertResponse(r''' |
| suggestions |
| b0 |
| kind: label |
| '''); |
| } |
| |
| Future<void> test_break_ignoresLabelsOutsideLocalFunction() async { |
| await computeSuggestions(''' |
| void g() { |
| f0: while (true) { |
| void f() { |
| b0: while (true) { break ^ } |
| }; |
| } |
| } |
| '''); |
| // The purpose of this test is to ensure that `f0` is not suggested. |
| assertResponse(r''' |
| suggestions |
| b0 |
| kind: label |
| '''); |
| } |
| |
| Future<void> test_break_ignoresToplevelVariables() async { |
| await computeSuggestions(''' |
| int x0; |
| void f() { |
| while (true) { |
| break ^ |
| } |
| } |
| '''); |
| // The purpose of this test is to ensure that `x0` is not suggested. |
| assertResponse(r''' |
| suggestions |
| '''); |
| } |
| |
| Future<void> test_break_inNestedLoop() async { |
| await computeSuggestions(''' |
| void f() { |
| f0: while (true) { |
| b0: while (true) { |
| break ^ |
| } |
| } |
| } |
| '''); |
| assertResponse(r''' |
| suggestions |
| b0 |
| kind: label |
| f0 |
| kind: label |
| '''); |
| } |
| |
| Future<void> test_continue_fromCaseLabels_after() async { |
| await computeSuggestions(''' |
| void f() { |
| switch (x) { |
| case 1: |
| break; |
| case 2: |
| continue ^; |
| f0: case 3: |
| break; |
| '''); |
| assertResponse(r''' |
| suggestions |
| f0 |
| kind: label |
| '''); |
| } |
| |
| Future<void> test_continue_fromCaseLabels_all() async { |
| await computeSuggestions(''' |
| void f() { |
| switch (x) { |
| f0: case 1: |
| break; |
| b0: case 2: |
| while (true) { |
| continue ^; |
| } |
| break; |
| b1: case 3: |
| break; |
| } |
| } |
| '''); |
| assertResponse(r''' |
| suggestions |
| b0 |
| kind: label |
| b1 |
| kind: label |
| f0 |
| kind: label |
| '''); |
| } |
| |
| Future<void> test_continue_fromCaseLabels_before() async { |
| await computeSuggestions(''' |
| void f() { |
| switch (x) { |
| f0: case 1: |
| break; |
| case 2: |
| continue ^; |
| case 3: |
| break; |
| '''); |
| assertResponse(r''' |
| suggestions |
| f0 |
| kind: label |
| '''); |
| } |
| |
| Future<void> test_continue_fromCaseLabels_same() async { |
| await computeSuggestions(''' |
| void f() { |
| switch (x) { |
| case 1: |
| break; |
| f0: case 2: |
| continue ^; |
| case 3: |
| break; |
| '''); |
| assertResponse(r''' |
| suggestions |
| f0 |
| kind: label |
| '''); |
| } |
| |
| Future<void> test_continue_fromEnclosingSwitch() async { |
| await computeSuggestions(''' |
| void f() { |
| switch (x) { |
| f0: case 1: |
| break; |
| b0: case 2: |
| switch (y) { |
| case 1: |
| continue ^; |
| } |
| break; |
| b1: case 3: |
| break; |
| } |
| } |
| '''); |
| assertResponse(r''' |
| suggestions |
| b0 |
| kind: label |
| b1 |
| kind: label |
| f0 |
| kind: label |
| '''); |
| } |
| |
| Future<void> test_continue_fromOuterLoop() async { |
| await computeSuggestions(''' |
| void f() { |
| f0: while (true) { |
| switch (x) { |
| case 1: |
| continue ^; |
| } |
| } |
| } |
| '''); |
| assertResponse(r''' |
| suggestions |
| f0 |
| kind: label |
| '''); |
| } |
| |
| Future<void> test_continue_fromOuterLoop2() async { |
| await computeSuggestions(''' |
| void f() { |
| f0: while (true) { |
| b0: while (true) { |
| continue ^ |
| } |
| } |
| } |
| '''); |
| assertResponse(r''' |
| suggestions |
| b0 |
| kind: label |
| f0 |
| kind: label |
| '''); |
| } |
| |
| Future<void> test_continue_ignoresLabelsOnUnrelatedStatements() async { |
| await computeSuggestions(''' |
| void f() { |
| f0: while (true) {} |
| while (true) { continue ^ } |
| b0: while (true) {} |
| } |
| '''); |
| // The scope of the label defined by a labeled statement is just the |
| // statement itself, so neither "f0" nor "b0" are in scope at the caret |
| // position. |
| assertResponse(r''' |
| suggestions |
| '''); |
| } |
| |
| Future<void> test_continue_ignoresLabelsOutsideClosure() async { |
| await computeSuggestions(''' |
| void f() { |
| f0: while (true) { |
| var f = () { |
| b0: while (true) { continue ^ } |
| }; |
| } |
| } |
| '''); |
| // The purpose of this test is to ensure that `f0` is not suggested. |
| assertResponse(r''' |
| suggestions |
| b0 |
| kind: label |
| '''); |
| } |
| |
| Future<void> test_continue_ignoresLabelsOutsideClosure2() async { |
| await computeSuggestions(''' |
| void g() { |
| switch (x) { |
| f0: case 1: |
| var f = () { |
| b0: while (true) { continue ^ } |
| }; |
| } |
| } |
| '''); |
| // The purpose of this test is to ensure that `f0` is not suggested. |
| assertResponse(r''' |
| suggestions |
| b0 |
| kind: label |
| '''); |
| } |
| |
| Future<void> test_continue_ignoresLabelsOutsideLocalFunction() async { |
| await computeSuggestions(''' |
| void g() { |
| f0: while (true) { |
| void f() { |
| b0: while (true) { continue ^ } |
| }; |
| } |
| } |
| '''); |
| // The purpose of this test is to ensure that `f0` is not suggested. |
| assertResponse(r''' |
| suggestions |
| b0 |
| kind: label |
| '''); |
| } |
| |
| Future<void> test_continue_ignoresLabelsOutsideLocalFunction2() async { |
| await computeSuggestions(''' |
| void g() { |
| switch (x) { |
| f0: case 1: |
| void f() { |
| b0: while (true) { continue ^ } |
| }; |
| } |
| } |
| '''); |
| // The purpose of this test is to ensure that `f0` is not suggested. |
| assertResponse(r''' |
| suggestions |
| b0 |
| kind: label |
| '''); |
| } |
| } |