dist-javascript-algorithms-and-data-structures
Version:
Algorithms and data-structures implemented on JavaScript
90 lines (76 loc) • 4.23 kB
JavaScript
"use strict";
var _BinaryTreeNode = _interopRequireDefault(require("../../../../data-structures/tree/BinaryTreeNode"));
var _depthFirstSearch = _interopRequireDefault(require("../depthFirstSearch"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
describe('depthFirstSearch', () => {
it('should perform DFS operation on tree', () => {
const nodeA = new _BinaryTreeNode.default('A');
const nodeB = new _BinaryTreeNode.default('B');
const nodeC = new _BinaryTreeNode.default('C');
const nodeD = new _BinaryTreeNode.default('D');
const nodeE = new _BinaryTreeNode.default('E');
const nodeF = new _BinaryTreeNode.default('F');
const nodeG = new _BinaryTreeNode.default('G');
nodeA.setLeft(nodeB).setRight(nodeC);
nodeB.setLeft(nodeD).setRight(nodeE);
nodeC.setLeft(nodeF).setRight(nodeG); // In-order traversing.
expect(nodeA.toString()).toBe('D,B,E,A,F,C,G');
const enterNodeCallback = jest.fn();
const leaveNodeCallback = jest.fn(); // Traverse tree without callbacks first to check default ones.
(0, _depthFirstSearch.default)(nodeA); // Traverse tree with callbacks.
(0, _depthFirstSearch.default)(nodeA, {
enterNode: enterNodeCallback,
leaveNode: leaveNodeCallback
});
expect(enterNodeCallback).toHaveBeenCalledTimes(7);
expect(leaveNodeCallback).toHaveBeenCalledTimes(7); // Check node entering.
expect(enterNodeCallback.mock.calls[0][0].value).toEqual('A');
expect(enterNodeCallback.mock.calls[1][0].value).toEqual('B');
expect(enterNodeCallback.mock.calls[2][0].value).toEqual('D');
expect(enterNodeCallback.mock.calls[3][0].value).toEqual('E');
expect(enterNodeCallback.mock.calls[4][0].value).toEqual('C');
expect(enterNodeCallback.mock.calls[5][0].value).toEqual('F');
expect(enterNodeCallback.mock.calls[6][0].value).toEqual('G'); // Check node leaving.
expect(leaveNodeCallback.mock.calls[0][0].value).toEqual('D');
expect(leaveNodeCallback.mock.calls[1][0].value).toEqual('E');
expect(leaveNodeCallback.mock.calls[2][0].value).toEqual('B');
expect(leaveNodeCallback.mock.calls[3][0].value).toEqual('F');
expect(leaveNodeCallback.mock.calls[4][0].value).toEqual('G');
expect(leaveNodeCallback.mock.calls[5][0].value).toEqual('C');
expect(leaveNodeCallback.mock.calls[6][0].value).toEqual('A');
});
it('allow users to redefine node visiting logic', () => {
const nodeA = new _BinaryTreeNode.default('A');
const nodeB = new _BinaryTreeNode.default('B');
const nodeC = new _BinaryTreeNode.default('C');
const nodeD = new _BinaryTreeNode.default('D');
const nodeE = new _BinaryTreeNode.default('E');
const nodeF = new _BinaryTreeNode.default('F');
const nodeG = new _BinaryTreeNode.default('G');
nodeA.setLeft(nodeB).setRight(nodeC);
nodeB.setLeft(nodeD).setRight(nodeE);
nodeC.setLeft(nodeF).setRight(nodeG); // In-order traversing.
expect(nodeA.toString()).toBe('D,B,E,A,F,C,G');
const enterNodeCallback = jest.fn();
const leaveNodeCallback = jest.fn(); // Traverse tree without callbacks first to check default ones.
(0, _depthFirstSearch.default)(nodeA); // Traverse tree with callbacks.
(0, _depthFirstSearch.default)(nodeA, {
allowTraversal: (node, child) => {
// Forbid traversing left part of the tree.
return child.value !== 'B';
},
enterNode: enterNodeCallback,
leaveNode: leaveNodeCallback
});
expect(enterNodeCallback).toHaveBeenCalledTimes(4);
expect(leaveNodeCallback).toHaveBeenCalledTimes(4); // Check node entering.
expect(enterNodeCallback.mock.calls[0][0].value).toEqual('A');
expect(enterNodeCallback.mock.calls[1][0].value).toEqual('C');
expect(enterNodeCallback.mock.calls[2][0].value).toEqual('F');
expect(enterNodeCallback.mock.calls[3][0].value).toEqual('G'); // Check node leaving.
expect(leaveNodeCallback.mock.calls[0][0].value).toEqual('F');
expect(leaveNodeCallback.mock.calls[1][0].value).toEqual('G');
expect(leaveNodeCallback.mock.calls[2][0].value).toEqual('C');
expect(leaveNodeCallback.mock.calls[3][0].value).toEqual('A');
});
});