Linter: move control_flow_in_finally tests

Change-Id: Idf1aaea14ead44969fb8d978b74d33e77aa2dc68
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/328767
Reviewed-by: Phil Quitslund <pquitslund@google.com>
Auto-Submit: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Phil Quitslund <pquitslund@google.com>
diff --git a/pkg/linter/test/rules/all.dart b/pkg/linter/test/rules/all.dart
index adc8b30..4ec5355 100644
--- a/pkg/linter/test/rules/all.dart
+++ b/pkg/linter/test/rules/all.dart
@@ -60,6 +60,7 @@
 import 'conditional_uri_does_not_exist_test.dart'
     as conditional_uri_does_not_exist;
 import 'constant_identifier_names_test.dart' as constant_identifier_names;
+import 'control_flow_in_finally_test.dart' as control_flow_in_finally;
 import 'dangling_library_doc_comments_test.dart'
     as dangling_library_doc_comments;
 import 'depend_on_referenced_packages_test.dart'
@@ -288,6 +289,7 @@
   comment_references.main();
   conditional_uri_does_not_exist.main();
   constant_identifier_names.main();
+  control_flow_in_finally.main();
   dangling_library_doc_comments.main();
   depend_on_referenced_packages.main();
   deprecated_consistency.main();
diff --git a/pkg/linter/test/rules/control_flow_in_finally_test.dart b/pkg/linter/test/rules/control_flow_in_finally_test.dart
new file mode 100644
index 0000000..40b4c61
--- /dev/null
+++ b/pkg/linter/test/rules/control_flow_in_finally_test.dart
@@ -0,0 +1,126 @@
+// 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 '../rule_test_support.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ControlFlowInFinallyTest);
+    // TODO(srawlins): Add tests with labels.
+  });
+}
+
+@reflectiveTest
+class ControlFlowInFinallyTest extends LintRuleTest {
+  @override
+  String get lintRule => 'control_flow_in_finally';
+
+  test_break() async {
+    await assertDiagnostics(r'''
+void f() {
+  for (var o in [1, 2]) {
+    try {
+    } catch (e) {
+    } finally {
+      if (1 > 0) {
+        break;
+      }
+    }
+  }
+}
+''', [
+      lint(108, 6),
+    ]);
+  }
+
+  test_break_loopDeclaredWithinFinally() async {
+    await assertNoDiagnostics(r'''
+void f() {
+  try {
+  } catch (e) {
+  } finally {
+    for (var o in [1, 2]) {
+      if (1 > 0) {
+        break;
+      }
+    }
+  }
+}
+''');
+  }
+
+  test_continue() async {
+    await assertDiagnostics(r'''
+void f() {
+  for (var o in [1, 2]) {
+    try {
+    } catch (e) {
+    } finally {
+      continue;
+    }
+  }
+}
+''', [
+      lint(87, 9),
+    ]);
+  }
+
+  test_continue_deep() async {
+    await assertNoDiagnostics(r'''
+void f() {
+  try {
+  } catch (e) {
+  } finally {
+    for (var o in [1, 2]) {
+      if (1 > 0) {
+        continue;
+      }
+    }
+  }
+}
+''');
+  }
+
+  test_nonControlFlow() async {
+    await assertNoDiagnostics(r'''
+void f(int i) {
+  try {
+  } catch (e) {
+  } finally {
+    i = i * i;
+  }
+}
+''');
+  }
+
+  test_return() async {
+    await assertDiagnostics(r'''
+void f() {
+  try {
+  } catch (e) {
+  } finally {
+    return;
+  }
+}
+''', [
+      lint(53, 7),
+    ]);
+  }
+
+  test_returnInClosure() async {
+    await assertNoDiagnostics(r'''
+void f() {
+  try {
+  } catch (e) {
+  } finally {
+    () {
+      return 1.0;
+    };
+  }
+}
+''');
+  }
+}
diff --git a/pkg/linter/test_data/rules/control_flow_in_finally.dart b/pkg/linter/test_data/rules/control_flow_in_finally.dart
deleted file mode 100644
index 50ab8ae..0000000
--- a/pkg/linter/test_data/rules/control_flow_in_finally.dart
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright (c) 2016, 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.
-
-class Ok {
-  double compliantMethod() {
-    var i = 5.0;
-    try {
-      i = 1 / 0;
-    } catch (e) {
-      print(e);
-    } finally {
-      i = i * i; // OK
-    }
-    return i;
-  }
-}
-
-class BadReturn {
-  double nonCompliantMethod() {
-    try {
-      return 1 / 0;
-    } catch (e) {
-      print(e);
-    } finally {
-      return 1.0; // LINT
-    }
-  }
-}
-
-class GoodReturn {
-  double? compliantMethod() {
-    try {
-      return 1 / 0;
-    } catch (e) {
-      print(e);
-    } finally {
-      () {
-        return 1.0; // OK
-      };
-    }
-  }
-}
-
-class BadContinue {
-  double nonCompliantMethod() {
-    for (var o in [1, 2]) {
-      try {
-        print(o / 0);
-      } catch (e) {
-        print(e);
-      } finally {
-        continue; // LINT
-      }
-    }
-    return 1.0;
-  }
-}
-
-class GoodContinue {
-  double compliantMethod() {
-    try {
-      print(1 / 0);
-    } catch (e) {
-      print(e);
-    } finally {
-      for (var o in [1, 2]) {
-        print(o);
-        if (1 > 0) {
-          continue; // OK
-        }
-      }
-    }
-    return 1.0;
-  }
-}
-
-class BadBreak {
-  double nonCompliantMethod() {
-    for (var o in [1, 2]) {
-      try {
-        print(o / 0);
-      } catch (e) {
-        print(e);
-      } finally {
-        if (1 > 0) {
-          break; // LINT
-        } else {
-          print('should catch nested cases!');
-        }
-      }
-    }
-    return 1.0;
-  }
-}
-
-class GoodBreak {
-  double compliantMethod() {
-    try {
-      print(1 / 0);
-    } catch (e) {
-      print(e);
-    } finally {
-      for (var o in [1, 2]) {
-        print(o);
-        if (1 > 0) {
-          break; // OK
-        }
-      }
-    }
-    return 1.0;
-  }
-}