public override object Set(ReadOnlySpan <char> value, TagMapLeaf mappingDetails, FixMessageContext fixMessageContext, object targetObject) { // mappingDetails is a leaf node for the repeating tag // parents are expected to be set by parents setter //This is handled as a parent. The incremental counting is set by the first tag of the repeating group. return(SetInternal(value, mappingDetails, fixMessageContext, targetObject)); }
public void GivenEnumeratedParents_SetTwice_ReturnsSecondElement() { var targetObject = new TestTypeParent() { Tag59s = new TestMany[3] }; var uut = new CompositePropertySetter(); var valueToSet = new byte[1].AsSpan(); var mappingDetails = new TagMapLeaf(typeof(TestMany).GetProperty("Tag60"), new MockPropertySetter()) { Parents = new List <TagMapParent> { new TagMapParent(targetObject.GetType().GetProperty(nameof(targetObject.Tag59s)), new ParentPropertySetter()) { IsEnumerable = true, InnerType = typeof(TestMany), } } }; var messageContext = new FixMessageContext(); uut.Set(valueToSet, mappingDetails, messageContext, targetObject); var result = uut.Set(valueToSet, mappingDetails, messageContext, targetObject); Assert.NotNull(targetObject.Tag59s.First()); Assert.Equal(result, targetObject.Tag59s.Skip(1).First()); }
private TagMapLeaf AddEnumerableLeaf(Stack <TagMapParent> parents, PropertyInfo property, FixTagAttribute fixTagAttribute, RepeatingGroupAttribute repeatingGroup, TypeConverterAttribute?typeConverter, int key, Type innerType) { BaseSetter setter; if (typeConverter != null) { setter = _propertySetterFactory.GetTypeConvertingSetter(property); } else { setter = _propertySetterFactory.GetSetter(property, innerType); } var value = TagMapLeaf.CreateEnumerable(property, repeatingGroup.Tag, innerType, setter); if (parents.Any()) { value.Parents = parents.ToList(); } if (typeConverter != null) { value.TypeConverterName = typeConverter.ConverterTypeName; } value.IsEncoded = fixTagAttribute.Encoded; _map.TryAdd(key, value); return(value); }
public object Set(ReadOnlySpan <byte> value, TagMapLeaf mappingDetails, FixMessageContext fixMessageContext, object targetObject) { if (mappingDetails.Parents != null) { foreach (var parent in mappingDetails.Parents) { targetObject = parent.ParentSetter.Set(mappingDetails, parent, fixMessageContext, targetObject); } } int valueLength = value.Length; Span <char> valueChars = stackalloc char[valueLength]; if (mappingDetails.IsEncoded) { valueLength = fixMessageContext.EncodedFields.GetEncoder().GetChars(value, valueChars); valueChars = valueChars.Slice(0, valueLength); } else { Encoding.ASCII.GetChars(value, valueChars); } targetObject = mappingDetails.Setter.Set(valueChars, mappingDetails, fixMessageContext, targetObject); return(targetObject); }
private TagMapLeaf AddLeafNode(Stack <TagMapParent> parents, PropertyInfo property, FixTagAttribute fixTagAttribute, TypeConverterAttribute?typeConverter, int key) { BaseSetter setter; if (typeConverter != null) { setter = _propertySetterFactory.GetTypeConvertingSetter(property); } else { setter = _propertySetterFactory.GetSetter(property, property.PropertyType); } TagMapLeaf value = new TagMapLeaf(property, setter) { IsEncoded = fixTagAttribute.Encoded }; if (parents.Any()) { value.Parents = parents.ToList(); } if (typeConverter != null) { value.TypeConverterName = typeConverter.ConverterTypeName; } _map.TryAdd(key, value); return(value); }
private object SetRepeatingTypeParent(TagMapLeaf leaf, TagMapParent parent, FixMessageContext fixMessageContext, object targetObject) { int index = GetAdvancedIndex(GetKey(leaf.Current), parent, fixMessageContext, out bool isAdvanced); if (isAdvanced) { object?childObject = Activator.CreateInstance(parent.InnerType); if (childObject is null) { throw new InvalidOperationException(); } Type typeOfParent = parent.InnerType; if (_delegateFactoryCache == null) { var methodInfo = typeof(BaseSetter).GetMethod("GetEnumeratedILSetterAction", BindingFlags.NonPublic | BindingFlags.Instance); var generatedDelegate = (Delegate?)methodInfo?.MakeGenericMethod(typeOfParent).Invoke(this, new[] { parent.Current }); _delegateFactoryCache = generatedDelegate ?? throw new InvalidOperationException(); } _delegateFactoryCache.DynamicInvoke(targetObject, childObject, index); return(childObject); } targetObject = (parent.Current.GetValue(targetObject) as IEnumerable <object>).ElementAt(index); return(targetObject); }
public void GivenEnumerableAsString_Set_SetsValueOnTargetObjectsProperIndex() { var targetObject = new TestTypeParent() { Tag57s = new string[3] }; var uut = new CompositePropertySetter(); var firstValueToSet = "12357"; var secondValueToSet = "12358"; var mappingDetails = new TagMapLeaf(targetObject.GetType().GetProperty(nameof(targetObject.Tag57s)), new StringSetter()) { IsEnumerable = true, RepeatingTagNumber = 56, InnerType = typeof(string), }; var messageContext = new FixMessageContext(); // Setting the 1st element uut.Set(firstValueToSet.AsSpan(), mappingDetails, messageContext, targetObject); // Setting the 2nd element uut.Set(secondValueToSet.AsSpan(), mappingDetails, messageContext, targetObject); Assert.Equal(firstValueToSet, targetObject.Tag57s.First()); Assert.Equal(secondValueToSet, targetObject.Tag57s.Skip(1).First()); }
public override TTarget SetTarget <TTarget>(ReadOnlySpan <char> valueChars, TagMapLeaf mappingDetails, FixMessageContext fixMessageContext, ref TTarget targetObject) { if (double.TryParse(valueChars, NumberStyles.Float | NumberStyles.AllowThousands, _numberFormatInfo, out var parsedValue)) { SetValue <TTarget, double?>(mappingDetails, fixMessageContext, ref targetObject, parsedValue); } return(targetObject); }
public override object Set(ReadOnlySpan <char> valueChars, TagMapLeaf mappingDetails, FixMessageContext fixMessageContext, object targetObject) { if (float.TryParse(valueChars, NumberStyles.Float | NumberStyles.AllowThousands, _numberFormatInfo, out var parsedValue)) { SetValue(mappingDetails, fixMessageContext, targetObject, parsedValue); } return(targetObject); }
public override TTarget SetTarget <TTarget>(ReadOnlySpan <char> valueChars, TagMapLeaf mappingDetails, FixMessageContext fixMessageContext, ref TTarget targetObject) { if (DateTimeOffset.TryParseExact(valueChars, DateTimeFormat, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AssumeUniversal, out var parsedValue)) { SetValue <TTarget, DateTimeOffset?>(mappingDetails, fixMessageContext, ref targetObject, parsedValue); } return(targetObject); }
public override object Set(ReadOnlySpan <char> valueChars, TagMapLeaf mappingDetails, FixMessageContext fixMessageContext, object targetObject) { if (int.TryParse(valueChars, NumberStyles.Integer, _numberFormatInfo, out var parsedValue)) { SetValue <int?>(mappingDetails, fixMessageContext, targetObject, parsedValue); } return(targetObject); }
public override TTarget SetTarget <TTarget>(ReadOnlySpan <char> valueChars, TagMapLeaf mappingDetails, FixMessageContext fixMessageContext, ref TTarget targetObject) { if (int.TryParse(valueChars, out var parsedValue)) { SetValue <TTarget, int?>(mappingDetails, fixMessageContext, ref targetObject, parsedValue); } return(targetObject); }
public override TTarget SetTarget <TTarget>(ReadOnlySpan <char> valueChars, TagMapLeaf mappingDetails, FixMessageContext fixMessageContext, ref TTarget targetObject) { if (short.TryParse(valueChars, NumberStyles.Integer, _numberFormatInfo, out var parsedValue)) { SetValue <TTarget, short?>(mappingDetails, fixMessageContext, ref targetObject, parsedValue); } return(targetObject); }
public void GivenByte_Set_SetsParsedValue() { var targetObject = new MockClass(); var uut = new NullableByteSetter(); var mappingDetails = new TagMapLeaf(targetObject.GetType().GetProperty(nameof(targetObject.Tag1)), uut); var messageContext = new FixMessageContext(); uut.Set("=", mappingDetails, messageContext, targetObject); Assert.True(targetObject.Tag1.HasValue); }
public void GivenInteger_SetTarget_SetsParsedValue() { var targetObject = new MockStruct(); var uut = new NullableIntegerSetter(); var mappingDetails = new TagMapLeaf(targetObject.GetType().GetProperty(nameof(targetObject.Tag1)), uut); var messageContext = new FixMessageContext(); uut.SetTarget <MockStruct>(1.ToString(), mappingDetails, messageContext, ref targetObject); Assert.Equal(1, targetObject.Tag1.Value); }
public void GivenLong_Set_SetsParsedValue() { var targetObject = new MockClass(); var uut = new LongSetter(); var mappingDetails = new TagMapLeaf(targetObject.GetType().GetProperty(nameof(targetObject.Tag1)), uut); var messageContext = new FixMessageContext(); uut.Set(1L.ToString(), mappingDetails, messageContext, targetObject); Assert.Equal(1L, targetObject.Tag1); }
public void GivenShort_Set_SetsParsedValue() { var targetObject = new MockClass(); var uut = new NullableShortSetter(); var mappingDetails = new TagMapLeaf(targetObject.GetType().GetProperty(nameof(targetObject.Tag1)), uut); var messageContext = new FixMessageContext(); uut.Set(((short)1).ToString(), mappingDetails, messageContext, targetObject); Assert.Equal(1, targetObject.Tag1.Value); }
public void GivenByte_SetTarget_SetsParsedValue() { var targetObject = new MockStruct(); var uut = new ByteSetter(); var mappingDetails = new TagMapLeaf(targetObject.GetType().GetProperty(nameof(targetObject.Tag1)), uut); var messageContext = new FixMessageContext(); uut.SetTarget <MockStruct>("=", mappingDetails, messageContext, ref targetObject); Assert.Equal(61, targetObject.Tag1); }
public void GivenFalseValues_Set_SetsParsedValue(string value) { var targetObject = new TestTypeParent(); var uut = new NullableBooleanSetter(); var mappingDetails = new TagMapLeaf(targetObject.GetType().GetProperty(nameof(targetObject.Tag69)), uut); var messageContext = new FixMessageContext(); uut.Set(value, mappingDetails, messageContext, targetObject); Assert.False(targetObject.Tag69); }
public void GivenDateTimeOffset_SetTarget_SetsParsedValue() { var targetObject = new MockStruct(); var uut = new DateTimeOffsetSetter(); var mappingDetails = new TagMapLeaf(targetObject.GetType().GetProperty(nameof(targetObject.Tag1)), uut); var messageContext = new FixMessageContext(); uut.SetTarget <MockStruct>("20190104-19:02:04", mappingDetails, messageContext, ref targetObject); Assert.Equal(new DateTimeOffset(2019, 1, 4, 19, 2, 4, TimeSpan.Zero), targetObject.Tag1); }
public void GivenDateTimeOffset_SetTarget_SetsParsedValue() { var targetObject = new MockStruct(); var uut = new NullableDateTimeOffsetSetter(); var mappingDetails = new TagMapLeaf(targetObject.GetType().GetProperty(nameof(targetObject.Tag1)), uut); var messageContext = new FixMessageContext(); uut.SetTarget <MockStruct>("20190104-19:02:04", mappingDetails, messageContext, ref targetObject); Assert.True(targetObject.Tag1.HasValue); }
public override object Set(ReadOnlySpan <char> valueChars, TagMapLeaf mappingDetails, FixMessageContext fixMessageContext, object targetObject) { if (mappingDetails.TypeConverterName is null) { return(targetObject); } if (_typeConverter is null) { Type?typeOfConverter = Type.GetType(mappingDetails.TypeConverterName); if (typeOfConverter == null) { throw new ArgumentException("Invalid TypeConverterName"); } _typeConverter = (TypeConverter?)Activator.CreateInstance(typeOfConverter); if (_typeConverter == null) { throw new ArgumentException("Invalid TypeConverterConstructor for"); } } if (!_typeConverter.CanConvertFrom(typeof(char[]))) { return(targetObject); } var tempCharsArray = ArrayPool <char> .Shared.Rent(valueChars.Length); try { valueChars.CopyTo(tempCharsArray.AsSpan()); object converted = _typeConverter.ConvertFrom(tempCharsArray); var convertedType = converted.GetType(); if (_delegateFactory == null) { string methodGeneratingMethodName = mappingDetails.IsEnumerable ? "GetEnumeratedILSetterAction" : "GetILSetterAction"; var methodInfo = typeof(BaseSetter).GetMethod(methodGeneratingMethodName, BindingFlags.NonPublic | BindingFlags.Instance); var generatedDelegate = (Delegate?)methodInfo?.MakeGenericMethod(convertedType).Invoke(this, new[] { mappingDetails.Current }); _delegateFactory = generatedDelegate ?? throw new ArgumentNullException(); } if (mappingDetails.IsEnumerable) { int index = GetAdvancedIndex(mappingDetails, fixMessageContext); _delegateFactory.DynamicInvoke(targetObject, converted, index); } else { _delegateFactory.DynamicInvoke(targetObject, converted); } } finally { ArrayPool <char> .Shared.Return(tempCharsArray, true); } return(targetObject); }
public void GivenNullableDateTimeOffsetAsString_Set_SetsValueOnTargetObject() { var targetObject = new TestTypeParent(); var uut = new CompositePropertySetter(); var valueToSet = "20181219-18:14:23"; var mappingDetails = new TagMapLeaf(targetObject.GetType().GetProperty(nameof(targetObject.Tag71)), new NullableDateTimeOffsetSetter()); var messageContext = new FixMessageContext(); uut.Set(valueToSet.AsSpan(), mappingDetails, messageContext, targetObject); Assert.Equal(new DateTimeOffset(2018, 12, 19, 18, 14, 23, 0, TimeSpan.Zero), targetObject.Tag71.Value); }
public void GivenRepeatingGroup_Set_CallsRepeatingSetter() { var testValue = new byte[0]; var mockSetter = new MockPropertySetter(); var uut = new CompositePropertySetter(); uut.Set(testValue, TagMapLeaf.CreateRepeatingTag(null, null, mockSetter), new FixMessageContext(), new object()); Assert.True(mockSetter.IsVerified); }
private object?SetInternal(ReadOnlySpan <char> value, TagMapLeaf mappingDetails, FixMessageContext fixMessageContext, object targetObject) { if (!fixMessageContext.CreatedParentTypes.Contains(GetKey(mappingDetails.Current))) { return(CreateEnumerable(value, mappingDetails, fixMessageContext, targetObject)); } else { return(mappingDetails.Current.GetValue(targetObject)); } }
public void GivenBoolAsString_Set_SetsValueOnTargetObject() { var targetObject = new TestTypeParent(); var uut = new CompositePropertySetter(); var valueToSet = "Y"; var mappingDetails = new TagMapLeaf(targetObject.GetType().GetProperty(nameof(targetObject.Tag68)), new BooleanSetter()); var messageContext = new FixMessageContext(); uut.Set(valueToSet.AsSpan(), mappingDetails, messageContext, targetObject); Assert.True(targetObject.Tag68); }
/// <summary> /// Sets a typed value on an array property or a non-enumerable property based on the mapping details. /// </summary> protected void SetValue <TTarget, T>(TagMapLeaf mappingDetails, FixMessageContext fixMessageContext, ref TTarget targetObject, T parsedValue) { if (mappingDetails.IsEnumerable) { int index = GetAdvancedIndex(mappingDetails, fixMessageContext); GetTypedEnumeratedILSetterAction <TTarget, T>(mappingDetails.Current).Invoke(ref targetObject, parsedValue, index); } else { GetTypedILSetterAction <TTarget, T>(mappingDetails.Current).Invoke(ref targetObject, parsedValue); } }
public void GivenNullableBool_Set_SetsValueOnTargetObject() { var targetObject = new TestTypeParent(); var uut = new CompositePropertySetter(); var valueToSet = Encoding.ASCII.GetBytes("Y").AsSpan(); var mappingDetails = new TagMapLeaf(targetObject.GetType().GetProperty(nameof(targetObject.Tag69)), new NullableBooleanSetter()); var messageContext = new FixMessageContext(); uut.Set(valueToSet, mappingDetails, messageContext, targetObject); Assert.True(targetObject.Tag69); Assert.False(targetObject.Tag68); }
public void GivenNullableIntegerAsString_Set_SetsValueOnTargetObject() { var targetObject = new TestTypeParent(); var uut = new CompositePropertySetter(); ReadOnlySpan <char> valueToSet = "12357".AsSpan(); var mappingDetails = new TagMapLeaf(targetObject.GetType().GetProperty(nameof(targetObject.Tag63)), new IntegerSetter()); var messageContext = new FixMessageContext(); uut.Set(valueToSet, mappingDetails, messageContext, targetObject); Assert.Equal(12357, targetObject.Tag63); }
public object Set(TagMapLeaf mappingDetails, TagMapParent parent, FixMessageContext fixMessageContext, object targetObject) { if (parent.IsEnumerable) { targetObject = SetRepeatingTypeParent(mappingDetails, parent, fixMessageContext, targetObject); } else { targetObject = SetSimpleTypeParent(parent, fixMessageContext, targetObject); } return(targetObject); }