| Index: test/cctest/test-dictionary.cc
|
| diff --git a/test/cctest/test-dictionary.cc b/test/cctest/test-dictionary.cc
|
| index 28adc7b4d34d60378213fa0e7124e40620561f0d..0756de6c1d783dc724c3e5c186a946886bbc7901 100644
|
| --- a/test/cctest/test-dictionary.cc
|
| +++ b/test/cctest/test-dictionary.cc
|
| @@ -113,6 +113,74 @@ TEST(HashMap) {
|
| TestHashMap(ObjectHashTable::New(isolate, 23));
|
| }
|
|
|
| +template <typename HashSet>
|
| +static void TestHashSet(Handle<HashSet> table) {
|
| + Isolate* isolate = CcTest::i_isolate();
|
| + Factory* factory = isolate->factory();
|
| +
|
| + Handle<JSObject> a = factory->NewJSArray(7);
|
| + Handle<JSObject> b = factory->NewJSArray(11);
|
| + table = HashSet::Add(table, a);
|
| + CHECK_EQ(table->NumberOfElements(), 1);
|
| + CHECK(table->Has(isolate, a));
|
| + CHECK(!table->Has(isolate, b));
|
| +
|
| + // Keys still have to be valid after objects were moved.
|
| + CcTest::heap()->CollectGarbage(NEW_SPACE);
|
| + CHECK_EQ(table->NumberOfElements(), 1);
|
| + CHECK(table->Has(isolate, a));
|
| + CHECK(!table->Has(isolate, b));
|
| +
|
| + // Keys that are overwritten should not change number of elements.
|
| + table = HashSet::Add(table, a);
|
| + CHECK_EQ(table->NumberOfElements(), 1);
|
| + CHECK(table->Has(isolate, a));
|
| + CHECK(!table->Has(isolate, b));
|
| +
|
| + // Keys that have been removed are mapped to the hole.
|
| + // TODO(cbruni): not implemented yet.
|
| + // bool was_present = false;
|
| + // table = HashSet::Remove(table, a, &was_present);
|
| + // CHECK(was_present);
|
| + // CHECK_EQ(table->NumberOfElements(), 0);
|
| + // CHECK(!table->Has(a));
|
| + // CHECK(!table->Has(b));
|
| +
|
| + // Keys should map back to their respective values and also should get
|
| + // an identity hash code generated.
|
| + for (int i = 0; i < 100; i++) {
|
| + Handle<JSReceiver> key = factory->NewJSArray(7);
|
| + table = HashSet::Add(table, key);
|
| + CHECK_EQ(table->NumberOfElements(), i + 2);
|
| + CHECK(table->Has(isolate, key));
|
| + CHECK(JSReceiver::GetIdentityHash(isolate, key)->IsSmi());
|
| + }
|
| +
|
| + // Keys never added to the map which already have an identity hash
|
| + // code should not be found.
|
| + for (int i = 0; i < 100; i++) {
|
| + Handle<JSReceiver> key = factory->NewJSArray(7);
|
| + CHECK(JSReceiver::GetOrCreateIdentityHash(isolate, key)->IsSmi());
|
| + CHECK(!table->Has(isolate, key));
|
| + CHECK(JSReceiver::GetIdentityHash(isolate, key)->IsSmi());
|
| + }
|
| +
|
| + // Keys that don't have an identity hash should not be found and also
|
| + // should not get an identity hash code generated.
|
| + for (int i = 0; i < 100; i++) {
|
| + Handle<JSReceiver> key = factory->NewJSArray(7);
|
| + CHECK(!table->Has(isolate, key));
|
| + Object* identity_hash = JSReceiver::GetIdentityHash(isolate, key);
|
| + CHECK_EQ(CcTest::heap()->undefined_value(), identity_hash);
|
| + }
|
| +}
|
| +
|
| +TEST(HashSet) {
|
| + LocalContext context;
|
| + v8::HandleScope scope(context->GetIsolate());
|
| + Isolate* isolate = CcTest::i_isolate();
|
| + TestHashSet(ObjectHashSet::New(isolate, 23));
|
| +}
|
|
|
| class ObjectHashTableTest: public ObjectHashTable {
|
| public:
|
|
|