{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-active-expression-proxies/src/client/reactive/test/life-cycle-management.spec.js"],"names":["chai","expect","sinon","sinonChai","BaseActiveExpression","frameBasedAExpr","wait","use","axp","value","spy","onChange","reset","deactivate","activate","val","expr","enable","done","aexpr","dispose","spy2","error","isDisposed","exp","exp2","disposeOnLastCallbackDetached","bool","offChange"],"mappings":"AAAA;;;;;;;;;;;;;;;;;AACOA,U;AAAOC,Y,sBAAAA,M;;AACPC,W;;AACAC,e;;AAGEC,0B,wDAAAA,oB;;AACGC,qB;;AAEHC,U,UAAAA,I;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AALT,yFAAKC,GAAL,wFAASJ,SAAT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,oFAAS,uBAAT,EAAkC,YAAW;AAC3C,sFAAS,cAAT,EAAyB,YAAW;AAClC,8EAAI,uCAAJ,EAA6C,MAAM;AAAA;;AACjD,gBAAIK,MAAM,OAAM,MAAM,CAAE,CAAd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAV;AACA,8MAAOA,GAAP,yBAAyB,UAAzB;AACA,8MAAOA,GAAP,yBAAyB,YAAzB;AACD,WAJD;;AAMA,8EAAI,iCAAJ,EAAuC,YAAW;AAAA;;AAChD,gBAAIC,QAAQ,CAAZ;AACA,gBAAIC,8EAAM,sFAAMA,GAAN,EAAN,CAAJ;AACA,gBAAIF,MAAM,OAAM;AAAMC;AAAN,aAAN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAV;AAHgD;AAIhD,8FAAIE,QAAJ,8EAAaD,GAAb;;AAEAD,oBAAQ,CAAR;AACA,mNAAOC,GAAP;AACA,0NAAOA,GAAP,sCAAkC,CAAlC;AARgD;AAShD,8FAAIE,KAAJ;;AATgD;AAWhD,8FAAIC,UAAJ;;AAEAJ,oBAAQ,CAAR;AACA,8NAAOC,GAAP;;AAEAD,oBAAQ,CAAR;AACA,8NAAOC,GAAP;;AAjBgD;AAmBhD,8FAAII,QAAJ;AACA,mNAAOJ,GAAP;AACA,0NAAOA,GAAP,sCAAkC,CAAlC;AArBgD;AAsBhD,8FAAIE,KAAJ;;AAtBgD;AAwBhD,8FAAIC,UAAJ;;AAEAJ,oBAAQ,CAAR;AACA,8NAAOC,GAAP;;AAEAD,oBAAQ,CAAR;AACA,8NAAOC,GAAP;;AA9BgD;AAgChD,8FAAII,QAAJ;AACA,mNAAOJ,GAAP;AACA,0NAAOA,GAAP,sCAAkC,CAAlC;AACD,WAnCD;AAoCD,SA3CD;;AA6CA;AACA;AACA,sFAAS,uBAAT,EAAkC,MAAM;AACtC,8EAAI,iDAAJ,EAAuD,MAAM;AAAA;;AAC3D,gBAAIK,MAAM,EAAV;AAAA,gBAAcL,8EAAM,sFAAMA,GAAN,EAAN,CAAd;;AAEA,uDAAM;AAAMK;AAAN,aAAN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0GACYL,GADZ;;AAIAK,kBAAM,EAAN;AACA,8NAAOL,GAAP;AACD,WATD;;AAWA,8EAAI,kEAAJ,EAAwE,MAAM;AAAA;;AAC5E,gBAAIK,MAAM,EAAV;AAAA,gBACIL,8EAAM,sFAAMA,GAAN,EAAN,CADJ;AAAA,gBAEIM,2CAAO,OAAM;AAAMD;AAAN,aAAN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAP,4FACcL,GADd,mBAFJ;;AAMAK,kBAAM,EAAN;AACA,8NAAOL,GAAP;;AAR4E;AAU5E,iGAAKO,MAAL;;AAEAF,kBAAM,EAAN;AACA,8NAAOL,GAAP;AACD,WAdD;AAgBD,SA5BD;;AA8BA,sFAAS,SAAT,EAAoB,YAAW;AAC7B,4EAAG,uBAAH,EAA4B,MAAM;AAChC,kIAAO,OAAM,MAAM,CAAE,CAAd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAP,wBAAqC,SAArC;AACD,WAFD;;AAIA,8FAAG,4BAAH,EAAiC,MAAMQ,IAAN,IAAc;AAAA;AAAA;;AAC7C,gBAAI;AAAA;;AACF,kBAAIT,QAAQ,CAAZ;AACA,kBAAIC,8EAAM,sFAAMA,GAAN,EAAN,CAAJ;AACA,kBAAIF,0FAAM,oHAAgBW,KAAhB,CAAsB;AAAMV;AAAN,eAAtB,CAAN,CAAJ;AAHE;AAIF,gGAAIE,QAAJ,8EAAaD,GAAb;;AAEA,gOAAOA,GAAP;;AAEAD,sBAAQ,CAAR;AACA,oBAAM,mFAAK,GAAL,CAAN;AACA,qNAAOC,GAAP;AACA,4NAAOA,GAAP,sCAAkC,CAAlC;AAXE;AAYF,gGAAIE,KAAJ;;AAZE;AAcF,gGAAIQ,OAAJ;;AAEAX,sBAAQ,CAAR;AACA,oBAAM,mFAAK,GAAL,CAAN;AACA,gOAAOC,GAAP;;AAEA,kBAAIW,+EAAO,sFAAMX,GAAN,EAAP,CAAJ;AApBE;AAqBF,gGAAIC,QAAJ,gFAAaU,IAAb;AACAZ,sBAAQ,CAAR;AACA,oBAAM,mFAAK,GAAL,CAAN;AACA,kOAAOY,IAAP;;AAEA;AACD,aA3BD,CA2BE,OAAMC,KAAN,EAAa;AACb,oLAAKA,KAAL;AACD;AACF,WA/BD,eA+BW,IA/BX;;AAiCA,4EAAG,0BAAH,EAA+B,MAAM;AAAA;;AACnC,gBAAIb,QAAQ,CAAZ;AACA,gBAAIC,8EAAM,sFAAMA,GAAN,EAAN,CAAJ;AACA,gBAAIF,MAAM,OAAM;AAAMC;AAAN,aAAN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAV;AAHmC;AAInC,8FAAIE,QAAJ,8EAAaD,GAAb;;AAEA,8NAAOA,GAAP;;AAEAD,oBAAQ,CAAR;AACA,mNAAOC,GAAP;AACA,0NAAOA,GAAP,sCAAkC,CAAlC;AAVmC;AAWnC,8FAAIE,KAAJ;;AAXmC;AAanC,8FAAIQ,OAAJ;;AAEAX,oBAAQ,CAAR;AACA,8NAAOC,GAAP;AACD,WAjBD;;AAmBA,4EAAG,sCAAH,EAA2C,MAAM;AAAA;;AAC/C,gBAAID,QAAQ,CAAZ;AACA,gBAAID,MAAM,OAAM;AAAMC;AAAN,aAAN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAV;AACA,gBAAIC,8EAAM,sFAAMA,GAAN,CAAU;AAAM,gLAAIU,OAAJ;AAAN,aAAV,CAAN,CAAJ;AAH+C;AAI/C,8FAAIT,QAAJ,8EAAaD,GAAb;;AAEAD,oBAAQ,CAAR;AACA,mNAAOC,GAAP;AACA,0NAAOA,GAAP,sCAAkC,CAAlC;AAR+C;AAS/C,8FAAIE,KAAJ;;AAEAH,oBAAQ,CAAR;AACA,8NAAOC,GAAP;AACD,WAbD;AAeD,SAxED;;AA0EA,sFAAS,YAAT,EAAuB,YAAW;AAChC,4EAAG,YAAH,EAAiB,MAAM;AACrB,+OAAON,oBAAP,yBAA0C,YAA1C;AACD,WAFD;AAGA,4EAAG,0BAAH,EAA+B,MAAM;AAAA;;AACnC,gBAAII,MAAM,OAAM;AAAM;AAAN,aAAN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAV;AACA,8NAAO,kFAAIe,UAAJ,EAAP;AAFmC;AAGnC,8FAAIH,OAAJ;AACA,mNAAO,kFAAIG,UAAJ,EAAP;AACD,WALD;AAMD,SAVD;;AAYA,sFAAS,+BAAT,EAA0C,YAAW;AACnD,4EAAG,YAAH,EAAiB,MAAM;AAAA;;AACrB,gBAAIC,MAAM,OAAM,MAAM,CAAE,CAAd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAV;AACA,+MAAOA,GAAP,yBAAyB,+BAAzB;AACD,WAHD;;AAKA,4EAAG,cAAH,EAAmB,MAAM;AAAA;;AACvB,gBAAIA,MAAM,OAAM,MAAM,CAAE,CAAd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAV;AACA,gBAAIC,uGAAO,kFAAIC,6BAAJ,EAAP,CAAJ;AACA,iNAAOD,IAAP,kGAAsBD,GAAtB;AACD,WAJD;;AAMA;AACA,4EAAG,OAAH,EAAY,MAAM;AAAA;;AAChB,gBAAId,8EAAM,sFAAMA,GAAN,EAAN,CAAJ;AACA,gBAAIiB,OAAO,KAAX;AACA,kBAAMX,yBAAO,OAAM;AAAMW;AAAN,aAAN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAP,4FACMjB,GADN,GAAN;;AAHgB;AAMhB,iGAAKgB,6BAAL;;AAEAC,mBAAO,IAAP;AACA,mNAAOjB,GAAP;;AATgB;AAWhB,iGAAKkB,SAAL,8EAAelB,GAAf;AACA;AACA;AACA;AACA,gOAAOM,IAAP;AACD,WAhBD;;AAkBA,4EAAG,uBAAH,EAA4B,MAAM;AAAA;;AAChC,gBAAIN,8EAAM,sFAAMA,GAAN,EAAN,CAAJ;AACA,gBAAIiB,OAAO,KAAX;AACA,kBAAMX,6DAAO,OAAM;AAAMW;AAAN,aAAN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAP,kIAEMjB,GAFN,gGAGOA,GAHP,GAAN;;AAKAiB,mBAAO,IAAP;AACA;AACA,gOAAOX,IAAP;AACD,WAXD;AAYH,SA3CC;AA4CD,OAhND","file":"life-cycle-management.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 { BaseActiveExpression } from 'src/client/reactive/active-expression/active-expression.js';\nimport * as frameBasedAExpr from \"active-expression-frame-based\";\n\nimport { wait } from 'utils';\n\ndescribe(\"life-cycle management\", function() {\n  describe(\"(de)activate\", function() {\n    xit(\"aexprs define activate and deactivate\", () => {\n      let axp = aexpr(() => {});\n      expect(axp).to.respondTo('activate');\n      expect(axp).to.respondTo('deactivate');\n    });\n    \n    xit(\"temporarily deactivate an aexpr\", function() {\n      let value = 0;\n      let spy = sinon.spy();\n      let axp = aexpr(() => value);\n      axp.onChange(spy);\n\n      value = 1;\n      expect(spy).to.be.calledOnce;\n      expect(spy).to.be.calledWithMatch(1);\n      spy.reset();\n\n      axp.deactivate();\n\n      value = 2;\n      expect(spy).not.to.be.called;\n\n      value = 3;\n      expect(spy).not.to.be.called;\n\n      axp.activate();\n      expect(spy).to.be.calledOnce;\n      expect(spy).to.be.calledWithMatch(3);\n      spy.reset();\n\n      axp.deactivate();\n\n      value = 4;\n      expect(spy).not.to.be.called;\n\n      value = 5;\n      expect(spy).not.to.be.called;\n\n      axp.activate();\n      expect(spy).to.be.calledOnce;\n      expect(spy).to.be.calledWithMatch(5);\n    });\n  });\n\n  // #TODO: duplicate with above (de-)activate\n  // #TODO: is this useful?\n  describe('disable and re-enable', () => {\n    xit(\"disabled aexprs do not fire notify the callback\", () => {\n      let val = 17, spy = sinon.spy();\n\n      aexpr(() => val)\n        .onChange(spy)\n        .disable();\n\n      val = 33;\n      expect(spy.called).to.be.false;\n    });\n\n    xit(\"disabled aexprs do nothing when explicitly listed to be checked2\", () => {\n      let val = 17,\n          spy = sinon.spy(),\n          expr = aexpr(() => val)\n              .onChange(spy)\n              .disable();\n\n      val = 33;\n      expect(spy.called).to.be.false;\n\n      expr.enable();\n\n      val = 33;\n      expect(spy.calledOnce).to.be.true;\n    });\n\n  });\n\n  describe(\"dispose\", function() {\n    it(\"aexprs define dispose\", () => {\n      expect(aexpr(() => {})).to.respondTo('dispose');\n    });\n\n    it(\"dispose frame-based aexprs\", async done => {\n      try {\n        let value = 0;\n        let spy = sinon.spy();\n        let axp = frameBasedAExpr.aexpr(() => value);\n        axp.onChange(spy);\n\n        expect(spy).not.to.be.called;\n\n        value = 1;\n        await wait(200);\n        expect(spy).to.be.calledOnce;\n        expect(spy).to.be.calledWithMatch(1);\n        spy.reset();\n\n        axp.dispose();\n\n        value = 2;\n        await wait(200);\n        expect(spy).not.to.be.called;\n\n        let spy2 = sinon.spy();\n        axp.onChange(spy2);\n        value = 3;\n        await wait(200);\n        expect(spy2).not.to.be.called;\n\n        done();\n      } catch(error) {\n        done(error);\n      }\n    }).timeout(3000);\n\n    it(\"dispose rewriting aexprs\", () => {\n      let value = 0;\n      let spy = sinon.spy();\n      let axp = aexpr(() => value);\n      axp.onChange(spy);\n\n      expect(spy).not.to.be.called;\n\n      value = 1;\n      expect(spy).to.be.calledOnce;\n      expect(spy).to.be.calledWithMatch(1);\n      spy.reset();\n\n      axp.dispose();\n\n      value = 2;\n      expect(spy).not.to.be.called;\n    });\n\n    it(\"dispose rewriting aexprs in callback\", () => {\n      let value = 0;\n      let axp = aexpr(() => value);\n      let spy = sinon.spy(() => axp.dispose());\n      axp.onChange(spy);\n\n      value = 1;\n      expect(spy).to.be.calledOnce;\n      expect(spy).to.be.calledWithMatch(1);\n      spy.reset();\n\n      value = 2;\n      expect(spy).not.to.be.called;\n    });\n    \n  });\n\n  describe(\"isDisposed\", function() {\n    it('is defined', () => {\n      expect(BaseActiveExpression).to.respondTo('isDisposed');\n    });\n    it('outputs disposing status', () => {\n      let axp = aexpr(() => true);\n      expect(axp.isDisposed()).not.to.be.ok;\n      axp.dispose();\n      expect(axp.isDisposed()).to.be.ok;\n    });\n  });\n\n  describe('disposeOnLastCallbackDetached', function() {\n    it('is defined', () => {\n      let exp = aexpr(() => {});\n      expect(exp).to.respondTo('disposeOnLastCallbackDetached');\n    });\n\n    it('is chainable', () => {\n      let exp = aexpr(() => {})\n      let exp2 = exp.disposeOnLastCallbackDetached();\n      expect(exp2).to.equal(exp);\n    });\n\n    // #TODO: proper test first\n    it('works', () => {\n      let spy = sinon.spy();\n      let bool = false\n      const expr = aexpr(() => bool)\n        .onChange(spy);\n      \n      expr.disposeOnLastCallbackDetached();\n      \n      bool = true;\n      expect(spy).to.be.calledOnce;\n      \n      expr.offChange(spy);\n      // bool = false;\n      // expect(spy).to.be.calledOnce;\n      // #TODO: use `aexpr.isDisposed()` instead\n      expect(expr._isDisposed).to.be.ok;\n    });\n\n    it('works instantaneously', () => {\n      let spy = sinon.spy();\n      let bool = false\n      const expr = aexpr(() => bool)\n        .disposeOnLastCallbackDetached()\n        .onChange(spy)\n        .offChange(spy);\n      \n      bool = true;\n      // #TODO: use `aexpr.isDisposed()` instead\n      expect(expr._isDisposed).to.be.ok;\n    });\n});\n});\n"]}