| // Copyright (c) 2019, 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. |
| |
| /// Tests for how variables and scoping work with for elements. |
| import 'package:expect/expect.dart'; |
| |
| import 'utils.dart'; |
| |
| String global = "global"; |
| |
| void main() { |
| testClosure(); |
| Test().shadowing(); |
| Test().reuseVariable(); |
| } |
| |
| void testClosure() { |
| var closures = []; |
| capture(callback) { |
| closures.add(callback); |
| return callback(); |
| } |
| |
| reset() { |
| closures.clear(); |
| } |
| |
| // Close over for-in loop variable in element. |
| var list = [for (var i in [0, 1]) () => i]; |
| Expect.equals(0, list[0]()); |
| Expect.equals(1, list[1]()); |
| |
| // Close over loop variable in element. |
| list = [for (var i = 0; i < 2; i++) () => i]; |
| Expect.equals(0, list[0]()); |
| Expect.equals(1, list[1]()); |
| |
| // Close over variable in condition expression. |
| var list2 = [for (var i = 0; capture(() => i++) < 2;) i]; |
| Expect.equals(1, closures[0]()); |
| Expect.equals(2, closures[1]()); |
| Expect.listEquals([1, 2], list2); |
| reset(); |
| |
| // Close over variable in increment expression. |
| var list3 = [for (var i = 0; i < 2; capture(() => i++)) i]; |
| Expect.equals(1, closures[0]()); |
| Expect.equals(2, closures[1]()); |
| Expect.listEquals([0, 1], list3); |
| reset(); |
| } |
| |
| class TestBase { |
| String inherited = "inherited"; |
| } |
| |
| class Test extends TestBase { |
| static String staticField = "static field"; |
| |
| String field = "field"; |
| |
| void shadowing() { |
| var local = "local"; |
| |
| // C-style for. |
| var list = [ |
| for (String? global = "for"; global != null; global = null) global |
| ]; |
| Expect.listEquals(["for"], list); |
| |
| list = [ |
| for (String? staticField = "for"; staticField != null; staticField = null) |
| staticField |
| ]; |
| Expect.listEquals(["for"], list); |
| |
| list = [ |
| for (String? field = "for"; field != null; field = null) field |
| ]; |
| Expect.listEquals(["for"], list); |
| |
| list = [ |
| for (String? inherited = "for"; inherited != null; inherited = null) inherited |
| ]; |
| Expect.listEquals(["for"], list); |
| |
| list = [ |
| for (String? local = "for"; local != null; local = null) local |
| ]; |
| Expect.listEquals(["for"], list); |
| |
| list = [ |
| for (String? outer = "outer"; outer != null; outer = null) |
| for (String? outer = "for"; outer != null; outer = null) |
| outer |
| ]; |
| Expect.listEquals(["for"], list); |
| |
| // For-in. |
| list = [for (var global in ["for"]) global]; |
| Expect.listEquals(["for"], list); |
| |
| list = [for (var staticField in ["for"]) staticField]; |
| Expect.listEquals(["for"], list); |
| |
| list = [for (var field in ["for"]) field]; |
| Expect.listEquals(["for"], list); |
| |
| list = [for (var inherited in ["for"]) inherited]; |
| Expect.listEquals(["for"], list); |
| |
| list = [for (var local in ["for"]) local]; |
| Expect.listEquals(["for"], list); |
| |
| list = [for (var outer in ["outer"]) for (var outer in ["for"]) outer]; |
| Expect.listEquals(["for"], list); |
| } |
| |
| void reuseVariable() { |
| var local = "local"; |
| |
| // C-style for. |
| var list = [ |
| for (global = "for"; global == "for"; global = "after") global |
| ]; |
| Expect.listEquals(["for"], list); |
| Expect.equals("after", global); |
| global = "global"; |
| |
| list = [ |
| for (staticField = "for"; staticField == "for"; staticField = "after") |
| staticField |
| ]; |
| Expect.listEquals(["for"], list); |
| Expect.equals("after", staticField); |
| staticField = "staticField"; |
| |
| list = [ |
| for (field = "for"; field == "for"; field = "after") field |
| ]; |
| Expect.listEquals(["for"], list); |
| Expect.equals("after", field); |
| field = "field"; |
| |
| list = [ |
| for (inherited = "for"; inherited == "for"; inherited = "after") inherited |
| ]; |
| Expect.listEquals(["for"], list); |
| Expect.equals("after", inherited); |
| inherited = "inherited"; |
| |
| list = [ |
| for (local = "for"; local == "for"; local = "after") local |
| ]; |
| Expect.listEquals(["for"], list); |
| Expect.equals("after", local); |
| local = "local"; |
| |
| list = [ |
| for (var outer = "outer"; outer == "outer"; outer = "outer after") ...[ |
| for (outer = "for"; outer == "for"; outer = "after") outer, |
| outer |
| ] |
| ]; |
| Expect.listEquals(["for", "after"], list); |
| |
| // For-in. |
| list = [for (global in ["for"]) global]; |
| Expect.listEquals(["for"], list); |
| Expect.equals("for", global); |
| global = "global"; |
| |
| list = [for (staticField in ["for"]) staticField]; |
| Expect.listEquals(["for"], list); |
| Expect.equals("for", staticField); |
| staticField = "staticField"; |
| |
| list = [for (field in ["for"]) field]; |
| Expect.listEquals(["for"], list); |
| Expect.equals("for", field); |
| field = "field"; |
| |
| list = [for (inherited in ["for"]) inherited]; |
| Expect.listEquals(["for"], list); |
| Expect.equals("for", inherited); |
| inherited = "inherited"; |
| |
| list = [for (local in ["for"]) local]; |
| Expect.listEquals(["for"], list); |
| Expect.equals("for", local); |
| local = "local"; |
| |
| list = [ |
| for (var outer in ["outer"]) ...[ |
| for (outer in ["for"]) outer, |
| outer |
| ] |
| ]; |
| Expect.listEquals(["for", "for"], list); |
| } |
| } |