From 80668fff1a037a30ace5a2427ed43d57b06df5f1 Mon Sep 17 00:00:00 2001 From: Vasco Santos Date: Wed, 15 Jul 2020 11:21:34 +0200 Subject: [PATCH] feat: arrayEquals for non primitive types with equals function --- src/array-equals.js | 14 ++++++++ test/array-equals.spec.js | 76 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 src/array-equals.js create mode 100644 test/array-equals.spec.js diff --git a/src/array-equals.js b/src/array-equals.js new file mode 100644 index 0000000..e293167 --- /dev/null +++ b/src/array-equals.js @@ -0,0 +1,14 @@ +'use strict' + +/** + * Verify if two arrays of non primitive types with the "equals" function are equal. + * Compatible with multiaddr, peer-id and Buffer. + * @param {Array<*>} a + * @param {Array<*>} b + * @returns {boolean} + */ +function arrayEquals (a, b) { + return a.length === b.length && b.sort() && a.sort().every((item, index) => b[index].equals(item)) +} + +module.exports = arrayEquals diff --git a/test/array-equals.spec.js b/test/array-equals.spec.js new file mode 100644 index 0000000..36c60cc --- /dev/null +++ b/test/array-equals.spec.js @@ -0,0 +1,76 @@ +/* eslint-env mocha */ +'use strict' + +const chai = require('chai') +const dirtyChai = require('dirty-chai') +const expect = chai.expect +chai.use(dirtyChai) + +const multiaddr = require('multiaddr') + +const arrayEquals = require('../src/array-equals') + +describe('non primitive array equals', () => { + it('returns true if two arrays of multiaddrs are equal', () => { + const a = [ + multiaddr('/ip4/127.0.0.1/tcp/8000'), + multiaddr('/ip4/127.0.0.1/tcp/3000/ws'), + multiaddr('/dns4/test.libp2p.io') + ] + + const b = [ + multiaddr('/ip4/127.0.0.1/tcp/8000'), + multiaddr('/ip4/127.0.0.1/tcp/3000/ws'), + multiaddr('/dns4/test.libp2p.io') + ] + + expect(arrayEquals(a, b)).to.eql(true) + }) + + it('returns true if two arrays of multiaddrs have the same content but different orders', () => { + const a = [ + multiaddr('/ip4/127.0.0.1/tcp/8000'), + multiaddr('/ip4/127.0.0.1/tcp/3000/ws'), + multiaddr('/dns4/test.libp2p.io') + ] + + const b = [ + multiaddr('/ip4/127.0.0.1/tcp/3000/ws'), + multiaddr('/ip4/127.0.0.1/tcp/8000'), + multiaddr('/dns4/test.libp2p.io') + ] + + expect(arrayEquals(a, b)).to.eql(true) + }) + + it('returns false if two arrays of multiaddrs are different', () => { + const a = [ + multiaddr('/ip4/127.0.0.1/tcp/8000'), + multiaddr('/ip4/127.0.0.1/tcp/3000/ws'), + multiaddr('/dns4/test.libp2p.io') + ] + + const b = [ + multiaddr('/ip4/127.0.0.1/tcp/8001'), + multiaddr('/ip4/127.0.0.1/tcp/3000/ws'), + multiaddr('/dns4/test.libp2p.io') + ] + + expect(arrayEquals(a, b)).to.eql(false) + }) + + it('returns false if two arrays of multiaddrs are partially equal, but different lengths', () => { + const a = [ + multiaddr('/ip4/127.0.0.1/tcp/8000'), + multiaddr('/ip4/127.0.0.1/tcp/3000/ws'), + multiaddr('/dns4/test.libp2p.io') + ] + + const b = [ + multiaddr('/ip4/127.0.0.1/tcp/8001'), + multiaddr('/dns4/test.libp2p.io') + ] + + expect(arrayEquals(a, b)).to.eql(false) + }) +})