Beispiel #1
0
        public void ShouldInvokeInvokeMemberOnDynamicObject()
        {
            var dynamic = new CustomDynamicObject();

            var context   = new { Dynamic = dynamic };
            var execution = ExecuteTemplate("$dynamic.Double(87)", context);

            Assert.That(execution.Output, Is.EqualTo("DO InvokeMember Double: (87)"));
        }
Beispiel #2
0
        public void ShouldInvokeGetMemberOnDynamicObject()
        {
            var dynamic = new CustomDynamicObject();

            var context   = new { Dynamic = dynamic };
            var execution = ExecuteTemplate("$dynamic.Prop", context);

            Assert.That(execution.Output, Is.EqualTo("DO GetMember: Prop"));
        }
Beispiel #3
0
        public void ShouldInvokeBinaryOnDynamicObjectForBinaryExpression(string op, string opName)
        {
            var dynamic = new CustomDynamicObject();

            var context   = new { Dynamic = dynamic };
            var execution = ExecuteTemplate($"#set($result = $dynamic {op} false)", context);

            Assert.That(execution.Context.Keys, Contains.Item("result"));
            Assert.That(execution.Context["result"], Is.EqualTo($"DO Binary {opName}: False"));
        }
Beispiel #4
0
        public void ShouldInvokeSetMemberOnDynamicObject()
        {
            var dynamic = new CustomDynamicObject();

            var context = new { Dynamic = dynamic };

            ExecuteTemplate("#set($dynamic.SetMe = true)", context);

            Assert.That(dynamic.SetMembers.Keys, Contains.Item("SetMe"));
            Assert.That(dynamic.SetMembers["SetMe"], Is.EqualTo(true));
        }
        public static CustomDynamicObject GetDynamicType(IRow row)
        {
            CustomDynamicObject result = new CustomDynamicObject();

            foreach (Column column in row.Columns)
            {
                if (!string.IsNullOrWhiteSpace(((Context)column.Context).TargetFieldName))
                {
                    result.AddPropertyValue(((Context)column.Context).TargetFieldName, column.ActualValue);
                }
            }

            return(result);
        }
        public static List <CustomDynamicObject> GetDynamicTypedList(ITable table)
        {
            List <CustomDynamicObject> result = new List <CustomDynamicObject>();

            foreach (Row row in table.Rows)
            {
                CustomDynamicObject current = new CustomDynamicObject();
                foreach (Column column in row.Columns)
                {
                    if (!string.IsNullOrWhiteSpace(((Context)column.Context).TargetFieldName))
                    {
                        current.AddPropertyValue(((Context)column.Context).TargetFieldName, column.ActualValue);
                    }
                }
                result.Add(current);
            }

            return(result);
        }
        public static Table GetPivotedTable <T>(List <T> list, Expression <Func <T, object> >[] yAxisDefinition, Expression <Func <T, object> >[] xzAxesDefinition, PivotDefinition <T> pivotDefinition)
        {
            List <CustomDynamicObject> yAxisParts = new List <CustomDynamicObject>();

            foreach (T currentItem in list)
            {
                CustomDynamicObject yAxisPart = new CustomDynamicObject();
                foreach (Expression <Func <T, object> > yAxisPartDef in yAxisDefinition)
                {
                    PropertyInfo yAxisPartDefPI = Member.Of <T>(yAxisPartDef).AsProperty();
                    string       name           = yAxisPartDefPI.Name;
                    object       value          = yAxisPartDefPI.GetValue(currentItem, null);
                    yAxisPart.AddPropertyValue(name, value);
                }
                yAxisParts.Add(yAxisPart);
            }
            yAxisParts = yAxisParts.Distinct().ToList();

            List <CustomDynamicObject> xzAxesParts = new List <CustomDynamicObject>();

            foreach (T currentItem in list)
            {
                CustomDynamicObject xzAxesPart = new CustomDynamicObject();
                foreach (Expression <Func <T, object> > xzAxesPartDef in xzAxesDefinition)
                {
                    PropertyInfo xzAxesPartDefPI = Member.Of <T>(xzAxesPartDef).AsProperty();
                    string       name            = xzAxesPartDefPI.Name;
                    object       value           = xzAxesPartDefPI.GetValue(currentItem, null);
                    xzAxesPart.AddPropertyValue(name, value);
                }
                xzAxesParts.Add(xzAxesPart);
            }
            xzAxesParts = xzAxesParts.Distinct().ToList();


            Table workingTable = TableAndTypeConverter.GetTableFromTypedList <CustomDynamicObject>(yAxisParts);

            workingTable.IsPivoted = true;


            Dictionary <int, int> foundXAxisIndexDict = new Dictionary <int, int>();
            Dictionary <int, int> foundYAxisIndexDict = new Dictionary <int, int>();
            int foundYAxisXAxisIndex = -1;

            foreach (CustomDynamicObject currentXZ in xzAxesParts)
            {
                int foundXAxisIndex = -1;
                if (!foundXAxisIndexDict.TryGetValue(currentXZ.GetPropertyValue(pivotDefinition.xAxisInfo.Name).GetHashCode(), out foundXAxisIndex))
                {
                    for (var i = 0; i < workingTable.Rows[0].Columns.Count; i++)
                    {
                        Column column = workingTable.Rows[0].Columns[i];
                        if (column.Context.PropInfo.Name.GetHashCode() == currentXZ.GetPropertyValue(pivotDefinition.xAxisInfo.Name).GetHashCode())
                        {
                            foundXAxisIndex = i;
                            foundXAxisIndexDict.Add(currentXZ.GetPropertyValue(pivotDefinition.xAxisInfo.Name).GetHashCode(), foundXAxisIndex);
                            break;
                        }
                        foundXAxisIndex = -1;
                    }
                }
                if (foundXAxisIndex <= -1)
                {
                    workingTable.AddColumnToAllRows(currentXZ.GetPropertyValue(pivotDefinition.xAxisInfo.Name).ToString(), typeof(object) /*pivotObject.ColumnNameFinderInfo.PropertyType*/);
                    foundXAxisIndex = workingTable.Rows[0].Columns.Count - 1;
                    foundXAxisIndexDict.Add(currentXZ.GetPropertyValue(pivotDefinition.xAxisInfo.Name).GetHashCode(), foundXAxisIndex);
                }

                if (foundYAxisXAxisIndex <= -1)
                {
                    for (var i = 0; i < workingTable.Rows[0].Columns.Count; i++)
                    {
                        Column column = workingTable.Rows[0].Columns[i];
                        if (column.Context.PropInfo.Name == pivotDefinition.yAxisInfo.Name)
                        {
                            foundYAxisXAxisIndex = i;
                            break;
                        }
                    }
                }

                if (foundYAxisXAxisIndex > -1)
                {
                    bool xyFoundAndValuePlaced = false;
                    int  foundYAxisIndex       = -1;
                    if (!foundYAxisIndexDict.TryGetValue(currentXZ.GetPropertyValue(pivotDefinition.yAxisInfo.Name).GetHashCode(), out foundYAxisIndex))
                    {
                        for (var i = 0; i < workingTable.Rows.Count; i++)
                        {
                            Row row = workingTable.Rows[i];
                            if (row.Columns[foundYAxisXAxisIndex].ActualValue.CompareTo(currentXZ.GetPropertyValue(pivotDefinition.yAxisInfo.Name)) == 0)
                            {
                                foundYAxisIndex = i;
                                foundYAxisIndexDict.Add(currentXZ.GetPropertyValue(pivotDefinition.yAxisInfo.Name).GetHashCode(), foundYAxisIndex);
                                break;
                            }
                            foundYAxisIndex = -1;
                        }
                    }
                    if (foundYAxisIndex > -1)
                    {
                        workingTable.Rows[foundYAxisIndex].Columns[foundXAxisIndex].ChangeContextType(pivotDefinition.zAxisInfo.PropertyType);
                        workingTable.Rows[foundYAxisIndex].Columns[foundXAxisIndex].ActualValue = pivotDefinition.InvokeAggregateFunction(workingTable.Rows[foundYAxisIndex].Columns[foundXAxisIndex].ActualValue, (IComparable)currentXZ.GetPropertyValue(pivotDefinition.zAxisInfo.Name));
                        xyFoundAndValuePlaced = true;
                    }
                    if (!xyFoundAndValuePlaced)
                    {
                        break;
                        //could not find the x and y axis in which to place the value
                    }
                }
                else
                {
                    break;
                    //the column name used to find the unique row cannot be found
                }
            }

            return(workingTable);
        }
Beispiel #8
0
        public void GenerateLine(Tuple <object, List <object> > dataObjects, List <Exception> exceptions)
        {
            bool isFixedWidth  = _fileToGenerate.IsFixedWidth;
            bool isMultiSchema = _fileToGenerate.IsMultiSchema;

            errorType = "File generation error";
            {
                FileType fileType = null;
                if (isMultiSchema)
                {
                    fileType = _fileToGenerate.FileTypes.SingleOrDefault(ft => ft.SchemaIdentifier == (string)dataObjects.Item1);
                }
                else
                {
                    fileType = _fileToGenerate.FileTypes[0];
                }
                if (fileType != null)
                {
                    RowDefinition rowDef = null;
                    try
                    {
                        int lastPos = 0;
                        if (isFixedWidth)
                        {
                            lastPos = 1;
                        }
                        ArrayList            fieldList = new ArrayList();
                        List <RowDefinition> rowDefs   = fileType.RowDefinitions.OrderBy(rd => rd.SourceColumnNumber).ToList();
                        for (var i = 0; i < rowDefs.Count; i++)
                        {
                            rowDef = rowDefs[i];
                            if (isFixedWidth)
                            {
                                if (rowDef.ParseStartPosition > lastPos)
                                {
                                    int len     = rowDef.ParseStartPosition.Value - lastPos;
                                    var padding = new string(' ', len);
                                    fieldList.Add(padding);
                                }
                                lastPos = rowDef.ParseStartPosition.Value + rowDef.ParseLength.Value;
                            }
                            else
                            {
                                if (rowDef.SourceColumnNumber == null)
                                {
                                    continue;
                                }

                                if (rowDef.SourceColumnNumber > (lastPos + 1))
                                {
                                    for (var s = 0; s < rowDef.SourceColumnNumber - 1; s++)
                                    {
                                        fieldList.Add("");
                                    }
                                }
                                lastPos = rowDef.SourceColumnNumber.Value;
                            }
                            object obj = null;
                            if (rowDef.SourceColumnNumber == -1)
                            {
                                string schemaId = ConvertValue(fileType.SchemaIdentifier, rowDef.DataType, rowDef.FieldFormat, isFixedWidth, rowDef.ParseLength);
                                if (schemaId != null)
                                {
                                    fieldList.Add(schemaId);
                                }
                            }
                            else
                            {
                                obj = dataObjects.Item2.SingleOrDefault(o => o.GetType().Name == rowDef.TargetTableName);
                                if (obj == null)
                                {
                                    obj = dataObjects.Item2.SingleOrDefault(o => o.GetType().GetCustomAttribute <ParseTargetAttribute>() != null && o.GetType().GetCustomAttribute <ParseTargetAttribute>().DisplayName == rowDef.TargetTableName);
                                }
                            }
                            if (obj != null)
                            {
                                PropertyInfo pInfo = obj.GetType().GetProperty(rowDef.TargetFieldName);
                                if (pInfo != null)
                                {
                                    string result = null;
                                    object value  = pInfo.GetValue(obj);
                                    if (value == null && rowDef.IsRequired)
                                    {
                                        if (rowDef.CanSetDefault && rowDef.DefaultValue != null)
                                        {
                                            value = rowDef.DefaultValue;
                                        }
                                        if (value == null)
                                        {
                                            throw new Exception("[" + rowDef.FieldDisplayName + "] is a required field but has no value.");
                                        }
                                    }

                                    result = ConvertValue(value, rowDef.DataType, rowDef.FieldFormat, isFixedWidth, rowDef.ParseLength);

                                    if (result != null)
                                    {
                                        fieldList.Add(result);
                                    }
                                    else
                                    {
                                        fieldList.Add("");
                                    }
                                }
                            }
                        }
                        if (!_fileToGenerate.IsMultiSchema && !_fileToGenerate.IsFixedWidth && _fileToGenerate.AppendUnmappedDataToEnd)
                        {
                            CustomDynamicObject cdo = null;
                            foreach (object obj in dataObjects.Item2)
                            {
                                List <PropertyInfo> propList = TypedPropertyList.GetPropertyList(obj.GetType(), false, true);
                                foreach (PropertyInfo prop in propList)
                                {
                                    object propVal = prop.GetValue(obj);
                                    if (propVal is CustomDynamicObject)
                                    {
                                        cdo = propVal as CustomDynamicObject;
                                        break;
                                    }
                                    if (cdo != null)
                                    {
                                        break;
                                    }
                                }
                            }
                            if (cdo != null)
                            {
                                var dictNamesTypes = cdo.GetPropertyNamesAndTypes();
                                foreach (var dictNameType in dictNamesTypes)
                                {
                                    var val = cdo.GetPropertyValue(dictNameType.Key);
                                    fieldList.Add(val != null ? val.ToString() : "");
                                }
                            }
                        }
                        _generator.WriteFields(fieldList.Cast <string>().ToArray());
                    }
                    catch (Exception e)
                    {
                        string columnDesc = string.Empty;
                        if (rowDef != null)
                        {
                            columnDesc = string.Format("Field '{0}', ", rowDef.FieldDisplayName);
                        }

                        exceptions.Add(new Exception("Generation Warning",
                                                     new Exception(string.Format(
                                                                       "Unable to generate line {0}, {1} column {2}.  Error: {3}", _currentLineNumber + 1,
                                                                       columnDesc, rowDef.SourceColumnNumber.Value, e.Message))));
                        if (_fileToGenerate.MaximumParsingErrors > 0 && exceptions.Count >= _fileToGenerate.MaximumParsingErrors)
                        {
                            errorType = string.Empty;
                            throw new Exception(string.Format("Aborting export after {0} Generation Warnings",
                                                              _fileToGenerate.MaximumParsingErrors));
                        }
                    }
                }
                _currentLineNumber++;
            }

            //skip footer lines if defined
            if (_footerLines > 0)
            {
                short skipFooterLines = 0;
                while (skipFooterLines < _footerLines)
                {
                    _generator.WriteLine();
                    skipFooterLines++;
                    _currentLineNumber++;
                }
            }
        }