{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-active-expression-proxies/src/client/reactive/test/active-expression-convention/active-expression-ticking.spec.js"],"names":["chai","expect","sinon","sinonChai","aexpr","check","clearDefaultActiveExpressions","use","describe","it","obj","a","b","spy","onChange","called","to","be","false","calledOnce","true","val","withArgs","have","been","getCall","args","equal","property","val1","val2","spy1","spy2","spy3","aexpr1","aexpr2","aexpr3","expr","checkAndNotify","o","params","not","obj1","obj2","obj3","o1","o2","o3","spy12","spy23","disable","enable"],"mappings":"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","file":"active-expression-ticking.spec.js","sourcesContent":["'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 { aexpr, check, clearDefaultActiveExpressions } from '../../active-expression-convention/active-expression-ticking.js';\n\ndescribe('Ticking Active Expressions', () => {\n    it(\"runs a basic aexpr\", () => {\n        let obj = {a: 2, b: 3},\n            spy = sinon.spy();\n\n        aexpr(() => obj.a).onChange(spy);\n\n        check();\n        expect(spy.called).to.be.false;\n\n        obj.a = 42;\n\n        check();\n        expect(spy.calledOnce).to.be.true;\n    });\n\n    it(\"recognize changes to local variables\", () => {\n        let val = 17,\n            spy = sinon.spy();\n\n        aexpr(() => val).onChange(spy);\n\n        val = 42;\n\n        check();\n        expect(spy.calledOnce).to.be.true;\n    });\n\n    it(\"provide the new value of the expression to the callback\", () => {\n        let val = 17,\n            spy = sinon.spy();\n\n        aexpr(() => val).onChange(spy);\n\n        val = 42;\n\n        check();\n        expect(spy.withArgs(42).calledOnce).to.be.true;\n    });\n\n    it(\"provide additional information (e.g. the last value of the expression) to the callback\", () => {\n        let val = 17,\n            spy = sinon.spy();\n\n        aexpr(() => val).onChange(spy);\n\n        val = 42;\n\n        check();\n        expect(spy).to.have.been.calledOnce;\n        expect(spy.getCall(0).args[0]).to.equal(42);\n        expect(spy.getCall(0).args[1]).to.have.property('lastValue', 17);\n    });\n\n    describe('check', () => {\n        it(\"run multiple checks only invokes the callback once\", () => {\n            let val = 17,\n                spy = sinon.spy();\n\n            aexpr(() => val).onChange(spy);\n\n            val = 42;\n\n            check();\n            check();\n\n            expect(spy.calledOnce).to.be.true;\n        });\n\n        it(\"check all active expressions if not specified further\", () => {\n            let val1 = 17,\n                val2 = 33,\n                spy1 = sinon.spy(),\n                spy2 = sinon.spy();\n\n            aexpr(() => val1).onChange(spy1);\n            aexpr(() => val2).onChange(spy2);\n\n            val1 = 42;\n            val2 = 51;\n\n            check();\n\n            expect(spy1.calledOnce).to.be.true;\n            expect(spy2.calledOnce).to.be.true;\n        });\n\n        it(\"check all active expressions provided by an iterator\", () => {\n            let val = 17,\n                spy1 = sinon.spy(),\n                spy2 = sinon.spy(),\n                spy3 = sinon.spy(),\n                aexpr1 = aexpr(() => val).onChange(spy1),\n                aexpr2 = aexpr(() => val).onChange(spy2),\n                aexpr3 = aexpr(() => val).onChange(spy3);\n\n            val = 42;\n\n            check([aexpr1, aexpr2]);\n\n            expect(spy1.calledOnce).to.be.true;\n            expect(spy2.calledOnce).to.be.true;\n            expect(spy3.called).to.be.false;\n        });\n\n        // TODO: should this really be part of the API?\n        it(\"check a single active expressions\", () => {\n            let val = 17,\n                spy = sinon.spy(),\n                expr = aexpr(() => val).onChange(spy);\n\n            val = 42;\n            expr.checkAndNotify();\n\n            expect(spy.calledOnce).to.be.true;\n        });\n    });\n\n    describe('parametrizable aexprs', () => {\n        it(\"handle aexprs with one single instance-bindong\", () => {\n            let obj = { val: 17 },\n                spy = sinon.spy();\n\n            aexpr(o => o.val, { params: [obj] }).onChange(spy);\n\n            expect(spy).not.to.be.called;\n\n            obj.val = 42;\n\n            check();\n\n            expect(spy).to.be.calledOnce;\n        });\n\n        it(\"handle aexprs with one instance-binding with multiple variables\", () => {\n            let obj1 = { val: 1 },\n                obj2 = { val: 2 },\n                obj3 = { val: 3 },\n                spy = sinon.spy();\n\n            aexpr((o1, o2, o3) => o1.val + o2.val + o3.val, { params: [obj1, obj2, obj3] }).onChange(spy);\n\n            expect(spy).not.to.be.called;\n\n            obj1.val = 10;\n            check();\n\n            expect(spy.withArgs(15)).to.be.calledOnce;\n\n            obj2.val = 20;\n            check();\n\n            expect(spy.withArgs(33)).to.be.calledOnce;\n        });\n\n        it(\"handle aexprs with multiple instance-bindings\", () => {\n            let obj1 = { val: 1 },\n                obj2 = { val: 2 },\n                obj3 = { val: 3 },\n                spy12 = sinon.spy(),\n                spy23 = sinon.spy(),\n                expr = (o1, o2) => o1.val + o2.val;\n\n            aexpr(expr, { params: [obj1, obj2] }).onChange(spy12);\n            aexpr(expr, { params: [obj2, obj3] }).onChange(spy23);\n\n            expect(spy12).not.to.be.called;\n            expect(spy23).not.to.be.called;\n\n            obj1.val = 10;\n            check();\n\n            expect(spy12.withArgs(12)).to.be.calledOnce;\n            expect(spy23).not.to.be.called;\n\n            obj2.val = 20;\n            check();\n\n            expect(spy12.withArgs(30)).to.be.calledOnce;\n            expect(spy23.withArgs(23)).to.be.calledOnce;\n\n            obj3.val = 30;\n            check();\n\n            expect(spy12.withArgs(30)).to.be.calledOnce;\n            expect(spy23.withArgs(50)).to.be.calledOnce;\n        });\n    });\n\n        // TODO: is this useful?\n    describe('disable and re-enable', () => {\n        it(\"disabled aexprs do not fire notify the callback\", () => {\n            let val = 17,\n                spy = sinon.spy();\n\n            aexpr(() => val)\n                .onChange(spy)\n                .disable();\n\n            val = 33;\n            check();\n\n            expect(spy.called).to.be.false;\n        });\n\n        it(\"disabled aexprs do nothing when explicitly listed to be checked\", () => {\n            let val = 17,\n                spy = sinon.spy(),\n                expr = aexpr(() => val)\n                    .onChange(spy)\n                    .disable();\n\n            val = 33;\n            check([expr]);\n\n            expect(spy.called).to.be.false;\n        });\n\n        it(\"disabled aexprs do nothing when explicitly listed to be checked\", () => {\n            let val = 17,\n                spy = sinon.spy(),\n                expr = aexpr(() => val)\n                    .onChange(spy)\n                    .disable();\n\n            val = 33;\n            check();\n\n            expect(spy.called).to.be.false;\n\n            expr.enable();\n\n            val = 33;\n            check();\n\n            expect(spy.calledOnce).to.be.true;\n\n        });\n    });\n\n    describe('clearDefaultActiveExpressions', () => {\n        it(\"clear global fallback set of active expressions\", () => {\n            let val = 17,\n                spy = sinon.spy();\n\n            let expr = aexpr(() => val)\n                .onChange(spy);\n\n            val = 33;\n\n            clearDefaultActiveExpressions();\n\n            check();\n\n            expect(spy.called).to.be.false;\n\n            check([expr]);\n\n            expect(spy.called).to.be.true;\n        });\n    });\n});\n"]}