UNPKG

indexed

Version:

database-like indexed array that always returns a new array

127 lines (121 loc) 5.47 kB
import chai from 'chai' import Indexed from '../src/' const {asClosure,wrapArray:wrap,BREAK,SKIP,isArrayLike} = Indexed; var expect = chai.expect; function verify(wrapped,closed,n){ expect(closed.indexes('name').size).to.equal(n) expect(closed.value().length).to.equal(n) expect(wrapped.indexes('name').size).to.equal(n) expect(wrapped.length).to.equal(n) } describe('Methods that return a new indexed object',()=>{ describe('Returns a subset of items',()=>{ describe('findMany(predicate:function|array[string,string]|array[string,RegExp]|array[string,function])',()=>{ describe('findMany(fn)',()=>{ it('should return the objects when the provided function returns true',()=>{ var wrapped = wrap([{name:'b'},{name:'d'},{name:'a'},{name:'c'}],'name'); var objs = wrapped.findMany((el,i)=>{ return i<2; }); expect(objs).to.eql([ {name:'b'} , {name:'d'} , {name:'a'} , {name:'c'} ].slice(0,2)); }) it('should return an empty array if no object matches the function',()=>{ var wrapped = wrap([{name:'b'},{name:'d'},{name:'a'},{name:'c'}],'name'); var objs = wrapped.findMany((el)=>{ return el.name=='e'; }); expect(objs.length).to.equal(0) }) it('should return the same object type that ran the function',()=>{ var wrapped = wrap([{name:'b'},{name:'d'},{name:'a'},{name:'c'}],'name'); var objs = wrapped.findMany((el,i)=>{ return i<2; }); expect(objs).to.have.property('indexes'); expect(objs.indexes()).to.be.instanceOf(Map) }) }) describe('findMany([propName,prop])',()=>{ it('should return the objects index who\'s property `propName` is equal to the provided `prop`',()=>{ var wrapped = wrap([{name:'b'},{name:'d'},{name:'a'},{name:'c'}],'name'); var objs = wrapped.findMany(['name','d']); var get = wrapped.get('name'); expect(objs).to.eql([get('d')]) }) it('should return the objects who\'s property `propName` matches the provided RegExp `prop`',()=>{ var wrapped = wrap([{name:'b'},{name:'d'},{name:'a'},{name:'c'}],'name'); var objs = wrapped.findMany(['name',/a|c/]); var get = wrapped.get('name'); expect(objs).to.eql([get('a'),get('c')]) }) }) describe('findMany([propName,fn])',()=>{ it('should return the objects for which fn returns true',()=>{ var wrapped = wrap([{name:'b'},{name:'d'},{name:'a'},{name:'c'}],'name'); var objs = wrapped.findMany(['name',(key)=>/b|d/.test(key)]) var get = wrapped.get('name'); expect(objs).to.eql([get('b'),get('d')]) }) it('should return an empty array if no objsect returned true',()=>{ var wrapped = wrap([{name:'b'},{name:'d'},{name:'a'},{name:'c'}],'name'); var objs = wrapped.findMany(['name',(key)=>/n/.test(key)]); expect(objs.length).to.be.equal(0); }) }) }) describe('transform(function[,thisArg])',()=>{ it('should be an equivalent to map(), with a contract that returned objects are indexable',()=>{ var wrapped = wrap([{name:'b'},{name:'d'},{name:'a'},{name:'c'}],'name'); function map({name},i){return {name:name+'a',i};} var resultTransformed = wrapped.transform(map); var resultMapped = wrapped.map(map); expect(resultTransformed).to.eql(resultMapped); expect(resultTransformed).to.have.property('indexes') expect(resultMapped).to.not.have.property('indexes') }) it('should reindex',()=>{ var wrapped = wrap([{name:'b'},{name:'d'},{name:'a'},{name:'c'}],'name'); var closed = asClosure([{name:'b'},{name:'d'},{name:'a'},{name:'c'}],'name'); function map({name},i){return {name:name+'a',i};} var resultWrapped = wrapped.transform(map); var resultClosed = closed.transform(map); verify(resultWrapped,resultClosed,4); expect(resultWrapped.indexes('name').get('ba')).to.equal(0) expect(resultClosed.indexes('name').get('ba')).to.equal(0) }) it('should stop when BREAK signal is returned',()=>{ var wrapped = wrap([{name:'b'},{name:'d'},{name:'a'},{name:'c'}],'name'); var closed = asClosure([{name:'b'},{name:'d'},{name:'a'},{name:'c'}],'name'); function map({name},i){return i>=2?BREAK:{name:name+'a',i};} var resultWrapped = wrapped.transform(map); var resultClosed = closed.transform(map); verify(resultWrapped,resultClosed,2); expect(resultWrapped.indexes('name').get('ba')).to.equal(0) expect(resultClosed.indexes('name').get('ba')).to.equal(0) }) it('should skip when SKIP signal is returned',()=>{ var wrapped = wrap([{name:'b'},{name:'d'},{name:'a'},{name:'c'}],'name'); function map({name},i){return i%2?{name:name+'a',i}:SKIP;} var resultWrapped = wrapped.transform(map); expect(resultWrapped.length).to.equal(2); expect(resultWrapped.indexes('name').get('ba')).to.be.undefined; expect(resultWrapped.indexes('name').get('da')).to.equal(0) }) it('should filter falsy values',()=>{ var wrapped = wrap([{name:'b'},{name:'d'},{name:'a'},{name:'c'}],'name'); var closed = asClosure([{name:'b'},{name:'d'},{name:'a'},{name:'c'}],'name'); function map({name},i){return i%2?{name:name+'a',i}:false;} var resultWrapped = wrapped.transform(map); var resultClosed = closed.transform(map); verify(resultWrapped,resultClosed,2); expect(resultWrapped.indexes('name').get('da')).to.equal(0) expect(resultClosed.indexes('name').get('da')).to.equal(0) }) }) }) })