tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

allSettled.js (2667B)


      1 // Smoke test for `Promise.allSettled`, test262 should cover the function in
      2 // more detail.
      3 
      4 // Empty elements.
      5 Promise.allSettled([]).then(v => {
      6    assertDeepEq(v, []);
      7 });
      8 
      9 // Single element.
     10 Promise.allSettled([Promise.resolve(0)]).then(v => {
     11    assertDeepEq(v, [
     12        {"status": "fulfilled", "value": 0},
     13    ]);
     14 });
     15 Promise.allSettled([Promise.reject(1)]).then(v => {
     16    assertDeepEq(v, [
     17        {"status": "rejected", "reason": 1},
     18    ]);
     19 });
     20 
     21 // Multiple elements.
     22 Promise.allSettled([Promise.resolve(1), Promise.resolve(2)]).then(v => {
     23    assertDeepEq(v, [
     24        {"status": "fulfilled", "value": 1},
     25        {"status": "fulfilled", "value": 2},
     26    ]);
     27 });
     28 Promise.allSettled([Promise.resolve(3), Promise.reject(4)]).then(v => {
     29    assertDeepEq(v, [
     30        {"status": "fulfilled", "value": 3},
     31        {"status": "rejected", "reason": 4},
     32    ]);
     33 });
     34 Promise.allSettled([Promise.reject(5), Promise.resolve(6)]).then(v => {
     35    assertDeepEq(v, [
     36        {"status": "rejected", "reason": 5},
     37        {"status": "fulfilled", "value": 6},
     38    ]);
     39 });
     40 Promise.allSettled([Promise.reject(7), Promise.reject(8)]).then(v => {
     41    assertDeepEq(v, [
     42        {"status": "rejected", "reason": 7},
     43        {"status": "rejected", "reason": 8},
     44    ]);
     45 });
     46 
     47 // Cross-Realm tests.
     48 //
     49 // Note: When |g| is a cross-compartment global, Promise.allSettled creates
     50 // the result array in |g|'s Realm. This doesn't follow the spec, but the code
     51 // in js/src/builtin/Promise.cpp claims this is useful when the Promise
     52 // compartment is less-privileged. This means for this test we can't use
     53 // assertDeepEq below, because the result array may have the wrong prototype.
     54 let g = newGlobal();
     55 
     56 if (typeof isSameCompartment !== "function") {
     57    var isSameCompartment = SpecialPowers.Cu.getJSTestingFunctions().isSameCompartment;
     58 }
     59 
     60 // Test wrapping when neither Promise.allSettled element function is called.
     61 Promise.allSettled.call(g.Promise, []).then(v => {
     62    assertEq(isSameCompartment(v, g), true);
     63 
     64    assertEq(v.length, 0);
     65 });
     66 
     67 // Test wrapping in `Promise.allSettled Resolve Element Function`.
     68 Promise.allSettled.call(g.Promise, [Promise.resolve(0)]).then(v => {
     69    assertEq(isSameCompartment(v, g), true);
     70 
     71    assertEq(v.length, 1);
     72    assertEq(v[0].status, "fulfilled");
     73    assertEq(v[0].value, 0);
     74 });
     75 
     76 // Test wrapping in `Promise.allSettled Reject Element Function`.
     77 Promise.allSettled.call(g.Promise, [Promise.reject(0)]).then(v => {
     78    assertEq(isSameCompartment(v, g), true);
     79 
     80    assertEq(v.length, 1);
     81    assertEq(v[0].status, "rejected");
     82    assertEq(v[0].reason, 0);
     83 });
     84 
     85 if (typeof reportCompare === "function")
     86    reportCompare(0, 0);