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)