react-sortable-tree-node
Version:
react-sortable-tree-node
2,043 lines (2,012 loc) • 60.4 kB
JavaScript
"use strict";
var _treeDataUtils = require("./tree-data-utils");
function _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var keyFromTreeIndex = function keyFromTreeIndex(_ref) {
var treeIndex = _ref.treeIndex;
return treeIndex;
};
var keyFromKey = function keyFromKey(_ref2) {
var node = _ref2.node;
return node.key;
};
describe('getVisibleNodeCount', function () {
it('should handle flat data', function () {
expect((0, _treeDataUtils.getVisibleNodeCount)({
treeData: [{}, {}]
})).toEqual(2);
});
it('should handle hidden nested data', function () {
expect((0, _treeDataUtils.getVisibleNodeCount)({
treeData: [{
children: [{
children: [{}, {}]
}, {
children: [{}]
}]
}, {}]
})).toEqual(2);
});
it('should handle functions', function () {
expect((0, _treeDataUtils.getVisibleNodeCount)({
treeData: [{
expanded: true,
children: [{
expanded: true,
children: [{
expanded: true,
children: function children() {
return {
key: 1
};
}
}, {}]
}, {
children: [{}]
}]
}, {}]
})).toEqual(6);
});
it('should handle partially expanded nested data', function () {
expect((0, _treeDataUtils.getVisibleNodeCount)({
treeData: [{
expanded: true,
children: [{
expanded: true,
children: [{}, {}]
}, {
children: [{}]
}]
}, {}]
})).toEqual(6);
});
it('should handle fully expanded nested data', function () {
expect((0, _treeDataUtils.getVisibleNodeCount)({
treeData: [{
expanded: true,
children: [{
expanded: true,
children: [{}, {}]
}, {
expanded: true,
children: [{}]
}]
}, {}]
})).toEqual(7);
});
});
describe('getVisibleNodeInfoAtIndex', function () {
it('should handle empty data', function () {
expect((0, _treeDataUtils.getVisibleNodeInfoAtIndex)({
treeData: [],
index: 1,
getNodeKey: keyFromTreeIndex
})).toEqual(null);
expect((0, _treeDataUtils.getVisibleNodeInfoAtIndex)({
treeData: null,
index: 1,
getNodeKey: keyFromTreeIndex
})).toEqual(null);
expect((0, _treeDataUtils.getVisibleNodeInfoAtIndex)({
treeData: undefined,
index: 1,
getNodeKey: keyFromTreeIndex
})).toEqual(null);
});
it('should handle flat data', function () {
expect((0, _treeDataUtils.getVisibleNodeInfoAtIndex)({
treeData: [{
key: 0
}],
index: 0,
getNodeKey: keyFromTreeIndex
}).node.key).toEqual(0);
expect((0, _treeDataUtils.getVisibleNodeInfoAtIndex)({
treeData: [{
key: 0
}, {
key: 1
}],
index: 1,
getNodeKey: keyFromTreeIndex
}).node.key).toEqual(1);
});
it('should handle hidden nested data', function () {
var result = (0, _treeDataUtils.getVisibleNodeInfoAtIndex)({
treeData: [{
key: 0,
children: [{
key: 1,
children: [{
key: 2
}, {
key: 3
}]
}, {
key: 4,
children: [{
key: 5
}]
}]
}, {
key: 6
}],
index: 1,
getNodeKey: keyFromTreeIndex
});
expect(result.node.key).toEqual(6);
expect(result.path).toEqual([1]);
expect(result.lowerSiblingCounts).toEqual([0]);
});
it('should handle partially expanded nested data', function () {
var result = (0, _treeDataUtils.getVisibleNodeInfoAtIndex)({
treeData: [{
expanded: true,
key: 0,
children: [{
key: 1,
children: [{
key: 2
}, {
key: 3
}]
}, {
expanded: true,
key: 4,
children: [{
key: 5
}]
}]
}, {
key: 6
}],
index: 3,
getNodeKey: keyFromKey
});
expect(result.node.key).toEqual(5);
expect(result.path).toEqual([0, 4, 5]);
expect(result.lowerSiblingCounts).toEqual([1, 0, 0]);
});
it('should handle fully expanded nested data', function () {
var result = (0, _treeDataUtils.getVisibleNodeInfoAtIndex)({
treeData: [{
expanded: true,
key: 0,
children: [{
expanded: true,
key: 1,
children: [{
key: 2
}, {
key: 3
}]
}, {
expanded: true,
key: 4,
children: [{
key: 5
}]
}]
}, {
key: 6
}],
index: 5,
getNodeKey: keyFromTreeIndex
});
expect(result.node.key).toEqual(5);
expect(result.path).toEqual([0, 4, 5]);
expect(result.lowerSiblingCounts).toEqual([1, 0, 0]);
});
it('should handle an index that is larger than the data', function () {
expect((0, _treeDataUtils.getVisibleNodeInfoAtIndex)({
treeData: [{
expanded: true,
key: 0,
children: [{
expanded: true,
key: 1,
children: [{
key: 2
}, {
key: 3
}]
}, {
expanded: true,
key: 4,
children: [{
key: 5
}]
}]
}, {
key: 6
}],
index: 7,
getNodeKey: keyFromTreeIndex
})).toEqual(null);
});
});
describe('getNodeAtPath', function () {
it('should handle empty data', function () {
expect((0, _treeDataUtils.getNodeAtPath)({
treeData: [],
path: 1,
getNodeKey: keyFromTreeIndex
})).toEqual(null);
expect((0, _treeDataUtils.getNodeAtPath)({
treeData: null,
path: 1,
getNodeKey: keyFromTreeIndex
})).toEqual(null);
expect((0, _treeDataUtils.getNodeAtPath)({
treeData: undefined,
path: 1,
getNodeKey: keyFromTreeIndex
})).toEqual(null);
});
it('should handle flat data', function () {
expect((0, _treeDataUtils.getNodeAtPath)({
treeData: [{
key: 0
}],
path: [0],
getNodeKey: keyFromTreeIndex
}).node.key).toEqual(0);
expect((0, _treeDataUtils.getNodeAtPath)({
treeData: [{
key: 0
}, {
key: 1
}],
path: [1],
getNodeKey: keyFromTreeIndex
}).node.key).toEqual(1);
});
it('should handle hidden nested data', function () {
var result = (0, _treeDataUtils.getNodeAtPath)({
treeData: [{
key: 0,
children: [{
key: 1,
children: [{
key: 2
}, {
key: 3
}]
}, {
key: 4,
children: [{
key: 5
}]
}]
}, {
key: 6
}],
path: [1],
getNodeKey: keyFromTreeIndex
});
expect(result.node.key).toEqual(6);
});
it('should handle partially expanded nested data', function () {
var result = (0, _treeDataUtils.getNodeAtPath)({
treeData: [{
expanded: true,
key: 0,
children: [{
key: 1,
children: [{
key: 2
}, {
key: 3
}]
}, {
expanded: true,
key: 4,
children: [{
key: 5
}]
}]
}, {
key: 6
}],
path: [0, 4, 5],
getNodeKey: keyFromKey
});
expect(result.node.key).toEqual(5);
});
it('should handle fully expanded nested data', function () {
var result = (0, _treeDataUtils.getNodeAtPath)({
treeData: [{
expanded: true,
key: 0,
children: [{
expanded: true,
key: 1,
children: [{
key: 2
}, {
key: 3
}]
}, {
expanded: true,
key: 4,
children: [{
key: 5
}]
}]
}, {
key: 6
}],
path: [0, 4, 5],
getNodeKey: keyFromTreeIndex
});
expect(result.node.key).toEqual(5);
});
it('should handle an index that is larger than the data', function () {
expect((0, _treeDataUtils.getNodeAtPath)({
treeData: [{
expanded: true,
key: 0,
children: [{
expanded: true,
key: 1,
children: [{
key: 2
}, {
key: 3
}]
}, {
expanded: true,
key: 4,
children: [{
key: 5
}]
}]
}, {
key: 6
}],
path: [7],
getNodeKey: keyFromTreeIndex
})).toEqual(null);
});
});
describe('getFlatDataFromTree', function () {
it('should handle empty data', function () {
expect((0, _treeDataUtils.getFlatDataFromTree)({
treeData: [],
getNodeKey: keyFromTreeIndex
})).toEqual([]);
expect((0, _treeDataUtils.getFlatDataFromTree)({
treeData: null,
getNodeKey: keyFromTreeIndex
})).toEqual([]);
expect((0, _treeDataUtils.getFlatDataFromTree)({
treeData: undefined,
getNodeKey: keyFromTreeIndex
})).toEqual([]);
});
it('should handle flat data', function () {
expect((0, _treeDataUtils.getFlatDataFromTree)({
ignoreCollapsed: true,
getNodeKey: keyFromTreeIndex,
treeData: [{
key: 0
}]
})).toEqual([{
node: {
key: 0
},
parentNode: null,
path: [0],
lowerSiblingCounts: [0],
treeIndex: 0
}]);
expect((0, _treeDataUtils.getFlatDataFromTree)({
ignoreCollapsed: true,
treeData: [{
key: 0
}, {
key: 1
}],
getNodeKey: keyFromTreeIndex
})).toEqual([{
node: {
key: 0
},
parentNode: null,
path: [0],
lowerSiblingCounts: [1],
treeIndex: 0
}, {
node: {
key: 1
},
parentNode: null,
path: [1],
lowerSiblingCounts: [0],
treeIndex: 1
}]);
});
it('should handle hidden nested data', function () {
var treeData = [{
key: 0,
children: [{
key: 1,
children: [{
key: 2
}, {
key: 3
}]
}, {
key: 4,
children: [{
key: 5
}]
}]
}, {
key: 6
}];
expect((0, _treeDataUtils.getFlatDataFromTree)({
ignoreCollapsed: true,
getNodeKey: keyFromTreeIndex,
treeData: treeData
})).toEqual([{
node: treeData[0],
parentNode: null,
path: [0],
lowerSiblingCounts: [1],
treeIndex: 0
}, {
node: treeData[1],
parentNode: null,
path: [1],
lowerSiblingCounts: [0],
treeIndex: 1
}]);
});
it('should handle partially expanded nested data', function () {
var treeData = [{
expanded: true,
key: 0,
children: [{
key: 1,
children: [{
key: 2
}, {
key: 3
}]
}, {
expanded: true,
key: 4,
children: [{
key: 5
}]
}]
}, {
key: 6
}];
expect((0, _treeDataUtils.getFlatDataFromTree)({
ignoreCollapsed: true,
getNodeKey: keyFromKey,
treeData: treeData
})).toEqual([{
node: treeData[0],
parentNode: null,
path: [0],
lowerSiblingCounts: [1],
treeIndex: 0
}, {
node: treeData[0].children[0],
parentNode: treeData[0],
path: [0, 1],
lowerSiblingCounts: [1, 1],
treeIndex: 1
}, {
node: treeData[0].children[1],
parentNode: treeData[0],
path: [0, 4],
lowerSiblingCounts: [1, 0],
treeIndex: 2
}, {
node: treeData[0].children[1].children[0],
parentNode: treeData[0].children[1],
path: [0, 4, 5],
lowerSiblingCounts: [1, 0, 0],
treeIndex: 3
}, {
node: treeData[1],
parentNode: null,
path: [6],
lowerSiblingCounts: [0],
treeIndex: 4
}]);
});
it('should handle fully expanded nested data', function () {
var treeData = [{
expanded: true,
key: 0,
children: [{
expanded: true,
key: 1,
children: [{
key: 2
}, {
key: 3
}]
}, {
expanded: true,
key: 4,
children: [{
key: 5
}]
}]
}, {
key: 6
}];
expect((0, _treeDataUtils.getFlatDataFromTree)({
ignoreCollapsed: true,
treeData: treeData,
getNodeKey: keyFromTreeIndex
})).toEqual([{
node: treeData[0],
parentNode: null,
path: [0],
lowerSiblingCounts: [1],
treeIndex: 0
}, {
node: treeData[0].children[0],
parentNode: treeData[0],
path: [0, 1],
lowerSiblingCounts: [1, 1],
treeIndex: 1
}, {
node: treeData[0].children[0].children[0],
parentNode: treeData[0].children[0],
path: [0, 1, 2],
lowerSiblingCounts: [1, 1, 1],
treeIndex: 2
}, {
node: treeData[0].children[0].children[1],
parentNode: treeData[0].children[0],
path: [0, 1, 3],
lowerSiblingCounts: [1, 1, 0],
treeIndex: 3
}, {
node: treeData[0].children[1],
parentNode: treeData[0],
path: [0, 4],
lowerSiblingCounts: [1, 0],
treeIndex: 4
}, {
node: treeData[0].children[1].children[0],
parentNode: treeData[0].children[1],
path: [0, 4, 5],
lowerSiblingCounts: [1, 0, 0],
treeIndex: 5
}, {
node: treeData[1],
parentNode: null,
path: [6],
lowerSiblingCounts: [0],
treeIndex: 6
}]);
});
});
describe('changeNodeAtPath', function () {
it('should handle empty data', function () {
var noChildrenError = new Error('Path referenced children of node with no children.');
var noNodeError = new Error('No node found at the given path.');
expect(function () {
return (0, _treeDataUtils.changeNodeAtPath)({
treeData: [],
path: [1],
newNode: {},
getNodeKey: keyFromTreeIndex
});
}).toThrow(noNodeError);
expect(function () {
return (0, _treeDataUtils.changeNodeAtPath)({
treeData: null,
path: [1],
newNode: {},
getNodeKey: keyFromTreeIndex
});
}).toThrow(noChildrenError);
expect(function () {
return (0, _treeDataUtils.changeNodeAtPath)({
treeData: null,
path: [1, 2],
newNode: {},
getNodeKey: keyFromTreeIndex
});
}).toThrow(noChildrenError);
expect(function () {
return (0, _treeDataUtils.changeNodeAtPath)({
treeData: undefined,
path: [1],
newNode: {},
getNodeKey: keyFromTreeIndex
});
}).toThrow(noChildrenError);
});
it('should handle flat data', function () {
expect((0, _treeDataUtils.changeNodeAtPath)({
treeData: [{
key: 0
}],
path: [0],
newNode: {
key: 1
},
getNodeKey: keyFromKey
})).toEqual([{
key: 1
}]);
expect((0, _treeDataUtils.changeNodeAtPath)({
treeData: [{
key: 0
}, {
key: 'a'
}],
path: ['a'],
newNode: {
key: 1
},
getNodeKey: keyFromKey
})).toEqual([{
key: 0
}, {
key: 1
}]);
});
it('should handle nested data', function () {
var result = (0, _treeDataUtils.changeNodeAtPath)({
treeData: [{
expanded: true,
key: 0,
children: [{
key: 'b',
children: [{
key: 2
}, {
key: 3
}, {
key: 'f'
}]
}, {
expanded: true,
key: 'r',
children: [{
key: 5
}, {
key: 8
}, {
key: 7
}]
}]
}, {
key: 6
}],
path: [0, 2, 5],
newNode: {
food: 'pancake'
},
getNodeKey: keyFromTreeIndex
});
expect(result[0].children[1].children[2].food).toEqual('pancake');
});
it('should handle adding children', function () {
var result = (0, _treeDataUtils.changeNodeAtPath)({
treeData: [{
expanded: true,
key: 0,
children: [{
key: 'b',
children: [{
key: 2
}, {
key: 3
}, {
key: 'f'
}]
}, {
expanded: true,
key: 'r',
children: [{
key: 5
}, {
key: 8
}, {
key: 7
}]
}]
}, {
key: 6
}],
path: [0, 2, 5],
newNode: function newNode(_ref3) {
var node = _ref3.node;
return _objectSpread(_objectSpread({}, node), {}, {
children: [{
food: 'pancake'
}]
});
},
getNodeKey: keyFromTreeIndex
});
expect(result[0].children[1].children[2].children[0].food).toEqual('pancake');
});
it('should handle adding children to the root', function () {
expect((0, _treeDataUtils.changeNodeAtPath)({
treeData: [],
path: [],
newNode: function newNode(_ref4) {
var node = _ref4.node;
return _objectSpread(_objectSpread({}, node), {}, {
children: [].concat(_toConsumableArray(node.children), [{
key: 1
}])
});
},
getNodeKey: keyFromKey
})).toEqual([{
key: 1
}]);
expect((0, _treeDataUtils.changeNodeAtPath)({
treeData: [{
key: 0
}],
path: [],
newNode: function newNode(_ref5) {
var node = _ref5.node;
return _objectSpread(_objectSpread({}, node), {}, {
children: [].concat(_toConsumableArray(node.children), [{
key: 1
}])
});
},
getNodeKey: keyFromKey
})).toEqual([{
key: 0
}, {
key: 1
}]);
});
it('should delete data when falsey node passed', function () {
var result = (0, _treeDataUtils.changeNodeAtPath)({
treeData: [{
expanded: true,
key: 'b',
children: [{
key: 'f'
}]
}, {
expanded: true,
key: 'r',
children: [{
key: 7
}]
}, {
key: 6
}],
path: [2, 3],
newNode: null,
getNodeKey: keyFromTreeIndex
});
expect(result[1].children.length).toEqual(0);
});
it('should delete data on the top level', function () {
var treeData = [{
expanded: true,
key: 'b',
children: [{
key: 'f'
}]
}, {
expanded: true,
key: 'r',
children: [{
key: 7
}]
}, {
key: 6
}];
var result = (0, _treeDataUtils.changeNodeAtPath)({
treeData: treeData,
path: [2],
newNode: null,
getNodeKey: keyFromTreeIndex
});
expect(result).toEqual([treeData[0], treeData[2]]);
});
it('should handle a path that is too long', function () {
var treeData = [{
expanded: true,
key: 0,
children: [{
expanded: true,
key: 1,
children: [{
key: 2
}, {
key: 3
}]
}]
}];
expect(function () {
return (0, _treeDataUtils.changeNodeAtPath)({
treeData: treeData,
path: [0, 1, 2, 4],
newNode: {
a: 1
},
getNodeKey: keyFromKey
});
}).toThrow(new Error('Path referenced children of node with no children.'));
});
it('should handle a path that does not exist', function () {
var treeData = [{
expanded: true,
key: 0,
children: [{
expanded: true,
key: 1,
children: [{
key: 2
}, {
key: 3
}]
}]
}];
expect(function () {
return (0, _treeDataUtils.changeNodeAtPath)({
treeData: treeData,
path: [0, 2],
newNode: {
a: 1
},
getNodeKey: keyFromKey
});
}).toThrowError('No node found at the given path.');
});
});
describe('addNodeUnderParent', function () {
it('should handle empty data', function () {
expect((0, _treeDataUtils.addNodeUnderParent)({
treeData: [],
parentKey: null,
newNode: {},
getNodeKey: keyFromTreeIndex
})).toEqual({
treeData: [{}],
treeIndex: 0
});
expect((0, _treeDataUtils.addNodeUnderParent)({
treeData: null,
parentKey: null,
newNode: {},
getNodeKey: keyFromTreeIndex
})).toEqual({
treeData: [{}],
treeIndex: 0
});
expect((0, _treeDataUtils.addNodeUnderParent)({
treeData: undefined,
parentKey: null,
newNode: {},
getNodeKey: keyFromTreeIndex
})).toEqual({
treeData: [{}],
treeIndex: 0
});
});
it('should handle a parentPath that does not exist', function () {
var treeData = [{
expanded: true,
key: 0,
children: [{
expanded: true,
key: 1,
children: [{
key: 2
}, {
key: 3
}]
}]
}];
expect(function () {
return (0, _treeDataUtils.addNodeUnderParent)({
treeData: treeData,
parentKey: 'fake',
newNode: {
a: 1
},
getNodeKey: keyFromKey
});
}).toThrowError('No node found with the given key.');
});
it('should handle flat data', function () {
// Older sibling of only node
expect((0, _treeDataUtils.addNodeUnderParent)({
treeData: [{
key: 0
}],
parentKey: null,
newNode: {
key: 1
},
getNodeKey: keyFromTreeIndex
})).toEqual({
treeData: [{
key: 0
}, {
key: 1
}],
treeIndex: 1
}); // Child of only node
expect((0, _treeDataUtils.addNodeUnderParent)({
treeData: [{
key: 0
}],
parentKey: 0,
newNode: {
key: 1
},
getNodeKey: keyFromTreeIndex
})).toEqual({
treeData: [{
key: 0,
children: [{
key: 1
}]
}],
treeIndex: 1
});
expect((0, _treeDataUtils.addNodeUnderParent)({
treeData: [{
key: 0
}, {
key: 'a'
}],
parentKey: 'a',
newNode: {
key: 1
},
getNodeKey: keyFromKey
})).toEqual({
treeData: [{
key: 0
}, {
key: 'a',
children: [{
key: 1
}]
}],
treeIndex: 2
});
}); // Tree looks like this
// /\
// 0 6
// / \
// 1 5
// / \
// 2 3
// \
// 4
var nestedParams = {
treeData: [{
expanded: true,
key: 0,
children: [{
expanded: true,
key: 1,
children: [{
key: 2
}, {
expanded: false,
key: 3,
children: [{
key: 4
}]
}]
}, {
key: 5
}]
}, {
key: 6
}],
newNode: {
key: 'new'
}
};
it('should handle nested data #1', function () {
var result = (0, _treeDataUtils.addNodeUnderParent)(_objectSpread(_objectSpread({}, nestedParams), {}, {
parentKey: 0,
getNodeKey: keyFromKey
}));
expect(result.treeData[0].children[2]).toEqual(nestedParams.newNode);
expect(result.treeIndex).toEqual(5);
});
it('should handle nested data #2', function () {
var result = (0, _treeDataUtils.addNodeUnderParent)(_objectSpread(_objectSpread({}, nestedParams), {}, {
parentKey: 1,
getNodeKey: keyFromKey
}));
expect(result.treeData[0].children[0].children[2]).toEqual(nestedParams.newNode);
expect(result.treeIndex).toEqual(4);
});
it('should handle nested data #3', function () {
var result = (0, _treeDataUtils.addNodeUnderParent)(_objectSpread(_objectSpread({}, nestedParams), {}, {
parentKey: 3,
getNodeKey: keyFromKey
}));
expect(result.treeData[0].children[0].children[1].children[1]).toEqual(nestedParams.newNode);
expect(result.treeIndex).toEqual(5);
});
it('should handle nested data #1 (using tree index as key)', function () {
var result = (0, _treeDataUtils.addNodeUnderParent)(_objectSpread(_objectSpread({}, nestedParams), {}, {
parentKey: 0,
getNodeKey: keyFromTreeIndex
}));
expect(result.treeData[0].children[2]).toEqual(nestedParams.newNode);
expect(result.treeIndex).toEqual(5);
});
it('should handle nested data #2 (using tree index as key)', function () {
var result = (0, _treeDataUtils.addNodeUnderParent)(_objectSpread(_objectSpread({}, nestedParams), {}, {
parentKey: 1,
getNodeKey: keyFromTreeIndex
}));
expect(result.treeData[0].children[0].children[2]).toEqual(nestedParams.newNode);
expect(result.treeIndex).toEqual(4);
});
it('should handle nested data #3 (using tree index as key)', function () {
var result = (0, _treeDataUtils.addNodeUnderParent)(_objectSpread(_objectSpread({}, nestedParams), {}, {
parentKey: 3,
getNodeKey: keyFromTreeIndex
}));
expect(result.treeData[0].children[0].children[1].children[1]).toEqual(nestedParams.newNode);
expect(result.treeIndex).toEqual(5);
});
it('should add new node as last child by default', function () {
var result = (0, _treeDataUtils.addNodeUnderParent)(_objectSpread(_objectSpread({}, nestedParams), {}, {
parentKey: 0,
getNodeKey: keyFromKey
}));
var _result$treeData$0$ch = _slicedToArray(result.treeData[0].children, 3),
existingChild0 = _result$treeData$0$ch[0],
existingChild1 = _result$treeData$0$ch[1],
expectedNewNode = _result$treeData$0$ch[2];
expect(expectedNewNode).toEqual(nestedParams.newNode);
expect([existingChild0, existingChild1]).toEqual(nestedParams.treeData[0].children);
});
it('should add new node as first child if addAsFirstChild is true', function () {
var result = (0, _treeDataUtils.addNodeUnderParent)(_objectSpread(_objectSpread({}, nestedParams), {}, {
parentKey: 0,
getNodeKey: keyFromKey,
addAsFirstChild: true
}));
var _result$treeData$0$ch2 = _toArray(result.treeData[0].children),
expectedNewNode = _result$treeData$0$ch2[0],
previousChildren = _result$treeData$0$ch2.slice(1);
expect(expectedNewNode).toEqual(nestedParams.newNode);
expect(previousChildren).toEqual(nestedParams.treeData[0].children);
});
});
describe('insertNode', function () {
it('should handle empty data', function () {
expect((0, _treeDataUtils.insertNode)({
treeData: [],
depth: 0,
minimumTreeIndex: 0,
newNode: {},
getNodeKey: keyFromTreeIndex
})).toEqual({
parentNode: null,
treeData: [{}],
treeIndex: 0,
path: [0]
});
expect((0, _treeDataUtils.insertNode)({
treeData: null,
depth: 0,
minimumTreeIndex: 0,
newNode: {},
getNodeKey: keyFromTreeIndex
})).toEqual({
parentNode: null,
treeData: [{}],
treeIndex: 0,
path: [0]
});
expect((0, _treeDataUtils.insertNode)({
treeData: undefined,
depth: 0,
minimumTreeIndex: 0,
newNode: {},
getNodeKey: keyFromTreeIndex
})).toEqual({
parentNode: null,
treeData: [{}],
treeIndex: 0,
path: [0]
});
});
it('should handle a depth that is deeper than any branch in the tree', function () {
var treeData = [{
expanded: true,
key: 0,
children: [{
expanded: true,
key: 1,
children: [{
key: 2
}, {
key: 3
}]
}]
}];
expect((0, _treeDataUtils.insertNode)({
treeData: treeData,
depth: 4,
minimumTreeIndex: 0,
newNode: {
key: 'new'
},
getNodeKey: keyFromKey
}).treeData[0]).toEqual({
key: 'new'
});
});
it('should handle a minimumTreeIndex that is too big', function () {
var treeData = [{
expanded: true,
key: 0,
children: [{
expanded: true,
key: 1,
children: [{
key: 2
}, {
key: 3
}]
}]
}, {
key: 4
}];
var insertResult = (0, _treeDataUtils.insertNode)({
treeData: treeData,
depth: 0,
minimumTreeIndex: 15,
newNode: {
key: 'new'
},
getNodeKey: keyFromKey
});
expect(insertResult.treeData[2]).toEqual({
key: 'new'
});
expect(insertResult.treeIndex).toEqual(5);
expect(insertResult.path).toEqual(['new']);
insertResult = (0, _treeDataUtils.insertNode)({
treeData: treeData,
depth: 2,
minimumTreeIndex: 15,
newNode: {
key: 'new'
},
getNodeKey: keyFromKey
});
expect(insertResult.treeData[1].children[0]).toEqual({
key: 'new'
});
expect(insertResult.treeIndex).toEqual(5);
expect(insertResult.path).toEqual([4, 'new']);
});
it('should handle flat data (before)', function () {
expect((0, _treeDataUtils.insertNode)({
treeData: [{
key: 0
}],
depth: 0,
minimumTreeIndex: 0,
newNode: {
key: 1
},
getNodeKey: keyFromKey
})).toEqual({
parentNode: null,
treeData: [{
key: 1
}, {
key: 0
}],
treeIndex: 0,
path: [1]
});
});
it('should handle flat data (after)', function () {
expect((0, _treeDataUtils.insertNode)({
treeData: [{
key: 0
}],
depth: 0,
minimumTreeIndex: 1,
newNode: {
key: 1
},
getNodeKey: keyFromKey
})).toEqual({
parentNode: null,
treeData: [{
key: 0
}, {
key: 1
}],
treeIndex: 1,
path: [1]
});
});
it('should handle flat data (child)', function () {
expect((0, _treeDataUtils.insertNode)({
treeData: [{
key: 0
}],
depth: 1,
minimumTreeIndex: 1,
newNode: {
key: 1
},
getNodeKey: keyFromKey
})).toEqual({
parentNode: {
key: 0,
children: [{
key: 1
}]
},
treeData: [{
key: 0,
children: [{
key: 1
}]
}],
treeIndex: 1,
path: [0, 1]
});
}); // Tree looks like this
// /\
// 0 6
// / \
// 1 5
// / \
// 2 3
// \
// 4
var nestedParams = {
treeData: [// Depth 0
{
expanded: true,
key: 0,
children: [// Depth 1
{
expanded: true,
key: 1,
children: [// Depth 2
{
key: 2
}, {
expanded: false,
key: 3,
children: [// Depth 3
{
key: 4
}]
}, {
key: 5
}]
}, {
key: 6
}]
}, {
key: 7
}],
newNode: {
key: 'new'
},
getNodeKey: keyFromKey
};
it('should handle nested data #1', function () {
var result = (0, _treeDataUtils.insertNode)(_objectSpread(_objectSpread({}, nestedParams), {}, {
depth: 1,
minimumTreeIndex: 4
}));
expect(result.treeData[0].children[1]).toEqual(nestedParams.newNode);
expect(result.treeIndex).toEqual(5);
expect(result.path).toEqual([0, 'new']);
});
it('should handle nested data #2', function () {
var result = (0, _treeDataUtils.insertNode)(_objectSpread(_objectSpread({}, nestedParams), {}, {
depth: 2,
ignoreCollapsed: true,
minimumTreeIndex: 5
}));
expect(result.treeData[0].children[0].children[3]).toEqual(nestedParams.newNode);
expect(result.treeIndex).toEqual(5);
expect(result.path).toEqual([0, 1, 'new']);
result = (0, _treeDataUtils.insertNode)(_objectSpread(_objectSpread({}, nestedParams), {}, {
depth: 2,
ignoreCollapsed: false,
minimumTreeIndex: 5
}));
expect(result.treeData[0].children[0].children[2]).toEqual(nestedParams.newNode);
expect(result.treeIndex).toEqual(5);
expect(result.path).toEqual([0, 1, 'new']);
});
it('should handle nested data #3', function () {
var result = (0, _treeDataUtils.insertNode)(_objectSpread(_objectSpread({}, nestedParams), {}, {
depth: 3,
minimumTreeIndex: 3
}));
expect(result.treeData[0].children[0].children[0].children[0]).toEqual(nestedParams.newNode);
expect(result.treeIndex).toEqual(3);
expect(result.path).toEqual([0, 1, 2, 'new']);
});
it('should handle nested data #4', function () {
expect((0, _treeDataUtils.insertNode)({
treeData: [{
key: 0,
expanded: true,
children: [{
key: 1
}]
}, {
key: 2
}],
newNode: {
key: 'new'
},
depth: 1,
minimumTreeIndex: 3,
getNodeKey: keyFromTreeIndex
})).toEqual({
parentNode: {
key: 2,
children: [{
key: 'new'
}]
},
treeData: [{
key: 0,
expanded: true,
children: [{
key: 1
}]
}, {
key: 2,
children: [{
key: 'new'
}]
}],
treeIndex: 3,
path: [2, 3]
});
});
it('should work with a preceding node with children #1', function () {
expect((0, _treeDataUtils.insertNode)({
treeData: [{
children: [{}]
}, {
expanded: true,
children: [{}, {}]
}],
newNode: {
key: 'new'
},
depth: 1,
minimumTreeIndex: 3,
getNodeKey: keyFromTreeIndex
})).toEqual({
parentNode: {
expanded: true,
children: [{}, {
key: 'new'
}, {}]
},
treeData: [{
children: [{}]
}, {
expanded: true,
children: [{}, {
key: 'new'
}, {}]
}],
treeIndex: 3,
path: [1, 3]
});
});
it('should work with a preceding node with children #2', function () {
expect((0, _treeDataUtils.insertNode)({
treeData: [{
children: [{}]
}, {
expanded: true,
children: [{}, {}]
}],
newNode: {
key: 'new'
},
depth: 2,
minimumTreeIndex: 4,
getNodeKey: keyFromTreeIndex
})).toEqual({
parentNode: {
children: [{
key: 'new'
}]
},
treeData: [{
children: [{}]
}, {
expanded: true,
children: [{}, {
children: [{
key: 'new'
}]
}]
}],
treeIndex: 4,
path: [1, 3, 4]
});
});
it('should work with a preceding node with children #3', function () {
expect((0, _treeDataUtils.insertNode)({
treeData: [{
children: [{}, {}, {}, {}]
}, {
expanded: true,
children: [{}, {}]
}],
newNode: {
key: 'new'
},
depth: 2,
minimumTreeIndex: 4,
getNodeKey: keyFromTreeIndex
})).toEqual({
parentNode: {
children: [{
key: 'new'
}]
},
treeData: [{
children: [{}, {}, {}, {}]
}, {
expanded: true,
children: [{}, {
children: [{
key: 'new'
}]
}]
}],
treeIndex: 4,
path: [1, 3, 4]
});
});
it('should work with nodes with an empty children array', function () {
expect((0, _treeDataUtils.insertNode)({
treeData: [{
expanded: true,
children: [{
expanded: true,
children: [{
children: []
}]
}]
}],
newNode: {
key: 'new'
},
depth: 2,
minimumTreeIndex: 2,
getNodeKey: keyFromTreeIndex
})).toEqual({
parentNode: {
expanded: true,
children: [{
key: 'new'
}, {
children: []
}]
},
treeData: [{
expanded: true,
children: [{
expanded: true,
children: [{
key: 'new'
}, {
children: []
}]
}]
}],
treeIndex: 2,
path: [0, 1, 2]
});
});
});
describe('walk', function () {
it('should handle empty data', function () {
[[], null, undefined].forEach(function (treeData) {
expect(function () {
return (0, _treeDataUtils.walk)({
treeData: treeData,
getNodeKey: keyFromTreeIndex,
callback: function callback() {
throw new Error('callback ran');
}
});
}).not.toThrow();
});
});
it('should handle flat and nested data', function () {
[{
treeData: [{}],
expected: 1
}, {
treeData: [{}, {}],
expected: 2
}, {
treeData: [{}, {
children: [{}]
}, {}],
expected: 3
}, {
treeData: [{}, {
children: [{}]
}, {}],
ignoreCollapsed: false,
expected: 4
}].forEach(function (_ref6) {
var treeData = _ref6.treeData,
expected = _ref6.expected,
_ref6$ignoreCollapsed = _ref6.ignoreCollapsed,
ignoreCollapsed = _ref6$ignoreCollapsed === void 0 ? true : _ref6$ignoreCollapsed;
var callCount = 0;
(0, _treeDataUtils.walk)({
treeData: treeData,
ignoreCollapsed: ignoreCollapsed,
getNodeKey: keyFromTreeIndex,
callback: function callback() {
callCount += 1;
}
});
expect(callCount).toEqual(expected);
});
});
it('should return correct params', function () {
var paths = [[0], [1], [1, 2], [3]];
var counter = 0;
(0, _treeDataUtils.walk)({
treeData: [{}, {
children: [{}]
}, {}],
ignoreCollapsed: false,
getNodeKey: keyFromTreeIndex,
callback: function callback(_ref7) {
var treeIndex = _ref7.treeIndex,
path = _ref7.path;
expect(treeIndex).toEqual(counter);
expect(path).toEqual(paths[treeIndex]);
counter += 1;
}
});
});
it('should cut walk short when false is returned', function () {
var treeData = [{
expanded: true,
key: 0,
children: [{
key: 2
}, {
key: 3
}]
}, {
key: 6
}];
expect(function () {
return (0, _treeDataUtils.walk)({
treeData: treeData,
getNodeKey: keyFromTreeIndex,
callback: function callback(_ref8) {
var node = _ref8.node;
if (node.key === 2) {
// Cut walk short with false
return false;
} else if (node.key === 3) {
throw new Error('walk not terminated by false');
}
return true;
}
});
}).not.toThrow();
});
it('can get parents while walking', function () {
var treeData = [{
key: 1,
children: [{
key: 12,
children: [{
key: 3
}]
}, {
key: 4
}]
}, {
key: 5
}];
var results = [];
(0, _treeDataUtils.walk)({
treeData: treeData,
getNodeKey: keyFromTreeIndex,
ignoreCollapsed: false,
callback: function callback(_ref9) {
var parentNode = _ref9.parentNode;
results.push(parentNode ? parentNode.key : null);
}
});
expect(results).toEqual([null, 1, 12, 1, null]);
});
});
describe('getTreeFromFlatData', function () {
var rootKey = -1;
var argDefaults = {
rootKey: rootKey,
getKey: function getKey(node) {
return node.key;
},
getParentKey: function getParentKey(node) {
return node.parentKey;
}
};
var checkFunction = function checkFunction(_ref10) {
var flatData = _ref10.flatData,
expected = _ref10.expected;
expect((0, _treeDataUtils.getTreeFromFlatData)(_objectSpread(_objectSpread({}, argDefaults), {}, {
flatData: flatData
}))).toEqual(expected);
};
it('should handle empty data', function () {
[{
flatData: [],
expected: []
}, {
flatData: null,
expected: []
}, {
flatData: undefined,
expected: []
}].forEach(checkFunction);
});
it('should handle [depth == 1] data', function () {
[{
flatData: [{
key: 1,
parentKey: rootKey
}, {
key: 2,
parentKey: rootKey
}],
expected: [{
key: 1,
parentKey: rootKey
}, {
key: 2,
parentKey: rootKey
}]
}, {
flatData: [{
key: '1',
parentKey: rootKey
}, {
key: '2',
parentKey: rootKey
}],
expected: [{
key: '1',
parentKey: rootKey
}, {
key: '2',
parentKey: rootKey
}]
}].forEach(checkFunction);
});
it('should handle [depth == 2] data', function () {
[{
flatData: [{
key: 1,
parentKey: rootKey
}, {
key: 2,
parentKey: 1
}],
expected: [{
key: 1,
parentKey: rootKey,
children: [{
key: 2,
parentKey: 1
}]
}]
}, {
flatData: [{
key: '1',
parentKey: rootKey
}, {
key: '2',
parentKey: '1'
}],
expected: [{
key: '1',
parentKey: rootKey,
children: [{
key: '2',
parentKey: '1'
}]
}]
}].forEach(checkFunction);
});
it('should handle [depth > 2] nested data', function () {
[{
flatData: [{
key: 3,
parentKey: 2
}, {
key: 1,
parentKey: rootKey
}, {
key: 2,
parentKey: 1
}],
expected: [{
key: 1,
parentKey: rootKey,
children: [{
key: 2,
parentKey: 1,
children: [{
key: 3,
parentKey: 2
}]
}]
}]
}, {
flatData: [{
key: 4,
parentKey: 2
}, {
key: 3,
parentKey: 2
}, {
key: 7,
parentKey: rootKey
}, {
key: 1,
parentKey: rootKey
}, {
key: 2,
parentKey: 1
}, {
key: 6,
parentKey: 1
}],
expected: [{
key: 7,
parentKey: rootKey
}, {
key: 1,
parentKey: rootKey,
children: [{
key: 2,
parentKey: 1,
children: [{
key: 4,
parentKey: 2
}, {
key: 3,
parentKey: 2
}]
}, {
key: 6,
parentKey: 1
}]
}]
}].forEach(checkFunction);
});
});
describe('map', function () {
var checkFunction = function checkFunction(_ref11) {
var treeData = _ref11.treeData,
getNodeKey = _ref11.getNodeKey,
callback = _ref11.callback,
ignoreCollapsed = _ref11.ignoreCollapsed,
expected = _ref11.expected;
expect((0, _treeDataUtils.map)({
treeData: treeData,
getNodeKey: getNodeKey,
callback: callback,
ignoreCollapsed: ignoreCollapsed
})).toEqual(expected);
};
it('should handle empty data', function () {
[{
treeData: [],
getNodeKey: keyFromKey,
callback: function callback(_ref12) {
var node = _ref12.node;
return node;
},
expected: []
}, {
treeData: null,
getNodeKey: keyFromKey,
callback: function callback(_ref13) {
var node = _ref13.node;
return node;
},
expected: []
}, {
treeData: undefined,
getNodeKey: keyFromKey,
callback: function callback(_ref14) {
var node = _ref14.node;
return node;
},
expected: []
}].forEach(checkFunction);
});
it('can return tree as-is', function () {
[{
getNodeKey: keyFromKey,
callback: function callback(_ref15) {
var node = _ref15.node;
return node;
},
treeData: [{
key: 1
}, {
key: 2
}],
expected: [{
key: 1
}, {
key: 2
}]
}, {
getNodeKey: keyFromKey,
callback: function callback(_ref16) {
var node = _ref16.node;
return node;
},
treeData: [{
key: 1,
children: [{
key: 2
}]
}],
expected: [{
key: 1,
children: [{
key: 2
}]
}]
}, {
getNodeKey: keyFromKey,
callback: function callback(_ref17) {
var node = _ref17.node;
return node;
},
treeData: [{
key: 1,
children: [{
key: 12,
children: [{
key: 3
}]
}, {
key: 4
}]
}, {
key: 5
}],
expected: [{
key: 1,
children: [{
key: 12,
children: [{
key: 3
}]
}, {
key: 4
}]
}, {
key: 5
}]
}].forEach(checkFunction);
});
it('can truncate part of the tree', function () {
[{
getNodeKey: keyFromKey,
callback: function callback(_ref18) {
var node = _ref18.node;
return node.key === 1 ? _objectSpread(_objectSpread({}, node), {}, {
children: []
}) : node;
},
treeData: [{
key: 1,
children: [{
key: 12,
children: [{
key: 3
}]
}, {
key: 4
}]
}, {
key: 5
}],
expected: [{
key: 1,
children: []
}, {
key: 5
}]
}].forEach(checkFunction);
});
it('can get parents', function () {
checkFunction({
getNodeKey: keyFromKey,
callback: function callback(_ref19) {
var node = _ref19.node,
parentNode = _ref19.parentNode;
return _objectSpread(_objectSpread({}, node), {}, {
parentKey: parentNode ? parentNode.key : null
});
},
ignoreCollapsed: false,
treeData: [{
key: 1,
children: [{
key: 12,
children: [{
key: 3
}]
}, {
key: 4
}]
}, {
key: 5
}],
expected: [{
key: 1,
parentKey: null,
children: [{
key: 12,
parentKey: 1,
children: [{
key: 3,
parentKey: 12
}]
}, {
key: 4,