| // 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. |
| |
| library sort_helper; |
| |
| import "package:expect/expect.dart"; |
| |
| typedef Sorter = void Function(List<num>); |
| typedef Comparer = int Function(num, num); |
| |
| class SortHelper { |
| SortHelper(this.sortFunction, this.compareFunction) {} |
| |
| void run() { |
| testSortIntLists(); |
| testSortDoubleLists(); |
| } |
| |
| bool isSorted(List<num> a) { |
| for (int i = 1; i < a.length; i++) { |
| if (compareFunction(a[i - 1], a[i]) > 0) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| void testSortIntLists() { |
| var a = new List<int>.filled(40, -1); |
| |
| for (int i = 0; i < a.length; i++) { |
| a[i] = i; |
| } |
| testSort(a); |
| |
| for (int i = 0; i < a.length; i++) { |
| a[a.length - i - 1] = i; |
| } |
| testSort(a); |
| |
| for (int i = 0; i < 21; i++) { |
| a[i] = 1; |
| } |
| for (int i = 21; i < a.length; i++) { |
| a[i] = 2; |
| } |
| testSort(a); |
| |
| // Same with bad pivot-choices. |
| for (int i = 0; i < 21; i++) { |
| a[i] = 1; |
| } |
| for (int i = 21; i < a.length; i++) { |
| a[i] = 2; |
| } |
| a[6] = 1; |
| a[13] = 1; |
| a[19] = 1; |
| a[25] = 1; |
| a[33] = 2; |
| testSort(a); |
| |
| for (int i = 0; i < 21; i++) { |
| a[i] = 2; |
| } |
| for (int i = 21; i < a.length; i++) { |
| a[i] = 1; |
| } |
| testSort(a); |
| |
| // Same with bad pivot-choices. |
| for (int i = 0; i < 21; i++) { |
| a[i] = 2; |
| } |
| for (int i = 21; i < a.length; i++) { |
| a[i] = 1; |
| } |
| a[6] = 2; |
| a[13] = 2; |
| a[19] = 2; |
| a[25] = 2; |
| a[33] = 1; |
| testSort(a); |
| |
| var a2 = new List<int>.empty(); |
| testSort(a2); |
| |
| var a3 = new List<int>.filled(1, 1); |
| testSort(a3); |
| |
| // -------- |
| // Test insertion sort. |
| testInsertionSort(0, 1, 2, 3); |
| testInsertionSort(0, 1, 3, 2); |
| testInsertionSort(0, 3, 2, 1); |
| testInsertionSort(0, 3, 1, 2); |
| testInsertionSort(0, 2, 1, 3); |
| testInsertionSort(0, 2, 3, 1); |
| testInsertionSort(1, 0, 2, 3); |
| testInsertionSort(1, 0, 3, 2); |
| testInsertionSort(1, 2, 3, 0); |
| testInsertionSort(1, 2, 0, 3); |
| testInsertionSort(1, 3, 2, 0); |
| testInsertionSort(1, 3, 0, 2); |
| testInsertionSort(2, 0, 1, 3); |
| testInsertionSort(2, 0, 3, 1); |
| testInsertionSort(2, 1, 3, 0); |
| testInsertionSort(2, 1, 0, 3); |
| testInsertionSort(2, 3, 1, 0); |
| testInsertionSort(2, 3, 0, 1); |
| testInsertionSort(3, 0, 1, 2); |
| testInsertionSort(3, 0, 2, 1); |
| testInsertionSort(3, 1, 2, 0); |
| testInsertionSort(3, 1, 0, 2); |
| testInsertionSort(3, 2, 1, 0); |
| testInsertionSort(3, 2, 0, 1); |
| } |
| |
| void testSort(List<num> a) { |
| sortFunction(a); |
| Expect.isTrue(isSorted(a)); |
| } |
| |
| void testInsertionSort(int i1, int i2, int i3, int i4) { |
| var a = new List<int>.filled(4, -1); |
| a[0] = i1; |
| a[1] = i2; |
| a[2] = i3; |
| a[3] = i4; |
| testSort(a); |
| } |
| |
| void testSortDoubleLists() { |
| var a = new List<double>.filled(40, -1); |
| for (int i = 0; i < a.length; i++) { |
| a[i] = 1.0 * i + 0.5; |
| } |
| testSort(a); |
| |
| for (int i = 0; i < a.length; i++) { |
| a[i] = 1.0 * (a.length - i) + 0.5; |
| } |
| testSort(a); |
| |
| for (int i = 0; i < a.length; i++) { |
| a[i] = 1.5; |
| } |
| testSort(a); |
| } |
| |
| Sorter sortFunction; |
| Comparer compareFunction; |
| } |