UNPKG

d3-sankey-diagram

Version:
108 lines (90 loc) 4.03 kB
import groupedGraph from '../../src/assignRanks/grouped-graph.js' import tape from 'tape' import { Graph } from '@dagrejs/graphlib' // XXX reversing edges into Smin and out of Smax? // XXX reversing edges marked as "right to left"? tape('rank assignment: groupedGraph() produces one group per node, without ranksets', (test) => { const graph = new Graph({ directed: true, multigraph: true }) graph.setNode('a', {}) graph.setNode('b', {}) graph.setNode('c', {}) graph.setEdge('a', 'b', {}) graph.setEdge('a', 'c', {}) const GG = groupedGraph(graph) test.deepEqual(GG.nodes(), ['0', '1', '2']) test.deepEqual(GG.node('0'), {type: 'min', nodes: ['a']}) test.deepEqual(GG.node('1'), {type: 'same', nodes: ['b']}) test.deepEqual(GG.node('2'), {type: 'same', nodes: ['c']}) test.deepEqual(GG.edges(), [{v: '0', w: '1'}, {v: '0', w: '2'}]) test.end() }) tape('rank assignment: groupedGraph() ignores repeated edges', (test) => { const graph = new Graph({ directed: true, multigraph: true }) graph.setNode('a', {}) graph.setNode('b', {}) graph.setEdge('a', 'b', {}, 'x') graph.setEdge('a', 'b', {}, 'y') const GG = groupedGraph(graph) test.deepEqual(GG.nodes(), ['0', '1']) test.deepEqual(GG.node('0'), {type: 'min', nodes: ['a']}) test.deepEqual(GG.node('1'), {type: 'same', nodes: ['b']}) test.deepEqual(GG.edges(), [{v: '0', w: '1'}]) test.end() }) tape('rank assignment: groupedGraph() produces one group per rankset', (test) => { const graph = new Graph({ directed: true, multigraph: true }) graph.setNode('a', {}) graph.setNode('b', {}) graph.setNode('c', {}) graph.setEdge('a', 'b', {}) graph.setEdge('a', 'c', {}) const GG = groupedGraph(graph, [{type: 'same', nodes: ['b', 'c']}]) test.deepEqual(GG.nodes(), ['0', '1']) test.deepEqual(GG.node('0'), {type: 'min', nodes: ['a']}) test.deepEqual(GG.node('1'), {type: 'same', nodes: ['b', 'c']}) test.deepEqual(GG.edges(), [{v: '0', w: '1'}]) test.end() }) tape('rank assignment: groupedGraph() respects explicit "min" rankset', (test) => { const graph = new Graph({ directed: true, multigraph: true }) graph.setNode('a', {}) graph.setNode('b', {}) graph.setNode('c', {}) graph.setEdge('a', 'b', {}) graph.setEdge('a', 'c', {}) const GG = groupedGraph(graph, [{type: 'min', nodes: ['b', 'c']}]) test.deepEqual(GG.nodes(), ['0', '1']) test.deepEqual(GG.node('0'), {type: 'min', nodes: ['b', 'c']}) test.deepEqual(GG.node('1'), {type: 'same', nodes: ['a']}) test.deepEqual(GG.edges(), [{v: '1', w: '0'}]) test.end() }) function testGroupedGraph (d0, d1) { const graph = new Graph({ directed: true, multigraph: true }) graph.setNode('a', {backwards: d0 === 'l'}) graph.setNode('b', {backwards: d1 === 'l'}) graph.setEdge('a', 'b', {}) return groupedGraph(graph) } tape('rank assignment: linkDelta = 0 for links that change direction, 1 otherwise', (test) => { test.deepEqual(testGroupedGraph('r', 'r').edge('0', '1'), {delta: 1}, 'rr1') test.deepEqual(testGroupedGraph('r', 'r').edge('1', '0'), undefined, 'rr2') test.deepEqual(testGroupedGraph('r', 'l').edge('0', '1'), {delta: 0}, 'rl1') test.deepEqual(testGroupedGraph('r', 'l').edge('1', '0'), undefined, 'rl2') test.deepEqual(testGroupedGraph('l', 'l').edge('1', '0'), {delta: 1}, 'll1') test.deepEqual(testGroupedGraph('l', 'l').edge('0', '1'), undefined, 'll2') test.deepEqual(testGroupedGraph('l', 'r').edge('1', '0'), {delta: 0}, 'lr1') test.deepEqual(testGroupedGraph('l', 'r').edge('0', '1'), undefined, 'lr2') test.end() }) function testGroupedGraphLoop (d) { const graph = new Graph({ directed: true, multigraph: true }) graph.setNode('a', {backwards: d === 'l'}) graph.setEdge('a', 'a', {}) return groupedGraph(graph) } tape('rank assignment: groupedGraph() sets delta on self-loops to 0', (test) => { test.deepEqual(testGroupedGraphLoop('r').edge('0', '0'), {delta: 0}, 'r') test.deepEqual(testGroupedGraphLoop('l').edge('0', '0'), {delta: 0}, 'r') test.end() })