Path: blob/main/src/vs/base/test/common/cancellation.test.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/4import assert from 'assert';5import { CancellationToken, CancellationTokenSource } from '../../common/cancellation.js';6import { ensureNoDisposablesAreLeakedInTestSuite } from './utils.js';78suite('CancellationToken', function () {910const store = ensureNoDisposablesAreLeakedInTestSuite();1112test('None', () => {13assert.strictEqual(CancellationToken.None.isCancellationRequested, false);14assert.strictEqual(typeof CancellationToken.None.onCancellationRequested, 'function');15});1617test('cancel before token', function () {1819const source = new CancellationTokenSource();20assert.strictEqual(source.token.isCancellationRequested, false);21source.cancel();2223assert.strictEqual(source.token.isCancellationRequested, true);2425return new Promise<void>(resolve => {26source.token.onCancellationRequested(() => resolve());27});28});2930test('cancel happens only once', function () {3132const source = new CancellationTokenSource();33assert.strictEqual(source.token.isCancellationRequested, false);3435let cancelCount = 0;36function onCancel() {37cancelCount += 1;38}3940store.add(source.token.onCancellationRequested(onCancel));4142source.cancel();43source.cancel();4445assert.strictEqual(cancelCount, 1);46});4748test('cancel calls all listeners', function () {4950let count = 0;5152const source = new CancellationTokenSource();53store.add(source.token.onCancellationRequested(() => count++));54store.add(source.token.onCancellationRequested(() => count++));55store.add(source.token.onCancellationRequested(() => count++));5657source.cancel();58assert.strictEqual(count, 3);59});6061test('token stays the same', function () {6263let source = new CancellationTokenSource();64let token = source.token;65assert.ok(token === source.token); // doesn't change on get6667source.cancel();68assert.ok(token === source.token); // doesn't change after cancel6970source.cancel();71assert.ok(token === source.token); // doesn't change after 2nd cancel7273source = new CancellationTokenSource();74source.cancel();75token = source.token;76assert.ok(token === source.token); // doesn't change on get77});7879test('dispose calls no listeners', function () {8081let count = 0;8283const source = new CancellationTokenSource();84store.add(source.token.onCancellationRequested(() => count++));8586source.dispose();87source.cancel();88assert.strictEqual(count, 0);89});9091test('dispose calls no listeners (unless told to cancel)', function () {9293let count = 0;9495const source = new CancellationTokenSource();96store.add(source.token.onCancellationRequested(() => count++));9798source.dispose(true);99// source.cancel();100assert.strictEqual(count, 1);101});102103test('dispose does not cancel', function () {104const source = new CancellationTokenSource();105source.dispose();106assert.strictEqual(source.token.isCancellationRequested, false);107});108109test('parent cancels child', function () {110111const parent = new CancellationTokenSource();112const child = new CancellationTokenSource(parent.token);113114let count = 0;115store.add(child.token.onCancellationRequested(() => count++));116117parent.cancel();118119assert.strictEqual(count, 1);120assert.strictEqual(child.token.isCancellationRequested, true);121assert.strictEqual(parent.token.isCancellationRequested, true);122123child.dispose();124parent.dispose();125});126});127128129