UNPKG

c3-linearization

Version:

A package that implements the C3 linearization algorithm

60 lines (50 loc) 2.13 kB
const assert = require('assert'); const { linearize } = require('../index') describe('C3', function() { it('linearizes trivial case', function() { assert.deepEqual(linearize({'A': []}), {'A': ['A']}) }) it('linearizes single inheritance case', function() { assert.deepEqual( linearize({'A': ['B'], 'B': ['C'], 'C': []}), {'A': ['A', 'B', 'C'], 'B': ['B', 'C'], 'C': ['C']} ) }) it('linearizes multiple inheritance case', function() { assert.deepEqual( linearize({'A': [], 'B': [], 'C': [], 'D': [], 'E': [], 'K1': ['A', 'B', 'C'], 'K2': ['D', 'B', 'E'], 'K3': ['D', 'A'], 'Z': ['K1', 'K2', 'K3']}), {'A': ['A'], 'B': ['B'], 'C': ['C'], 'D': ['D'], 'E': ['E'], 'K1': ['K1', 'A', 'B', 'C'], 'K2': ['K2', 'D', 'B', 'E'], 'K3': ['K3', 'D', 'A'], 'Z': ['Z', 'K1', 'K2', 'K3', 'D', 'A', 'B', 'C', 'E']} ) }) it('linearizes with missing elements', function() { assert.deepEqual( linearize({'K1': ['A', 'B', 'C'], 'K2': ['D', 'B', 'E'], 'K3': ['D', 'A'], 'Z': ['K1', 'K2', 'K3']}), {'A': ['A'], 'B': ['B'], 'C': ['C'], 'D': ['D'], 'E': ['E'], 'K1': ['K1', 'A', 'B', 'C'], 'K2': ['K2', 'D', 'B', 'E'], 'K3': ['K3', 'D', 'A'], 'Z': ['Z', 'K1', 'K2', 'K3', 'D', 'A', 'B', 'C', 'E']} ) }) it('linearizes well Solidity and Python', function() { const input = { ERC721Enumerable: ['ERC721Basic'], ERC721Metadata: ['ERC721Basic'], ERC721: ['ERC721Basic', 'ERC721Enumerable', 'ERC721Metadata'], }; assert.deepEqual( linearize(input, { reverse: true }), { ERC721Enumerable: ['ERC721Enumerable', 'ERC721Basic'], ERC721Metadata: ['ERC721Metadata', 'ERC721Basic'], ERC721: ['ERC721', 'ERC721Metadata', 'ERC721Enumerable', 'ERC721Basic'], ERC721Basic: ['ERC721Basic'] } ); assert.throws( function() { linearize(input, { python: true }) }, Error ); }) it('reports circular dependencies correctly', function () { assert.throws( function() { linearize({ a: ['b'], b: ['c'], c: ['b'] }) }, new Error('circular dependency found') ) }) })