|
| 1 | +import test from 'ava'; |
| 2 | + |
| 3 | +import {_calloc} from '@array-like/alloc'; |
| 4 | +import {randint} from '@randomized/random'; |
| 5 | + |
| 6 | +import {swapRanges} from '../../src/index.js'; |
| 7 | + |
| 8 | +import {arrayTypes} from './_fixtures.js'; |
| 9 | + |
| 10 | +const macro = (t, Constructor) => { |
| 11 | + const calloc = _calloc(Constructor); |
| 12 | + |
| 13 | + const n = 100; |
| 14 | + const ai = 23; |
| 15 | + const aj = 73; |
| 16 | + const bi = 49; |
| 17 | + |
| 18 | + const a = calloc(n); |
| 19 | + const b = calloc(n); |
| 20 | + const c = calloc(n); |
| 21 | + const d = calloc(n); |
| 22 | + |
| 23 | + for (let i = 0; i < n; ++i) { |
| 24 | + a[i] = randint(1, 2 ** 31); |
| 25 | + b[i] = randint(1, 2 ** 31); |
| 26 | + c[i] = a[i]; |
| 27 | + d[i] = b[i]; |
| 28 | + } |
| 29 | + |
| 30 | + swapRanges(a, ai, aj, b, bi); |
| 31 | + |
| 32 | + for (let i = 0; i < n; ++i) { |
| 33 | + if (i < ai || i >= aj) { |
| 34 | + t.deepEqual(a[i], c[i], `a[${i}] === c[${i}]`); |
| 35 | + } else { |
| 36 | + const j = i - ai + bi; |
| 37 | + t.deepEqual(a[i], d[j], `a[${i}] === d[${j}]`); |
| 38 | + } |
| 39 | + |
| 40 | + if (i < bi || i >= bi + aj - ai) { |
| 41 | + t.deepEqual(b[i], d[i], `b[${i}] === d[${i}]`); |
| 42 | + } else { |
| 43 | + const j = i - bi + ai; |
| 44 | + t.deepEqual(b[i], c[j], `b[${i}] === c[${j}]`); |
| 45 | + } |
| 46 | + } |
| 47 | + |
| 48 | + swapRanges(a, ai, aj, b, bi); |
| 49 | + |
| 50 | + t.deepEqual(a, c, 'swapranges back check a'); |
| 51 | + t.deepEqual(b, d, 'swapranges back check b'); |
| 52 | + |
| 53 | + swapRanges(a, ai, aj, a, ai); |
| 54 | + |
| 55 | + t.deepEqual(a, c, 'swapranges self check a'); |
| 56 | +}; |
| 57 | + |
| 58 | +macro.title = (title, Constructor) => title ?? Constructor.name; |
| 59 | + |
| 60 | +for (const arrayType of arrayTypes) test(macro, arrayType); |
0 commit comments