UNPKG

graphology

Version:

A robust and multipurpose Graph object for JavaScript.

213 lines (176 loc) 7.87 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = iteration; var _assert = _interopRequireDefault(require("assert")); var _take = _interopRequireDefault(require("obliterator/take")); var _nodes = _interopRequireDefault(require("./nodes")); var _edges = _interopRequireDefault(require("./edges")); var _neighbors = _interopRequireDefault(require("./neighbors")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } /** * Graphology Iteration Specs * =========================== * * Testing the iteration-related methods of the graph. */ function iteration(Graph, checkers) { return { Adjacency: { 'it should be possible to iterate over the graph\'s adjacency using callbacks.': function itShouldBePossibleToIterateOverTheGraphSAdjacencyUsingCallbacks() { var graph = new Graph(); graph.addNode(1); graph.addNode(2); graph.addNode(3); graph.addEdge(1, 2); graph.addEdge(2, 3); graph.addEdge(3, 1); graph.addUndirectedEdge(1, 2); graph.replaceNodeAttributes(2, { hello: 'world' }); var adjacency = []; graph.forEach(function (s, t, sa, ta, e, ea, u, g) { adjacency.push([u, s, t]); _assert["default"].deepStrictEqual(sa, graph.getNodeAttributes(s)); _assert["default"].deepStrictEqual(ta, graph.getNodeAttributes(t)); _assert["default"].deepStrictEqual(ea, graph.getEdgeAttributes(e)); _assert["default"].strictEqual(graph.isUndirected(e), u); _assert["default"].strictEqual(graph.hasGeneratedKey(e), g); }); _assert["default"].deepStrictEqual(adjacency, [[false, '1', '2'], [true, '1', '2'], [false, '2', '3'], [true, '2', '1'], [false, '3', '1']]); }, 'it should be possible to iterate over a multi graph\'s adjacency using callbacks.': function itShouldBePossibleToIterateOverAMultiGraphSAdjacencyUsingCallbacks() { var graph = new Graph({ multi: true }); graph.addNode(1); graph.addNode(2); graph.addNode(3); graph.addEdge(1, 2); graph.addEdge(2, 3); graph.addEdge(3, 1); graph.addEdgeWithKey('test', 2, 3); graph.addUndirectedEdge(1, 2); graph.replaceNodeAttributes(2, { hello: 'world' }); var adjacency = []; graph.forEach(function (s, t, sa, ta, e, ea, u, g) { adjacency.push([u, s, t]); _assert["default"].deepStrictEqual(sa, graph.getNodeAttributes(s)); _assert["default"].deepStrictEqual(ta, graph.getNodeAttributes(t)); _assert["default"].deepStrictEqual(ea, graph.getEdgeAttributes(e)); _assert["default"].strictEqual(graph.isUndirected(e), u); _assert["default"].strictEqual(graph.hasGeneratedKey(e), g); if (!g) _assert["default"].strictEqual(e, 'test'); }); _assert["default"].deepStrictEqual(adjacency, [[false, '1', '2'], [true, '1', '2'], [false, '2', '3'], [false, '2', '3'], [true, '2', '1'], [false, '3', '1']]); }, 'it should be possible to iterate over the graph\'s adjacency using callbacks until returning true.': function itShouldBePossibleToIterateOverTheGraphSAdjacencyUsingCallbacksUntilReturningTrue() { var graph = new Graph(); graph.addNode(1); graph.addNode(2); graph.addNode(3); graph.addEdge(1, 2); graph.addEdge(2, 3); graph.addEdge(3, 1); graph.addUndirectedEdge(1, 2); graph.replaceNodeAttributes(2, { hello: 'world' }); var adjacency = []; var broke = graph.forEachUntil(function (s, t, sa, ta, e, ea, u, g) { adjacency.push([u, s, t]); _assert["default"].deepStrictEqual(sa, graph.getNodeAttributes(s)); _assert["default"].deepStrictEqual(ta, graph.getNodeAttributes(t)); _assert["default"].deepStrictEqual(ea, graph.getEdgeAttributes(e)); _assert["default"].strictEqual(graph.isUndirected(e), u); _assert["default"].strictEqual(graph.hasGeneratedKey(e), g); if (sa.hello === 'world') return true; }); _assert["default"].strictEqual(broke, true); _assert["default"].deepStrictEqual(adjacency, [[false, '1', '2'], [true, '1', '2'], [false, '2', '3']]); broke = graph.forEachUntil(function () { return false; }); _assert["default"].strictEqual(broke, false); }, 'it should be possible to create an iterator over the graph\'s adjacency.': function itShouldBePossibleToCreateAnIteratorOverTheGraphSAdjacency() { var edgeKeyGenerator = function edgeKeyGenerator(_ref) { var undirected = _ref.undirected, source = _ref.source, target = _ref.target; return "".concat(source).concat(undirected ? '--' : '->').concat(target); }; var graph = new Graph({ edgeKeyGenerator: edgeKeyGenerator }); graph.addNode(1); graph.addNode(2); graph.addNode(3); graph.addEdge(1, 2); graph.addEdge(2, 3); graph.addEdge(3, 1); graph.addUndirectedEdge(1, 2); graph.replaceNodeAttributes(2, { hello: 'world' }); var adj = (0, _take["default"])(graph.adjacency()).map(function (p) { return [p[0], p[1], p[4]]; }); _assert["default"].deepStrictEqual(adj, [['1', '2', '1->2'], ['1', '2', '1--2'], ['2', '3', '2->3'], ['2', '1', '1--2'], ['3', '1', '3->1']]); }, 'it should be possible to create an iterator over a multi graph\'s adjacency.': function itShouldBePossibleToCreateAnIteratorOverAMultiGraphSAdjacency() { var graph = new Graph({ multi: true }); graph.addNode(1); graph.addNode(2); graph.addNode(3); graph.addEdgeWithKey(0, 1, 2); graph.addEdgeWithKey(1, 2, 3); graph.addEdgeWithKey(2, 3, 1); graph.addEdgeWithKey(3, 2, 3); graph.addUndirectedEdgeWithKey(4, 1, 2); graph.replaceNodeAttributes(2, { hello: 'world' }); var adj = (0, _take["default"])(graph.adjacency()).map(function (p) { return [p[0], p[1], p[4]]; }); _assert["default"].deepStrictEqual(adj, [['1', '2', '0'], ['1', '2', '4'], ['2', '3', '1'], ['2', '3', '3'], ['2', '1', '4'], ['3', '1', '2']]); }, 'it should be possible to iterate via Symbol.iterator.': function itShouldBePossibleToIterateViaSymbolIterator() { if (typeof Symbol === 'undefined') return; var edgeKeyGenerator = function edgeKeyGenerator(_ref2) { var undirected = _ref2.undirected, source = _ref2.source, target = _ref2.target; return "".concat(source).concat(undirected ? '--' : '->').concat(target); }; var graph = new Graph({ edgeKeyGenerator: edgeKeyGenerator }); graph.addNode(1); graph.addNode(2); graph.addNode(3); graph.addEdge(1, 2); graph.addEdge(2, 3); graph.addEdge(3, 1); graph.addUndirectedEdge(1, 2); graph.replaceNodeAttributes(2, { hello: 'world' }); var adj = (0, _take["default"])(graph[Symbol.iterator]()).map(function (p) { return [p[0], p[1], p[4]]; }); _assert["default"].deepStrictEqual(adj, [['1', '2', '1->2'], ['1', '2', '1--2'], ['2', '3', '2->3'], ['2', '1', '1--2'], ['3', '1', '3->1']]); } }, Nodes: (0, _nodes["default"])(Graph, checkers), Edges: (0, _edges["default"])(Graph, checkers), Neighbors: (0, _neighbors["default"])(Graph, checkers) }; }