@theia/core
Version:
Theia is a cloud & desktop IDE framework implemented in TypeScript.
126 lines • 5.36 kB
JavaScript
// *****************************************************************************
// Copyright (C) 2018 TypeFox and others.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License v. 2.0 which is available at
// http://www.eclipse.org/legal/epl-2.0.
//
// This Source Code may also be made available under the following Secondary
// Licenses when the conditions for such availability set forth in the Eclipse
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
// with the GNU Classpath Exception which is available at
// https://www.gnu.org/software/classpath/license.html.
//
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
// *****************************************************************************
Object.defineProperty(exports, "__esModule", { value: true });
const assert = require("assert");
const reference_1 = require("./reference");
describe('reference', () => {
it('dispose a single reference', async () => {
const expectation = { disposed: false };
const references = new reference_1.ReferenceCollection(key => ({
key, dispose: () => {
expectation.disposed = true;
}
}));
assert.ok(!references.has('a'));
assert.ok(!expectation.disposed);
assert.deepStrictEqual(references.keys(), []);
const reference = await references.acquire('a');
assert.ok(references.has('a'));
assert.ok(!expectation.disposed);
assert.deepStrictEqual(references.keys(), ['a']);
reference.dispose();
assert.ok(!references.has('a'));
assert.ok(expectation.disposed);
assert.deepStrictEqual(references.keys(), []);
});
it('dispose 2 references', async () => {
const expectation = { disposed: false };
const references = new reference_1.ReferenceCollection(key => ({
key, dispose: () => {
expectation.disposed = true;
}
}));
assert.ok(!references.has('a'));
assert.ok(!expectation.disposed);
assert.deepStrictEqual(references.keys(), []);
const reference = await references.acquire('a');
const reference2 = await references.acquire('a');
assert.ok(references.has('a'));
assert.ok(!expectation.disposed);
assert.deepStrictEqual(references.keys(), ['a']);
reference.dispose();
assert.ok(references.has('a'));
assert.ok(!expectation.disposed);
assert.deepStrictEqual(references.keys(), ['a']);
reference2.dispose();
assert.ok(!references.has('a'));
assert.ok(expectation.disposed);
assert.deepStrictEqual(references.keys(), []);
});
it('dispose an object with 2 references', async () => {
const expectation = { disposed: false };
const references = new reference_1.ReferenceCollection(key => ({
key, dispose: () => {
expectation.disposed = true;
}
}));
assert.ok(!references.has('a'));
assert.ok(!expectation.disposed);
assert.deepStrictEqual(references.keys(), []);
await references.acquire('a');
const reference = await references.acquire('a');
assert.ok(references.has('a'));
assert.ok(!expectation.disposed);
assert.deepStrictEqual(references.keys(), ['a']);
reference.object.dispose();
assert.ok(!references.has('a'));
assert.ok(expectation.disposed);
assert.deepStrictEqual(references.keys(), []);
});
it("shouldn't call onWillDispose event on create", async () => {
const expectation = { disposed: false };
const references = new reference_1.ReferenceCollection(key => ({
key, dispose: () => {
}
}));
assert.ok(!references.has('a'));
assert.ok(!expectation.disposed);
references.onWillDispose(e => {
expectation.disposed = true;
});
await references.acquire('a');
assert.ok(!expectation.disposed);
const reference = await references.acquire('a');
reference.object.dispose();
assert.ok(expectation.disposed);
});
it('the same object should be provided by an async factory for the same key', async () => {
const references = new reference_1.ReferenceCollection(async (key) => ({
key, dispose: () => {
}
}));
const result = await Promise.all([...Array(10).keys()].map(() => references.acquire('a')));
result.forEach(v => assert.ok(result[0].object === v.object));
});
it('should not dispose an object if a reference is pending', async () => {
let disposed = false;
const references = new reference_1.ReferenceCollection(async (key) => ({
key, dispose: () => {
disposed = true;
}
}));
assert.ok(!disposed);
let reference = await references.acquire('a');
const pendingReference = references.acquire('a');
reference.dispose();
assert.ok(!disposed);
reference = await pendingReference;
reference.dispose();
assert.ok(disposed);
});
});
//# sourceMappingURL=reference.spec.js.map
;