// Copyright (c) 2014, 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.
// VMOptions=--optimization-counter-threshold=20 --no-background-compilation
// Test correct OSR (issue 16151).

import "dart:collection";
import "package:expect/expect.dart";

List create([int? length]) {
  return new MyList(length);
}

main() {
  test(create);
}

class MyList<E> extends ListBase<E> {
  List<E?> _list;

  MyList([int? length])
    : _list = (length == null ? <E?>[] : new List<E?>.filled(length, null));

  E operator [](int index) => _list[index]!;

  void operator []=(int index, E value) {
    _list[index] = value;
  }

  int get length => _list.length;

  void set length(int newLength) {
    _list.length = newLength;
  }
}

test(List create([int length])) {
  sort_A01_t02_test(create);
}

//  From library co19 sort_A01_t02.

sort_A01_t02_test(List create([int length])) {
  int c(var a, var b) {
    return a < b ? -1 : (a == b ? 0 : 1);
  }

  int maxlen = 7;
  int prevLength = 0;
  for (int length = 1; length < maxlen; ++length) {
    // Check that we are making progress.
    if (prevLength == length) {
      // Cannot use Expect.notEquals since it hides the bug.
      throw "No progress made";
    }
    prevLength = length;
    List a = create(length);
    List expected = create(length);
    for (int i = 0; i < length; ++i) {
      expected[i] = i;
      a[i] = i;
    }

    void swap(int i, int j) {
      var t = a[i];
      a[i] = a[j];
      a[j] = t;
    }

    void check() {
      return;
      // Deleting the code below will throw a RangeError instead of throw above.
      var a_copy = new List<dynamic>.filled(length, null);
      a_copy.setRange(0, length, a);
      a_copy.sort(c);
    }

    void permute(int n) {
      if (n == 1) {
        check();
      } else {
        for (int i = 0; i < n; i++) {
          permute(n - 1);
          if (n % 2 == 1) {
            swap(0, n - 1);
          } else {
            swap(i, n - 1);
          }
        }
      }
    } //void permute

    permute(length);
  } //for i in 0..length
} // test
