devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
309 lines (308 loc) • 7.38 kB
JavaScript
/**
* DevExtreme (esm/__internal/scheduler/appointments/utils/get_arrays_diff.test.js)
* Version: 25.2.3
* Build date: Fri Dec 12 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
import {
describe,
expect,
it
} from "@jest/globals";
import {
getArraysDiff,
isNeedToAdd,
isNeedToRemove
} from "./get_arrays_diff";
const compare = (a, b) => a.id === b.id && a.name === b.name;
const getOperations = items => items.map((item => {
if (isNeedToAdd(item)) {
return "+"
}
return isNeedToRemove(item) ? "-" : "="
})).join("");
describe("getArraysDiff", (() => {
it("should process both empty arrays", (() => {
const diff = getArraysDiff([], [], compare);
expect(diff).toEqual([])
}));
it("should no mark for no changes", (() => {
const a = [{
id: 1,
name: "A"
}, {
id: 2,
name: "B"
}, {
id: 3,
name: "C"
}];
const diff = getArraysDiff(a, [{
id: 1,
name: "A"
}, {
id: 2,
name: "B"
}, {
id: 3,
name: "C"
}], compare);
expect(getOperations(diff)).toBe("===");
expect(diff).toEqual([{
item: a[0]
}, {
item: a[1]
}, {
item: a[2]
}])
}));
it("should mark insertion from empty to something", (() => {
const b = [{
id: 10,
name: "X"
}, {
id: 11,
name: "Y"
}];
const diff = getArraysDiff([], b, compare);
expect(getOperations(diff)).toBe("++");
expect(diff).toEqual([{
item: b[0],
needToAdd: true
}, {
item: b[1],
needToAdd: true
}])
}));
it("should removal from something to empty", (() => {
const a = [{
id: 5,
name: "A"
}, {
id: 6,
name: "B"
}];
const diff = getArraysDiff(a, [], compare);
expect(getOperations(diff)).toBe("--");
expect(diff).toEqual([{
item: a[0],
needToRemove: true
}, {
item: a[1],
needToRemove: true
}])
}));
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 = getArraysDiff(a, b, compare);
expect(getOperations(diff)).toBe("=+-=");
expect(diff).toEqual([{
item: a[0]
}, {
item: b[1],
needToAdd: true
}, {
item: a[1],
needToRemove: true
}, {
item: a[2]
}])
}));
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 = getArraysDiff(a, b, compare);
expect(getOperations(diff)).toBe("=+-=");
expect(diff).toEqual([{
item: a[0]
}, {
item: b[1],
needToAdd: true
}, {
item: a[1],
needToRemove: true
}, {
item: a[2]
}])
}));
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 = getArraysDiff(a, b, compare);
expect(getOperations(diff)).toBe("+===-");
expect(diff).toEqual([{
item: b[0],
needToAdd: true
}, {
item: a[0]
}, {
item: a[1]
}, {
item: a[2]
}, {
item: a[3],
needToRemove: true
}])
}));
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 = getArraysDiff(a, b, compare);
expect(getOperations(diff)).toBe("+=+-=-");
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
}])
}));
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 = getArraysDiff(a, b, compare);
expect(getOperations(diff)).toBe("+=+-=-");
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
}])
}))
}));