{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-markus/src/client/reactive/test/active-expression/configurable-comparison-function.spec.js"],"names":["chai","expect","sinon","sinonChai","BaseActiveExpression","use","describe","it","spy","arr","aexpr","onChange","push","checkAndNotify","to","be","calledOnce","getCall","args","equal","not","called","match","x","matchSecondProperty","compare","lastResult","newResult","store","reset","length","set","Set","add","map","Map"],"mappings":"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","file":"configurable-comparison-function.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 { BaseActiveExpression } from '../../active-expression/active-expression.js';\n\ndescribe('Configurable Comparison Function', () => {\n  describe('Identity as default for objects', () => {\n  });\n  // #TODO: other implementation strategies have to detect those changes\n  describe('Arrays as Data Structures', () => {\n    it('detects a newly pushed element', () => {\n      const spy = sinon.spy();\n      const arr = [1,2];\n      const aexpr = new BaseActiveExpression(() => arr).onChange(spy);\n\n      arr.push(42);\n      aexpr.checkAndNotify();\n\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(arr);\n    });\n    it('identity does not matter/arrays as value classes', () => {\n      const spy = sinon.spy();\n      let arr = [1,2];\n      const aexpr = new BaseActiveExpression(() => arr).onChange(spy);\n\n      arr = [1,2];\n      aexpr.checkAndNotify();\n\n      expect(spy).not.to.be.called;\n    });\n    \n    describe('explicit option configured to identity', () => {\n      it('array modification do not trigger callbacks', () => {\n        const spy = sinon.spy();\n        const arr = [1,2];\n        const aexpr = new BaseActiveExpression(() => arr, { match: 'identity' }).onChange(spy);\n\n        arr.push(42);\n        aexpr.checkAndNotify();\n\n        expect(spy).not.to.be.called;\n      });\n      it('identity changes matter', () => {\n        const spy = sinon.spy();\n        let arr = [1,2];\n        const aexpr = new BaseActiveExpression(() => arr, { match: 'identity' }).onChange(spy);\n\n        arr = [1,2];\n        aexpr.checkAndNotify();\n\n        expect(spy).to.be.calledOnce;\n        expect(spy.getCall(0).args[0]).to.equal(arr);\n      });\n    });\n    \n    describe('explicit option set to shallow', () => {\n      it('array modification triggers callbacks', () => {\n        const spy = sinon.spy();\n        const arr = [1,2];\n        const aexpr = new BaseActiveExpression(() => arr, { match: 'shallow' }).onChange(spy);\n\n        arr.push(42);\n        aexpr.checkAndNotify();\n\n        expect(spy).to.be.calledOnce;\n        expect(spy.getCall(0).args[0]).to.equal(arr);\n      });\n      it('identity changes do not matter', () => {\n        const spy = sinon.spy();\n        let arr = [1,2];\n        const aexpr = new BaseActiveExpression(() => arr, { match: 'shallow' }).onChange(spy);\n\n        arr = [1,2];\n        aexpr.checkAndNotify();\n\n        expect(spy).not.to.be.called;\n      });\n    });\n    \n    describe('explicit option set to deep', () => {\n      it('array modification triggers callbacks', () => {\n        const spy = sinon.spy();\n        const arr = [1, { x: 4 }];\n        const aexpr = new BaseActiveExpression(() => arr, { match: 'deep' }).onChange(spy);\n\n        arr.push(42);\n        aexpr.checkAndNotify();\n\n        expect(spy).to.be.calledOnce;\n        expect(spy.getCall(0).args[0]).to.equal(arr);\n      });\n      it('identity changes do not matter1', () => {\n        const spy = sinon.spy();\n        let arr = [1, { x: 4 }];\n        const aexpr = new BaseActiveExpression(() => arr, { match: 'deep' }).onChange(spy);\n\n        arr = [1, { x: 4 }];\n        aexpr.checkAndNotify();\n\n        expect(spy).not.to.be.called;\n      });\n      it('nested property identity changes do not trigger1', () => {\n        const spy = sinon.spy();\n        let arr = [1, { x: 4 }];\n        const aexpr = new BaseActiveExpression(() => arr, { match: 'deep' }).onChange(spy);\n\n        arr[1] = { x: 4 };\n        aexpr.checkAndNotify();\n\n        expect(spy).not.to.be.called;\n      });\n      it('nested property changes trigger', () => {\n        const spy = sinon.spy();\n        let arr = [1, { x: 4 }];\n        const aexpr = new BaseActiveExpression(() => arr, { match: 'deep' }).onChange(spy);\n\n        arr[1] = { x: 5};\n        aexpr.checkAndNotify();\n\n        expect(spy).to.be.calledOnce;\n        expect(spy.getCall(0).args[0]).to.equal(arr);\n      });\n      it('nested property changes trigger (modify only a deep property)', () => {\n        const spy = sinon.spy();\n        let arr = [1, { x: 4 }];\n        const aexpr = new BaseActiveExpression(() => arr, { match: 'deep' }).onChange(spy);\n\n        arr[1].x = 5;\n        aexpr.checkAndNotify();\n\n        expect(spy).to.be.calledOnce;\n        expect(spy.getCall(0).args[0]).to.equal(arr);\n      });\n    });\n    \n    describe('custom comparator (explicit option)', () => {\n      const matchSecondProperty = {\n        compare(lastResult, newResult) {\n          return lastResult[1] === newResult[1];\n        },\n        store(newResult) { return [...newResult]; }\n      }\n      \n      it('array modification triggers callbacks', () => {\n        const spy = sinon.spy();\n        const arr = [1, 2];\n        const aexpr = new BaseActiveExpression(() => arr, { match: matchSecondProperty }).onChange(spy);\n\n        arr.push(42);\n        aexpr.checkAndNotify();\n\n        expect(spy).not.to.be.called;\n      });\n      \n      it('changing second property triggers callbacks', () => {\n        const spy = sinon.spy();\n        const arr = [1, 2];\n        const aexpr = new BaseActiveExpression(() => arr, { match: matchSecondProperty }).onChange(spy);\n\n        arr[1] = 3;\n        aexpr.checkAndNotify();\n\n        expect(spy).to.be.calledOnce;\n        expect(spy.getCall(0).args[0]).to.equal(arr);\n        spy.reset()\n\n        arr.length = 1;\n        aexpr.checkAndNotify();\n\n        expect(spy).to.be.calledOnce;\n        expect(spy.getCall(0).args[0]).to.equal(arr);\n      });\n    });\n    \n  });\n  \n  describe('Sets as Data Structures', () => {\n    it('detects a newly added element', () => {\n      const spy = sinon.spy();\n      const set = new Set([1,2]);\n      const aexpr = new BaseActiveExpression(() => set).onChange(spy);\n\n      set.add(42);\n      aexpr.checkAndNotify();\n\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(set);\n    });\n    it('identity does not matter/sets as value classes', () => {\n      const spy = sinon.spy();\n      let set = new Set([1,2]);\n      const aexpr = new BaseActiveExpression(() => set).onChange(spy);\n\n      set = new Set([1,2]);\n      aexpr.checkAndNotify();\n\n      expect(spy).not.to.be.called;\n    });\n    it('order of insertion does not matter/set semantic', () => {\n      const spy = sinon.spy();\n      let set = new Set([1,2]);\n      const aexpr = new BaseActiveExpression(() => set).onChange(spy);\n\n      set = new Set([2,1]);\n      aexpr.checkAndNotify();\n\n      expect(spy).not.to.be.called;\n    });\n  });\n  describe('Maps as Data Structures', () => {\n    it('detects a newly added element', () => {\n      const spy = sinon.spy();\n      const map = new Map([[1,2]]);\n      const aexpr = new BaseActiveExpression(() => map).onChange(spy);\n\n      map.set(42, {});\n      aexpr.checkAndNotify();\n\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(map);\n    });\n    it('identity does not matter/maps as value classes', () => {\n      const spy = sinon.spy();\n      let map = new Map([[1,2]]);\n      const aexpr = new BaseActiveExpression(() => map).onChange(spy);\n\n      map = new Map([[1,2]]);\n      aexpr.checkAndNotify();\n\n      expect(spy).not.to.be.called;\n    });\n    it('order of insertion does not matter/map semantic', () => {\n      const spy = sinon.spy();\n      let map = new Map([[1,2],[3,4]]);\n      const aexpr = new BaseActiveExpression(() => map).onChange(spy);\n\n      map = new Map([[3,4],[1,2]]);\n      aexpr.checkAndNotify();\n\n      expect(spy).not.to.be.called;\n    });\n  });\n});"]}