{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-markus/src/client/reactive/test/polymorphic-identifiers/polymorphic-identifiers.spec.js"],"names":["chai","expect","sinon","sinonChai","PIScheme","makeRef","uuid","use","fourtyTwo","read","thisReference","evalFunction","str","prop","initialize","write","value","o","foo","func","local","id","self","v1","v2","A","constructor","B","b"],"mappings":"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","file":"polymorphic-identifiers.spec.js","sourcesContent":["\"enable aexpr\";\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 { PIScheme, makeRef } from 'polymorphic-identifiers';\nimport { uuid } from 'utils';\n\ndescribe(\"PI\", function() {\n  \n  it(\"is defined\", () => {\n    expect(PIScheme).to.be.ok;\n    expect(makeRef).to.be.ok;\n  });\n\n  it(\"detects accesses\", () => {\n    class fourtyTwo extends PIScheme {\n      read() {\n        return 42;\n      }\n    }\n\n    expect(makeRef(fourtyTwo, {\n      thisReference: this,\n      evalFunction: str => eval(str)\n    })``.access).to.equal(42)\n    \n  });\n\n  it(\"can access the `this` reference\", () => {\n    class prop extends PIScheme {\n      initialize() {\n        this.prop = this.strings.first;\n      }\n      read() {\n        return this.thisReference[this.prop];\n      }\n      write(value) {\n        return this.thisReference[this.prop] = value;\n      }\n    }\n\n    // read\n    const o = {\n      foo: 17,\n      func() {\n        return makeRef(prop, {\n          thisReference: this,\n          evalFunction: str => eval(str)\n        })`foo`.access;\n      },\n      write(value) {\n        makeRef(prop, {\n          thisReference: this,\n          evalFunction: str => eval(str)\n        })`bar`.access = value;\n      }\n    };\n    expect(o.func()).to.equal(17)\n    \n    // write\n    o.write(23)\n    expect(o.bar).to.equal(23)\n  });\n\n  it(\"can access locals with eval\", () => {\n    class local extends PIScheme {\n      initialize() {\n        this.local = this.strings.first;\n      }\n      read() {\n        return this.evalFunction(this.local);\n      }\n      write(value) {\n        const id = uuid();\n        self[id] = value;\n        try {\n          return this.evalFunction(this.local + ` = self['${id}']`);\n        } finally {\n          delete self[id];\n        }\n      }\n    }\n\n    let v1 = 'v1', v2 = 42;\n\n    // read\n    expect(makeRef(local, {\n          thisReference: this,\n          evalFunction: str => eval(str)\n        })`v1`.access).to.equal('v1')\n    \n    // write\n    makeRef(local, {\n          thisReference: this,\n          evalFunction: str => eval(str)\n        })`v2`.access = \"v2\";\n    expect(v2).to.equal('v2');\n    \n    // read/write\n    makeRef(local, {\n          thisReference: this,\n          evalFunction: str => eval(str)\n        })`v2`.access += '.2';\n    expect(v2).to.equal('v2.2');\n  });\n\n  it(\"ignore normal tagged template strings\", () => {\n    function foo() {\n      return 'bar';\n    }\n    \n    expect(makeRef(foo, {\n      thisReference: this,\n      evalFunction: str => eval(str)\n    })``.access).to.equal('bar')\n  });\n\n});\ndescribe(\"AEs\", function() {\n  \n  it(\"AExprs insert default constructors\", () => {\n    class A {\n      constructor(prop) {\n        this.prop = prop;\n      }\n    }\n    class B extends A {}\n    \n    const b = new B(42);\n    expect(b.prop).to.equal(42);\n  });\n\n});\n"]}