{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-active-expression-proxies/src/client/reactive/test/stream.spec.js"],"names":["chai","expect","sinon","sinonChai","Stream","use","dataSpyFor","stream","dataSpy","spy","on","endSpyFor","endSpy","s","result","write","reset","end","withArgs","lateDataSpy","secondEndSpy","dest","src","pipe","map","d","src1","src2","zip","src3"],"mappings":"AAAA;;;;;;;;;;;;;;;;AACOA,U;AAAOC,Y,sBAAAA,M;;AACPC,W;;AACAC,e;;AAGAC,Y;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAFP,yFAAKC,GAAL,wFAASF,SAAT;;;;;;;;;;;;;;;;;;;AAIA,oFAAS,SAAT,EAAoB,YAAW;AAAA;;;AAE7B,iBAASG,UAAT,CAAoBC,MAApB,EAA4B;AAAA;;AAC1B,gBAAMC,kFAAU,sFAAMC,GAAN,EAAV,CAAN;AAD0B;AAE1B,oGAAOC,EAAP,CAAU,MAAV,sFAAkBF,OAAlB;AACA,oGAAOA,OAAP;AACD;;AAED,iBAASG,SAAT,CAAmBJ,MAAnB,EAA2B;AAAA;;AACzB,gBAAMK,iFAAS,sFAAMH,GAAN,EAAT,CAAN;AADyB;AAEzB,oGAAOC,EAAP,CAAU,KAAV,oFAAiBE,MAAjB;AACA,kGAAOA,MAAP;AACD;;AAED,0EAAG,YAAH,EAAiB,MAAM;AACrB,qNAAOR,MAAP;AACD,SAFD;AAGA,sFAAS,kBAAT,EAA6B,YAAW;AACtC,4EAAG,oBAAH,EAAyB,MAAM;AAAA;;AAC7B,kBAAMS,IAAI,qFAAIT,MAAJ,GAAV;;AAEA,kBAAMU,4EAAS,2EAAEJ,EAAF,CAAK,MAAL,EAAa,MAAM,CAAE,CAArB,CAAT,CAAN;AACA,oNAAOI,MAAP,6FAAwBD,CAAxB;AACD,WALD;;AAOA,4EAAG,2CAAH,EAAgD,MAAM;AAAA;;AACpD,kBAAMA,IAAI,qFAAIT,MAAJ,GAAV;AACA,kBAAMI,UAAU,gLAAWK,CAAX,EAAhB;AACA,kBAAMD,SAAS,6KAAUC,CAAV,EAAf;;AAEA,sOAAOL,OAAP;AACA,oOAAOI,MAAP;;AANoD;AAQpD,wFAAEG,KAAF,CAAQ,CAAR;AACA,2NAAOP,OAAP;AACA,kOAAOA,OAAP,iCAAiC,CAAjC;AAVoD;AAWpD,0GAAQQ,KAAR;AACA,oOAAOJ,MAAP;;AAZoD;AAcpD,wFAAEG,KAAF,CAAQ,CAAR;AACA,2NAAOP,OAAP;AACA,kOAAOA,OAAP,iCAAiC,CAAjC;AAhBoD;AAiBpD,0GAAQQ,KAAR;AACA,oOAAOJ,MAAP;;AAlBoD;AAoBpD,wFAAEK,GAAF;AACA,sOAAOT,OAAP;AACA,yNAAOI,MAAP;AACD,WAvBD;;AAyBA,4EAAG,2CAAH,EAAgD,MAAM;AAAA;;AACpD,kBAAMC,IAAI,qFAAIT,MAAJ,GAAV;AADoD;AAEpD,wFAAEW,KAAF,CAAQ,CAAR;AAFoD;AAGpD,wFAAEA,KAAF,CAAQ,CAAR;AAHoD;AAIpD,wFAAEE,GAAF;;AAEA,kBAAMT,UAAU,gLAAWK,CAAX,EAAhB;AACA,kBAAMD,SAAS,6KAAUC,CAAV,EAAf;;AAEA,2NAAOL,OAAP;AACA,4NAAO,8FAAQU,QAAR,CAAiB,CAAjB,CAAP,kHAA+C,8FAAQA,QAAR,CAAiB,CAAjB,CAA/C;AACA,4NAAO,8FAAQA,QAAR,CAAiB,CAAjB,CAAP,sHAA+CN,MAA/C;AACA,yNAAOA,MAAP;AACD,WAbD;;AAeA,4EAAG,iDAAH,EAAsD,MAAM;AAAA;;AAC1D,kBAAMC,IAAI,qFAAIT,MAAJ,GAAV;AAD0D;AAE1D,wFAAEW,KAAF,CAAQ,CAAR;AAF0D;AAG1D,wFAAEE,GAAF;;AAEA,kBAAMT,UAAU,gLAAWK,CAAX,EAAhB;;AAEA,2NAAOL,OAAP;AACA,kOAAOA,OAAP,iCAAiC,CAAjC;AAR0D;AAS1D,0GAAQQ,KAAR;;AAT0D;AAW1D,wFAAED,KAAF,CAAQ,CAAR;AACA,sOAAOP,OAAP;AACD,WAbD;;AAeA,4EAAG,wCAAH,EAA6C,MAAM;AAAA;;AACjD,kBAAMK,IAAI,qFAAIT,MAAJ,GAAV;AADiD;AAEjD,wFAAEa,GAAF;;AAEA,kBAAMT,UAAU,gLAAWK,CAAX,EAAhB;AACA,kBAAMD,SAAS,6KAAUC,CAAV,EAAf;;AAEA,sOAAOL,OAAP;AACA,yNAAOI,MAAP;;AARiD;AAUjD,wFAAEG,KAAF,CAAQ,CAAR;AACA,sOAAOP,OAAP;;AAEA,kBAAMW,cAAc,gLAAWN,CAAX,EAApB;AACA,8OAAOM,WAAP;AACD,WAfD;;AAiBA,4EAAG,uBAAH,EAA4B,MAAM;AAAA;;AAChC,kBAAMN,IAAI,qFAAIT,MAAJ,GAAV;AADgC;AAEhC,wFAAEa,GAAF;;AAEA,kBAAML,SAAS,6KAAUC,CAAV,EAAf;;AAEA,yNAAOD,MAAP;AANgC;AAOhC,uGAAOI,KAAP;;AAPgC;AAShC,wFAAEC,GAAF;AACA,oOAAOL,MAAP;;AAEA,kBAAMQ,eAAe,6KAAUP,CAAV,EAArB;AACA,qOAAOO,YAAP;AACD,WAdD;AAeD,SA/FD;;AAiGA,sFAAS,MAAT,EAAiB,YAAW;AAC1B,4EAAG,2CAAH,EAAgD,MAAM;AAAA;;AACpD,kBAAMC,OAAO,qFAAIjB,MAAJ,GAAb;AACA,kBAAMU,2BAAS,qFAAIV,MAAJ,GAAT,0FAA2BiB,IAA3B,GAAN;;AAEA,qNAAOP,MAAP,oGAAwBO,IAAxB;AACD,WALD;;AAOA,4EAAG,sDAAH,EAA2D,MAAM;AAAA;;AAC/D,kBAAMC,MAAM,qFAAIlB,MAAJ,GAAZ;AACA,kBAAMiB,OAAO,qFAAIjB,MAAJ,GAAb;;AAEA,kBAAMI,UAAU,sLAAWa,IAAX,EAAhB;AACA,kBAAMT,SAAS,mLAAUS,IAAV,EAAf;;AAL+D;AAO/D,8FAAIN,KAAJ,CAAU,CAAV;AAP+D;AAQ/D,8FAAIE,GAAJ;;AAR+D;AAU/D,8FAAIM,IAAJ,gFAASF,IAAT;;AAEA,2NAAOb,OAAP;AACA,kOAAOA,OAAP,iCAAiC,CAAjC;AACA,yNAAOI,MAAP;AACA,kOAAOJ,OAAP,sHAAmCI,MAAnC;AACD,WAhBD;;AAkBA,4EAAG,sCAAH,EAA2C,MAAM;AAAA;;AAC/C,kBAAMU,MAAM,qFAAIlB,MAAJ,GAAZ;AACA,kBAAMiB,OAAO,qFAAIjB,MAAJ,GAAb;AAF+C;AAG/C,8FAAImB,IAAJ,gFAASF,IAAT;;AAEA,kBAAMb,UAAU,sLAAWa,IAAX,EAAhB;AACA,kBAAMT,SAAS,mLAAUS,IAAV,EAAf;;AAEA,sOAAOb,OAAP;AACA,oOAAOI,MAAP;;AAT+C;AAW/C,8FAAIG,KAAJ,CAAU,CAAV;;AAEA,2NAAOP,OAAP;AACA,kOAAOA,OAAP,iCAAiC,CAAjC;AAd+C;AAe/C,0GAAQQ,KAAR;AACA,oOAAOJ,MAAP;;AAhB+C;AAkB/C,8FAAIK,GAAJ;;AAEA,sOAAOT,OAAP;AACA,yNAAOI,MAAP;AACD,WAtBD;AAuBD,SAjDD;;AAmDA,sFAAS,iBAAT,EAA4B,YAAW;AACrC,4EAAG,KAAH,EAAU,MAAM;AAAA;;AACd,kBAAMU,MAAM,qFAAIlB,MAAJ,GAAZ;;AADc;AAGd,8FAAIW,KAAJ,CAAU,CAAV;;AAEA,kBAAMM,6EAAO,kFAAIG,GAAJ,CAAQC;AAAA;AAAK,mGAAI,MAAJ;AAAL,aAAR,CAAP,CAAN;;AAEA,kBAAMjB,UAAU,sLAAWa,IAAX,EAAhB;AACA,kBAAMT,SAAS,mLAAUS,IAAV,EAAf;AACA,2NAAOb,OAAP;AACA,kOAAOA,OAAP,iCAAiC,OAAjC;AAVc;AAWd,0GAAQQ,KAAR;AACA,oOAAOJ,MAAP;;AAZc;AAcd,8FAAIG,KAAJ,CAAU,CAAV;AACA,2NAAOP,OAAP;AACA,kOAAOA,OAAP,iCAAiC,OAAjC;AAhBc;AAiBd,0GAAQQ,KAAR;AACA,oOAAOJ,MAAP;;AAlBc;AAoBd,8FAAIK,GAAJ;AACA,sOAAOT,OAAP;AACA,yNAAOI,MAAP;AAtBc;AAuBd,uGAAOI,KAAP;;AAvBc;AAyBd,8FAAID,KAAJ,CAAU,CAAV;AACA,sOAAOP,OAAP;AACA,oOAAOI,MAAP;AACD,WA5BD;;AA8BA,wFAAS,KAAT,EAAgB,YAAW;;AAEzB,8EAAG,iBAAH,EAAsB,MAAM;AAAA;;AAC1B,oBAAMc,OAAO,qFAAItB,MAAJ,GAAb;AACA,oBAAMuB,OAAO,qFAAIvB,MAAJ,GAAb;;AAEA,oBAAMiB,8EAAO,qFAAKO,GAAL,gFAASD,IAAT,EAAP,CAAN;;AAEA,oBAAMnB,UAAU,sLAAWa,IAAX,EAAhB;AACA,oBAAMT,SAAS,mLAAUS,IAAV,EAAf;;AAEA,wOAAOb,OAAP;AACA,sOAAOI,MAAP;;AAV0B;AAY1B,mGAAKG,KAAL,CAAW,CAAX;AACA,wOAAOP,OAAP;AACA,sOAAOI,MAAP;;AAd0B;AAgB1B,mGAAKG,KAAL,CAAW,CAAX;AACA,wOAAOP,OAAP;AACA,sOAAOI,MAAP;;AAlB0B;AAoB1B,mGAAKG,KAAL,CAAW,GAAX;AACA,6NAAOP,OAAP;AACA,oOAAOA,OAAP,iCAAiC,CAAC,CAAD,EAAG,GAAH,CAAjC;AAtB0B;AAuB1B,4GAAQQ,KAAR;AACA,sOAAOJ,MAAP;;AAxB0B;AA0B1B,mGAAKG,KAAL,CAAW,CAAX;AACA,wOAAOP,OAAP;AACA,sOAAOI,MAAP;;AA5B0B;AA8B1B,mGAAKG,KAAL,CAAW,GAAX;AACA,6NAAOP,OAAP;AACA,oOAAOA,OAAP,iCAAiC,CAAC,CAAD,EAAG,GAAH,CAAjC;AAhC0B;AAiC1B,4GAAQQ,KAAR;AACD,aAlCD;;AAoCA,8EAAG,kDAAH,EAAuD,MAAM;AAAA;;AAC3D,oBAAMU,OAAO,qFAAItB,MAAJ,GAAb;AAD2D;AAE3D,mGAAKW,KAAL,CAAW,CAAX;AAF2D;AAG3D,mGAAKA,KAAL,CAAW,CAAX;AAH2D;AAI3D,mGAAKA,KAAL,CAAW,CAAX;;AAEA,oBAAMY,OAAO,qFAAIvB,MAAJ,GAAb;AAN2D;AAO3D,mGAAKW,KAAL,CAAW,GAAX;AAP2D;AAQ3D,mGAAKA,KAAL,CAAW,GAAX;;AAEA,oBAAMM,8EAAO,qFAAKO,GAAL,gFAASD,IAAT,EAAP,CAAN;AACA,oBAAMnB,UAAU,sLAAWa,IAAX,EAAhB;AACA,oBAAMT,SAAS,mLAAUS,IAAV,EAAf;;AAEA,6NAAOb,OAAP;AACA,8NAAO,8FAAQU,QAAR,CAAiB,CAAC,CAAD,EAAG,GAAH,CAAjB,CAAP,kHAAqD,8FAAQA,QAAR,CAAiB,CAAC,CAAD,EAAG,GAAH,CAAjB,CAArD;AACA,sOAAON,MAAP;AACD,aAjBD;;AAmBA,8EAAG,2BAAH,EAAgC,MAAM;AAAA;;AACpC,oBAAMc,OAAO,qFAAItB,MAAJ,GAAb;AACA,oBAAMuB,OAAO,qFAAIvB,MAAJ,GAAb;;AAEA,oBAAMiB,8EAAO,qFAAKO,GAAL,gFAASD,IAAT,EAAP,CAAN;AACA,oBAAMnB,UAAU,sLAAWa,IAAX,EAAhB;AACA,oBAAMT,SAAS,mLAAUS,IAAV,EAAf;;AANoC;AAQpC,mGAAKN,KAAL,CAAW,CAAX;AARoC;AASpC,mGAAKE,GAAL;;AAEA,wOAAOT,OAAP;AACA,sOAAOI,MAAP;;AAZoC;AAcpC,mGAAKG,KAAL,CAAW,GAAX;;AAEA,6NAAOP,OAAP;AACA,oOAAOA,OAAP,iCAAiC,CAAC,CAAD,EAAI,GAAJ,CAAjC;AACA,2NAAOI,MAAP;AACD,aAnBD;;AAsBA,8EAAG,+BAAH,EAAoC,MAAM;AAAA;;AACxC,oBAAMc,OAAO,qFAAItB,MAAJ,GAAb;AACA,oBAAMuB,OAAO,qFAAIvB,MAAJ,GAAb;AACA,oBAAMyB,OAAO,qFAAIzB,MAAJ,GAAb;;AAEA,oBAAMiB,8EAAO,qFAAKO,GAAL,gFAASD,IAAT,kFAAeE,IAAf,EAAP,CAAN;AACA,oBAAMrB,UAAU,sLAAWa,IAAX,EAAhB;AACA,oBAAMT,SAAS,mLAAUS,IAAV,EAAf;;AAPwC;AASxC,mGAAKN,KAAL,CAAW,CAAX;AATwC;AAUxC,mGAAKA,KAAL,CAAW,CAAX;AAVwC;AAWxC,mGAAKA,KAAL,CAAW,GAAX;;AAEA,wOAAOP,OAAP;AACA,sOAAOI,MAAP;;AAdwC;AAgBxC,mGAAKG,KAAL,CAAW,OAAX;;AAEA,6NAAOP,OAAP;AACA,oOAAOA,OAAP,iCAAiC,CAAC,CAAD,EAAI,GAAJ,EAAS,OAAT,CAAjC;AAnBwC;AAoBxC,4GAAQQ,KAAR;AACA,sOAAOJ,MAAP;;AArBwC;AAuBxC,mGAAKG,KAAL,CAAW,OAAX;;AAEA,wOAAOP,OAAP;AACA,sOAAOI,MAAP;;AA1BwC;AA4BxC,mGAAKG,KAAL,CAAW,GAAX;;AAEA,6NAAOP,OAAP;AACA,oOAAOA,OAAP,iCAAiC,CAAC,CAAD,EAAI,GAAJ,EAAS,OAAT,CAAjC;AA/BwC;AAgCxC,4GAAQQ,KAAR;AACA,sOAAOJ,MAAP;;AAjCwC;AAmCxC,mGAAKK,GAAL;;AAEA,wOAAOT,OAAP;AACA,2NAAOI,MAAP;AACD,aAvCD;AAwCD,WAvHD;AAwHD,SAvJD;AAwJD,OA7TD","file":"stream.spec.js","sourcesContent":["\"enable aexpr\";\nimport chai, {expect} from 'src/external/chai.js';\nimport sinon from 'src/external/sinon-3.2.1.js';\nimport sinonChai from 'src/external/sinon-chai.js';\nchai.use(sinonChai);\n\nimport Stream from 'src/client/reactive/stream.js';\n\ndescribe(\"Streams\", function() {\n  \n  function dataSpyFor(stream) {\n    const dataSpy = sinon.spy();\n    stream.on('data', dataSpy);\n    return dataSpy;\n  }\n  \n  function endSpyFor(stream) {\n    const endSpy = sinon.spy();\n    stream.on('end', endSpy);\n    return endSpy;\n  }\n  \n  it(\"is defined\", () => {\n    expect(Stream).to.be.ok;\n  });\n  describe(\"simple streaming\", function() {\n    it(\"`.on` in chainable\", () => {\n      const s = new Stream();\n\n      const result = s.on('data', () => {});\n      expect(result).to.equal(s);\n    });\n\n    it(\"streams data (setup listeners beforehand)\", () => {\n      const s = new Stream();\n      const dataSpy = dataSpyFor(s);\n      const endSpy = endSpyFor(s);\n      \n      expect(dataSpy).not.to.be.called;\n      expect(endSpy).not.to.be.called;\n\n      s.write(1);\n      expect(dataSpy).to.be.calledOnce;\n      expect(dataSpy).to.be.calledWith(1);\n      dataSpy.reset();\n      expect(endSpy).not.to.be.called;\n      \n      s.write(2);\n      expect(dataSpy).to.be.calledOnce;\n      expect(dataSpy).to.be.calledWith(2);\n      dataSpy.reset();\n      expect(endSpy).not.to.be.called;\n      \n      s.end();\n      expect(dataSpy).not.to.be.called;\n      expect(endSpy).to.be.calledOnce;\n    });\n\n    it(\"streams data (setup listeners afterwards)\", () => {\n      const s = new Stream();\n      s.write(1);\n      s.write(2);\n      s.end();\n      \n      const dataSpy = dataSpyFor(s);\n      const endSpy = endSpyFor(s);\n      \n      expect(dataSpy).to.be.calledTwice;\n      expect(dataSpy.withArgs(1)).to.be.calledBefore(dataSpy.withArgs(2));\n      expect(dataSpy.withArgs(2)).to.be.calledBefore(endSpy);\n      expect(endSpy).to.be.calledOnce;\n    });\n    \n    it(\"ended streams still emit previously stored data\", () => {\n      const s = new Stream();\n      s.write(1);\n      s.end();\n\n      const dataSpy = dataSpyFor(s);\n      \n      expect(dataSpy).to.be.calledOnce;\n      expect(dataSpy).to.be.calledWith(1);\n      dataSpy.reset();\n      \n      s.write(2);\n      expect(dataSpy).not.to.be.called;\n    });\n    \n    it(\"ended streams do not emit further data\", () => {\n      const s = new Stream();\n      s.end();\n\n      const dataSpy = dataSpyFor(s);\n      const endSpy = endSpyFor(s);\n      \n      expect(dataSpy).not.to.be.called;\n      expect(endSpy).to.be.calledOnce;\n\n      s.write(1);\n      expect(dataSpy).not.to.be.called;\n      \n      const lateDataSpy = dataSpyFor(s);\n      expect(lateDataSpy).not.to.be.called;\n    });\n    \n    it(\"streams end only once\", () => {\n      const s = new Stream();\n      s.end();\n\n      const endSpy = endSpyFor(s);\n      \n      expect(endSpy).to.be.calledOnce;\n      endSpy.reset();\n\n      s.end();\n      expect(endSpy).not.to.be.called;\n      \n      const secondEndSpy = endSpyFor(s);\n      expect(secondEndSpy).to.be.calledOnce;\n    });\n  });\n  \n  describe(\"pipe\", function() {\n    it(\"returns the destination stream (chaining)\", () => {\n      const dest = new Stream();\n      const result = new Stream().pipe(dest);\n\n      expect(result).to.equal(dest);\n    });\n    \n    it(\"write data already present to the destination stream\", () => {\n      const src = new Stream();\n      const dest = new Stream();\n\n      const dataSpy = dataSpyFor(dest);\n      const endSpy = endSpyFor(dest);\n\n      src.write(1);\n      src.end();\n\n      src.pipe(dest);\n      \n      expect(dataSpy).to.be.calledOnce;\n      expect(dataSpy).to.be.calledWith(1);\n      expect(endSpy).to.be.calledOnce;\n      expect(dataSpy).to.be.calledBefore(endSpy);\n    });\n    \n    it(\"pipes data to the destination stream\", () => {\n      const src = new Stream();\n      const dest = new Stream();\n      src.pipe(dest);\n\n      const dataSpy = dataSpyFor(dest);\n      const endSpy = endSpyFor(dest);\n\n      expect(dataSpy).not.to.be.called;\n      expect(endSpy).not.to.be.called;\n\n      src.write(1);\n      \n      expect(dataSpy).to.be.calledOnce;\n      expect(dataSpy).to.be.calledWith(1);\n      dataSpy.reset();\n      expect(endSpy).not.to.be.called;\n      \n      src.end();\n      \n      expect(dataSpy).not.to.be.called;\n      expect(endSpy).to.be.calledOnce;\n    });\n  });\n  \n  describe(\"transformations\", function() {\n    it(\"map\", () => {\n      const src = new Stream();\n\n      src.write(1);\n\n      const dest = src.map(d => d + \"test\");\n\n      const dataSpy = dataSpyFor(dest);\n      const endSpy = endSpyFor(dest);\n      expect(dataSpy).to.be.calledOnce;\n      expect(dataSpy).to.be.calledWith('1test');\n      dataSpy.reset();\n      expect(endSpy).not.to.be.called;\n      \n      src.write(2);\n      expect(dataSpy).to.be.calledOnce;\n      expect(dataSpy).to.be.calledWith('2test');\n      dataSpy.reset();\n      expect(endSpy).not.to.be.called;\n\n      src.end();\n      expect(dataSpy).not.to.be.called;\n      expect(endSpy).to.be.calledOnce;\n      endSpy.reset();\n\n      src.write(3);\n      expect(dataSpy).not.to.be.called;\n      expect(endSpy).not.to.be.called;\n    });\n\n    describe(\"zip\", function() {\n    \n      it(\"zip two streams\", () => {\n        const src1 = new Stream();\n        const src2 = new Stream();\n\n        const dest = src1.zip(src2);\n\n        const dataSpy = dataSpyFor(dest);\n        const endSpy = endSpyFor(dest);\n\n        expect(dataSpy).not.to.be.called;\n        expect(endSpy).not.to.be.called;\n\n        src1.write(1);\n        expect(dataSpy).not.to.be.called;\n        expect(endSpy).not.to.be.called;\n\n        src1.write(2);\n        expect(dataSpy).not.to.be.called;\n        expect(endSpy).not.to.be.called;\n\n        src2.write('a');\n        expect(dataSpy).to.be.calledOnce;\n        expect(dataSpy).to.be.calledWith([1,'a']);\n        dataSpy.reset();\n        expect(endSpy).not.to.be.called;\n\n        src1.write(3);\n        expect(dataSpy).not.to.be.called;\n        expect(endSpy).not.to.be.called;\n\n        src2.write('b');\n        expect(dataSpy).to.be.calledOnce;\n        expect(dataSpy).to.be.calledWith([2,'b']);\n        dataSpy.reset();\n      });\n      \n      it(\"immediately pushes data already on input streams\", () => {\n        const src1 = new Stream();\n        src1.write(1);\n        src1.write(2);\n        src1.write(3);\n        \n        const src2 = new Stream();\n        src2.write('a');\n        src2.write('b');\n\n        const dest = src1.zip(src2);\n        const dataSpy = dataSpyFor(dest);\n        const endSpy = endSpyFor(dest);\n\n        expect(dataSpy).to.be.calledTwice;\n        expect(dataSpy.withArgs([1,'a'])).to.be.calledBefore(dataSpy.withArgs([2,'b']));\n        expect(endSpy).not.to.be.called;\n      });\n      \n      it(\"end a zipped stream early\", () => {\n        const src1 = new Stream();\n        const src2 = new Stream();\n\n        const dest = src1.zip(src2);\n        const dataSpy = dataSpyFor(dest);\n        const endSpy = endSpyFor(dest);\n\n        src1.write(1);\n        src1.end();\n\n        expect(dataSpy).not.to.be.called;\n        expect(endSpy).not.to.be.called;\n\n        src2.write('a');\n        \n        expect(dataSpy).to.be.calledOnce;\n        expect(dataSpy).to.be.calledWith([1, 'a']);\n        expect(endSpy).to.be.calledOnce;\n      });\n      \n      \n      it(\"handles more than two streams\", () => {\n        const src1 = new Stream();\n        const src2 = new Stream();\n        const src3 = new Stream();\n\n        const dest = src1.zip(src2, src3);\n        const dataSpy = dataSpyFor(dest);\n        const endSpy = endSpyFor(dest);\n\n        src1.write(1);\n        src1.write(2);\n        src2.write('a');\n\n        expect(dataSpy).not.to.be.called;\n        expect(endSpy).not.to.be.called;\n\n        src3.write('hello');\n\n        expect(dataSpy).to.be.calledOnce;\n        expect(dataSpy).to.be.calledWith([1, 'a', 'hello']);\n        dataSpy.reset();\n        expect(endSpy).not.to.be.called;\n        \n        src3.write('world');\n        \n        expect(dataSpy).not.to.be.called;\n        expect(endSpy).not.to.be.called;\n\n        src2.write('b');\n\n        expect(dataSpy).to.be.calledOnce;\n        expect(dataSpy).to.be.calledWith([2, 'b', 'world']);\n        dataSpy.reset();\n        expect(endSpy).not.to.be.called;\n        \n        src2.end();\n\n        expect(dataSpy).not.to.be.called;\n        expect(endSpy).to.be.calledOnce;\n      });\n    });\n  });\n});\n"]}