addons/shared/__tests__/CancellationToken.test.tsblame
View source
b69ab311/**
b69ab312 * Copyright (c) Meta Platforms, Inc. and affiliates.
b69ab313 *
b69ab314 * This source code is licensed under the MIT license found in the
b69ab315 * LICENSE file in the root directory of this source tree.
b69ab316 */
b69ab317
b69ab318import {CancellationToken} from '../CancellationToken';
b69ab319
b69ab3110describe('CancellationToken', () => {
b69ab3111 it('can be cancelled', () => {
b69ab3112 const token = new CancellationToken();
b69ab3113 expect(token.isCancelled).toBe(false);
b69ab3114 token.cancel();
b69ab3115 expect(token.isCancelled).toBe(true);
b69ab3116 });
b69ab3117
b69ab3118 it('can be subscribed to', () => {
b69ab3119 const token = new CancellationToken();
b69ab3120 const callback = jest.fn();
b69ab3121 const dispose = token.onCancel(callback);
b69ab3122
b69ab3123 token.cancel();
b69ab3124
b69ab3125 expect(callback).toHaveBeenCalled();
b69ab3126
b69ab3127 dispose();
b69ab3128 });
b69ab3129
b69ab3130 it('callback can be disposed', () => {
b69ab3131 const token = new CancellationToken();
b69ab3132 const callback = jest.fn();
b69ab3133 const dispose = token.onCancel(callback);
b69ab3134 dispose();
b69ab3135 token.cancel();
b69ab3136 expect(callback).not.toHaveBeenCalled();
b69ab3137 });
b69ab3138
b69ab3139 it('handles multiple callbacks', () => {
b69ab3140 const token = new CancellationToken();
b69ab3141 const callback1 = jest.fn();
b69ab3142 const callback2 = jest.fn();
b69ab3143 const callback3 = jest.fn();
b69ab3144 const dispose1 = token.onCancel(callback1);
b69ab3145 const dispose2 = token.onCancel(callback2);
b69ab3146 const dispose3 = token.onCancel(callback3);
b69ab3147
b69ab3148 dispose2();
b69ab3149
b69ab3150 token.cancel();
b69ab3151 expect(callback1).toHaveBeenCalledTimes(1);
b69ab3152 expect(callback2).not.toHaveBeenCalled();
b69ab3153 expect(callback3).toHaveBeenCalledTimes(1);
b69ab3154
b69ab3155 dispose1();
b69ab3156 dispose3();
b69ab3157 });
b69ab3158
b69ab3159 it('callback fires immediately when already cancelled', () => {
b69ab3160 const token = new CancellationToken();
b69ab3161 token.cancel();
b69ab3162 const callback = jest.fn();
b69ab3163 const dispose = token.onCancel(callback);
b69ab3164 expect(callback).toHaveBeenCalled();
b69ab3165
b69ab3166 dispose();
b69ab3167 });
b69ab3168
b69ab3169 it('cancelling is idempotent', () => {
b69ab3170 const token = new CancellationToken();
b69ab3171 const callback = jest.fn();
b69ab3172 const dispose = token.onCancel(callback);
b69ab3173
b69ab3174 token.cancel();
b69ab3175 token.cancel();
b69ab3176 token.cancel();
b69ab3177
b69ab3178 expect(callback).toHaveBeenCalledTimes(1);
b69ab3179
b69ab3180 dispose();
b69ab3181 });
b69ab3182});