sort.spec.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /**
  2. * Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import * as Sort from '../util/sort'
  7. function shuffle<T>(data: T, len: number, clone: (s: T) => T, swap: Sort.Swapper = Sort.arraySwap) {
  8. const a = clone(data);
  9. for (let i = len - 1; i > 0; i--) {
  10. const j = Math.floor(Math.random() * (i + 1));
  11. swap(a, i, j);
  12. }
  13. return a;
  14. }
  15. function shuffleArray(data: any[]) {
  16. return shuffle(data, data.length, t => [...t]);
  17. }
  18. describe('qsort-array asc', () => {
  19. const data0 = new Array(50);
  20. for (let i = 0; i < data0.length; i++) data0[i] = i;
  21. const data1 = [1, 1, 2, 2, 3, 3, 4, 4, 4, 6, 6, 6];
  22. function test(name: string, data: any[], randomize: boolean) {
  23. it(name, () => {
  24. // [ 3, 1, 6, 4, 4, 6, 4, 2, 6, 1, 2, 3 ];
  25. if (randomize) {
  26. for (let i = 0; i < 10; i++) {
  27. expect(Sort.sortArray(shuffleArray(data))).toEqual(data);
  28. }
  29. } else {
  30. expect(Sort.sortArray([...data])).toEqual(data);
  31. }
  32. });
  33. }
  34. test('uniq', data0, false);
  35. test('uniq shuffle', data0, true);
  36. test('rep', data1, false);
  37. test('rep shuffle', data1, true);
  38. })
  39. describe('qsort-array generic', () => {
  40. const data0 = new Array(50);
  41. for (let i = 0; i < data0.length; i++) data0[i] = i;
  42. const data1 = [1, 1, 2, 2, 3, 3, 4, 4, 4, 6, 6, 6];
  43. function test(name: string, data: any[], randomize: boolean) {
  44. it(name, () => {
  45. // [ 3, 1, 6, 4, 4, 6, 4, 2, 6, 1, 2, 3 ];
  46. if (randomize) {
  47. for (let i = 0; i < 10; i++) {
  48. expect(Sort.sort(shuffleArray(data), 0, data.length, Sort.arrayLess, Sort.arraySwap)).toEqual(data);
  49. }
  50. } else {
  51. expect(Sort.sort([...data], 0, data.length, Sort.arrayLess, Sort.arraySwap)).toEqual(data);
  52. }
  53. });
  54. }
  55. test('uniq', data0, false);
  56. test('uniq shuffle', data0, true);
  57. test('rep', data1, false);
  58. test('rep shuffle', data1, true);
  59. })
  60. describe('qsort-dual array', () => {
  61. const len = 3;
  62. const data = { xs: [0, 1, 2], ys: ['x', 'y', 'z'] };
  63. const cmp: Sort.Comparer<typeof data> = (data, i, j) => data.xs[i] - data.xs[j];
  64. const swap: Sort.Swapper<typeof data> = (data, i, j) => { Sort.arraySwap(data.xs, i, j); Sort.arraySwap(data.ys, i, j); }
  65. const clone = (d: typeof data) => ({ xs: [...d.xs], ys: [...d.ys] })
  66. function test(name: string, src: typeof data, randomize: boolean) {
  67. it(name, () => {
  68. // [ 3, 1, 6, 4, 4, 6, 4, 2, 6, 1, 2, 3 ];
  69. if (randomize) {
  70. for (let i = 0; i < 10; i++) {
  71. expect(Sort.sort(shuffle(src, len, clone, swap), 0, len, cmp, swap)).toEqual(data);
  72. }
  73. } else {
  74. expect(Sort.sort(clone(src), 0, len, cmp, swap)).toEqual(data);
  75. }
  76. });
  77. }
  78. test('sorted', data, false);
  79. test('shuffled', data, true);
  80. })