| // Copyright (c) 2014, 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. |
| |
| // @dart = 2.9 |
| |
| import "package:expect/expect.dart"; |
| |
| run(callback) => callback(); |
| |
| initializer() { |
| var closure; |
| for (var i = 0, fn = () => i; i < 3; i++) { |
| i += 1; |
| closure = fn; |
| } |
| Expect.equals(1, closure()); |
| } |
| |
| condition() { |
| var closures = []; |
| check(callback) { |
| closures.add(callback); |
| return callback(); |
| } |
| |
| var values = []; |
| for (var i = 0; check(() => ++i) < 8; ++i) { |
| values.add(i); |
| } |
| Expect.listEquals([1, 3, 5, 7], values); |
| Expect.listEquals([2, 4, 6, 8, 10], closures.map(run).toList()); |
| } |
| |
| body() { |
| var closures = []; |
| for (var i = 0, j = 0; i < 3; i++) { |
| j++; |
| closures.add(() => i); |
| closures.add(() => j); |
| } |
| Expect.listEquals([0, 1, 1, 2, 2, 3], closures.map(run).toList()); |
| } |
| |
| update() { |
| var closures = []; |
| check(callback) { |
| closures.add(callback); |
| return callback(); |
| } |
| |
| var values = []; |
| for (var i = 0; i < 4; check(() => ++i)) { |
| values.add(i); |
| } |
| Expect.listEquals([0, 1, 2, 3], values); |
| Expect.listEquals([2, 3, 4, 5], closures.map(run).toList()); |
| } |
| |
| initializer_condition() { |
| var values = []; |
| for (var i = 0, fn = () => i; run(() => ++i) < 3;) { |
| values.add(i); |
| values.add(fn()); |
| } |
| Expect.listEquals([1, 1, 2, 1], values); |
| } |
| |
| initializer_update() { |
| var update_closures = []; |
| update(callback) { |
| update_closures.add(callback); |
| return callback(); |
| } |
| |
| var init_closure; |
| for (var i = 0, fn = () => i; i < 4; update(() => ++i)) { |
| init_closure = fn; |
| if (i == 0) { |
| ++i; // Mutate copy of 'i' from first iteration. |
| } |
| } |
| Expect.equals(1, init_closure()); |
| Expect.listEquals([3, 4, 5], update_closures.map(run).toList()); |
| Expect.equals(1, init_closure()); |
| } |
| |
| initializer_body() { |
| var closures = []; |
| for (var i = 0, fn = () => i; i < 3; i++) { |
| closures.add(() => i); |
| closures.add(fn); |
| fn = () => i; |
| } |
| Expect.listEquals([0, 0, 1, 0, 2, 1], closures.map(run).toList()); |
| } |
| |
| condition_update() { |
| var cond_closures = []; |
| check(callback) { |
| cond_closures.add(callback); |
| return callback(); |
| } |
| |
| var update_closures = []; |
| update(callback) { |
| update_closures.add(callback); |
| return callback(); |
| } |
| |
| var values = []; |
| for (var i = 0; check(() => i) < 4; update(() => ++i)) { |
| values.add(i); |
| } |
| Expect.listEquals([0, 1, 2, 3], values); |
| |
| Expect.listEquals([0, 1, 2, 3, 4], cond_closures.map(run).toList()); |
| Expect.listEquals([2, 3, 4, 5], update_closures.map(run).toList()); |
| Expect.listEquals([0, 2, 3, 4, 5], cond_closures.map(run).toList()); |
| } |
| |
| condition_body() { |
| var cond_closures = []; |
| check(callback) { |
| cond_closures.add(callback); |
| return callback(); |
| } |
| |
| var body_closures = []; |
| do_body(callback) { |
| body_closures.add(callback); |
| return callback(); |
| } |
| |
| for (var i = 0; check(() => i) < 4; ++i) { |
| do_body(() => i); |
| } |
| Expect.listEquals([0, 1, 2, 3, 4], cond_closures.map(run).toList()); |
| Expect.listEquals([0, 1, 2, 3], body_closures.map(run).toList()); |
| } |
| |
| initializer_condition_update() { |
| var init; |
| var cond_closures = []; |
| check(callback) { |
| cond_closures.add(callback); |
| return callback(); |
| } |
| |
| var update_closures = []; |
| update(callback) { |
| update_closures.add(callback); |
| return callback(); |
| } |
| |
| var values = []; |
| for (var i = 0, fn = () => i; check(() => ++i) < 8; update(() => ++i)) { |
| init = fn; |
| values.add(i); |
| } |
| Expect.listEquals([1, 3, 5, 7], values); |
| Expect.equals(1, init()); |
| |
| Expect.listEquals([2, 4, 6, 8, 10], cond_closures.map(run).toList()); |
| Expect.listEquals([5, 7, 9, 11], update_closures.map(run).toList()); |
| } |
| |
| initializer_condition_body() { |
| var init; |
| var cond_closures = []; |
| check(callback) { |
| cond_closures.add(callback); |
| return callback(); |
| } |
| |
| var body_closures = []; |
| do_body(callback) { |
| body_closures.add(callback); |
| return callback(); |
| } |
| |
| var values = []; |
| for (var i = 0, fn = () => i; check(() => ++i) < 8;) { |
| init = fn; |
| do_body(() => ++i); |
| values.add(i); |
| } |
| Expect.listEquals([2, 4, 6, 8], values); |
| Expect.equals(2, init()); |
| |
| Expect.listEquals([3, 5, 7, 9, 10], cond_closures.map(run).toList()); |
| Expect.listEquals([4, 6, 8, 10], body_closures.map(run).toList()); |
| } |
| |
| initializer_update_body() { |
| var init; |
| var update_closures = []; |
| update(callback) { |
| update_closures.add(callback); |
| return callback(); |
| } |
| |
| var body_closures = []; |
| do_body(callback) { |
| body_closures.add(callback); |
| return callback(); |
| } |
| |
| var values = []; |
| for (var i = 0, fn = () => i; i < 8; update(() => ++i)) { |
| init = fn; |
| do_body(() => ++i); |
| values.add(i); |
| } |
| Expect.listEquals([1, 3, 5, 7], values); |
| Expect.equals(1, init()); |
| |
| Expect.listEquals([4, 6, 8, 9], update_closures.map(run).toList()); |
| Expect.listEquals([2, 5, 7, 9], body_closures.map(run).toList()); |
| } |
| |
| condition_update_body() { |
| var cond_closures = []; |
| check(callback) { |
| cond_closures.add(callback); |
| return callback(); |
| } |
| |
| var update_closures = []; |
| update(callback) { |
| update_closures.add(callback); |
| return callback(); |
| } |
| |
| var body_closures = []; |
| do_body(callback) { |
| body_closures.add(callback); |
| return callback(); |
| } |
| |
| var values = []; |
| for (var i = 0; check(() => i) < 8; update(() => ++i)) { |
| do_body(() => ++i); |
| values.add(i); |
| } |
| Expect.listEquals([1, 3, 5, 7], values); |
| |
| Expect.listEquals([1, 3, 5, 7, 8], cond_closures.map(run).toList()); |
| Expect.listEquals([4, 6, 8, 9], update_closures.map(run).toList()); |
| Expect.listEquals([2, 5, 7, 9], body_closures.map(run).toList()); |
| Expect.listEquals([2, 5, 7, 9, 9], cond_closures.map(run).toList()); |
| } |
| |
| initializer_condition_update_body() { |
| var init; |
| var cond_closures = []; |
| check(callback) { |
| cond_closures.add(callback); |
| return callback(); |
| } |
| |
| var update_closures = []; |
| update(callback) { |
| update_closures.add(callback); |
| return callback(); |
| } |
| |
| var body_closures = []; |
| do_body(callback) { |
| body_closures.add(callback); |
| return callback(); |
| } |
| |
| var values = []; |
| for (var i = 0, fn = () => i; check(() => i) < 8; update(() => ++i)) { |
| init = fn; |
| do_body(() => ++i); |
| values.add(i); |
| } |
| Expect.listEquals([1, 3, 5, 7], values); |
| Expect.equals(1, init()); |
| |
| Expect.listEquals([1, 3, 5, 7, 8], cond_closures.map(run).toList()); |
| Expect.listEquals([4, 6, 8, 9], update_closures.map(run).toList()); |
| Expect.listEquals([2, 5, 7, 9], body_closures.map(run).toList()); |
| Expect.listEquals([2, 5, 7, 9, 9], cond_closures.map(run).toList()); |
| } |
| |
| main() { |
| initializer(); |
| condition(); |
| update(); |
| body(); |
| initializer_condition(); |
| initializer_update(); |
| initializer_body(); |
| condition_update(); |
| condition_body(); |
| initializer_condition_update(); |
| initializer_condition_body(); |
| initializer_update_body(); |
| condition_update_body(); |
| initializer_condition_update_body(); |
| } |