All files / diff/src/__tests__ line.ts

100% Statements 55/55
90.9% Branches 10/11
100% Functions 5/5
100% Lines 53/53

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 706x   6x 2747x 2747x     9205x     9475x     1035x     2747x     6x 2746x 2746x 2746x 2746x 2676x 2676x 2676x 40105x 9203x 9203x 9203x 9203x 30902x 9475x 9475x 9475x 9475x 9475x 9475x 9475x 21427x 20392x 20392x 20392x 20392x 20392x 20392x 20392x 20392x 20392x 20392x 1035x 1035x 1035x 1035x 1035x 1035x 1035x 1035x 1035x 1035x       70x   2746x 2746x    
import * as line from '../line';
 
export const assertApply = (src: string[], dst: string[], patch: line.LinePatch) => {
  const res = [...src];
  line.apply(
    patch,
    (pos) => {
      res.splice(pos, 1);
    },
    (srcPos, dstPos) => {
      res.splice(srcPos + 1, 0, dst[dstPos]);
    },
    (srcPos, dstPos) => {
      res[srcPos] = dst[dstPos];
    },
  );
  expect(res).toEqual(dst);
};
 
export const assertDiff = (src: string[], dst: string[], diff: line.LinePatch = line.diff(src, dst)) => {
  const srcLen = src.length;
  const dstLen = dst.length;
  const res: string[] = [];
  if (diff.length) {
    let lastSrcIdx = -1; // last src index consumed by a DEL/EQL/MIX op
    let lastDstIdx = -1; // last dst index consumed by an INS/EQL/MIX op
    for (const [type, srcIdx, dstIdx] of diff) {
      if (type === line.LINE_PATCH_OP_TYPE.DEL) {
        expect(srcIdx).toBeGreaterThanOrEqual(0);
        expect(srcIdx).toBeLessThan(srcLen);
        expect(srcIdx).toBeGreaterThan(lastSrcIdx);
        lastSrcIdx = srcIdx;
      } else if (type === line.LINE_PATCH_OP_TYPE.INS) {
        expect(dstIdx).toBeGreaterThanOrEqual(0);
        expect(dstIdx).toBeLessThan(dstLen);
        expect(dstIdx).toBeGreaterThan(lastDstIdx);
        expect(srcIdx).toBeGreaterThanOrEqual(-1); // insert anchor, -1 inserts at the start
        expect(srcIdx).toBeLessThan(srcLen);
        lastDstIdx = dstIdx;
        res.push(dst[dstIdx]);
      } else if (type === line.LINE_PATCH_OP_TYPE.EQL) {
        expect(srcIdx).toBeGreaterThanOrEqual(0);
        expect(srcIdx).toBeLessThan(srcLen);
        expect(dstIdx).toBeGreaterThanOrEqual(0);
        expect(dstIdx).toBeLessThan(dstLen);
        expect(srcIdx).toBeGreaterThan(lastSrcIdx);
        expect(dstIdx).toBeGreaterThan(lastDstIdx);
        expect(src[srcIdx]).toBe(dst[dstIdx]);
        lastSrcIdx = srcIdx;
        lastDstIdx = dstIdx;
        res.push(src[srcIdx]);
      } else Eif (type === line.LINE_PATCH_OP_TYPE.MIX) {
        expect(srcIdx).toBeGreaterThanOrEqual(0);
        expect(srcIdx).toBeLessThan(srcLen);
        expect(dstIdx).toBeGreaterThanOrEqual(0);
        expect(dstIdx).toBeLessThan(dstLen);
        expect(srcIdx).toBeGreaterThan(lastSrcIdx);
        expect(dstIdx).toBeGreaterThan(lastDstIdx);
        lastSrcIdx = srcIdx;
        lastDstIdx = dstIdx;
        res.push(dst[dstIdx]);
      }
    }
  } else {
    res.push(...src);
  }
  expect(res).toEqual(dst);
  assertApply(src, dst, diff);
};