blob: 4386648354254db22cd4a5aef4d99233cad13804 [file] [log] [blame]
// 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=5 --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 ? new List() : new List(length));
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(length);
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