2.0 KB83 lines
Blame
1/**
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 */
7
8import {CancellationToken} from '../CancellationToken';
9
10describe('CancellationToken', () => {
11 it('can be cancelled', () => {
12 const token = new CancellationToken();
13 expect(token.isCancelled).toBe(false);
14 token.cancel();
15 expect(token.isCancelled).toBe(true);
16 });
17
18 it('can be subscribed to', () => {
19 const token = new CancellationToken();
20 const callback = jest.fn();
21 const dispose = token.onCancel(callback);
22
23 token.cancel();
24
25 expect(callback).toHaveBeenCalled();
26
27 dispose();
28 });
29
30 it('callback can be disposed', () => {
31 const token = new CancellationToken();
32 const callback = jest.fn();
33 const dispose = token.onCancel(callback);
34 dispose();
35 token.cancel();
36 expect(callback).not.toHaveBeenCalled();
37 });
38
39 it('handles multiple callbacks', () => {
40 const token = new CancellationToken();
41 const callback1 = jest.fn();
42 const callback2 = jest.fn();
43 const callback3 = jest.fn();
44 const dispose1 = token.onCancel(callback1);
45 const dispose2 = token.onCancel(callback2);
46 const dispose3 = token.onCancel(callback3);
47
48 dispose2();
49
50 token.cancel();
51 expect(callback1).toHaveBeenCalledTimes(1);
52 expect(callback2).not.toHaveBeenCalled();
53 expect(callback3).toHaveBeenCalledTimes(1);
54
55 dispose1();
56 dispose3();
57 });
58
59 it('callback fires immediately when already cancelled', () => {
60 const token = new CancellationToken();
61 token.cancel();
62 const callback = jest.fn();
63 const dispose = token.onCancel(callback);
64 expect(callback).toHaveBeenCalled();
65
66 dispose();
67 });
68
69 it('cancelling is idempotent', () => {
70 const token = new CancellationToken();
71 const callback = jest.fn();
72 const dispose = token.onCancel(callback);
73
74 token.cancel();
75 token.cancel();
76 token.cancel();
77
78 expect(callback).toHaveBeenCalledTimes(1);
79
80 dispose();
81 });
82});
83