Browse Source

Add default iterator prototype for IteratorInstance (#1126)

Marko Lahma 3 years ago
parent
commit
d0eb6aab75
2 changed files with 22 additions and 1 deletions
  1. 20 0
      Jint.Tests/Runtime/InteropTests.cs
  2. 2 1
      Jint/Native/Iterator/IteratorInstance.cs

+ 20 - 0
Jint.Tests/Runtime/InteropTests.cs

@@ -2778,6 +2778,26 @@ namespace Jint.Tests.Runtime
             Assert.Equal("12345", _engine.Evaluate("test.create(12345)").AsString());
         }
 
+        [Fact]
+        public void ShouldGetIteratorForListAndDictionary()
+        {
+            const string Script = @"
+                var it = collection[Symbol.iterator]();
+                var result = it.next();
+                var str = """";
+                while (!result.done) {
+                    str += result.value;
+                    result = it.next();
+                }
+                return str;";
+
+            _engine.SetValue("collection", new List<string> { "a", "b", "c" });
+            Assert.Equal("abc", _engine.Evaluate(Script));
+
+            _engine.SetValue("collection", new Dictionary<string, object> { {"a", 1 }, { "b", 2 }, { "c", 3 } });
+            Assert.Equal("a,1b,2c,3", _engine.Evaluate(Script));
+        }
+
         private class Profile
         {
             public int AnyProperty => throw new NotSupportedException("NOT SUPPORTED");

+ 2 - 1
Jint/Native/Iterator/IteratorInstance.cs

@@ -22,7 +22,8 @@ namespace Jint.Native.Iterator
             IEnumerable<JsValue> enumerable) : base(engine, ObjectClass.Iterator)
         {
             _enumerable = enumerable.GetEnumerator();
-        }
+            _prototype = engine.Realm.Intrinsics.IteratorPrototype;
+       }
 
         public override object ToObject()
         {