{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-active-expression-proxies/src/client/reactive/test/active-expression-rewriting/configurable-comparison-function.spec.js"],"names":["chai","expect","sinon","sinonChai","BaseActiveExpression","use","spy","arr","expr","push","getCall","match","x","checkAndNotify","matchSecondProperty","compare","lastResult","newResult","store","reset","set","Set","add","map","Map"],"mappings":"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","file":"configurable-comparison-function.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';\n\ndescribe('Configurable Comparison Function', () => {\n\n  describe('Identity as default for objects', () => {\n  });\n\n  // #TODO: other implementation strategies have to detect those changes\n  describe('Arrays as Data Structures', () => {\n\n    it('detects a newly pushed element', () => {\n      const spy = sinon.spy();\n      const arr = [1,2];\n      const expr = aexpr(() => arr).onChange(spy);\n\n      arr.push(42);\n\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(arr);\n    });\n\n    it('identity does not matter/arrays as value classes', () => {\n      const spy = sinon.spy();\n      let arr = [1,2];\n      const expr = aexpr(() => arr).onChange(spy);\n\n      arr = [1,2];\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 expr = aexpr(() => arr, { match: 'identity' }).onChange(spy);\n\n        arr.push(42);\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 expr = aexpr(() => arr, { match: 'identity' }).onChange(spy);\n\n        arr = [1,2];\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 callbacks2', () => {\n        const spy = sinon.spy();\n        const arr = [1,2];\n        const expr = aexpr(() => arr, { match: 'shallow' }).onChange(spy);\n\n        arr.push(42);\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 expr = aexpr(() => arr, { match: 'shallow' }).onChange(spy);\n\n        arr = [1,2];\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 expr = aexpr(() => arr, { match: 'deep' }).onChange(spy);\n\n        arr.push(42);\n        expr.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 expr = aexpr(() => arr, { match: 'deep' }).onChange(spy);\n\n        arr = [1, { x: 4 }];\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 expr = aexpr(() => arr, { match: 'deep' }).onChange(spy);\n\n        arr[1] = { x: 4 };\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 expr = aexpr(() => arr, { match: 'deep' }).onChange(spy);\n\n        arr[1] = { x: 5};\n        expr.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 expr = aexpr(() => arr, { match: 'deep' }).onChange(spy);\n\n        arr[1].x = 5;\n        expr.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 expr = aexpr(() => arr, { match: matchSecondProperty }).onChange(spy);\n\n        arr.push(42);\n  \n        expect(spy).not.to.be.called;\n      });\n      \n      // #TODO: this test failing when removing the explicit checkAndNotify means we do not detect dependencies in matcher or store functions!\n      it('changing second property triggers callbacks', () => {\n        const spy = sinon.spy();\n        const arr = [1, 2];\n        const expr = aexpr(() => arr, { match: matchSecondProperty }).onChange(spy);\n\n        arr[1] = 3;\n        expr.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        expr.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 expr = aexpr(() => set).onChange(spy);\n\n      set.add(42);\n\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(set);\n    });\n    it('set modification triggers callbacks with shallow matcher', () => {\n      const spy = sinon.spy();\n      const set = new Set([1,2]);\n      const expr = aexpr(() => set, { match: 'shallow' }).onChange(spy);\n\n      set.add(42);\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 expr = aexpr(() => set).onChange(spy);\n\n      set = new Set([1,2]);\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 expr = aexpr(() => set).onChange(spy);\n\n      set = new Set([2,1]);\n\n      expect(spy).not.to.be.called;\n    });\n  });\n  describe('Maps as Data Structures', () => {\n    it('detects a newly added element (maps)', () => {\n      const spy = sinon.spy();\n      const map = new Map([[1,2]]);\n      const expr = aexpr(() => map).onChange(spy);\n\n      map.set(42, {});\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 expr = aexpr(() => map).onChange(spy);\n\n      map = new Map([[1,2]]);\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 expr = aexpr(() => map).onChange(spy);\n\n      map = new Map([[3,4],[1,2]]);\n\n      expect(spy).not.to.be.called;\n    });\n  });\n});"]}