Browse Source

#98: Fixing Json array parsing

Sebastien Ros 10 years ago
parent
commit
1a83e8cc84

+ 68 - 0
Jint.Tests/Runtime/EngineTests.cs

@@ -1085,5 +1085,73 @@ namespace Jint.Tests.Runtime
             var maxValue = engine.Execute("new Date('9999-12-31T23:59:59.999')").GetCompletionValue().ToObject();
             var maxValue = engine.Execute("new Date('9999-12-31T23:59:59.999')").GetCompletionValue().ToObject();
             Assert.Equal(new DateTime(9999, 12, 31, 23, 59, 59, 999, DateTimeKind.Utc), maxValue);
             Assert.Equal(new DateTime(9999, 12, 31, 23, 59, 59, 999, DateTimeKind.Utc), maxValue);
         }
         }
+
+        [Fact]
+        public void ShouldConstructNewArrayWithInteger()
+        {
+            RunTest(@"
+                var a = new Array(3);
+                assert(a.length === 3);
+                assert(a[0] == undefined);
+                assert(a[1] == undefined);
+                assert(a[2] == undefined);
+            ");
+        }
+
+        [Fact]
+        public void ShouldConstructNewArrayWithString()
+        {
+            RunTest(@"
+                var a = new Array('foo');
+                assert(a.length === 1);
+                assert(a[0] === 'foo');
+            ");
+        }
+
+        [Fact]
+        public void ShouldThrowRangeExceptionWhenConstructedWithNonInteger()
+        {
+            RunTest(@"
+                var result = false;
+                try {
+                    var a = new Array(3.4);
+                }
+                catch(e) {
+                    result = e instanceof RangeError;
+                }
+
+                assert(result);                
+            ");
+        }
+
+        [Fact]
+        public void ShouldInitializeArrayWithSingleIngegerValue()
+        {
+            RunTest(@"
+                var a = [3];
+                assert(a.length === 1);
+                assert(a[0] === 3);
+            ");
+        }
+
+        [Fact]
+        public void ShouldInitializeJsonObjectArrayWithSingleIntegerValue()
+        {
+            RunTest(@"
+                var x = JSON.parse('{ ""a"": [3] }');
+                assert(x.a.length === 1);
+                assert(x.a[0] === 3);
+            ");
+        }
+
+        [Fact]
+        public void ShouldInitializeJsonArrayWithSingleIntegerValue()
+        {
+            RunTest(@"
+                var a = JSON.parse('[3]');
+                assert(a.length === 1);
+                assert(a[0] === 3);
+            ");
+        }
     }
     }
 }
 }

+ 1 - 1
Jint/Native/Array/ArrayConstructor.cs

@@ -64,7 +64,7 @@ namespace Jint.Native.Array
                 var length = TypeConverter.ToUint32(arguments.At(0));
                 var length = TypeConverter.ToUint32(arguments.At(0));
                 if (!TypeConverter.ToNumber(arguments[0]).Equals(length))
                 if (!TypeConverter.ToNumber(arguments[0]).Equals(length))
                 {
                 {
-                    throw new JavaScriptException(Engine.RangeError);
+                    throw new JavaScriptException(Engine.RangeError, "Invalid array length");
                 }
                 }
                 
                 
                 instance.FastAddProperty("length", length, true, false, false);
                 instance.FastAddProperty("length", length, true, false, false);

+ 3 - 1
Jint/Native/Json/JsonParser.cs

@@ -613,7 +613,9 @@ namespace Jint.Native.Json
 
 
         public ObjectInstance CreateArrayInstance(IEnumerable<JsValue> values)
         public ObjectInstance CreateArrayInstance(IEnumerable<JsValue> values)
         {
         {
-            return _engine.Array.Construct(values.ToArray());
+            var jsArray = _engine.Array.Construct(Arguments.Empty);
+            _engine.Array.PrototypeObject.Push(jsArray, values.ToArray());
+            return jsArray;            
         }
         }
 
 
         // Throw an exception
         // Throw an exception