// 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 for closures.

// @dart = 2.9

import "package:expect/expect.dart";

class ClosureBreak {
  ClosureBreak(this.field);
  int field;
}

class ClosureBreakTest {
  static testMain() {
    var o1 = new ClosureBreak(3);
    String newstr = "abcdefgh";
    foo() {
      o1.field++;
      Expect.equals(8, newstr.length);
    }

    bool loop = true;
    L1:
    while (loop) {
      String newstr1 = "abcd";
      var o2 = new ClosureBreak(3);
      foo1() {
        o2.field++;
        Expect.equals(4, newstr1.length);
      }

      Expect.equals(4, newstr1.length);
      L2:
      while (loop) {
        int newint = 0;
        var o3 = new ClosureBreak(3);
        foo2() {
          o3.field++;
          Expect.equals(0, newint);
        }

        foo2();
        break L2;
      }
      foo1();
      Expect.equals(4, newstr1.length);
      break L1;
    }
    foo();
    Expect.equals(4, o1.field);
  }
}

main() {
  ClosureBreakTest.testMain();
}
