public void String_ToByte()
 {
     using (ValueBuilder builder = new ValueBuilder())
     {
         object value;
         Assert.True(builder.Build(typeof(byte),
                                   new LiteralValue(SourceInfo.Empty, LiteralValueType.String, "255"),
                                   out value));
         Assert.Equal((byte)255, (byte)value);
         Assert.Empty(builder.Errors);
     }
 }
 public void String_Nop()
 {
     using (ValueBuilder builder = new ValueBuilder())
     {
         object value;
         Assert.True(builder.Build(typeof(string),
                                   new LiteralValue(SourceInfo.Empty, LiteralValueType.String, "test"),
                                   out value));
         Assert.Equal("test", (string)value);
         Assert.Empty(builder.Errors);
     }
 }
 public void String_ToArrayOfString()
 {
     using (ValueBuilder builder = new ValueBuilder())
     {
         object value;
         Assert.True(builder.Build(typeof(string[]),
                                   new LiteralValue(SourceInfo.Empty, LiteralValueType.String, "255"),
                                   out value));
         Assert.IsType<string[]>(value);
         Assert.Equal(new[]{"255"}, value);
         Assert.Empty(builder.Errors);
     }
 }
        public void AssocArray_To_ILookup(Type targetType)
        {
            using (ValueBuilder builder = new ValueBuilder())
            {
                object value;
                Assert.True(builder.Build(targetType,
                                          new AssociativeArray(
                                              SourceInfo.Empty,
                                              new[]
                                                  {
                                                      new KeyValuePair<AstNode, AstNode>(
                                                          new LiteralValue(SourceInfo.Empty,
                                                                           LiteralValueType.Numeric,
                                                                           "1"),
                                                          new LiteralValue(SourceInfo.Empty,
                                                                           LiteralValueType.String, 
                                                                           "2")),
                                                      new KeyValuePair<AstNode, AstNode>(
                                                          new LiteralValue(SourceInfo.Empty,
                                                                           LiteralValueType.Numeric,
                                                                           "1"),
                                                          new LiteralValue(SourceInfo.Empty,
                                                                           LiteralValueType.String, 
                                                                           "4"))
                                                  }),
                                          out value));

                Assert.IsAssignableFrom(targetType, value);

                Assert.IsAssignableFrom<IEnumerable>(value);

                Assert.Equal(1, ((IEnumerable)value).Cast<object>().Count());

                object group = ((IEnumerable) value).Cast<object>().Single();

                Assert.Equal("1", group.GetType().GetProperty("Key").GetValue(group, null).ToString());

                object[] values = ((IEnumerable) group).Cast<object>().ToArray();

                Assert.Equal(2, values.Length);

                Assert.Equal("2", values[0].ToString());

                Assert.Equal("4", values[1].ToString());

                Assert.Empty(builder.Errors);
            }
        }
        public void AssocArray(Type targetType, string keyName, string valueName)
        {
            using (ValueBuilder builder = new ValueBuilder())
            {
                object value;
                Assert.True(builder.Build(targetType,
                                          new AssociativeArray(
                                              SourceInfo.Empty,
                                              new[]
                                                  {
                                                      new KeyValuePair<AstNode, AstNode>(
                                                          new LiteralValue(SourceInfo.Empty,
                                                                           LiteralValueType.Numeric,
                                                                           "1"),
                                                          new LiteralValue(SourceInfo.Empty,
                                                                           LiteralValueType.String, 
                                                                           "2")),
                                                      new KeyValuePair<AstNode, AstNode>(
                                                          new LiteralValue(SourceInfo.Empty,
                                                                           LiteralValueType.Numeric,
                                                                           "3"),
                                                          new LiteralValue(SourceInfo.Empty,
                                                                           LiteralValueType.String, 
                                                                           "4"))
                                                  }),
                                          out value));

                Assert.IsAssignableFrom(targetType, value);

                Assert.IsAssignableFrom<IEnumerable>(value);

                Assert.Equal(2, ((IEnumerable)value).Cast<object>().Count());

                int i = 0;
                foreach (object kvp in ((IEnumerable)value))
                {
                    object keyValue = kvp.GetType().GetProperty(keyName).GetValue(kvp, null);
                    object valueValue = kvp.GetType().GetProperty(valueName).GetValue(kvp, null);

                    switch (i)
                    {
                        case 0:
                            Assert.Equal("1", keyValue.ToString());
                            Assert.Equal("2", valueValue.ToString());
                            break;
                        case 1:
                            Assert.Equal("3", keyValue.ToString());
                            Assert.Equal("4", valueValue.ToString());
                            break;
                    }

                    i++;
                }

                Assert.Empty(builder.Errors);
            }
        }
        public void Sequence_To_Array_of_Decimal()
        {
            using (ValueBuilder builder = new ValueBuilder())
            {
                object value;
                Assert.True(builder.Build(typeof(decimal[]),
                                          new Sequence(SourceInfo.Empty,
                                                       new[]
                                                           {
                                                               new LiteralValue(SourceInfo.Empty,
                                                                                LiteralValueType.Numeric, "1"),
                                                               new LiteralValue(SourceInfo.Empty,
                                                                                LiteralValueType.String, "2")
                                                           }),
                                          out value));

                Assert.Equal(new[] { 1m, 2m }, (decimal[])value);

                Assert.Empty(builder.Errors);
            }
        }
        public void Sequence_To_Array_of_Boolean()
        {
            using (ValueBuilder builder = new ValueBuilder())
            {
                object value;
                Assert.True(builder.Build(typeof(bool[]),
                                          new Sequence(SourceInfo.Empty,
                                                       new[]
                                                           {
                                                               new LiteralValue(SourceInfo.Empty,
                                                                                LiteralValueType.Boolean, "$true"),
                                                               new LiteralValue(SourceInfo.Empty,
                                                                                LiteralValueType.Boolean, "$false"),
                                                               new LiteralValue(SourceInfo.Empty,
                                                                                LiteralValueType.Numeric, "1"),
                                                               new LiteralValue(SourceInfo.Empty,
                                                                                LiteralValueType.Numeric, "0"),
                                                               new LiteralValue(SourceInfo.Empty,
                                                                                LiteralValueType.String, "Any"),
                                                               new LiteralValue(SourceInfo.Empty,
                                                                                LiteralValueType.String, "")
                                                           }),
                                          out value));

                Assert.True(new[] { true, false, true, false, true, false }.SequenceEqual((IEnumerable<bool>)value));

                Assert.Empty(builder.Errors);
            }
        }
 public void Sequence_Empty_To_IEnumerable_of_Object()
 {
     using (ValueBuilder builder = new ValueBuilder())
     {
         object value;
         Assert.True(builder.Build(typeof(IEnumerable<object>),
                                   new Sequence(SourceInfo.Empty, Enumerable.Empty<AstNode>()), out value));
         Assert.Empty((IEnumerable)value);
         Assert.Empty(builder.Errors);
     }
 }
        private static void SetPropertyValue(BuildContext ctx, Parameter parameter, AstNode astNode)
        {
            using (ValueBuilder builder = new ValueBuilder())
            {
                object value;
                if (builder.Build(parameter.Property.PropertyType, astNode, out value))
                {
                    parameter.Property.SetValue(ctx.Instance, value, null);
                }
                else
                {
                    foreach (ValueError valueError in builder.Errors)
                    {
                        TypeError typeError = valueError as TypeError;
                        if (typeError != null)
                        {
                            string message = string.Format(ErrorMessages.IncompatibleType,
                                                           ctx.Sequence.GetInputString(typeError.AstNode.SourceInfo),
                                                           parameter.Name);

                            ctx.Errors.Add(new BindError(ErrorType.IncompatibleType,
                                                         new[] { parameter },
                                                         new[] { astNode },
                                                         message));
                        }

                        AddError addError = valueError as AddError;

                        if (addError != null)
                        {
                            string message = string.Format(ErrorMessages.MethodInvocationFailed,
                                                           ctx.Sequence.GetInputString(addError.AstNodes.Select(ast => ast.SourceInfo)),
                                                           parameter.Name,
                                                           addError.Method.ReflectedType.Name,
                                                           addError.Method.Name,
                                                           addError.Exception.GetType().Name,
                                                           addError.Exception.Message);

                            ctx.Errors.Add(new BindError(ErrorType.IncompatibleType,
                                                         new[] { parameter },
                                                         new[] { astNode },
                                                         message));
                        }
                        else
                        {
                            ActivationError activationError = valueError as ActivationError;

                            if (activationError != null)
                            {
                                string message = string.Format(ErrorMessages.ObjectInitializationFailed,
                                                               ctx.Sequence.GetInputString(activationError.AstNodes.Select(ast => ast.SourceInfo)),
                                                               parameter.Name,
                                                               activationError.Constructor.ReflectedType.Name,
                                                               activationError.Exception.GetType().Name,
                                                               activationError.Exception.Message);

                                ctx.Errors.Add(new BindError(ErrorType.IncompatibleType,
                                                             new[] { parameter },
                                                             new[] { astNode },
                                                             message));
                            }
                        }
                    }
                }
            }
        }
 public void String_Empty_ToBoolean()
 {
     using (ValueBuilder builder = new ValueBuilder())
     {
         object value;
         Assert.True(builder.Build(typeof(bool), new LiteralValue(SourceInfo.Empty, LiteralValueType.String, ""),
                                   out value));
         Assert.False((bool)value);
         Assert.Empty(builder.Errors);
     }
 }
 public void Number_ToDecimal()
 {
     using (ValueBuilder builder = new ValueBuilder())
     {
         object value;
         Assert.True(builder.Build(typeof(decimal),
                                   new LiteralValue(SourceInfo.Empty, LiteralValueType.Numeric, "2.55"),
                                   out value));
         Assert.Equal((decimal)2.55, (decimal)value);
         Assert.Empty(builder.Errors);
     }
 }
 public void Number_ToSingle()
 {
     using (ValueBuilder builder = new ValueBuilder())
     {
         object value;
         Assert.True(builder.Build(typeof(Single),
                                   new LiteralValue(SourceInfo.Empty, LiteralValueType.Numeric, "2"),
                                   out value));
         Assert.Equal(2f, (Single)value);
         Assert.Empty(builder.Errors);
     }
 }
 public void String_ToDateTime()
 {
     using (ValueBuilder builder = new ValueBuilder())
     {
         object value;
         Assert.True(builder.Build(typeof(DateTime),
                                   new LiteralValue(SourceInfo.Empty, LiteralValueType.String,
                                                    "2001-02-03 04:05:06"),
                                   out value));
         Assert.Equal(new DateTime(2001, 02, 03, 04, 05, 06), (DateTime)value);
         Assert.Empty(builder.Errors);
     }
 }
 public void StringAlpha_ToByte()
 {
     using (ValueBuilder builder = new ValueBuilder())
     {
         object value;
         Assert.False(builder.Build(typeof(byte),
                                    new LiteralValue(SourceInfo.Empty, LiteralValueType.String, "abc"),
                                    out value));
         Assert.NotEmpty(builder.Errors);
     }
 }
 public void String_To_PathInfo()
 {
     using (ValueBuilder builder = new ValueBuilder())
     {
         object value;
         Assert.True(builder.Build(typeof(System.IO.DirectoryInfo),
                                   new LiteralValue(SourceInfo.Empty, LiteralValueType.String, "c:\\doesnt exist\\"),
                                   out value));
         Assert.IsType<System.IO.DirectoryInfo>(value);
         Assert.Empty(builder.Errors);
     }
 }
 public void String_To_Enum()
 {
     using (ValueBuilder builder = new ValueBuilder())
     {
         object value;
         Assert.True(builder.Build(typeof(ConsoleColor),
                                   new LiteralValue(SourceInfo.Empty, LiteralValueType.String, "Red"),
                                   out value));
         Assert.Equal(ConsoleColor.Red, (ConsoleColor)value);
         Assert.Empty(builder.Errors);
     }
 }
 public void Booean_False_ToInt()
 {
     using (ValueBuilder builder = new ValueBuilder())
     {
         object value;
         Assert.True(builder.Build(typeof(int),
                                   new LiteralValue(SourceInfo.Empty, LiteralValueType.Boolean, "$false"),
                                   out value));
         Assert.Equal(0, (int)value);
         Assert.Empty(builder.Errors);
     }
 }
        private static void SetDefaultValues(ITypeConverter typeConverter, CultureInfo cultureInfo, BuildContext ctx)
        {
            // set default values
            foreach (Parameter parameter in ctx.ParameterSet)
            {
                var attr = parameter.GetAttribute<DefaultValueAttribute>();

                if (attr == null)
                    continue;

                string strVal = attr.Value as string;
                if (strVal != null)
                {
                    if (parameter.Property.PropertyType != typeof(string))
                    {
                        Parser parser = new Parser();
                        NodeSequence seq = parser.Parse(strVal);
                        using (ValueBuilder valueBuilder = new ValueBuilder())
                        {
                            object value;
                            if (valueBuilder.Build(parameter.Property.PropertyType, seq[0], out value))
                            {
                                parameter.Property.SetValue(ctx.Instance, value, null);
                            }
                            else
                            {
                                string message = string.Format(Exceptions.FailedToParseDefaultValue,
                                                               strVal,
                                                               parameter.Property.PropertyType.FullName);

                                throw new ParameterDefinitionException(parameter.Property, message);
                            }
                        }
                    }
                    else
                    {
                        parameter.Property.SetValue(ctx.Instance, strVal, null);
                    }
                }
                else
                {
                    object value = attr.Value;
                    if (value == null)
                    {
                        if (!parameter.Property.PropertyType.IsValueType)
                        {
                            parameter.Property.SetValue(ctx.Instance, value, null);
                        }
                        else
                        {
                            string message = string.Format(Exceptions.FailedToConvertDefaultValue,
                                                           "NULL",
                                                           "",
                                                           parameter.Property.PropertyType.FullName);
                            throw new ParameterDefinitionException(parameter.Property, message);
                        }
                    }
                    else
                    {
                        IEnumerable<Exception> exceptions;
                        if (typeConverter.TryConvertType(cultureInfo, parameter.Property.PropertyType, ref value, out exceptions))
                        {
                            parameter.Property.SetValue(ctx.Instance, value, null);
                        }
                        else
                        {
                            string message = string.Format(Exceptions.FailedToConvertDefaultValue,
                                                           value,
                                                           value.GetType().FullName,
                                                           parameter.Property.PropertyType.FullName);

                            throw new ParameterDefinitionException(parameter.Property, message);
                        }
                    }
                }
            }
        }