Browse Source

Add iterator prototype tests (#928)

* cleanup map and set method names and prototypes
Marko Lahma 4 years ago
parent
commit
99d05aff3f

+ 9 - 1
Jint.Tests.Test262/BuiltIns/ArrayTests.cs

@@ -7,7 +7,15 @@ namespace Jint.Tests.Test262.BuiltIns
         [Theory(DisplayName = "built-ins\\Array")]
         [MemberData(nameof(SourceFiles), "built-ins\\Array", false)]
         [MemberData(nameof(SourceFiles), "built-ins\\Array", true, Skip = "Skipped")]
-        protected void RunTest(SourceFile sourceFile)
+        protected void Array(SourceFile sourceFile)
+        {
+            RunTestInternal(sourceFile);
+        }
+
+        [Theory(DisplayName = "built-ins\\ArrayIteratorPrototype")]
+        [MemberData(nameof(SourceFiles), "built-ins\\ArrayIteratorPrototype", false)]
+        [MemberData(nameof(SourceFiles), "built-ins\\ArrayIteratorPrototype", true, Skip = "Skipped")]
+        protected void ArrayIteratorPrototype(SourceFile sourceFile)
         {
             RunTestInternal(sourceFile);
         }

+ 9 - 1
Jint.Tests.Test262/BuiltIns/MapTests.cs

@@ -7,7 +7,15 @@ namespace Jint.Tests.Test262.BuiltIns
         [Theory(DisplayName = "built-ins\\Map")]
         [MemberData(nameof(SourceFiles), "built-ins\\Map", false)]
         [MemberData(nameof(SourceFiles), "built-ins\\Map", true, Skip = "Skipped")]
-        protected void RunTest(SourceFile sourceFile)
+        protected void Map(SourceFile sourceFile)
+        {
+            RunTestInternal(sourceFile);
+        }
+
+        [Theory(DisplayName = "built-ins\\MapIteratorPrototype")]
+        [MemberData(nameof(SourceFiles), "built-ins\\MapIteratorPrototype", false)]
+        [MemberData(nameof(SourceFiles), "built-ins\\MapIteratorPrototype", true, Skip = "Skipped")]
+        protected void MapIteratorPrototype(SourceFile sourceFile)
         {
             RunTestInternal(sourceFile);
         }

+ 1 - 1
Jint.Tests.Test262/BuiltIns/RegExpTests.cs

@@ -12,7 +12,7 @@ namespace Jint.Tests.Test262.BuiltIns
             RunTestInternal(sourceFile);
         }
 
-        [Theory(DisplayName = "built-ins\\StringIteratorPrototype")]
+        [Theory(DisplayName = "built-ins\\RegExpStringIteratorPrototype")]
         [MemberData(nameof(SourceFiles), "built-ins\\RegExpStringIteratorPrototype", false)]
         [MemberData(nameof(SourceFiles), "built-ins\\RegExpStringIteratorPrototype", true, Skip = "Skipped")]
         protected void RegExpStringIteratorPrototype(SourceFile sourceFile)

+ 9 - 1
Jint.Tests.Test262/BuiltIns/SetTests.cs

@@ -7,7 +7,15 @@ namespace Jint.Tests.Test262.BuiltIns
         [Theory(DisplayName = "built-ins\\Set")]
         [MemberData(nameof(SourceFiles), "built-ins\\Set", false)]
         [MemberData(nameof(SourceFiles), "built-ins\\Set", true, Skip = "Skipped")]
-        protected void RunTest(SourceFile sourceFile)
+        protected void Set(SourceFile sourceFile)
+        {
+            RunTestInternal(sourceFile);
+        }
+
+        [Theory(DisplayName = "built-ins\\SetIteratorPrototype")]
+        [MemberData(nameof(SourceFiles), "built-ins\\SetIteratorPrototype", false)]
+        [MemberData(nameof(SourceFiles), "built-ins\\SetIteratorPrototype", true, Skip = "Skipped")]
+        protected void SetIteratorPrototype(SourceFile sourceFile)
         {
             RunTestInternal(sourceFile);
         }

+ 4 - 0
Jint.Tests.Test262/test/skipped.json

@@ -130,6 +130,10 @@
     "source": "built-ins/Map/prototype/forEach/iterates-values-deleted-then-readded.js",
     "reason": "delete/add detection not implemented for map iterator during iteration"
   },
+  {
+    "source": "built-ins/MapIteratorPrototype/next/iteration-mutable.js",
+    "reason": "delete/add detection not implemented for map iterator during iteration"
+  },
   {
     "source": "built-ins/Set/prototype/forEach/iterates-values-revisits-after-delete-re-add.js",
     "reason": "delete/add detection not implemented for set iterator during iteration"

+ 25 - 5
Jint/Native/Iterator/IteratorConstructor.cs

@@ -74,7 +74,7 @@ namespace Jint.Native.Iterator
             return instance;
         }
 
-        internal ObjectInstance Construct(MapInstance map)
+        internal ObjectInstance ConstructEntryIterator(MapInstance map)
         {
             var instance = new IteratorInstance.MapIterator(Engine, map)
             {
@@ -84,11 +84,21 @@ namespace Jint.Native.Iterator
             return instance;
         }
 
-        internal ObjectInstance Construct(SetInstance set)
+        internal ObjectInstance ConstructKeyIterator(MapInstance map)
         {
-            var instance = new IteratorInstance.SetIterator(Engine, set)
+            var instance = new IteratorInstance(Engine, map._map.Keys)
             {
-                _prototype = SetIteratorPrototypeObject
+                _prototype = MapIteratorPrototypeObject
+            };
+
+            return instance;
+        }
+
+        internal ObjectInstance ConstructValueIterator(MapInstance map)
+        {
+            var instance = new IteratorInstance(Engine, map._map.Values)
+            {
+                _prototype = MapIteratorPrototypeObject
             };
 
             return instance;
@@ -98,7 +108,17 @@ namespace Jint.Native.Iterator
         {
             var instance = new IteratorInstance.SetEntryIterator(Engine, set)
             {
-                _prototype = GenericIteratorPrototypeObject
+                _prototype = SetIteratorPrototypeObject
+            };
+
+            return instance;
+        }
+
+        internal ObjectInstance ConstructValueIterator(SetInstance set)
+        {
+            var instance = new IteratorInstance.ListIterator(Engine, set._set._list)
+            {
+                _prototype = SetIteratorPrototypeObject
             };
 
             return instance;

+ 0 - 26
Jint/Native/Iterator/IteratorInstance.cs

@@ -161,32 +161,6 @@ namespace Jint.Native.Iterator
             }
         }
 
-        public class SetIterator : IteratorInstance
-        {
-            private readonly SetInstance _set;
-            private int _position;
-
-            public SetIterator(Engine engine, SetInstance set) : base(engine)
-            {
-                _set = set;
-                _position = 0;
-            }
-
-            public override bool TryIteratorStep(out ObjectInstance nextItem)
-            {
-                if (_position < _set._set._list.Count)
-                {
-                    var value = _set._set[_position];
-                    _position++;
-                    nextItem = new ValueIteratorPosition(_engine, value);
-                    return true;
-                }
-
-                nextItem = KeyValueIteratorPosition.Done;
-                return false;
-            }
-        }
-
         public class SetEntryIterator : IteratorInstance
         {
             private readonly SetInstance _set;

+ 3 - 3
Jint/Native/Map/MapInstance.cs

@@ -85,17 +85,17 @@ namespace Jint.Native.Map
 
         internal ObjectInstance Iterator()
         {
-            return _realm.Intrinsics.Iterator.Construct(this);
+            return _realm.Intrinsics.Iterator.ConstructEntryIterator(this);
         }
 
         internal ObjectInstance Keys()
         {
-            return _realm.Intrinsics.Iterator.Construct(_map.Keys);
+            return _realm.Intrinsics.Iterator.ConstructKeyIterator(this);
         }
 
         internal ObjectInstance Values()
         {
-            return _realm.Intrinsics.Iterator.Construct(_map.Values);
+            return _realm.Intrinsics.Iterator.ConstructValueIterator(this);
         }
 
         [MethodImpl(MethodImplOptions.AggressiveInlining)]

+ 1 - 1
Jint/Native/Set/SetInstance.cs

@@ -78,7 +78,7 @@ namespace Jint.Native.Set
 
         internal ObjectInstance Values()
         {
-            return _engine.Realm.Intrinsics.Iterator.Construct(_set._list);
+            return _engine.Realm.Intrinsics.Iterator.ConstructValueIterator(this);
         }
     }
 }