1 | 'use strict';
|
---|
2 | /**
|
---|
3 | * @license Angular v12.0.0-next.0
|
---|
4 | * (c) 2010-2020 Google LLC. https://angular.io/
|
---|
5 | * License: MIT
|
---|
6 | */
|
---|
7 | (function (factory) {
|
---|
8 | typeof define === 'function' && define.amd ? define(factory) :
|
---|
9 | factory();
|
---|
10 | }((function () {
|
---|
11 | 'use strict';
|
---|
12 | /**
|
---|
13 | * @license
|
---|
14 | * Copyright Google LLC All Rights Reserved.
|
---|
15 | *
|
---|
16 | * Use of this source code is governed by an MIT-style license that can be
|
---|
17 | * found in the LICENSE file at https://angular.io/license
|
---|
18 | */
|
---|
19 | Zone.__load_patch('jasmine', function (global, Zone, api) {
|
---|
20 | var __extends = function (d, b) {
|
---|
21 | for (var p in b)
|
---|
22 | if (b.hasOwnProperty(p))
|
---|
23 | d[p] = b[p];
|
---|
24 | function __() {
|
---|
25 | this.constructor = d;
|
---|
26 | }
|
---|
27 | d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());
|
---|
28 | };
|
---|
29 | // Patch jasmine's describe/it/beforeEach/afterEach functions so test code always runs
|
---|
30 | // in a testZone (ProxyZone). (See: angular/zone.js#91 & angular/angular#10503)
|
---|
31 | if (!Zone)
|
---|
32 | throw new Error('Missing: zone.js');
|
---|
33 | if (typeof jest !== 'undefined') {
|
---|
34 | // return if jasmine is a light implementation inside jest
|
---|
35 | // in this case, we are running inside jest not jasmine
|
---|
36 | return;
|
---|
37 | }
|
---|
38 | if (typeof jasmine == 'undefined' || jasmine['__zone_patch__']) {
|
---|
39 | return;
|
---|
40 | }
|
---|
41 | jasmine['__zone_patch__'] = true;
|
---|
42 | var SyncTestZoneSpec = Zone['SyncTestZoneSpec'];
|
---|
43 | var ProxyZoneSpec = Zone['ProxyZoneSpec'];
|
---|
44 | if (!SyncTestZoneSpec)
|
---|
45 | throw new Error('Missing: SyncTestZoneSpec');
|
---|
46 | if (!ProxyZoneSpec)
|
---|
47 | throw new Error('Missing: ProxyZoneSpec');
|
---|
48 | var ambientZone = Zone.current;
|
---|
49 | // Create a synchronous-only zone in which to run `describe` blocks in order to raise an
|
---|
50 | // error if any asynchronous operations are attempted inside of a `describe` but outside of
|
---|
51 | // a `beforeEach` or `it`.
|
---|
52 | var syncZone = ambientZone.fork(new SyncTestZoneSpec('jasmine.describe'));
|
---|
53 | var symbol = Zone.__symbol__;
|
---|
54 | // whether patch jasmine clock when in fakeAsync
|
---|
55 | var disablePatchingJasmineClock = global[symbol('fakeAsyncDisablePatchingClock')] === true;
|
---|
56 | // the original variable name fakeAsyncPatchLock is not accurate, so the name will be
|
---|
57 | // fakeAsyncAutoFakeAsyncWhenClockPatched and if this enablePatchingJasmineClock is false, we also
|
---|
58 | // automatically disable the auto jump into fakeAsync feature
|
---|
59 | var enableAutoFakeAsyncWhenClockPatched = !disablePatchingJasmineClock &&
|
---|
60 | ((global[symbol('fakeAsyncPatchLock')] === true) ||
|
---|
61 | (global[symbol('fakeAsyncAutoFakeAsyncWhenClockPatched')] === true));
|
---|
62 | var ignoreUnhandledRejection = global[symbol('ignoreUnhandledRejection')] === true;
|
---|
63 | if (!ignoreUnhandledRejection) {
|
---|
64 | var globalErrors_1 = jasmine.GlobalErrors;
|
---|
65 | if (globalErrors_1 && !jasmine[symbol('GlobalErrors')]) {
|
---|
66 | jasmine[symbol('GlobalErrors')] = globalErrors_1;
|
---|
67 | jasmine.GlobalErrors = function () {
|
---|
68 | var instance = new globalErrors_1();
|
---|
69 | var originalInstall = instance.install;
|
---|
70 | if (originalInstall && !instance[symbol('install')]) {
|
---|
71 | instance[symbol('install')] = originalInstall;
|
---|
72 | instance.install = function () {
|
---|
73 | var originalHandlers = process.listeners('unhandledRejection');
|
---|
74 | var r = originalInstall.apply(this, arguments);
|
---|
75 | process.removeAllListeners('unhandledRejection');
|
---|
76 | if (originalHandlers) {
|
---|
77 | originalHandlers.forEach(function (h) { return process.on('unhandledRejection', h); });
|
---|
78 | }
|
---|
79 | return r;
|
---|
80 | };
|
---|
81 | }
|
---|
82 | return instance;
|
---|
83 | };
|
---|
84 | }
|
---|
85 | }
|
---|
86 | // Monkey patch all of the jasmine DSL so that each function runs in appropriate zone.
|
---|
87 | var jasmineEnv = jasmine.getEnv();
|
---|
88 | ['describe', 'xdescribe', 'fdescribe'].forEach(function (methodName) {
|
---|
89 | var originalJasmineFn = jasmineEnv[methodName];
|
---|
90 | jasmineEnv[methodName] = function (description, specDefinitions) {
|
---|
91 | return originalJasmineFn.call(this, description, wrapDescribeInZone(specDefinitions));
|
---|
92 | };
|
---|
93 | });
|
---|
94 | ['it', 'xit', 'fit'].forEach(function (methodName) {
|
---|
95 | var originalJasmineFn = jasmineEnv[methodName];
|
---|
96 | jasmineEnv[symbol(methodName)] = originalJasmineFn;
|
---|
97 | jasmineEnv[methodName] = function (description, specDefinitions, timeout) {
|
---|
98 | arguments[1] = wrapTestInZone(specDefinitions);
|
---|
99 | return originalJasmineFn.apply(this, arguments);
|
---|
100 | };
|
---|
101 | });
|
---|
102 | ['beforeEach', 'afterEach', 'beforeAll', 'afterAll'].forEach(function (methodName) {
|
---|
103 | var originalJasmineFn = jasmineEnv[methodName];
|
---|
104 | jasmineEnv[symbol(methodName)] = originalJasmineFn;
|
---|
105 | jasmineEnv[methodName] = function (specDefinitions, timeout) {
|
---|
106 | arguments[0] = wrapTestInZone(specDefinitions);
|
---|
107 | return originalJasmineFn.apply(this, arguments);
|
---|
108 | };
|
---|
109 | });
|
---|
110 | if (!disablePatchingJasmineClock) {
|
---|
111 | // need to patch jasmine.clock().mockDate and jasmine.clock().tick() so
|
---|
112 | // they can work properly in FakeAsyncTest
|
---|
113 | var originalClockFn_1 = (jasmine[symbol('clock')] = jasmine['clock']);
|
---|
114 | jasmine['clock'] = function () {
|
---|
115 | var clock = originalClockFn_1.apply(this, arguments);
|
---|
116 | if (!clock[symbol('patched')]) {
|
---|
117 | clock[symbol('patched')] = symbol('patched');
|
---|
118 | var originalTick_1 = (clock[symbol('tick')] = clock.tick);
|
---|
119 | clock.tick = function () {
|
---|
120 | var fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
|
---|
121 | if (fakeAsyncZoneSpec) {
|
---|
122 | return fakeAsyncZoneSpec.tick.apply(fakeAsyncZoneSpec, arguments);
|
---|
123 | }
|
---|
124 | return originalTick_1.apply(this, arguments);
|
---|
125 | };
|
---|
126 | var originalMockDate_1 = (clock[symbol('mockDate')] = clock.mockDate);
|
---|
127 | clock.mockDate = function () {
|
---|
128 | var fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
|
---|
129 | if (fakeAsyncZoneSpec) {
|
---|
130 | var dateTime = arguments.length > 0 ? arguments[0] : new Date();
|
---|
131 | return fakeAsyncZoneSpec.setFakeBaseSystemTime.apply(fakeAsyncZoneSpec, dateTime && typeof dateTime.getTime === 'function' ? [dateTime.getTime()] :
|
---|
132 | arguments);
|
---|
133 | }
|
---|
134 | return originalMockDate_1.apply(this, arguments);
|
---|
135 | };
|
---|
136 | // for auto go into fakeAsync feature, we need the flag to enable it
|
---|
137 | if (enableAutoFakeAsyncWhenClockPatched) {
|
---|
138 | ['install', 'uninstall'].forEach(function (methodName) {
|
---|
139 | var originalClockFn = (clock[symbol(methodName)] = clock[methodName]);
|
---|
140 | clock[methodName] = function () {
|
---|
141 | var FakeAsyncTestZoneSpec = Zone['FakeAsyncTestZoneSpec'];
|
---|
142 | if (FakeAsyncTestZoneSpec) {
|
---|
143 | jasmine[symbol('clockInstalled')] = 'install' === methodName;
|
---|
144 | return;
|
---|
145 | }
|
---|
146 | return originalClockFn.apply(this, arguments);
|
---|
147 | };
|
---|
148 | });
|
---|
149 | }
|
---|
150 | }
|
---|
151 | return clock;
|
---|
152 | };
|
---|
153 | }
|
---|
154 | // monkey patch createSpyObj to make properties enumerable to true
|
---|
155 | if (!jasmine[Zone.__symbol__('createSpyObj')]) {
|
---|
156 | var originalCreateSpyObj_1 = jasmine.createSpyObj;
|
---|
157 | jasmine[Zone.__symbol__('createSpyObj')] = originalCreateSpyObj_1;
|
---|
158 | jasmine.createSpyObj = function () {
|
---|
159 | var args = Array.prototype.slice.call(arguments);
|
---|
160 | var propertyNames = args.length >= 3 ? args[2] : null;
|
---|
161 | var spyObj;
|
---|
162 | if (propertyNames) {
|
---|
163 | var defineProperty_1 = Object.defineProperty;
|
---|
164 | Object.defineProperty = function (obj, p, attributes) {
|
---|
165 | return defineProperty_1.call(this, obj, p, Object.assign(Object.assign({}, attributes), { configurable: true, enumerable: true }));
|
---|
166 | };
|
---|
167 | try {
|
---|
168 | spyObj = originalCreateSpyObj_1.apply(this, args);
|
---|
169 | }
|
---|
170 | finally {
|
---|
171 | Object.defineProperty = defineProperty_1;
|
---|
172 | }
|
---|
173 | }
|
---|
174 | else {
|
---|
175 | spyObj = originalCreateSpyObj_1.apply(this, args);
|
---|
176 | }
|
---|
177 | return spyObj;
|
---|
178 | };
|
---|
179 | }
|
---|
180 | /**
|
---|
181 | * Gets a function wrapping the body of a Jasmine `describe` block to execute in a
|
---|
182 | * synchronous-only zone.
|
---|
183 | */
|
---|
184 | function wrapDescribeInZone(describeBody) {
|
---|
185 | return function () {
|
---|
186 | return syncZone.run(describeBody, this, arguments);
|
---|
187 | };
|
---|
188 | }
|
---|
189 | function runInTestZone(testBody, applyThis, queueRunner, done) {
|
---|
190 | var isClockInstalled = !!jasmine[symbol('clockInstalled')];
|
---|
191 | var testProxyZoneSpec = queueRunner.testProxyZoneSpec;
|
---|
192 | var testProxyZone = queueRunner.testProxyZone;
|
---|
193 | if (isClockInstalled && enableAutoFakeAsyncWhenClockPatched) {
|
---|
194 | // auto run a fakeAsync
|
---|
195 | var fakeAsyncModule = Zone[Zone.__symbol__('fakeAsyncTest')];
|
---|
196 | if (fakeAsyncModule && typeof fakeAsyncModule.fakeAsync === 'function') {
|
---|
197 | testBody = fakeAsyncModule.fakeAsync(testBody);
|
---|
198 | }
|
---|
199 | }
|
---|
200 | if (done) {
|
---|
201 | return testProxyZone.run(testBody, applyThis, [done]);
|
---|
202 | }
|
---|
203 | else {
|
---|
204 | return testProxyZone.run(testBody, applyThis);
|
---|
205 | }
|
---|
206 | }
|
---|
207 | /**
|
---|
208 | * Gets a function wrapping the body of a Jasmine `it/beforeEach/afterEach` block to
|
---|
209 | * execute in a ProxyZone zone.
|
---|
210 | * This will run in `testProxyZone`. The `testProxyZone` will be reset by the `ZoneQueueRunner`
|
---|
211 | */
|
---|
212 | function wrapTestInZone(testBody) {
|
---|
213 | // The `done` callback is only passed through if the function expects at least one argument.
|
---|
214 | // Note we have to make a function with correct number of arguments, otherwise jasmine will
|
---|
215 | // think that all functions are sync or async.
|
---|
216 | return (testBody && (testBody.length ? function (done) {
|
---|
217 | return runInTestZone(testBody, this, this.queueRunner, done);
|
---|
218 | } : function () {
|
---|
219 | return runInTestZone(testBody, this, this.queueRunner);
|
---|
220 | }));
|
---|
221 | }
|
---|
222 | var QueueRunner = jasmine.QueueRunner;
|
---|
223 | jasmine.QueueRunner = (function (_super) {
|
---|
224 | __extends(ZoneQueueRunner, _super);
|
---|
225 | function ZoneQueueRunner(attrs) {
|
---|
226 | var _this = this;
|
---|
227 | if (attrs.onComplete) {
|
---|
228 | attrs.onComplete = (function (fn) { return function () {
|
---|
229 | // All functions are done, clear the test zone.
|
---|
230 | _this.testProxyZone = null;
|
---|
231 | _this.testProxyZoneSpec = null;
|
---|
232 | ambientZone.scheduleMicroTask('jasmine.onComplete', fn);
|
---|
233 | }; })(attrs.onComplete);
|
---|
234 | }
|
---|
235 | var nativeSetTimeout = global[Zone.__symbol__('setTimeout')];
|
---|
236 | var nativeClearTimeout = global[Zone.__symbol__('clearTimeout')];
|
---|
237 | if (nativeSetTimeout) {
|
---|
238 | // should run setTimeout inside jasmine outside of zone
|
---|
239 | attrs.timeout = {
|
---|
240 | setTimeout: nativeSetTimeout ? nativeSetTimeout : global.setTimeout,
|
---|
241 | clearTimeout: nativeClearTimeout ? nativeClearTimeout : global.clearTimeout
|
---|
242 | };
|
---|
243 | }
|
---|
244 | // create a userContext to hold the queueRunner itself
|
---|
245 | // so we can access the testProxy in it/xit/beforeEach ...
|
---|
246 | if (jasmine.UserContext) {
|
---|
247 | if (!attrs.userContext) {
|
---|
248 | attrs.userContext = new jasmine.UserContext();
|
---|
249 | }
|
---|
250 | attrs.userContext.queueRunner = this;
|
---|
251 | }
|
---|
252 | else {
|
---|
253 | if (!attrs.userContext) {
|
---|
254 | attrs.userContext = {};
|
---|
255 | }
|
---|
256 | attrs.userContext.queueRunner = this;
|
---|
257 | }
|
---|
258 | // patch attrs.onException
|
---|
259 | var onException = attrs.onException;
|
---|
260 | attrs.onException = function (error) {
|
---|
261 | if (error &&
|
---|
262 | error.message ===
|
---|
263 | 'Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.') {
|
---|
264 | // jasmine timeout, we can make the error message more
|
---|
265 | // reasonable to tell what tasks are pending
|
---|
266 | var proxyZoneSpec = this && this.testProxyZoneSpec;
|
---|
267 | if (proxyZoneSpec) {
|
---|
268 | var pendingTasksInfo = proxyZoneSpec.getAndClearPendingTasksInfo();
|
---|
269 | try {
|
---|
270 | // try catch here in case error.message is not writable
|
---|
271 | error.message += pendingTasksInfo;
|
---|
272 | }
|
---|
273 | catch (err) {
|
---|
274 | }
|
---|
275 | }
|
---|
276 | }
|
---|
277 | if (onException) {
|
---|
278 | onException.call(this, error);
|
---|
279 | }
|
---|
280 | };
|
---|
281 | _super.call(this, attrs);
|
---|
282 | }
|
---|
283 | ZoneQueueRunner.prototype.execute = function () {
|
---|
284 | var _this = this;
|
---|
285 | var zone = Zone.current;
|
---|
286 | var isChildOfAmbientZone = false;
|
---|
287 | while (zone) {
|
---|
288 | if (zone === ambientZone) {
|
---|
289 | isChildOfAmbientZone = true;
|
---|
290 | break;
|
---|
291 | }
|
---|
292 | zone = zone.parent;
|
---|
293 | }
|
---|
294 | if (!isChildOfAmbientZone)
|
---|
295 | throw new Error('Unexpected Zone: ' + Zone.current.name);
|
---|
296 | // This is the zone which will be used for running individual tests.
|
---|
297 | // It will be a proxy zone, so that the tests function can retroactively install
|
---|
298 | // different zones.
|
---|
299 | // Example:
|
---|
300 | // - In beforeEach() do childZone = Zone.current.fork(...);
|
---|
301 | // - In it() try to do fakeAsync(). The issue is that because the beforeEach forked the
|
---|
302 | // zone outside of fakeAsync it will be able to escape the fakeAsync rules.
|
---|
303 | // - Because ProxyZone is parent fo `childZone` fakeAsync can retroactively add
|
---|
304 | // fakeAsync behavior to the childZone.
|
---|
305 | this.testProxyZoneSpec = new ProxyZoneSpec();
|
---|
306 | this.testProxyZone = ambientZone.fork(this.testProxyZoneSpec);
|
---|
307 | if (!Zone.currentTask) {
|
---|
308 | // if we are not running in a task then if someone would register a
|
---|
309 | // element.addEventListener and then calling element.click() the
|
---|
310 | // addEventListener callback would think that it is the top most task and would
|
---|
311 | // drain the microtask queue on element.click() which would be incorrect.
|
---|
312 | // For this reason we always force a task when running jasmine tests.
|
---|
313 | Zone.current.scheduleMicroTask('jasmine.execute().forceTask', function () { return QueueRunner.prototype.execute.call(_this); });
|
---|
314 | }
|
---|
315 | else {
|
---|
316 | _super.prototype.execute.call(this);
|
---|
317 | }
|
---|
318 | };
|
---|
319 | return ZoneQueueRunner;
|
---|
320 | })(QueueRunner);
|
---|
321 | });
|
---|
322 | })));
|
---|