Example #1
0
 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);
        }
Example #4
0
        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);
        }
Example #6
0
        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);
 }
Example #9
0
 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);
 }
Example #13
0
 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);
        }
Example #16
0
        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);
        }
Example #18
0
        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);
        }
Example #20
0
        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);
        }
Example #22
0
        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);
        }
Example #25
0
 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);
        }
Example #27
0
 /// <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);
        }
Example #30
0
 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);
 }