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

import "package:expect/expect.dart";

class LocalFunctionTest {
  LocalFunctionTest() : field1 = 100, field2_ = 200 {}
  static int f(int n) {
    int a = 0;
    g(int m) {
      a = 3 * n + m + 1; // Capture parameter n and local a.
      return a;
    }

    var b = g(n);
    return a + b;
  }

  static int h(int n) {
    k(int n) {
      var a = new List<dynamic>.filled(n, null);
      var b = new List<dynamic>.filled(n, null);
      int i;
      for (i = 0; i < n; i++) {
        var j = i;
        a[i] = () => i; // Captured i is always n.
        b[i] = () => j; // Captured j varies from 0 to n-1.
      }
      var a_sum = 0;
      var b_sum = 0;
      for (int i = 0; i < n; i++) {
        a_sum += a[i]() as int;
        b_sum += b[i]() as int;
      }
      return a_sum + b_sum;
    }

    return k(n);
  }

  static int h2(int n) {
    k(int n) {
      var a = new List<dynamic>.filled(n, null);
      var b = new List<dynamic>.filled(n, null);
      for (int i = 0; i < n; i++) {
        var j = i;
        a[i] = () => i; // Captured i varies from 0 to n-1.
        b[i] = () => j; // Captured j varies from 0 to n-1.
      }
      var a_sum = 0;
      var b_sum = 0;
      for (int i = 0; i < n; i++) {
        a_sum += a[i]() as int;
        b_sum += b[i]() as int;
      }
      return a_sum + b_sum;
    }

    return k(n);
  }

  int field1;
  int field2_;
  int get field2 {
    return field2_;
  }

  void set field2(int value) {
    field2_ = value;
  }

  int method(int n) {
    incField1() {
      field1++;
    }

    incField2() {
      field2++;
    }

    for (int i = 0; i < n; i++) {
      incField1();
      incField2();
    }
    return field1 + field2;
  }

  int execute(int times, apply(int x)) {
    for (int i = 0; i < times; i++) {
      apply(i);
    }
    return field1;
  }

  int testExecute(int n) {
    execute(n, (int x) {
      field1 += x;
    });
    return field1;
  }

  static int foo(int n) {
    return -100; // Wrong foo.
  }

  static testSelfReference1(int n) {
    int foo(int n) {
      if (n == 0) {
        return 0;
      } else {
        return 1 + foo(n - 1); // Local foo, not static foo.
      }
    }

    ;
    return foo(n); // Local foo, not static foo.
  }

  static void hep(Function f) {
    f();
  }

  static testNesting(int n) {
    var a = new List<dynamic>.filled(n * n, null);
    f0() {
      for (int i = 0; i < n; i++) {
        int vi = i;
        f1() {
          for (int j = 0; j < n; j++) {
            int vj = j;
            a[i * n + j] = () => vi * n + vj;
          }
        }

        f1();
      }
    }

    f0();
    int result = 0;
    for (int k = 0; k < n * n; k++) {
      Expect.equals(k, a[k]());
      result += a[k]() as int;
    }
    return result;
  }

  static var field5;
  static var set_field5_func;
  static testClosureCallStatement(int x) {
    LocalFunctionTest.set_field5_func = (int n) {
      field5 = n * n;
    };
    (LocalFunctionTest.set_field5_func)(x);
    Expect.equals(x * x, LocalFunctionTest.field5);
    return true;
  }

  static testExceptions() {
    dynamic f = (int n) => n + 1;
    Expect.equals(2, f(1));
    Expect.equals(true, f is Function);
    Expect.equals(true, f is Object);
    Expect.equals(true, f.toString().startsWith("Closure"));
    bool exception_caught = false;
    try {
      f(1, 2);
    } on NoSuchMethodError catch (e) {
      exception_caught = true;
    }
    Expect.equals(true, exception_caught);
    exception_caught = false;
    try {
      f();
    } on NoSuchMethodError catch (e) {
      exception_caught = true;
    }
    Expect.equals(true, exception_caught);
    exception_caught = false;
    try {
      f.xyz(0);
    } on NoSuchMethodError catch (e) {
      exception_caught = true;
    }
    Expect.equals(true, exception_caught);

    // Overwrite closure value.
    f = 3;
    exception_caught = false;
    try {
      f(1);
    } on NoSuchMethodError catch (e) {
      exception_caught = true;
    }
    Expect.equals(true, exception_caught);

    // Do not expect any exceptions to be thrown.
    var g = ([int n = 1]) => n + 1;
    Expect.equals(2, g());
    Expect.equals(3, g(2));
  }

  static int doThis(int n, int f(int n)) {
    return f(n);
  }

  static testMain() {
    Expect.equals(2 * (3 * 2 + 2 + 1), f(2));
    Expect.equals(10 * 10 + 10 * 9 / 2, h(10));
    Expect.equals(90, h2(10));
    Expect.equals(320, new LocalFunctionTest().method(10));
    Expect.equals(145, new LocalFunctionTest().testExecute(10));
    Expect.equals(5, testSelfReference1(5));
    Expect.equals(24 * 25 / 2, testNesting(5));
    Expect.equals(true, testClosureCallStatement(7));
    Expect.equals(99, doThis(10, (n) => n * n - 1));
    testExceptions();
  }
}

main() {
  LocalFunctionTest.testMain();
}
