UNPKG

devextreme

Version:

JavaScript/TypeScript Component Suite for Responsive Web Development

407 lines (406 loc) • 11.4 kB
/** * DevExtreme (cjs/__internal/scheduler/appointments/utils/get_arrays_diff.test.js) * Version: 25.2.8 * Build date: Mon Jun 08 2026 * * Copyright (c) 2012 - 2026 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ "use strict"; var _globals = require("@jest/globals"); var _get_arrays_diff = require("./get_arrays_diff"); const compare = (a, b) => a.id === b.id && a.name === b.name; const noItemsLengthChange = () => true; const getOperations = items => items.map(item => { if ((0, _get_arrays_diff.isNeedToAdd)(item)) { return "+" } if ((0, _get_arrays_diff.isNeedToRemove)(item)) { return "-" } return (0, _get_arrays_diff.isNeedToUpdateItems)(item) ? "~" : "=" }).join(""); (0, _globals.describe)("getArraysDiff", () => { (0, _globals.it)("should process both empty arrays", () => { const diff = (0, _get_arrays_diff.getArraysDiff)([], [], compare, compare, noItemsLengthChange); (0, _globals.expect)(diff).toEqual([]) }); (0, _globals.it)("should no mark for no changes", () => { const a = [{ id: 1, name: "A" }, { id: 2, name: "B" }, { id: 3, name: "C" }]; const diff = (0, _get_arrays_diff.getArraysDiff)(a, [{ id: 1, name: "A" }, { id: 2, name: "B" }, { id: 3, name: "C" }], compare, compare, noItemsLengthChange); (0, _globals.expect)(getOperations(diff)).toBe("==="); (0, _globals.expect)(diff).toEqual([{ item: a[0] }, { item: a[1] }, { item: a[2] }]) }); (0, _globals.it)("should mark insertion from empty to something", () => { const b = [{ id: 10, name: "X" }, { id: 11, name: "Y" }]; const diff = (0, _get_arrays_diff.getArraysDiff)([], b, compare, compare, noItemsLengthChange); (0, _globals.expect)(getOperations(diff)).toBe("++"); (0, _globals.expect)(diff).toEqual([{ item: b[0], needToAdd: true }, { item: b[1], needToAdd: true }]) }); (0, _globals.it)("should removal from something to empty", () => { const a = [{ id: 5, name: "A" }, { id: 6, name: "B" }]; const diff = (0, _get_arrays_diff.getArraysDiff)(a, [], compare, compare, noItemsLengthChange); (0, _globals.expect)(getOperations(diff)).toBe("--"); (0, _globals.expect)(diff).toEqual([{ item: a[0], needToRemove: true }, { item: a[1], needToRemove: true }]) }); (0, _globals.it)("should mark remove and add for one object replacement", () => { const a = [{ id: 1, name: "A" }, { id: 2, name: "B" }, { id: 4, name: "D" }]; const b = [{ id: 1, name: "A" }, { id: 3, name: "C" }, { id: 4, name: "D" }]; const diff = (0, _get_arrays_diff.getArraysDiff)(a, b, compare, compare, noItemsLengthChange); (0, _globals.expect)(getOperations(diff)).toBe("=+-="); (0, _globals.expect)(diff).toEqual([{ item: a[0] }, { item: b[1], needToAdd: true }, { item: a[1], needToRemove: true }, { item: a[2] }]) }); (0, _globals.it)("should mark remove and add for changes inside object", () => { const a = [{ id: 1, name: "A" }, { id: 2, name: "B" }, { id: 4, name: "D" }]; const b = [{ id: 1, name: "A" }, { id: 2, name: "C" }, { id: 4, name: "D" }]; const diff = (0, _get_arrays_diff.getArraysDiff)(a, b, compare, compare, noItemsLengthChange); (0, _globals.expect)(getOperations(diff)).toBe("=+-="); (0, _globals.expect)(diff).toEqual([{ item: a[0] }, { item: b[1], needToAdd: true }, { item: a[1], needToRemove: true }, { item: a[2] }]) }); (0, _globals.it)("should choose optimum operations for reordering", () => { const a = [{ id: 1, name: "A" }, { id: 2, name: "B" }, { id: 3, name: "C" }, { id: 4, name: "D" }]; const b = [{ id: 4, name: "D" }, { id: 1, name: "A" }, { id: 2, name: "B" }, { id: 3, name: "C" }]; const diff = (0, _get_arrays_diff.getArraysDiff)(a, b, compare, compare, noItemsLengthChange); (0, _globals.expect)(getOperations(diff)).toBe("+===-"); (0, _globals.expect)(diff).toEqual([{ item: b[0], needToAdd: true }, { item: a[0] }, { item: a[1] }, { item: a[2] }, { item: a[3], needToRemove: true }]) }); (0, _globals.it)("should choose optimum operations for reordering, insertion and removal", () => { const a = [{ id: 1, name: "A" }, { id: 2, name: "B" }, { id: 3, name: "C" }, { id: 4, name: "D" }]; const b = [{ id: 4, name: "D" }, { id: 1, name: "A" }, { id: 5, name: "E" }, { id: 3, name: "C" }]; const diff = (0, _get_arrays_diff.getArraysDiff)(a, b, compare, compare, noItemsLengthChange); (0, _globals.expect)(getOperations(diff)).toBe("+=+-=-"); (0, _globals.expect)(diff).toEqual([{ item: b[0], needToAdd: true }, { item: a[0] }, { item: b[2], needToAdd: true }, { item: a[1], needToRemove: true }, { item: a[2] }, { item: a[3], needToRemove: true }]) }); (0, _globals.it)("should save additional props in second object", () => { const a = [{ id: 1, name: "A" }, { id: 2, name: "B" }, { id: 3, name: "C" }, { id: 4, name: "D" }]; const b = [{ id: 4, name: "D", extra: 10 }, { id: 1, name: "A", extra: 20 }, { id: 5, name: "E", extra: 30 }, { id: 3, name: "C", extra: 40 }]; const diff = (0, _get_arrays_diff.getArraysDiff)(a, b, compare, compare, noItemsLengthChange); (0, _globals.expect)(getOperations(diff)).toBe("+=+-=-"); (0, _globals.expect)(diff).toEqual([{ item: b[0], needToAdd: true }, { item: b[1] }, { item: b[2], needToAdd: true }, { item: a[1], needToRemove: true }, { item: b[3] }, { item: a[3], needToRemove: true }]) }) }); (0, _globals.describe)("getArraysDiff needToUpdateItems", () => { const matchById = (a, b) => a.id === b.id; const equalByPos = (a, b) => a.pos === b.pos; const equalByCount = (a, b) => a.count === b.count; (0, _globals.it)("should mark as needToUpdateItems when match and equal but itemsLengthEqual is false", () => { const b = [{ id: 1, pos: 0, count: 3 }]; const diff = (0, _get_arrays_diff.getArraysDiff)([{ id: 1, pos: 0, count: 2 }], b, matchById, equalByPos, equalByCount); (0, _globals.expect)(getOperations(diff)).toBe("~"); (0, _globals.expect)(diff).toEqual([{ item: b[0], needToUpdateItems: true }]) }); (0, _globals.it)("should not mark as needToUpdateItems when match, equal and itemsLengthEqual are all true", () => { const b = [{ id: 1, pos: 0, count: 2 }]; const diff = (0, _get_arrays_diff.getArraysDiff)([{ id: 1, pos: 0, count: 2 }], b, matchById, equalByPos, equalByCount); (0, _globals.expect)(getOperations(diff)).toBe("="); (0, _globals.expect)(diff).toEqual([{ item: b[0] }]) }); (0, _globals.it)("should produce remove+add when match is true but equal is false", () => { const a = [{ id: 1, pos: 0, count: 2 }]; const b = [{ id: 1, pos: 5, count: 2 }]; const diff = (0, _get_arrays_diff.getArraysDiff)(a, b, matchById, equalByPos, equalByCount); (0, _globals.expect)(getOperations(diff)).toBe("+-"); (0, _globals.expect)(diff).toEqual([{ item: b[0], needToAdd: true }, { item: a[0], needToRemove: true }]) }); (0, _globals.it)("should handle mix of needToUpdateItems, no change, add and remove", () => { const a = [{ id: 1, pos: 0, count: 2 }, { id: 2, pos: 10, count: 1 }, { id: 3, pos: 20, count: 3 }]; const b = [{ id: 1, pos: 0, count: 4 }, { id: 2, pos: 10, count: 1 }, { id: 4, pos: 30, count: 1 }]; const diff = (0, _get_arrays_diff.getArraysDiff)(a, b, matchById, equalByPos, equalByCount); (0, _globals.expect)(getOperations(diff)).toBe("~=+-"); (0, _globals.expect)(diff).toEqual([{ item: b[0], needToUpdateItems: true }, { item: b[1] }, { item: b[2], needToAdd: true }, { item: a[2], needToRemove: true }]) }) });