tor-browser

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

testMapSet.cpp (4384B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 #include "jsapi.h"
      6 #include "jsfriendapi.h"
      7 
      8 #include "js/MapAndSet.h"
      9 #include "js/RootingAPI.h"
     10 #include "js/Wrapper.h"
     11 
     12 #include "jsapi-tests/tests.h"
     13 
     14 BEGIN_TEST(testMap) {
     15  JS::Rooted<JSObject*> theMap(cx, JS::NewMapObject(cx));
     16  CHECK(theMap);
     17 
     18  auto runTests = [&](JS::Handle<JSObject*> map) {
     19    CHECK_EQUAL(JS::MapSize(cx, map), 0u);
     20 
     21    JS::Rooted<JS::Value> val1(cx, JS::ObjectValue(*JS_NewObject(cx, nullptr)));
     22    JS::Rooted<JS::Value> val2(cx, JS::ObjectValue(*JS_NewObject(cx, nullptr)));
     23    JS::Rooted<JS::Value> rval(cx);
     24 
     25    // Set and Size
     26    CHECK(JS::MapSet(cx, map, val1, val2));
     27    CHECK_EQUAL(JS::MapSize(cx, map), 1u);
     28 
     29    // Has
     30    bool b;
     31    CHECK(JS::MapHas(cx, map, val1, &b));
     32    CHECK_EQUAL(b, true);
     33    CHECK(JS::MapHas(cx, map, val2, &b));
     34    CHECK_EQUAL(b, false);
     35 
     36    // Get
     37    CHECK(JS::MapGet(cx, map, val1, &rval));
     38    CHECK(rval == val2);
     39    CHECK(JS::MapGet(cx, map, val2, &rval));
     40    CHECK(rval.isUndefined());
     41 
     42    // Delete
     43    CHECK(JS::MapDelete(cx, map, val2, &b));
     44    CHECK_EQUAL(b, false);
     45    CHECK(JS::MapDelete(cx, map, val1, &b));
     46    CHECK_EQUAL(b, true);
     47    CHECK_EQUAL(JS::MapSize(cx, map), 0u);
     48 
     49    // Set
     50    CHECK(JS::MapSet(cx, map, val1, val2));
     51    CHECK(JS::MapSet(cx, map, val2, val1));
     52    CHECK_EQUAL(JS::MapSize(cx, map), 2u);
     53 
     54    // Iterator
     55    CHECK(JS::MapKeys(cx, map, &rval));
     56    CHECK(rval.isObject());
     57    js::AssertSameCompartment(cx, rval);
     58 
     59    // Clear
     60    CHECK(JS::MapClear(cx, map));
     61    CHECK_EQUAL(JS::MapSize(cx, map), 0u);
     62 
     63 #ifdef NIGHTLY_BUILD
     64    // GetOrInsert
     65    CHECK(JS::MapSet(cx, map, val1, val2));
     66    CHECK(JS::MapGetOrInsert(cx, map, val1, val2, &rval));
     67    CHECK(rval == val2);
     68    CHECK(JS::MapGetOrInsert(cx, map, val2, val1, &rval));
     69    CHECK(rval == val1);
     70    CHECK_EQUAL(JS::MapSize(cx, map), 2u);
     71    CHECK(JS::MapClear(cx, map));
     72 #endif  // #ifdef NIGHTLY_BUILD
     73    return true;
     74  };
     75 
     76  // Run tests with unwrapped MapObject.
     77  if (!runTests(theMap)) {
     78    return false;
     79  }
     80 
     81  // Run tests with wrapped MapObject.
     82  JS::RealmOptions globalOptions;
     83  JS::Rooted<JSObject*> newGlobal(
     84      cx, JS_NewGlobalObject(cx, getGlobalClass(), nullptr,
     85                             JS::FireOnNewGlobalHook, globalOptions));
     86  CHECK(newGlobal);
     87 
     88  JSAutoRealm ar(cx, newGlobal);
     89  CHECK(JS_WrapObject(cx, &theMap));
     90  CHECK(js::IsCrossCompartmentWrapper(theMap));
     91  return runTests(theMap);
     92 }
     93 END_TEST(testMap)
     94 
     95 BEGIN_TEST(testSet) {
     96  JS::Rooted<JSObject*> theSet(cx, JS::NewSetObject(cx));
     97  CHECK(theSet);
     98 
     99  auto runTests = [&](JS::Handle<JSObject*> set) {
    100    CHECK_EQUAL(JS::SetSize(cx, set), 0u);
    101 
    102    JS::Rooted<JS::Value> val1(cx, JS::ObjectValue(*JS_NewObject(cx, nullptr)));
    103    JS::Rooted<JS::Value> val2(cx, JS::ObjectValue(*JS_NewObject(cx, nullptr)));
    104    JS::Rooted<JS::Value> rval(cx);
    105 
    106    // Add and Size
    107    CHECK(JS::SetAdd(cx, set, val1));
    108    CHECK_EQUAL(JS::SetSize(cx, set), 1u);
    109 
    110    // Has
    111    bool b;
    112    CHECK(JS::SetHas(cx, set, val1, &b));
    113    CHECK_EQUAL(b, true);
    114    CHECK(JS::SetHas(cx, set, val2, &b));
    115    CHECK_EQUAL(b, false);
    116 
    117    // Delete
    118    CHECK(JS::SetDelete(cx, set, val2, &b));
    119    CHECK_EQUAL(b, false);
    120    CHECK(JS::SetDelete(cx, set, val1, &b));
    121    CHECK_EQUAL(b, true);
    122    CHECK_EQUAL(JS::SetSize(cx, set), 0u);
    123 
    124    // Add
    125    CHECK(JS::SetAdd(cx, set, val1));
    126    CHECK(JS::SetAdd(cx, set, val2));
    127    CHECK_EQUAL(JS::SetSize(cx, set), 2u);
    128 
    129    // Iterator
    130    CHECK(JS::SetKeys(cx, set, &rval));
    131    CHECK(rval.isObject());
    132    js::AssertSameCompartment(cx, rval);
    133 
    134    // Clear
    135    CHECK(JS::SetClear(cx, set));
    136    CHECK_EQUAL(JS::SetSize(cx, set), 0u);
    137    return true;
    138  };
    139 
    140  // Run tests with unwrapped SetObject.
    141  if (!runTests(theSet)) {
    142    return false;
    143  }
    144 
    145  // Run tests with wrapped SetObject.
    146  JS::RealmOptions globalOptions;
    147  JS::Rooted<JSObject*> newGlobal(
    148      cx, JS_NewGlobalObject(cx, getGlobalClass(), nullptr,
    149                             JS::FireOnNewGlobalHook, globalOptions));
    150  CHECK(newGlobal);
    151 
    152  JSAutoRealm ar(cx, newGlobal);
    153  CHECK(JS_WrapObject(cx, &theSet));
    154  CHECK(js::IsCrossCompartmentWrapper(theSet));
    155  return runTests(theSet);
    156 }
    157 END_TEST(testSet)