summaryrefslogtreecommitdiffstats
path: root/toolkit/modules/tests/xpcshell/test_PromiseUtils.js
blob: cc80248f008995f017e256552123ad06188b5344 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */
/* eslint-disable mozilla/no-arbitrary-setTimeout */

"use strict";

const { PromiseUtils } = ChromeUtils.importESModule(
  "resource://gre/modules/PromiseUtils.sys.mjs"
);
const { setTimeout } = ChromeUtils.importESModule(
  "resource://gre/modules/Timer.sys.mjs"
);
const { PromiseTestUtils } = ChromeUtils.importESModule(
  "resource://testing-common/PromiseTestUtils.sys.mjs"
);

// Tests for PromiseUtils.sys.mjs

// Tests for PromiseUtils.defer()

/* Tests for checking the resolve method of the Deferred object
 * returned by PromiseUtils.defer() */
add_task(async function test_resolve_string() {
  let def = PromiseUtils.defer();
  let expected = "The promise is resolved " + Math.random();
  def.resolve(expected);
  let result = await def.promise;
  Assert.equal(result, expected, "def.resolve() resolves the promise");
});

/* Test for the case when undefined is passed to the resolve method
 * of the Deferred object */
add_task(async function test_resolve_undefined() {
  let def = PromiseUtils.defer();
  def.resolve();
  let result = await def.promise;
  Assert.equal(result, undefined, "resolve works with undefined as well");
});

/* Test when a pending promise is passed to the resolve method
 * of the Deferred object */
add_task(async function test_resolve_pending_promise() {
  let def = PromiseUtils.defer();
  let expected = 100 + Math.random();
  let p = new Promise((resolve, reject) => {
    setTimeout(() => resolve(expected), 100);
  });
  def.resolve(p);
  let result = await def.promise;
  Assert.equal(
    result,
    expected,
    "def.promise assumed the state of the passed promise"
  );
});

/* Test when a resovled promise is passed
 * to the resolve method of the Deferred object */
add_task(async function test_resolve_resolved_promise() {
  let def = PromiseUtils.defer();
  let expected = "Yeah resolved" + Math.random();
  let p = new Promise((resolve, reject) => resolve(expected));
  def.resolve(p);
  let result = await def.promise;
  Assert.equal(
    result,
    expected,
    "Resolved promise is passed to the resolve method"
  );
});

/* Test for the case when a rejected promise is
 * passed to the resolve method */
add_task(async function test_resolve_rejected_promise() {
  let def = PromiseUtils.defer();
  let p = new Promise((resolve, reject) =>
    reject(new Error("There its an rejection"))
  );
  def.resolve(p);
  await Assert.rejects(
    def.promise,
    /There its an rejection/,
    "Settled rejection promise passed to the resolve method"
  );
});

/* Test for the checking the reject method of
 * the Deferred object returned by PromiseUtils.defer() */
add_task(async function test_reject_Error() {
  let def = PromiseUtils.defer();
  def.reject(new Error("This one rejects"));
  await Assert.rejects(
    def.promise,
    /This one rejects/,
    "reject method with Error for rejection"
  );
});

/* Test for the case when a pending Promise is passed to
 * the reject method of Deferred object */
add_task(async function test_reject_pending_promise() {
  let def = PromiseUtils.defer();
  let p = new Promise((resolve, reject) => {
    setTimeout(() => resolve(100), 100);
  });
  def.reject(p);
  await Assert.rejects(
    def.promise,
    Promise,
    "Rejection with a pending promise uses the passed promise itself as the reason of rejection"
  );
});

/* Test for the case when a resolved Promise
 * is passed to the reject method */
add_task(async function test_reject_resolved_promise() {
  let def = PromiseUtils.defer();
  let p = new Promise((resolve, reject) => resolve("This resolved"));
  def.reject(p);
  await Assert.rejects(
    def.promise,
    Promise,
    "Rejection with a resolved promise uses the passed promise itself as the reason of rejection"
  );
});

/* Test for the case when a rejected Promise is
 * passed to the reject method */
add_task(async function test_reject_resolved_promise() {
  PromiseTestUtils.expectUncaughtRejection(/This one rejects/);
  let def = PromiseUtils.defer();
  let p = new Promise((resolve, reject) =>
    reject(new Error("This one rejects"))
  );
  def.reject(p);
  await Assert.rejects(
    def.promise,
    Promise,
    "Rejection with a rejected promise uses the passed promise itself as the reason of rejection"
  );
});