// Copyright (c) 2012, 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.
//
// We are using --complete-timeline below to ensure that we get timeline events
// generated during all phases of compilation and deoptimization.
// VMOptions=--optimization_counter_threshold=10 --no-use-osr --complete-timeline --no-background_compilation

import "package:expect/expect.dart";

test1(a, start, step, N) {
  var e;
  for (var i = 0; i < N; i++) {
    e = a[start + i * step];
  }
  return e;
}

test2(a, b) {
  var e;
  for (var i = 0, j = 0, k = 0; i < a.length; i++, j++, k++) {
    e = b[k] = a[j];
  }
  return e;
}

test3(a, b) {
  var e;
  for (var i = 0, j = 1, k = 0; i < a.length - 1; i++, j++, k++) {
    e = b[k] = a[j - 1];
  }
  return e;
}

test4(a, b) {
  var e;
  if (a.length < 2) {
    return null;
  }

  for (var i = 0, j = 1, k = 0; i < a.length - 1; i++, j++, k++) {
    e = b[k] = a[j - 1];
  }
  return e;
}

test5(a, b, k0) {
  var e;
  if (a.length < 2) {
    return null;
  }

  if (k0 > 1) {
    return null;
  }

  for (var i = 0, j = 1, k = 0; i < a.length - 1; i++, j++, k++) {
    e = b[k - k0] = a[j - 1];
  }
  return e;
}

test6(a, M, N) {
  var e = 0;
  for (var i = 0; i < N; i++) {
    for (var j = 0; j < M; j++) {
      e += a[i * M + j];
    }
  }
  return e;
}

main() {
  var a = const [0, 1, 2, 3, 4, 5, 6, 7];
  var b = new List(a.length);
  for (var i = 0; i < 10000; i++) {
    Expect.equals(a.last, test1(a, 0, 1, a.length));
    Expect.equals(a.last, test2(a, b));
    Expect.equals(a[a.length - 2], test3(a, b));
    Expect.equals(a[a.length - 2], test4(a, b));
    Expect.equals(a[a.length - 2], test5(a, b, 0));
    Expect.equals(6, test6(a, 2, 2));
  }

  test1(a, 0, 2, a.length ~/ 2);
  Expect.throws(() => test1(a, 1, 1, a.length));
  Expect.throws(() => test2(a, new List(a.length - 1)));
  Expect.throws(() => test6(a, 4, 3));
}
