Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(496)

Unified Diff: tests/language/switch_case_warn_test.dart

Issue 2446923003: Add test for warning-conditions around switch cases. (Closed)
Patch Set: Include test file. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tests/language/language_dart2js.status ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests/language/switch_case_warn_test.dart
diff --git a/tests/language/switch_case_warn_test.dart b/tests/language/switch_case_warn_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..89679d9372c8c0efdc90ee778694869a1e672851
--- /dev/null
+++ b/tests/language/switch_case_warn_test.dart
@@ -0,0 +1,201 @@
+// 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.
+// Test switch statement.
+
+// Tests some switch-case statements blocks that should and should not
+// cause static warnings.
+// This test is not testing runtime behavior, only static warnings.
+
+// None of the cases blocks should cause a warning.
+void testSwitch(int x) {
+ // Catch all control flow leaving the switch.
+ // Run switch in catch clause to check rethrow.
+ try {
+ throw x;
+ } catch (x) {
+ // Add loop as break/continue target.
+ LOOP: do {
+ switch (x) {
+ case 0:
+ case 1:
+ nop(x);
+ break; // Break switch.
+ case 2:
+ nop(x);
+ break LOOP;
+ case 3:
+ nop(x);
+ continue; // Continue loop.
+ case 4:
+ nop(x);
+ continue LOOP;
+ case 5:
+ nop(x);
+ continue LAST;
+ // Avoid warning for "return;"" and "return e;" in same function.
+ case 6: /// retnon: ok
+ nop(x); /// retnon: continued
+ return; /// retnon: continued
+ case 7: /// retval: ok
+ nop(x); /// retval: continued
+ return x; /// retval: continued
+ case 8:
+ nop(x);
+ throw x;
+ case 9:
+ nop(x);
+ rethrow;
+ case 10:
+ case 11: {
+ nop(x);
+ break; // Break switch.
+ }
+ case 12: {
+ nop(x);
+ break LOOP;
+ }
+ case 13: {
+ nop(x);
+ continue; // Continue loop.
+ }
+ case 14: {
+ nop(x);
+ continue LOOP;
+ }
+ case 15: {
+ nop(x);
+ continue LAST;
+ }
+ case 16: { /// retnon: continued
+ nop(x); /// retnon: continued
+ return; /// retnon: continued
+ } /// retnon: continued
+ case 17: { /// retval: continued
+ nop(x); /// retval: continued
+ return x; /// retval: continued
+ } /// retval: continued
+ case 18: {
+ nop(x);
+ throw x;
+ }
+ case 19: {
+ nop(x);
+ rethrow;
+ }
+ LAST:
+ case 20: {
+ nop(x);
+ // Fallthrough allowed on last statements.
+ }
+ }
+ } while (false);
+ } finally {
+ // Catch all control flow leaving the switch and ignore it.
+ return;
+ }
+}
+
+// All these switch cases should cause warnings.
+void testSwitchWarn(x) {
+ // Catch all control flow from the switch and ignore it.
+ try {
+ throw 0;
+ } catch (e) {
+ // Wrap in loop as target for continue/break.
+ LOOP: do {
+ switch (x) {
+ case 0: /// 01: static type warning
+ case 1: { /// 01: continued
+ { /// 01: continued
+ nop(x); /// 01: continued
+ break; // Break switch. /// 01: continued
+ } /// 01: continued
+ } /// 01: continued
+ case 2: { /// 02: static type warning
+ { /// 02: continued
+ nop(x); /// 02: continued
+ break LOOP; /// 02: continued
+ } /// 02: continued
+ } /// 02: continued
+ case 3: { /// 03: static type warning
+ { /// 03: continued
+ nop(x); /// 03: continued
+ continue; // Continue loop. /// 03: continued
+ } /// 03: continued
+ } /// 03: continued
+ case 4: { /// 04: static type warning
+ { /// 04: continued
+ nop(x); /// 04: continued
+ continue LOOP; /// 04: continued
+ } /// 04: continued
+ } /// 04: continued
+ case 5: { /// 05: static type warning
+ { /// 05: continued
+ nop(x); /// 05: continued
+ continue LAST; /// 05: continued
+ } /// 05: continued
+ } /// 05: continued
+ case 6: { /// 06: static type warning
+ { /// 06: continued
+ nop(x); /// 06: continued
+ return; /// 06: continued
+ } /// 06: continued
+ } /// 06: continued
+ case 7: { /// 07: static type warning
+ { /// 07: continued
+ nop(x); /// 07: continued
+ return x; /// 07: continued
+ } /// 07: continued
+ } /// 07: continued
+ case 8: { /// 08: static type warning
+ { /// 08: continued
+ nop(x); /// 08: continued
+ throw x; /// 08: continued
+ } /// 08: continued
+ } /// 08: continued
+ case 9: { /// 09: static type warning
+ { /// 09: continued
+ nop(x); /// 09: continued
+ rethrow; /// 09: continued
+ } /// 09: continued
+ } /// 09: continued
+ case 10: /// 10: static type warning
+ while (true) break; /// 10: continued
+ case 11: /// 11: static type warning
+ do break; while (true); /// 11: continued
+ case 12: /// 12: static type warning
+ for (;;) break; /// 12: continued
+ case 13: /// 13: static type warning
+ for (var _ in []) break; /// 13: continued
+ case 14: /// 14: static type warning
+ if (x) break; else break; /// 14: continued
+ case 15: /// 15: static type warning
+ (throw 0); /// 15: continued
+ case 16: /// 16: static type warning
+ nop(x); // fallthrough. /// 16: continued
+ case 17: /// 17: static type warning
+ L: break; /// 17: continued
+ LAST:
+ case 99:
+ // Last case can't cause static warning.
+ }
+ } while (false);
+ } finally {
+ // Catch all control flow leaving the switch and ignore it.
+ return;
+ }
+}
+
+main() {
+ // Ensure that all the cases compile and run (even if they might throw).
+ for (int i = 0; i <= 20; i++) {
+ testSwitch(i); // Just make sure it runs.
+ }
+ for (int i = 0; i <= 18; i++) {
+ testSwitchWarn(i);
+ }
+}
+
+/// Don't make it obvious that a switch case isn't doing anything.
+void nop(x) {}
« no previous file with comments | « tests/language/language_dart2js.status ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698