{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-bp2019/src/client/reactive/test/active-expression-rewriting/data-structure-hooks.spec.js"],"names":["chai","expect","sinon","sinonChai","use","spy","arr","expr","push","getCall","unshift","set","Set","add","clear","reset","map","Map"],"mappings":"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","file":"data-structure-hooks.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\ndescribe('Data Structure Hooks', () => {\n\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('detects indexed access in expression', () => {\n      const spy = sinon.spy();\n      const arr = [1,2,3];\n      const expr = aexpr(() => arr[0]).onChange(spy);\n\n      arr.unshift(0);\n\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(0);\n    });\n\n    it('detects access in expression for first element', () => {\n      const spy = sinon.spy();\n      const arr = [1,2,3];\n      const expr = aexpr(() => arr.first).onChange(spy);\n\n      arr.unshift(0);\n\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(0);\n    });\n\n    it('detects write access to first element', () => {\n      const spy = sinon.spy();\n      const arr = [1,2,3];\n      const expr = aexpr(() => arr.first).onChange(spy);\n\n      arr.first = 0;\n\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(0);\n    });\n\n    it('detects access in expression for last element', () => {\n      const spy = sinon.spy();\n      const arr = [1,2,3];\n      const expr = aexpr(() => arr.last).onChange(spy);\n\n      arr.push(4);\n\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(4);\n    });\n\n    it('detects write access to last element', () => {\n      const spy = sinon.spy();\n      const arr = [1,2,3];\n      const expr = aexpr(() => arr.last).onChange(spy);\n\n      arr.last = 0;\n\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(0);\n    });\n\n    xit('detects an indexed write', () => {\n      const spy = sinon.spy();\n      const arr = [1,2];\n      const expr = aexpr(() => arr).onChange(spy);\n\n      arr[1] = 3;\n\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(arr);\n    });\n\n    xit('detects an indexed write outside existing values', () => {\n      const spy = sinon.spy();\n      const arr = [1,2];\n      const expr = aexpr(() => arr).onChange(spy);\n\n      arr[4] = 5;\n\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(arr);\n    });\n\n    xit('detects changes to the length property', () => {\n      const spy = sinon.spy();\n      let arr = [1,2];\n      const expr = aexpr(() => arr).onChange(spy);\n\n      arr.length = 1;\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(arr);\n\n      arr.length = 0;\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(arr);\n    });\n\n    it('monitoring does not influence length property', () => {\n      let arr = [1,2];\n      const expr = aexpr(() => arr);\n\n      expect(arr.length).to.equal(2);\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      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\n    it('do not detect an already existing item', () => {\n      const spy = sinon.spy();\n      const set = new Set([1,2]);\n      aexpr(() => set).onChange(spy);\n\n      set.add(2);\n\n      expect(spy).not.to.be.called;\n    });\n\n    it('detects a cleared set', () => {\n      const spy = sinon.spy();\n      const set = new Set([1,2]);\n      aexpr(() => set).onChange(spy);\n\n      set.clear();\n\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(set);\n    });\n\n    it('detects a changed set size', () => {\n      const spy = sinon.spy();\n      const set = new Set([1,2]);\n      aexpr(() => set.size).onChange(spy);\n\n      set.add(3);\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(set.size);\n      spy.reset();\n\n      set.clear();\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(set.size);\n      spy.reset();\n    });\n\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\n    it('detects a new value for existing key', () => {\n      const spy = sinon.spy();\n      const map = new Map([[1,2]]);\n      aexpr(() => map).onChange(spy);\n\n      map.set(1,3);\n\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(map);\n    });\n\n    it('do not detect identical value for key', () => {\n      const spy = sinon.spy();\n      const map = new Map([[1,2]]);\n      aexpr(() => map).onChange(spy);\n\n      map.set(1,2);\n\n      expect(spy).not.to.be.called;\n    });\n\n    it('detects a cleared map', () => {\n      const spy = sinon.spy();\n      const map = new Map([[1,2]]);\n      aexpr(() => map).onChange(spy);\n\n      map.clear();\n\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(map);\n    });\n\n    it('detects a changed map size', () => {\n      const spy = sinon.spy();\n      const map = new Map([[1,2]]);\n      aexpr(() => map.size).onChange(spy);\n\n      map.set(3, 4);\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(map.size);\n      spy.reset();\n\n      map.clear();\n      expect(spy).to.be.calledOnce;\n      expect(spy.getCall(0).args[0]).to.equal(map.size);\n    });\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\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  });\n\n});\n"]}