Browse Source

Merge pull request #185 from npenin/pure-jint

added as/is date
Sébastien Ros 10 years ago
parent
commit
4da70e8d3d
3 changed files with 214 additions and 16 deletions
  1. 1 0
      Jint.Tests/Jint.Tests.csproj
  2. 171 0
      Jint.Tests/Runtime/JsValueConversionTests.cs
  3. 42 16
      Jint/Native/JsValue.cs

+ 1 - 0
Jint.Tests/Jint.Tests.csproj

@@ -72,6 +72,7 @@
     <Compile Include="Runtime\Domain\IPerson.cs" />
     <Compile Include="Runtime\Domain\Person.cs" />
     <Compile Include="Runtime\Domain\Shape.cs" />
+    <Compile Include="Runtime\JsValueConversionTests.cs" />
     <Compile Include="Runtime\SamplesTests.cs" />
     <Compile Include="Runtime\InteropTests.cs" />
     <Compile Include="Runtime\EngineTests.cs" />

+ 171 - 0
Jint.Tests/Runtime/JsValueConversionTests.cs

@@ -0,0 +1,171 @@
+using Jint.Native;
+using Jint.Native.Array;
+using Jint.Native.Date;
+using Jint.Native.Object;
+using Jint.Native.RegExp;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xunit;
+
+namespace Jint.Tests.Runtime
+{
+    public class JsValueConversionTests
+    {
+        [Fact]
+        public void ShouldBeAnArray()
+        {
+            var value = new JsValue(new ArrayInstance(null));
+            Assert.Equal(false, value.IsBoolean());
+            Assert.Equal(true, value.IsArray());
+            Assert.Equal(false, value.IsDate());
+            Assert.Equal(false, value.IsNull());
+            Assert.Equal(false, value.IsNumber());
+            Assert.Equal(true, value.IsObject());
+            Assert.Equal(false, value.IsPrimitive());
+            Assert.Equal(false, value.IsRegExp());
+            Assert.Equal(false, value.IsString());
+            Assert.Equal(false, value.IsUndefined());
+
+            Assert.Equal(true, value.AsArray() != null);
+        }
+
+        [Fact]
+        public void ShouldBeABoolean()
+        {
+            var value = new JsValue(true);
+            Assert.Equal(true, value.IsBoolean());
+            Assert.Equal(false, value.IsArray());
+            Assert.Equal(false, value.IsDate());
+            Assert.Equal(false, value.IsNull());
+            Assert.Equal(false, value.IsNumber());
+            Assert.Equal(false, value.IsObject());
+            Assert.Equal(true, value.IsPrimitive());
+            Assert.Equal(false, value.IsRegExp());
+            Assert.Equal(false, value.IsString());
+            Assert.Equal(false, value.IsUndefined());
+
+            Assert.Equal(true, value.AsBoolean());
+        }
+
+        [Fact]
+        public void ShouldBeADate()
+        {
+            var value = new JsValue(new DateInstance(null));
+            Assert.Equal(false, value.IsBoolean());
+            Assert.Equal(false, value.IsArray());
+            Assert.Equal(true, value.IsDate());
+            Assert.Equal(false, value.IsNull());
+            Assert.Equal(false, value.IsNumber());
+            Assert.Equal(true, value.IsObject());
+            Assert.Equal(false, value.IsPrimitive());
+            Assert.Equal(false, value.IsRegExp());
+            Assert.Equal(false, value.IsString());
+            Assert.Equal(false, value.IsUndefined());
+
+            Assert.Equal(true, value.AsDate() != null);
+        }
+
+        [Fact]
+        public void ShouldBeNull()
+        {
+            var value = Null.Instance;
+            Assert.Equal(false, value.IsBoolean());
+            Assert.Equal(false, value.IsArray());
+            Assert.Equal(false, value.IsDate());
+            Assert.Equal(true, value.IsNull());
+            Assert.Equal(false, value.IsNumber());
+            Assert.Equal(false, value.IsObject());
+            Assert.Equal(true, value.IsPrimitive());
+            Assert.Equal(false, value.IsRegExp());
+            Assert.Equal(false, value.IsString());
+            Assert.Equal(false, value.IsUndefined());
+        }
+
+        [Fact]
+        public void ShouldBeANumber()
+        {
+            var value = new JsValue(2);
+            Assert.Equal(false, value.IsBoolean());
+            Assert.Equal(false, value.IsArray());
+            Assert.Equal(false, value.IsDate());
+            Assert.Equal(false, value.IsNull());
+            Assert.Equal(true, value.IsNumber());
+            Assert.Equal(2, value.AsNumber());
+            Assert.Equal(false, value.IsObject());
+            Assert.Equal(true, value.IsPrimitive());
+            Assert.Equal(false, value.IsRegExp());
+            Assert.Equal(false, value.IsString());
+            Assert.Equal(false, value.IsUndefined());
+        }
+
+        [Fact]
+        public void ShouldBeAnObject()
+        {
+            var value = new JsValue(new ObjectInstance(null));
+            Assert.Equal(false, value.IsBoolean());
+            Assert.Equal(false, value.IsArray());
+            Assert.Equal(false, value.IsDate());
+            Assert.Equal(false, value.IsNull());
+            Assert.Equal(false, value.IsNumber());
+            Assert.Equal(true, value.IsObject());
+            Assert.Equal(true, value.AsObject() != null);
+            Assert.Equal(false, value.IsPrimitive());
+            Assert.Equal(false, value.IsRegExp());
+            Assert.Equal(false, value.IsString());
+            Assert.Equal(false, value.IsUndefined());
+        }
+
+        [Fact]
+        public void ShouldBeARegExp()
+        {
+            var value = new JsValue(new RegExpInstance(null));
+            Assert.Equal(false, value.IsBoolean());
+            Assert.Equal(false, value.IsArray());
+            Assert.Equal(false, value.IsDate());
+            Assert.Equal(false, value.IsNull());
+            Assert.Equal(false, value.IsNumber());
+            Assert.Equal(true, value.IsObject());
+            Assert.Equal(false, value.IsPrimitive());
+            Assert.Equal(true, value.IsRegExp());
+            Assert.Equal(true, value.AsRegExp() != null);
+            Assert.Equal(false, value.IsString());
+            Assert.Equal(false, value.IsUndefined());
+        }
+
+        [Fact]
+        public void ShouldBeAString()
+        {
+            var value = new JsValue("a");
+            Assert.Equal(false, value.IsBoolean());
+            Assert.Equal(false, value.IsArray());
+            Assert.Equal(false, value.IsDate());
+            Assert.Equal(false, value.IsNull());
+            Assert.Equal(false, value.IsNumber());
+            Assert.Equal(false, value.IsObject());
+            Assert.Equal(true, value.IsPrimitive());
+            Assert.Equal(false, value.IsRegExp());
+            Assert.Equal(true, value.IsString());
+            Assert.Equal("a", value.AsString());
+            Assert.Equal(false, value.IsUndefined());
+        }
+
+        [Fact]
+        public void ShouldBeUndefined()
+        {
+            var value = Undefined.Instance;
+            Assert.Equal(false, value.IsBoolean());
+            Assert.Equal(false, value.IsArray());
+            Assert.Equal(false, value.IsDate());
+            Assert.Equal(false, value.IsNull());
+            Assert.Equal(false, value.IsNumber());
+            Assert.Equal(false, value.IsObject());
+            Assert.Equal(true, value.IsPrimitive());
+            Assert.Equal(false, value.IsRegExp());
+            Assert.Equal(false, value.IsString());
+            Assert.Equal(true, value.IsUndefined());
+        }
+    }
+}

+ 42 - 16
Jint/Native/JsValue.cs

@@ -103,18 +103,24 @@ namespace Jint.Native
             return IsObject() && AsObject() is ArrayInstance;
         }
 
+        [Pure]
+        public bool IsDate()
+        {
+            return IsObject() && AsObject() is DateInstance;
+        }
+
         [Pure]
         public bool IsRegExp()
         {
             return IsObject() && AsObject() is RegExpInstance;
         }
-        
+
         [Pure]
         public bool IsObject()
         {
             return _type == Types.Object;
         }
-        
+
         [Pure]
         public bool IsString()
         {
@@ -157,11 +163,31 @@ namespace Jint.Native
             {
                 throw new ArgumentException("The value is not an array");
             }
-            return AsObject() as ArrayInstance;            
+            return AsObject() as ArrayInstance;
+        }
+
+        [Pure]
+        public DateInstance AsDate()
+        {
+            if (!IsDate())
+            {
+                throw new ArgumentException("The value is not a date");
+            }
+            return AsObject() as DateInstance;
         }
 
         [Pure]
-        public T TryCast<T>(Action<JsValue> fail = null) where T: class
+        public RegExpInstance AsRegExp()
+        {
+            if (!IsRegExp())
+            {
+                throw new ArgumentException("The value is not a date");
+            }
+            return AsObject() as RegExpInstance;
+        }
+
+        [Pure]
+        public T TryCast<T>(Action<JsValue> fail = null) where T : class
         {
             if (IsObject())
             {
@@ -190,7 +216,7 @@ namespace Jint.Native
         {
             return _object as T;
         }
-        
+
         [Pure]
         public bool AsBoolean()
         {
@@ -275,7 +301,7 @@ namespace Jint.Native
                 return Null;
             }
 
-            foreach(var converter in engine.Options.GetObjectConverters())
+            foreach (var converter in engine.Options.GetObjectConverters())
             {
                 JsValue result;
                 if (converter.TryConvert(value, out result))
@@ -327,7 +353,7 @@ namespace Jint.Native
 
             if (value is DateTimeOffset)
             {
-                    return engine.Date.Construct((DateTimeOffset)value);
+                return engine.Date.Construct((DateTimeOffset)value);
             }
 
             // if an ObjectInstance is passed directly, use it as is
@@ -340,7 +366,7 @@ namespace Jint.Native
             // if a JsValue is passed directly, use it as is
             if (value is JsValue)
             {
-                return (JsValue) value;
+                return (JsValue)value;
             }
 
             var array = value as System.Array;
@@ -428,7 +454,7 @@ namespace Jint.Native
                                 return result;
                             }
                             break;
-                        
+
                         case "String":
                             var stringInstance = _object as StringInstance;
                             if (stringInstance != null)
@@ -460,10 +486,10 @@ namespace Jint.Native
                             var function = _object as FunctionInstance;
                             if (function != null)
                             {
-                                return (Func<JsValue, JsValue[], JsValue>) function.Call;
+                                return (Func<JsValue, JsValue[], JsValue>)function.Call;
                             }
 
-                            break; 
+                            break;
 
                         case "Number":
                             var numberInstance = _object as NumberInstance;
@@ -484,12 +510,12 @@ namespace Jint.Native
                             break;
 
                         case "Object":
-                            #if __IOS__
+#if __IOS__
                                 IDictionary<string, object> o = new Dictionary<string, object>(); 
-                            #else
-                                IDictionary<string, object> o = new ExpandoObject();
-                            #endif
-                            
+#else
+                            IDictionary<string, object> o = new ExpandoObject();
+#endif
+
                             foreach (var p in _object.Properties)
                             {
                                 if (!p.Value.Enumerable.HasValue || p.Value.Enumerable.Value == false)