Index: test/cctest/test-ordered-hash-table.cc |
diff --git a/test/cctest/test-ordered-hash-table.cc b/test/cctest/test-ordered-hash-table.cc |
index f6ebc16f1ef3467c4ea08751277aecb403153482..f495804ee6a276cd5604eee0068eca157dc64832 100644 |
--- a/test/cctest/test-ordered-hash-table.cc |
+++ b/test/cctest/test-ordered-hash-table.cc |
@@ -36,7 +36,20 @@ namespace { |
using namespace v8::internal; |
+ |
+void CheckIterResultObject(Factory* factory, |
+ Handle<JSObject> result, |
+ Handle<Object> value, |
+ bool done) { |
+ CHECK(GetProperty(result, "value").ToHandleChecked()->SameValue(*value)); |
+ CHECK(GetProperty(result, "done").ToHandleChecked()->IsBoolean()); |
+ CHECK_EQ(GetProperty(result, "done").ToHandleChecked()->BooleanValue(), done); |
+} |
+ |
+ |
TEST(Set) { |
+ i::FLAG_harmony_collections = true; |
+ |
LocalContext context; |
Isolate* isolate = CcTest::i_isolate(); |
Factory* factory = isolate->factory(); |
@@ -46,6 +59,11 @@ TEST(Set) { |
CHECK_EQ(0, ordered_set->NumberOfElements()); |
CHECK_EQ(0, ordered_set->NumberOfDeletedElements()); |
+ Handle<JSSetIterator> value_iterator = |
+ JSSetIterator::Create(ordered_set, JSSetIterator::kKindValues); |
+ Handle<JSSetIterator> value_iterator_2 = |
+ JSSetIterator::Create(ordered_set, JSSetIterator::kKindValues); |
+ |
Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
Handle<JSObject> obj = factory->NewJSObjectFromMap(map); |
CHECK(!ordered_set->Contains(*obj)); |
@@ -68,6 +86,18 @@ TEST(Set) { |
CHECK(ordered_set->Contains(*obj2)); |
CHECK(ordered_set->Contains(*obj3)); |
+ // Test iteration |
+ CheckIterResultObject( |
+ factory, JSSetIterator::Next(value_iterator), obj1, false); |
+ CheckIterResultObject( |
+ factory, JSSetIterator::Next(value_iterator), obj2, false); |
+ CheckIterResultObject( |
+ factory, JSSetIterator::Next(value_iterator), obj3, false); |
+ CheckIterResultObject(factory, |
+ JSSetIterator::Next(value_iterator), |
+ factory->undefined_value(), |
+ true); |
+ |
// Test growth |
ordered_set = OrderedHashSet::Add(ordered_set, obj); |
Handle<JSObject> obj4 = factory->NewJSObjectFromMap(map); |
@@ -81,6 +111,22 @@ TEST(Set) { |
CHECK_EQ(0, ordered_set->NumberOfDeletedElements()); |
CHECK_EQ(4, ordered_set->NumberOfBuckets()); |
+ // Test iteration after growth |
+ CheckIterResultObject( |
+ factory, JSSetIterator::Next(value_iterator_2), obj1, false); |
+ CheckIterResultObject( |
+ factory, JSSetIterator::Next(value_iterator_2), obj2, false); |
+ CheckIterResultObject( |
+ factory, JSSetIterator::Next(value_iterator_2), obj3, false); |
+ CheckIterResultObject( |
+ factory, JSSetIterator::Next(value_iterator_2), obj, false); |
+ CheckIterResultObject( |
+ factory, JSSetIterator::Next(value_iterator_2), obj4, false); |
+ CheckIterResultObject(factory, |
+ JSSetIterator::Next(value_iterator_2), |
+ factory->undefined_value(), |
+ true); |
+ |
// Test shrinking |
ordered_set = OrderedHashSet::Remove(ordered_set, obj); |
ordered_set = OrderedHashSet::Remove(ordered_set, obj1); |
@@ -92,6 +138,8 @@ TEST(Set) { |
TEST(Map) { |
+ i::FLAG_harmony_collections = true; |
+ |
LocalContext context; |
Isolate* isolate = CcTest::i_isolate(); |
Factory* factory = isolate->factory(); |
@@ -101,6 +149,11 @@ TEST(Map) { |
CHECK_EQ(0, ordered_map->NumberOfElements()); |
CHECK_EQ(0, ordered_map->NumberOfDeletedElements()); |
+ Handle<JSMapIterator> value_iterator = |
+ JSMapIterator::Create(ordered_map, JSMapIterator::kKindValues); |
+ Handle<JSMapIterator> key_iterator = |
+ JSMapIterator::Create(ordered_map, JSMapIterator::kKindKeys); |
+ |
Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
Handle<JSObject> obj = factory->NewJSObjectFromMap(map); |
Handle<JSObject> val = factory->NewJSObjectFromMap(map); |
@@ -128,6 +181,18 @@ TEST(Map) { |
CHECK(ordered_map->Lookup(*obj2)->SameValue(*val2)); |
CHECK(ordered_map->Lookup(*obj3)->SameValue(*val3)); |
+ // Test iteration |
+ CheckIterResultObject( |
+ factory, JSMapIterator::Next(value_iterator), val1, false); |
+ CheckIterResultObject( |
+ factory, JSMapIterator::Next(value_iterator), val2, false); |
+ CheckIterResultObject( |
+ factory, JSMapIterator::Next(value_iterator), val3, false); |
+ CheckIterResultObject(factory, |
+ JSMapIterator::Next(value_iterator), |
+ factory->undefined_value(), |
+ true); |
+ |
// Test growth |
ordered_map = OrderedHashMap::Put(ordered_map, obj, val); |
Handle<JSObject> obj4 = factory->NewJSObjectFromMap(map); |
@@ -141,6 +206,22 @@ TEST(Map) { |
CHECK_EQ(5, ordered_map->NumberOfElements()); |
CHECK_EQ(4, ordered_map->NumberOfBuckets()); |
+ // Test iteration after growth |
+ CheckIterResultObject( |
+ factory, JSMapIterator::Next(key_iterator), obj1, false); |
+ CheckIterResultObject( |
+ factory, JSMapIterator::Next(key_iterator), obj2, false); |
+ CheckIterResultObject( |
+ factory, JSMapIterator::Next(key_iterator), obj3, false); |
+ CheckIterResultObject( |
+ factory, JSMapIterator::Next(key_iterator), obj, false); |
+ CheckIterResultObject( |
+ factory, JSMapIterator::Next(key_iterator), obj4, false); |
+ CheckIterResultObject(factory, |
+ JSMapIterator::Next(key_iterator), |
+ factory->undefined_value(), |
+ true); |
+ |
// Test shrinking |
ordered_map = OrderedHashMap::Put( |
ordered_map, obj, factory->the_hole_value()); |