Add filters and more events to Promise callback. (#4605)

JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
Zoltan Herczeg
2021-02-24 10:31:08 +01:00
committed by GitHub
parent f0f2a28109
commit c27047da03
8 changed files with 307 additions and 29 deletions
+82 -7
View File
@@ -23,6 +23,10 @@ typedef enum
C = JERRY_PROMISE_EVENT_CREATE, /**< same as JERRY_PROMISE_CALLBACK_CREATE with undefined value */
RS = JERRY_PROMISE_EVENT_RESOLVE, /**< same as JERRY_PROMISE_CALLBACK_RESOLVE */
RJ = JERRY_PROMISE_EVENT_REJECT, /**< same as JERRY_PROMISE_CALLBACK_REJECT */
RSF = JERRY_PROMISE_EVENT_RESOLVE_FULFILLED, /**< same as JERRY_PROMISE_EVENT_RESOLVE_FULFILLED */
RJF = JERRY_PROMISE_EVENT_REJECT_FULFILLED, /**< same as JERRY_PROMISE_EVENT_REJECT_FULFILLED */
RWH = JERRY_PROMISE_EVENT_REJECT_WITHOUT_HANDLER, /**< same as JERRY_PROMISE_EVENT_REJECT_WITHOUT_HANDLER */
CHA = JERRY_PROMISE_EVENT_CATCH_HANDLER_ADDED, /**< same as JERRY_PROMISE_EVENT_CATCH_HANDLER_ADDED */
BR = JERRY_PROMISE_EVENT_BEFORE_REACTION_JOB, /**< same as JERRY_PROMISE_CALLBACK_BEFORE_REACTION_JOB */
AR = JERRY_PROMISE_EVENT_AFTER_REACTION_JOB, /**< same as JERRY_PROMISE_CALLBACK_AFTER_REACTION_JOB */
A = JERRY_PROMISE_EVENT_ASYNC_AWAIT, /**< same as JERRY_PROMISE_CALLBACK_ASYNC_AWAIT */
@@ -61,10 +65,14 @@ promise_callback (jerry_promise_event_type_t event_type, /**< event type */
}
case JERRY_PROMISE_EVENT_RESOLVE:
case JERRY_PROMISE_EVENT_REJECT:
case JERRY_PROMISE_EVENT_RESOLVE_FULFILLED:
case JERRY_PROMISE_EVENT_REJECT_FULFILLED:
case JERRY_PROMISE_EVENT_REJECT_WITHOUT_HANDLER:
{
TEST_ASSERT (jerry_value_is_promise (object));
break;
}
case JERRY_PROMISE_EVENT_CATCH_HANDLER_ADDED:
case JERRY_PROMISE_EVENT_BEFORE_REACTION_JOB:
case JERRY_PROMISE_EVENT_AFTER_REACTION_JOB:
{
@@ -126,7 +134,13 @@ main (void)
jerry_init (JERRY_INIT_EMPTY);
jerry_promise_set_callback (promise_callback, (void *) &user);
jerry_promise_event_filter_t filters = (JERRY_PROMISE_EVENT_FILTER_MAIN
| JERRY_PROMISE_EVENT_FILTER_ERROR
| JERRY_PROMISE_EVENT_FILTER_REACTION_JOB
| JERRY_PROMISE_EVENT_FILTER_ASYNC_MAIN
| JERRY_PROMISE_EVENT_FILTER_ASYNC_REACTION_JOB);
jerry_promise_set_callback (filters, promise_callback, (void *) &user);
/* Test promise creation. */
static uint8_t events1[] = { C, C, C, E };
@@ -155,7 +169,7 @@ main (void)
"promise.then(() => {})\n");
/* Test resolve and reject calls. */
static uint8_t events4[] = { C, C, RS, RJ, E };
static uint8_t events4[] = { C, C, RS, RJ, RWH, E };
run_eval (events4,
"'use strict'\n"
@@ -191,10 +205,10 @@ main (void)
"Promise.resolve(4).then(() => {})\n");
/* Test Promise.reject. */
static uint8_t events8[] = { C, RJ, CP, BR, RJ, AR, E };
static uint8_t events8[] = { C, RJ, RWH, CP, CHA, BR, RJ, RWH, AR, E };
run_eval (events8,
"Promise.reject(4).then(() => {})\n");
"Promise.reject(4).catch(() => { throw 'Error' })\n");
/* Test Promise.race without resolve */
static uint8_t events9[] = { C, C, C, CP, CP, E };
@@ -206,7 +220,7 @@ main (void)
"Promise.race([p1,p2])\n");
/* Test Promise.race with resolve. */
static uint8_t events10[] = { C, RS, C, RJ, C, CP, CP, BR, RS, RS, AR, BR, RS, AR, E };
static uint8_t events10[] = { C, RS, C, RJ, RWH, C, CP, CP, CHA, BR, RS, RS, AR, BR, RJF, RS, AR, E };
run_eval (events10,
"'use strict'\n"
@@ -224,7 +238,7 @@ main (void)
"Promise.all([p1,p2])\n");
/* Test Promise.all with resolve. */
static uint8_t events12[] = { C, RS, C, RJ, C, CP, CP, BR, RS, AR, BR, RJ, RS, AR, E };
static uint8_t events12[] = { C, RS, C, RJ, RWH, C, CP, CP, CHA, BR, RS, AR, BR, RJ, RWH, RS, AR, E };
run_eval (events12,
"'use strict'\n"
@@ -257,7 +271,7 @@ main (void)
"f(Promise.resolve(1))\n");
/* Test await with rejected Promise. */
static uint8_t events16[] = { C, RJ, A, C, BRJ, C, RS, RS, ARJ, E };
static uint8_t events16[] = { C, RJ, RWH, A, CHA, C, BRJ, C, RS, RS, ARJ, E };
run_eval (events16,
"'use strict'\n"
@@ -281,6 +295,67 @@ main (void)
"async function *g() { yield* f() }\n"
"g().next()\n");
/* Test multiple fulfill operations. */
static uint8_t events19[] = { C, RS, RSF, RJF, E };
run_eval (events19,
"'use strict'\n"
"var resolve, reject\n"
"var p1 = new Promise((res, rej) => { resolve = res, reject = rej })\n"
"resolve(1)\n"
"resolve(2)\n"
"reject(3)\n");
/* Test multiple fulfill operations. */
static uint8_t events20[] = { C, RJ, RWH, RSF, RJF, E };
run_eval (events20,
"'use strict'\n"
"var resolve, reject\n"
"var p1 = new Promise((res, rej) => { resolve = res, reject = rej })\n"
"reject(1)\n"
"resolve(2)\n"
"reject(3)\n");
/* Test catch handler added later is reported only once. */
static uint8_t events21[] = { C, RJ, RWH, CP, CHA, CP, CP, BR, RS, AR, BR, RS, AR, BR, RS, AR, E };
run_eval (events21,
"'use strict'\n"
"var rej = Promise.reject(4)\n"
"rej.catch(() => {})\n"
"rej.catch(() => {})\n"
"rej.catch(() => {})\n");
/* Test catch handler added later is reported only once. */
static uint8_t events22[] = { C, RJ, RWH, A, CHA, C, BRJ, A, ARJ, BRJ, RJ, RWH, ARJ, E };
run_eval (events22,
"'use strict'\n"
"async function f(p) { try { await p; } catch(e) { await p; } }"
"f(Promise.reject(4))\n");
/* Test disabled filters. */
jerry_promise_set_callback (JERRY_PROMISE_EVENT_FILTER_DISABLE, promise_callback, (void *) &user);
static uint8_t events23[] = { E };
run_eval (events23,
"'use strict'\n"
"async function f(p) { await p }"
"f(Promise.resolve(1))\n");
/* Test filtered events. */
filters = JERRY_PROMISE_EVENT_FILTER_REACTION_JOB | JERRY_PROMISE_EVENT_FILTER_ASYNC_REACTION_JOB;
jerry_promise_set_callback (filters, promise_callback, (void *) &user);
static uint8_t events24[] = { BR, AR, BRS, ARS, E };
run_eval (events24,
"'use strict'\n"
"async function f(p) { await p }"
"f(Promise.resolve(1).then(() => {}))\n");
jerry_cleanup ();
return 0;
} /* main */