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);
        }
 internal JToken ConvertBack(JTokenType type, JsValue value)
 {
     switch (type)
     {
         case JTokenType.Array:
             if (value.IsArray())
             {
                 var array = value.AsArray();
                 return new JArray(array.Properties.Where(k => ArrayInstance.IsArrayIndex(new JsValue(k.Key))).Select(kvp => ConvertBack(kvp.Value.Value ?? JsValue.Null)));
             }
             break;
         case JTokenType.Boolean:
             if (value.IsBoolean())
                 return new JValue(value.AsBoolean());
             break;
         case JTokenType.Date:
             if (value.IsDate())
                 return new JValue(value.AsDate());
             break;
         case JTokenType.Float:
             if (value.IsNumber())
                 return new JValue((float)value.AsNumber());
             break;
         case JTokenType.Integer:
             if (value.IsNumber())
                 return new JValue((int)value.AsNumber());
             break;
         case JTokenType.String:
             if (value.IsString())
                 return JValue.CreateString(value.AsString());
             break;
     }
     return ConvertBack(value);
 }