| // Copyright (c) 2011, 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 test program for testing for statement which captures loop variable. | 
 |  | 
 | import "package:expect/expect.dart"; | 
 |  | 
 | var f; | 
 |  | 
 | main() { | 
 |   // Capture the loop variable, ensure we capture the right value. | 
 |   for (int i = 0; i < 10; i++) { | 
 |     if (i == 7) { | 
 |       f = () => "i = $i"; | 
 |     } | 
 |   } | 
 |   Expect.equals("i = 7", f()); | 
 |  | 
 |   // There is only one instance of k. The captured variable continues | 
 |   // to change. | 
 |   int k; | 
 |   for (k = 0; k < 10; k++) { | 
 |     if (k == 7) { | 
 |       f = () => "k = $k"; | 
 |     } | 
 |   } | 
 |   Expect.equals("k = 10", f()); | 
 |  | 
 |   // l gets modified after it's captured. n++ is executed on the | 
 |   // newly introduced instance of n (i.e. the instance of the loop | 
 |   // iteration after the value is captured). | 
 |   for (int n = 0; n < 10; n++) { | 
 |     var l = n; | 
 |     if (l == 7) { | 
 |       f = () => "l = $l, n = $n"; | 
 |     } | 
 |     l++; | 
 |   } | 
 |   Expect.equals("l = 8, n = 7", f()); | 
 |  | 
 |   // Loop variable is incremented in loop body instead of the increment. | 
 |   // expression. Thus, the captured value is incremented by one before | 
 |   // a new loop variable instance is created. | 
 |   for (int i = 0; i < 10; /*nothing*/) { | 
 |     if (i == 7) { | 
 |       f = () => "i = $i"; | 
 |     } | 
 |     i++; | 
 |   } | 
 |   Expect.equals("i = 8", f()); | 
 |  | 
 |   // Make sure continue still ensures the loop variable is captured correctly. | 
 |   for (int i = 0; i < 10; i++) { | 
 |     if (i == 7) { | 
 |       f = () => "i = $i"; | 
 |     } | 
 |     continue; | 
 |     i++; | 
 |   } | 
 |   Expect.equals("i = 7", f()); | 
 |  | 
 |   // Nested loops with captured variables. | 
 |   for (int k = 0; k < 5; k++) { | 
 |     for (int i = 0; i < 10; i++) { | 
 |       if (k == 3 && i == 7) { | 
 |         f = () => "k = $k, i = $i"; | 
 |       } | 
 |     } | 
 |   } | 
 |   Expect.equals("k = 3, i = 7", f()); | 
 | } |