import { Graph } from '../util' describe('graph', () => { { { test('findVertex', () => { const graph = new Graph() const foo = graph.addVertex('foo', [], []) const bar = graph.addVertex( 'bar', [{ from: foo, metadata: 'foo-bar' }], [], ) const baz = graph.addVertex( 'baz', [{ from: bar, metadata: 'bar-baz' }], [], ) const qux = graph.addVertex( 'qux', [{ from: baz, metadata: 'baz-qux' }], [], ) const match = Array.from(graph.findVertex((v) => v.metadata === 'qux')) expect(match).toHaveLength(1) expect(match[0]).toBe(qux) }) test('shortestPathA', () => { const graph = new Graph() const foo = graph.addVertex('foo', [], []) const bar = graph.addVertex( 'bar', [{ from: foo, metadata: 'foo-bar' }], [], ) const baz = graph.addVertex( 'baz', [{ from: bar, metadata: 'bar-baz' }], [], ) const qux = graph.addVertex( 'qux', [{ from: baz, metadata: 'baz-qux' }], [], ) graph.addEdge('foo-qux', foo, qux) expect(graph.shortestPath(foo, qux) || []).toHaveLength(1) }) test('shortestPathB', () => { const graph = new Graph() const foo = graph.addVertex('foo', [], []) const bar = graph.addVertex( 'bar', [{ from: foo, metadata: 'foo-bar' }], [], ) const baz = graph.addVertex( 'baz', [{ from: bar, metadata: 'bar-baz' }], [], ) const qux = graph.addVertex( 'qux', [{ from: baz, metadata: 'baz-qux' }], [], ) graph.addEdge('bar-qux', bar, qux) expect(graph.shortestPath(foo, qux) || []).toHaveLength(2) }) test('shortestPathC', () => { const graph = new Graph() const foo = graph.addVertex('foo', [], []) const bar = graph.addVertex( 'bar', [{ from: foo, metadata: 'foo-bar' }], [], ) const baz = graph.addVertex( 'baz', [{ from: bar, metadata: 'bar-baz' }], [], ) const qux = graph.addVertex( 'qux', [{ from: baz, metadata: 'baz-qux' }], [{ to: foo, metadata: 'qux-foo' }], ) expect(graph.shortestPath(foo, qux) || []).toHaveLength(3) }) test('bfs', () => { const graph = new Graph() const foo = graph.addVertex('foo', [], []) const bar = graph.addVertex( 'bar', [{ from: foo, metadata: 'foo-bar' }], [], ) const baz = graph.addVertex( 'baz', [{ from: bar, metadata: 'bar-baz' }], [], ) const qux = graph.addVertex( 'qux', [ { from: foo, metadata: 'foo-qux' }, { from: baz, metadata: 'baz-qux' }, ], [], ) const bfs = Array.from(graph.breadthFirstSearch(foo)) expect(bfs).toHaveLength(4) expect(bfs[0]).toBe(foo) expect(bfs[1]).toBe(bar) expect(bfs[2]).toBe(qux) expect(bfs[3]).toBe(baz) }) test('reverseBfs', () => { const graph = new Graph() const foo = graph.addVertex('foo', [], []) const bar = graph.addVertex( 'bar', [{ from: foo, metadata: 'foo-bar' }], [], ) const baz = graph.addVertex( 'baz', [{ from: bar, metadata: 'bar-baz' }], [], ) const qux = graph.addVertex( 'qux', [ { from: foo, metadata: 'foo-qux' }, { from: baz, metadata: 'baz-qux' }, ], [], ) const bfs = Array.from(graph.reverseBreadthFirstSearch(qux)) expect(bfs).toHaveLength(4) expect(bfs[0]).toBe(qux) expect(bfs[1]).toBe(foo) expect(bfs[2]).toBe(baz) expect(bfs[3]).toBe(bar) }) } } })