devextreme
Version:
JavaScript/TypeScript Component Suite for Responsive Web Development
414 lines (413 loc) • 13.9 kB
JavaScript
/**
* DevExtreme (cjs/__internal/scheduler/appointments_new/utils/get_view_model_diff.test.js)
* Version: 25.2.7
* Build date: Tue May 05 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 _appointment_view_model = require("../__mock__/appointment_view_model");
var _get_view_model_diff = require("./get_view_model_diff");
const createMockDataSource = function() {
let updatedAppointment = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null;
let updatedKeys = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : [];
return {
getUpdatedAppointment: () => updatedAppointment,
getUpdatedAppointmentKeys: () => updatedKeys
}
};
const defaultDataSource = createMockDataSource();
const makeItem = _appointment_view_model.mockGridViewModel;
const getOperations = items => items.map(item => {
if (item.needToAdd) {
return "+"
}
if (item.needToRemove) {
return "-"
}
if (item.needToResize) {
return "r"
}
return "="
}).join("");
(0, _globals.describe)("getViewModelDiff", () => {
(0, _globals.it)("should return empty array for both empty inputs", () => {
(0, _globals.expect)((0, _get_view_model_diff.getViewModelDiff)([], [], defaultDataSource)).toEqual([])
});
(0, _globals.it)("should mark no changes for identical items", () => {
const data1 = {};
const data2 = {};
const data3 = {};
const a = [makeItem(data1, {
sortedIndex: 0
}), makeItem(data2, {
sortedIndex: 1
}), makeItem(data3, {
sortedIndex: 2
})];
const b = [makeItem(data1, {
sortedIndex: 0
}), makeItem(data2, {
sortedIndex: 1
}), makeItem(data3, {
sortedIndex: 2
})];
const diff = (0, _get_view_model_diff.getViewModelDiff)(a, b, defaultDataSource);
(0, _globals.expect)(getOperations(diff)).toBe("===");
(0, _globals.expect)(diff).toEqual([{
item: b[0],
oldSortedIndex: 0
}, {
item: b[1],
oldSortedIndex: 1
}, {
item: b[2],
oldSortedIndex: 2
}])
});
(0, _globals.it)("should mark all as needToAdd when old list is empty", () => {
const b = [makeItem({}, {
sortedIndex: 0
}), makeItem({}, {
sortedIndex: 1
})];
const diff = (0, _get_view_model_diff.getViewModelDiff)([], b, defaultDataSource);
(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 mark all as needToRemove when new list is empty", () => {
const a = [makeItem({}), makeItem({})];
const diff = (0, _get_view_model_diff.getViewModelDiff)(a, [], defaultDataSource);
(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 item replacement (different itemData)", () => {
const data1 = {};
const data4 = {};
const a = [makeItem(data1, {
sortedIndex: 0
}), makeItem({}, {
sortedIndex: 1
}), makeItem(data4, {
sortedIndex: 2
})];
const b = [makeItem(data1, {
sortedIndex: 0
}), makeItem({}, {
sortedIndex: 1
}), makeItem(data4, {
sortedIndex: 2
})];
const diff = (0, _get_view_model_diff.getViewModelDiff)(a, b, defaultDataSource);
(0, _globals.expect)(getOperations(diff)).toBe("=+-=");
(0, _globals.expect)(diff).toEqual([{
item: b[0],
oldSortedIndex: 0
}, {
item: b[1],
needToAdd: true
}, {
item: a[1],
needToRemove: true
}, {
item: b[2],
oldSortedIndex: 2
}])
});
(0, _globals.it)("should mark remove and add for same itemData with changed non-dimension properties", () => {
const data1 = {};
const data2 = {};
const data4 = {};
const a = [makeItem(data1, {
sortedIndex: 0
}), makeItem(data2, {
sortedIndex: 1
}), makeItem(data4, {
sortedIndex: 2
})];
const b = [makeItem(data1, {
sortedIndex: 0
}), makeItem(data2, {
sortedIndex: 1,
rowIndex: 1
}), makeItem(data4, {
sortedIndex: 2
})];
const diff = (0, _get_view_model_diff.getViewModelDiff)(a, b, defaultDataSource);
(0, _globals.expect)(getOperations(diff)).toBe("=+-=");
(0, _globals.expect)(diff).toEqual([{
item: b[0],
oldSortedIndex: 0
}, {
item: b[1],
needToAdd: true
}, {
item: a[1],
needToRemove: true
}, {
item: b[2],
oldSortedIndex: 2
}])
});
(0, _globals.it)("should choose optimum operations for reordering", () => {
const data1 = {};
const data2 = {};
const data3 = {};
const data4 = {};
const a = [makeItem(data1, {
sortedIndex: 0
}), makeItem(data2, {
sortedIndex: 1
}), makeItem(data3, {
sortedIndex: 2
}), makeItem(data4, {
sortedIndex: 3
})];
const b = [makeItem(data4, {
sortedIndex: 0
}), makeItem(data1, {
sortedIndex: 1
}), makeItem(data2, {
sortedIndex: 2
}), makeItem(data3, {
sortedIndex: 3
})];
const diff = (0, _get_view_model_diff.getViewModelDiff)(a, b, defaultDataSource);
(0, _globals.expect)(getOperations(diff)).toBe("+===-");
(0, _globals.expect)(diff).toEqual([{
item: b[0],
needToAdd: true
}, {
item: b[1],
oldSortedIndex: 0
}, {
item: b[2],
oldSortedIndex: 1
}, {
item: b[3],
oldSortedIndex: 2
}, {
item: a[3],
needToRemove: true
}])
});
(0, _globals.it)("should choose optimum operations for reordering, insertion, and removal", () => {
const data1 = {};
const data3 = {};
const data4 = {};
const a = [makeItem(data1, {
sortedIndex: 0
}), makeItem({}, {
sortedIndex: 1
}), makeItem(data3, {
sortedIndex: 2
}), makeItem(data4, {
sortedIndex: 3
})];
const b = [makeItem(data4, {
sortedIndex: 0
}), makeItem(data1, {
sortedIndex: 1
}), makeItem({}, {
sortedIndex: 2
}), makeItem(data3, {
sortedIndex: 3
})];
const diff = (0, _get_view_model_diff.getViewModelDiff)(a, b, defaultDataSource);
(0, _globals.expect)(getOperations(diff)).toBe("+=+-=-");
(0, _globals.expect)(diff).toEqual([{
item: b[0],
needToAdd: true
}, {
item: b[1],
oldSortedIndex: 0
}, {
item: b[2],
needToAdd: true
}, {
item: a[1],
needToRemove: true
}, {
item: b[3],
oldSortedIndex: 2
}, {
item: a[3],
needToRemove: true
}])
});
(0, _globals.it)("should use the new item (from new list) in no-change cases", () => {
const data2 = {
myId: 1
};
const data3 = {
myId: 2
};
const data4 = {
myId: 3
};
const a = [makeItem({
myId: 0
}, {
sortedIndex: 0
}), makeItem(data2, {
sortedIndex: 1
}), makeItem(data3, {
sortedIndex: 2
}), makeItem(data4, {
sortedIndex: 3
})];
const bItem1 = makeItem(data2, {
sortedIndex: 5
});
const b = [makeItem(data4, {
sortedIndex: 0
}), bItem1, makeItem({
myId: 4
}, {
sortedIndex: 2
}), makeItem(data3, {
sortedIndex: 3
})];
const diff = (0, _get_view_model_diff.getViewModelDiff)(a, b, defaultDataSource);
(0, _globals.expect)(getOperations(diff)).toBe("+-=+=-");
(0, _globals.expect)(diff[2]).toEqual({
item: bItem1,
oldSortedIndex: 1
})
});
(0, _globals.describe)("needToResize", () => {
(0, _globals.it)("should mark needToResize when only dimensions change for the same item", () => {
const data1 = {};
const a = [makeItem(data1, {
sortedIndex: 3,
left: 0,
top: 0,
height: 100,
width: 200
})];
const b = [makeItem(data1, {
sortedIndex: 0,
left: 10,
top: 20,
height: 50,
width: 150
})];
const diff = (0, _get_view_model_diff.getViewModelDiff)(a, b, defaultDataSource);
(0, _globals.expect)(getOperations(diff)).toBe("r");
(0, _globals.expect)(diff).toEqual([{
item: b[0],
needToResize: true,
oldSortedIndex: 3
}])
});
(0, _globals.it)("should mix needToResize with other operations", () => {
const data1 = {};
const data2 = {};
const data3 = {};
const a = [makeItem(data1, {
sortedIndex: 0
}), makeItem(data2, {
sortedIndex: 1
}), makeItem(data3, {
sortedIndex: 2
})];
const b = [makeItem(data1, {
sortedIndex: 0
}), makeItem(data2, {
sortedIndex: 1,
left: 50,
top: 50
}), makeItem(data3, {
sortedIndex: 2
})];
const diff = (0, _get_view_model_diff.getViewModelDiff)(a, b, defaultDataSource);
(0, _globals.expect)(getOperations(diff)).toBe("=r=");
(0, _globals.expect)(diff).toEqual([{
item: b[0],
oldSortedIndex: 0
}, {
item: b[1],
needToResize: true,
oldSortedIndex: 1
}, {
item: b[2],
oldSortedIndex: 2
}])
})
});
(0, _globals.describe)("updatedAppointment", () => {
(0, _globals.it)("should treat item as changed when itemData matches getUpdatedAppointment reference", () => {
const data1 = {};
const a = [makeItem(data1, {
sortedIndex: 0
})];
const b = [makeItem(data1, {
sortedIndex: 0
})];
const dataSource = createMockDataSource(data1);
const diff = (0, _get_view_model_diff.getViewModelDiff)(a, b, dataSource);
(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 treat item as changed when its data matches an updatedAppointmentKey", () => {
const data1 = {
id: 1
};
const a = [makeItem(data1, {
sortedIndex: 0
})];
const b = [makeItem(data1, {
sortedIndex: 0
})];
const dataSource = createMockDataSource(null, [{
key: "id",
value: 1
}]);
const diff = (0, _get_view_model_diff.getViewModelDiff)(a, b, dataSource);
(0, _globals.expect)(getOperations(diff)).toBe("+-")
});
(0, _globals.it)("should not affect items whose data has not changed", () => {
const data1 = {
id: 1
};
const data2 = {
id: 2
};
const a = [makeItem(data1, {
sortedIndex: 0
}), makeItem(data2, {
sortedIndex: 1
})];
const b = [makeItem(data1, {
sortedIndex: 0
}), makeItem(data2, {
sortedIndex: 1
})];
const dataSource = createMockDataSource({
id: 3
});
const diff = (0, _get_view_model_diff.getViewModelDiff)(a, b, dataSource);
(0, _globals.expect)(getOperations(diff)).toBe("==")
})
})
});