Cycles: flatten-o-tron fixes and tests

cycles-detection-with-context
Alexandre Hajjar 2020-09-24 23:05:08 +02:00
parent b5acf267bf
commit cbc3e74ea7
2 changed files with 62 additions and 4 deletions

View File

@ -60,7 +60,8 @@ export function flattenOneLevelRemplaceLoops(naiveGraph: Graph) {
const ROLLNodesTypes = new Proxy(
{},
{
get: (target, name) => (name in target ? target[name] : new Set())
get: (target, name) =>
name in target ? target[name] : (target[name] = new Set())
}
)
ROLLEdges.forEach(e => {

View File

@ -6,15 +6,72 @@ import { flattenOneLevelRemplaceLoops } from '../source/cyclesLib/graph'
import { cyclicDependencies } from '../source/cyclesLib'
describe('Remplace loops flatten-o-tron 2500 ™', () => {
it(`should replace 2 nodes referencing each other with formule and replacedBy by
4 nodes without loop`, () => {
describe('ROLL flatten-o-tron 2500 ™', () => {
it('should replace 2 ROLL nodes with 4 nodes without loop', () => {
const g = new graphlib.Graph()
g.setEdge('b', 'c', { type: DependencyType.formule })
g.setEdge('c', 'b', { type: DependencyType.replacedBy })
const flattenedGraph = flattenOneLevelRemplaceLoops(g)
expect(flattenedGraph.nodes()).to.deep.equal([
'b [depType: 0]',
'c [depType: 0]',
'c [depType: 1]',
'b [depType: 1]'
])
expect(flattenedGraph.edges()).to.deep.equal([
{ v: 'b [depType: 0]', w: 'c [depType: 0]' },
{ v: 'c [depType: 1]', w: 'b [depType: 1]' }
])
})
it('should replace 2 ROLL nodes in context of a larger graph', () => {
const g = new graphlib.Graph()
g.setEdge('a', 'b', { type: DependencyType.formule })
g.setEdge('a', 'c', { type: DependencyType.formule })
g.setEdge('b', 'c', { type: DependencyType.formule })
g.setEdge('c', 'b', { type: DependencyType.replacedBy })
g.setEdge('b', 'd', { type: DependencyType.formule })
g.setEdge('c', 'd', { type: DependencyType.formule })
const flattenedGraph = flattenOneLevelRemplaceLoops(g)
expect(flattenedGraph.nodes()).to.deep.equal([
'a',
'b [depType: 1]',
'b [depType: 0]',
'c [depType: 1]',
'c [depType: 0]',
'd'
])
expect(flattenedGraph.edges()).to.have.deep.members([
{ v: 'a', w: 'b [depType: 0]' },
{ v: 'a', w: 'b [depType: 1]' },
{ v: 'a', w: 'c [depType: 0]' },
{ v: 'a', w: 'c [depType: 1]' },
{ v: 'b [depType: 0]', w: 'c [depType: 0]' },
{ v: 'c [depType: 1]', w: 'b [depType: 1]' },
{ v: 'b [depType: 0]', w: 'd' },
{ v: 'b [depType: 1]', w: 'd' },
{ v: 'c [depType: 0]', w: 'd' },
{ v: 'c [depType: 1]', w: 'd' }
])
})
it('should not replace any nodes in a 2-level formule + remplace loop', () => {
const g = new graphlib.Graph()
g.setEdge('a', 'b', { type: DependencyType.formule })
g.setEdge('b', 'c', { type: DependencyType.formule })
g.setEdge('c', 'a', { type: DependencyType.replacedBy })
const flattenedGraph = flattenOneLevelRemplaceLoops(g)
expect(flattenedGraph.nodes()).to.deep.equal(['a', 'b', 'c'])
expect(flattenedGraph.edges()).to.deep.equal(g.edges())
})
})