11cb0ef41Sopenharmony_ci'use strict';
21cb0ef41Sopenharmony_ciconst common = require('../common');
31cb0ef41Sopenharmony_ciconst assert = require('assert');
41cb0ef41Sopenharmony_ciconst { promiseHooks } = require('v8');
51cb0ef41Sopenharmony_ci
61cb0ef41Sopenharmony_ciassert.throws(() => {
71cb0ef41Sopenharmony_ci  promiseHooks.onSettled(async function() { });
81cb0ef41Sopenharmony_ci}, /The "settledHook" argument must be of type function/);
91cb0ef41Sopenharmony_ci
101cb0ef41Sopenharmony_ciassert.throws(() => {
111cb0ef41Sopenharmony_ci  promiseHooks.onSettled(async function*() { });
121cb0ef41Sopenharmony_ci}, /The "settledHook" argument must be of type function/);
131cb0ef41Sopenharmony_ci
141cb0ef41Sopenharmony_cilet seen;
151cb0ef41Sopenharmony_ci
161cb0ef41Sopenharmony_ciconst stop = promiseHooks.onSettled(common.mustCall((promise) => {
171cb0ef41Sopenharmony_ci  seen = promise;
181cb0ef41Sopenharmony_ci}, 4));
191cb0ef41Sopenharmony_ci
201cb0ef41Sopenharmony_ci// Constructor resolve triggers hook
211cb0ef41Sopenharmony_ciconst promise = new Promise((resolve, reject) => {
221cb0ef41Sopenharmony_ci  assert.strictEqual(seen, undefined);
231cb0ef41Sopenharmony_ci  setImmediate(() => {
241cb0ef41Sopenharmony_ci    resolve();
251cb0ef41Sopenharmony_ci    assert.strictEqual(seen, promise);
261cb0ef41Sopenharmony_ci    seen = undefined;
271cb0ef41Sopenharmony_ci
281cb0ef41Sopenharmony_ci    constructorReject();
291cb0ef41Sopenharmony_ci  });
301cb0ef41Sopenharmony_ci});
311cb0ef41Sopenharmony_ci
321cb0ef41Sopenharmony_ci// Constructor reject triggers hook
331cb0ef41Sopenharmony_cifunction constructorReject() {
341cb0ef41Sopenharmony_ci  const promise = new Promise((resolve, reject) => {
351cb0ef41Sopenharmony_ci    assert.strictEqual(seen, undefined);
361cb0ef41Sopenharmony_ci    setImmediate(() => {
371cb0ef41Sopenharmony_ci      reject();
381cb0ef41Sopenharmony_ci      assert.strictEqual(seen, promise);
391cb0ef41Sopenharmony_ci      seen = undefined;
401cb0ef41Sopenharmony_ci
411cb0ef41Sopenharmony_ci      simpleResolveReject();
421cb0ef41Sopenharmony_ci    });
431cb0ef41Sopenharmony_ci  });
441cb0ef41Sopenharmony_ci  promise.catch(() => {});
451cb0ef41Sopenharmony_ci}
461cb0ef41Sopenharmony_ci
471cb0ef41Sopenharmony_ci// Sync resolve/reject helpers trigger hook
481cb0ef41Sopenharmony_cifunction simpleResolveReject() {
491cb0ef41Sopenharmony_ci  const resolved = Promise.resolve();
501cb0ef41Sopenharmony_ci  assert.strictEqual(seen, resolved);
511cb0ef41Sopenharmony_ci  seen = undefined;
521cb0ef41Sopenharmony_ci
531cb0ef41Sopenharmony_ci  const rejected = Promise.reject();
541cb0ef41Sopenharmony_ci  assert.strictEqual(seen, rejected);
551cb0ef41Sopenharmony_ci  seen = undefined;
561cb0ef41Sopenharmony_ci
571cb0ef41Sopenharmony_ci  stop();
581cb0ef41Sopenharmony_ci  rejected.catch(() => {});
591cb0ef41Sopenharmony_ci}
60