// 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);
  }
}
