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)")); }
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")); }
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")); }
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); }
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++; } } }