{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-active-expression-proxies/test/utils-test.js"],"names":["waitForDeepProperty","isFunction","functionMetaInfo","CallableObject","using","shallowEqualsArray","shallowEqualsSet","shallowEqualsMap","shallowEquals","deepEquals","chai","expect","sinon","sinonChai","use","describe","it","foo","to","be","true","false","undefined","Date","isAsync","isGenerator","ok","TestContextManager","constructor","__enter__","spy","__exit__","actual","calledOnce","expected","equal","callbackSpy","contextManager","calledBefore","contextManager1","contextManager2","expectedError","Error","errornousFunction","throw","calledWith","done","o","Object","lively","sleep","then","bar","result"],"mappings":"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","file":"utils-test.js","sourcesContent":["import { waitForDeepProperty, isFunction, functionMetaInfo, CallableObject, using, shallowEqualsArray, shallowEqualsSet, shallowEqualsMap, shallowEquals, deepEquals } from 'utils';\n\"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\ndescribe('Dynamic type checks', function() {\n  // #TODO #Question: are generators functions in this case?\n  it('`isFunction` works on functions but not on non-functions', () => {\n    expect(isFunction(function foo() {}), \"function foo() {}\").to.be.true;\n    expect(isFunction(async function foo() {}), \"async function foo() {}\").to.be.true;\n\n    expect(isFunction({})).to.be.false;\n    expect(isFunction('')).to.be.false;\n    expect(isFunction(1)).to.be.false;\n    expect(isFunction(undefined)).to.be.false;\n    expect(isFunction(null)).to.be.false;\n    expect(isFunction(0)).to.be.false;\n    expect(isFunction(true)).to.be.false;\n    expect(isFunction(new Date())).to.be.false;\n  });\n  describe('Dynamic type checks', function() {\n    it('functionMetaInfo function', () => {\n      const { isFunction, isAsync, isGenerator } = functionMetaInfo(function foo() {});\n      expect(isFunction).to.be.true;\n      expect(isAsync).to.be.false;\n      expect(isGenerator).to.be.false;\n    });\n    it('functionMetaInfo anonymous function', () => {\n      const { isFunction, isAsync, isGenerator } = functionMetaInfo(() => {});\n      expect(isFunction).to.be.true;\n      expect(isAsync).to.be.false;\n      expect(isGenerator).to.be.false;\n    });\n    it('functionMetaInfo async function', () => {\n      const { isFunction, isAsync, isGenerator } = functionMetaInfo(async () => {});\n      expect(isFunction).to.be.true;\n      expect(isAsync).to.be.true;\n      expect(isGenerator).to.be.false;\n    });\n    it('functionMetaInfo generator function', () => {\n      const { isFunction, isAsync, isGenerator } = functionMetaInfo(function* foo() {});\n      expect(isFunction).to.be.true;\n      expect(isAsync).to.be.false;\n      expect(isGenerator).to.be.true;\n    });\n    it('functionMetaInfo async generator function', () => {\n      const { isFunction, isAsync, isGenerator } = functionMetaInfo(async function* foo() {});\n      expect(isFunction).to.be.true;\n      expect(isAsync).to.be.true;\n      expect(isGenerator).to.be.true;\n    });\n    it('functionMetaInfo string', () => {\n      const { isFunction, isAsync, isGenerator } = functionMetaInfo('');\n      expect(isFunction).to.be.false;\n      expect(isAsync).to.be.false;\n      expect(isGenerator).to.be.false;\n    });\n    it('functionMetaInfo null', () => {\n      const { isFunction, isAsync, isGenerator } = functionMetaInfo('');\n      expect(isFunction).to.be.false;\n      expect(isAsync).to.be.false;\n      expect(isGenerator).to.be.false;\n    });\n\n  });\n});\n\n\ndescribe('Callable Object', () => {\n  it('defines CallableObject', () => {\n    expect(CallableObject).to.be.ok;\n  });\n});\n\n\n// === Python's with statement\ndescribe('using', () => {\n  class TestContextManager {\n    constructor() {\n      this.__enter__ = sinon.spy();\n      this.__exit__ = sinon.spy();\n    }\n  }\n  \n  it('using is defined', () => {\n    expect(using).to.be.ok;\n  });\n\n  it('using calls the specified function', () => {\n    const spy = sinon.spy();\n    \n    const actual = using([], spy);\n    expect(spy).to.be.calledOnce;\n  });\n\n  it(\"using returns the callback's value\", () => {\n    const expected = 42;\n    \n    const actual = using([], () => expected);\n    expect(actual).to.equal(expected);\n  });\n\n  it('calls __enter__ and __exit__ of one context manager', () => {\n    const callbackSpy = sinon.spy();\n    const contextManager = new TestContextManager();\n        \n    using([contextManager], callbackSpy);\n    expect(contextManager.__enter__).to.be.calledOnce;\n    expect(callbackSpy).to.be.calledOnce;\n    expect(contextManager.__exit__).to.be.calledOnce;\n    expect(contextManager.__enter__).to.be.calledBefore(callbackSpy)\n    expect(callbackSpy).to.be.calledBefore(contextManager.__exit__)\n  });\n\n  it('calls __enter__ and __exit__ of multiple context managers', () => {\n    const callbackSpy = sinon.spy();\n    const contextManager1 = new TestContextManager();\n    const contextManager2 = new TestContextManager();\n\n    using([contextManager1, contextManager2], callbackSpy);\n    \n    expect(contextManager1.__enter__).to.be.calledOnce;\n    expect(contextManager2.__enter__).to.be.calledOnce;\n    expect(callbackSpy).to.be.calledOnce;\n    expect(contextManager2.__exit__).to.be.calledOnce;\n    expect(contextManager1.__exit__).to.be.calledOnce;\n\n    expect(contextManager1.__enter__).to.be.calledBefore(contextManager2.__enter__)\n    expect(contextManager2.__enter__).to.be.calledBefore(callbackSpy)\n    expect(callbackSpy).to.be.calledBefore(contextManager2.__exit__)\n    expect(contextManager2.__exit__).to.be.calledBefore(contextManager1.__exit__)\n  });\n\n  it('nested usings call respective context managers', () => {\n    const callbackSpy = sinon.spy();\n    const contextManager1 = new TestContextManager();\n    const contextManager2 = new TestContextManager();\n\n    using([contextManager1], () =>\n      using([contextManager2], callbackSpy)\n    );\n    \n    expect(contextManager1.__enter__).to.be.calledOnce;\n    expect(contextManager2.__enter__).to.be.calledOnce;\n    expect(callbackSpy).to.be.calledOnce;\n    expect(contextManager2.__exit__).to.be.calledOnce;\n    expect(contextManager1.__exit__).to.be.calledOnce;\n\n    expect(contextManager1.__enter__).to.be.calledBefore(contextManager2.__enter__)\n    expect(contextManager2.__enter__).to.be.calledBefore(callbackSpy)\n    expect(callbackSpy).to.be.calledBefore(contextManager2.__exit__)\n    expect(contextManager2.__exit__).to.be.calledBefore(contextManager1.__exit__)\n  });\n\n  it('using calls context managers with error in case of exceptions', () => {\n    const expectedError = new Error('test error');\n    const contextManager1 = new TestContextManager();\n    const contextManager2 = new TestContextManager();\n\n    function errornousFunction() {\n      using([contextManager1], () =>\n        using([contextManager2], (callbackSpy => {\n          throw expectedError;\n        }))\n      );\n    }\n    \n    expect(errornousFunction).to.throw(expectedError);\n    \n    expect(contextManager2.__exit__).to.be.calledOnce;\n    expect(contextManager2.__exit__).to.be.calledWith(expectedError);\n\n    expect(contextManager1.__exit__).to.be.calledOnce;\n    expect(contextManager1.__exit__).to.be.calledWith(expectedError);\n\n    expect(contextManager2.__exit__).to.be.calledBefore(contextManager1.__exit__)\n  });\n});\n\n\ndescribe('waitForDeepProperty', () => {\n  it('it works', async (done) => {\n    \n    var o = new Object();\n    \n    lively.sleep(20).then(() => {\n      o.foo = {}\n    })\n\n    lively.sleep(30).then(() => {\n      o.foo.bar = 7\n    })\n\n    var result = await waitForDeepProperty(o, \"foo.bar\", 1000, 10) \n    expect(result).to.equal(7)\n    done()\n  });\n});\n"]}