{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tom/src/client/reactive/test/active-expression/set-expression.spec.js"],"names":["chai","expect","sinon","sinonChai","BaseActiveExpression","TickingActiveExpression","check","FrameBasedActiveExpression","use","bae","bae2","setExpression","TypeError","spy","obj","a","b","getCurrentValue","checkImmediately","ae","onChange","sleep"],"mappings":"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","file":"set-expression.spec.js","sourcesContent":["'enable aexpr';\n'use strict';\n\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 '../../active-expression/active-expression.js';\nimport { TickingActiveExpression, check } from '../../active-expression-convention/active-expression-ticking.js';\nimport { FrameBasedActiveExpression } from '../../active-expression-convention/active-expression-frame-based.js';\n\ndescribe('.setExpression', () => {\n  \n  it('responds to setExpression', () => {\n    expect(BaseActiveExpression).to.respondTo('setExpression');\n  });\n\n  it(\".setExpression is chainable\", () => {\n    const bae = new BaseActiveExpression(() => {});\n    const bae2 = bae.setExpression(() => {});\n    expect(bae === bae2).to.be.true;\n  });\n\n  it(\".setExpression throws if no function is given\", () => {\n    const bae = new BaseActiveExpression(() => {});\n\n    expect(() => {\n      bae.setExpression();\n    }).to.throw(TypeError, 'no function given');\n\n    expect(() => {\n      bae.setExpression(17);\n    }).to.throw(TypeError, 'no function given');\n\n    expect(() => {\n      bae.setExpression(() => {});\n    }).not.to.throw();\n  });\n\n  it(\"can set new expression\", () => {\n    let spy = sinon.spy(),\n        obj = { a: 1, b: 1 },\n        bae = new BaseActiveExpression(() => obj.a).onChange(spy);\n\n    bae.setExpression(() => obj.b);\n    obj.b = 2;\n\n    expect(bae.getCurrentValue()).to.equal(2);\n  });\n\n  it(\"calls callback immediately\", () => {\n    let spy = sinon.spy(),\n        obj = { a: 1, b: 2 },\n        bae = new BaseActiveExpression(() => obj.a).onChange(spy);\n\n    bae.setExpression(() => obj.b);\n\n    expect(spy).to.be.calledOnce;\n  });\n\n  it(\"does not call callback immediately (via option)\", () => {\n    let spy = sinon.spy(),\n        obj = { a: 1, b: 2 },\n        bae = new BaseActiveExpression(() => obj.a).onChange(spy);\n\n    bae.setExpression(() => obj.b, { checkImmediately: false });\n\n    expect(spy).not.to.be.called;\n  });\n\n  describe('Rewriting Active Expressions', () => {\n\n    it(\"calls callback immediately\", () => {\n      let spy = sinon.spy(),\n          obj = { a: 1, b: 2 };\n      let ae = aexpr(() => obj.a).onChange(spy);\n\n      ae.setExpression(() => obj.b);\n      expect(spy).to.be.calledOnce;\n    });\n\n    it(\"monitors the new dependencies\", () => {\n      let spy = sinon.spy(),\n          obj = { a: 1, b: 1 };\n      let ae = aexpr(() => obj.a).onChange(spy);\n\n      ae.setExpression(() => obj.b);\n      expect(spy).not.to.be.called;\n\n      obj.b = 2\n      expect(spy).to.be.calledOnce;\n    });\n\n    // #TODO: checkImmediately: false feels weird\n    // #TODO: either get rid of it entirely or find out, whether we want lastValue to be the last value of the old expression or the current value of the new expression\n    it(\"checkImmediately: false\", () => {\n      let spy = sinon.spy(),\n          obj = { a: 1, b: 2 };\n      let ae = aexpr(() => obj.a).onChange(spy);\n\n      ae.setExpression(() => obj.b, { checkImmediately: false });\n      expect(spy).not.to.be.called;\n\n      obj.b = 3\n      // #UNCERTAIN: what is lastValue here?\n      expect(spy).to.be.calledOnce;\n    });\n\n  });\n\n  describe('Convention', () => {\n\n    describe('Ticking Active Expressions', () => {\n\n      it(\"does not call callback immediately (ticking)\", () => {\n        let spy = sinon.spy(),\n            obj = { a: 1, b: 2 };\n        let ae = new TickingActiveExpression(() => obj.a).onChange(spy);\n\n        ae.setExpression(() => obj.b);\n        expect(spy.called).to.be.false;\n        expect(ae.getCurrentValue()).to.equal(2)\n\n        check();\n        expect(spy).to.be.calledOnce;\n      });\n\n      it(\"calls callback immediately ONLY IF EXPLICITLY WANTED\", () => {\n        let spy = sinon.spy(),\n            obj = { a: 1, b: 2 };\n        let ae = new TickingActiveExpression(() => obj.a).onChange(spy);\n\n        ae.setExpression(() => obj.b, { checkImmediately: true });\n        expect(spy).to.be.calledOnce;\n      });\n\n    });\n\n    describe('Frame-Based Active Expressions', () => {\n\n      it(\"does not call callback immediately (frame-based)\", async () => {\n        let spy = sinon.spy(),\n            obj = { a: 1, b: 2 };\n        let ae = new FrameBasedActiveExpression(() => obj.a);\n        ae.onChange(spy);\n\n        ae.setExpression(() => obj.b);\n        expect(spy.called).to.be.false;\n        expect(ae.getCurrentValue()).to.equal(2)\n\n        await lively.sleep(50)\n        expect(spy).to.be.calledOnce;\n      });\n\n      it(\"calls callback immediately ONLY IF EXPLICITLY WANTED\", () => {\n        let spy = sinon.spy(),\n            obj = { a: 1, b: 2 };\n        let ae = new FrameBasedActiveExpression(() => obj.a)\n        ae.onChange(spy);\n\n        ae.setExpression(() => obj.b, { checkImmediately: true });\n        expect(spy).to.be.calledOnce;\n      });\n\n    });\n\n  });\n\n});"]}