{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-markus/src/client/reactive/test/active-expression-rewriting/data-structure-hooks.spec.js"],"names":["chai","expect","sinon","sinonChai","use","spy","arr","expr","onChange","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"]}