diff --git a/src/libraries/System.Private.Xml/src/System.Private.Xml.csproj b/src/libraries/System.Private.Xml/src/System.Private.Xml.csproj index 2afc279cf5f805..619a6c4fbb7152 100644 --- a/src/libraries/System.Private.Xml/src/System.Private.Xml.csproj +++ b/src/libraries/System.Private.Xml/src/System.Private.Xml.csproj @@ -433,7 +433,6 @@ - diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Core/XmlReader.cs b/src/libraries/System.Private.Xml/src/System/Xml/Core/XmlReader.cs index d2567757a5aaf8..e119068dbc8269 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Core/XmlReader.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Core/XmlReader.cs @@ -328,7 +328,7 @@ public virtual object ReadContentAs(Type returnType, IXmlNamespaceResolver? name try { - return XmlUntypedStringConverter.Instance.FromString(strContentValue, returnType, (namespaceResolver ?? this as IXmlNamespaceResolver)!); + return XmlUntypedConverter.Untyped.ChangeType(strContentValue, returnType, namespaceResolver ?? this as IXmlNamespaceResolver); } catch (FormatException e) { @@ -534,7 +534,7 @@ public virtual object ReadElementContentAs(Type returnType, IXmlNamespaceResolve return value; } - return returnType == typeof(string) ? string.Empty : XmlUntypedStringConverter.Instance.FromString(string.Empty, returnType, namespaceResolver); + return returnType == typeof(string) ? string.Empty : XmlUntypedConverter.Untyped.ChangeType(string.Empty, returnType, namespaceResolver); } // Checks local name and namespace of the current element and returns its content as the requested type. diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlUntypedStringConverter.cs b/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlUntypedStringConverter.cs deleted file mode 100644 index 50f0d2d53390cb..00000000000000 --- a/src/libraries/System.Private.Xml/src/System/Xml/Schema/XmlUntypedStringConverter.cs +++ /dev/null @@ -1,246 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Xml; -using System.Text; -using System.Collections; -using System.Globalization; -using System.Diagnostics; -using System.Reflection; - -namespace System.Xml.Schema -{ - // This is an atomic value converted for Silverlight XML core that knows only how to convert to and from string. - // It does not recognize XmlAtomicValue or XPathItemType. - internal sealed class XmlUntypedStringConverter - { - // Fields - private readonly bool _listsAllowed; - private readonly XmlUntypedStringConverter? _listItemConverter; - - // Cached types - private static readonly Type s_decimalType = typeof(decimal); - private static readonly Type s_int32Type = typeof(int); - private static readonly Type s_int64Type = typeof(long); - private static readonly Type s_stringType = typeof(string); - private static readonly Type s_objectType = typeof(object); - private static readonly Type s_byteType = typeof(byte); - private static readonly Type s_int16Type = typeof(short); - private static readonly Type s_SByteType = typeof(sbyte); - private static readonly Type s_UInt16Type = typeof(ushort); - private static readonly Type s_UInt32Type = typeof(uint); - private static readonly Type s_UInt64Type = typeof(ulong); - private static readonly Type s_doubleType = typeof(double); - private static readonly Type s_singleType = typeof(float); - private static readonly Type s_dateTimeType = typeof(DateTime); - private static readonly Type s_dateTimeOffsetType = typeof(DateTimeOffset); - private static readonly Type s_booleanType = typeof(bool); - private static readonly Type s_byteArrayType = typeof(byte[]); - private static readonly Type s_xmlQualifiedNameType = typeof(XmlQualifiedName); - private static readonly Type s_uriType = typeof(Uri); - private static readonly Type s_timeSpanType = typeof(TimeSpan); - - private const string UntypedStringTypeName = "xdt:untypedAtomic"; - - // Static convertor instance - internal static XmlUntypedStringConverter Instance = new XmlUntypedStringConverter(true); - - private XmlUntypedStringConverter(bool listsAllowed) - { - _listsAllowed = listsAllowed; - if (listsAllowed) - { - _listItemConverter = new XmlUntypedStringConverter(false); - } - } - - internal object FromString(string value, Type destinationType, IXmlNamespaceResolver nsResolver) - { - if (value == null) throw new ArgumentNullException(nameof(value)); - if (destinationType == null) throw new ArgumentNullException(nameof(destinationType)); - - if (destinationType == s_objectType) destinationType = typeof(string); - if (destinationType == s_booleanType) return XmlConvert.ToBoolean((string)value); - if (destinationType == s_byteType) return Int32ToByte(XmlConvert.ToInt32((string)value)); - if (destinationType == s_byteArrayType) return StringToBase64Binary((string)value); - if (destinationType == s_dateTimeType) return StringToDateTime((string)value); - if (destinationType == s_dateTimeOffsetType) return StringToDateTimeOffset((string)value); - if (destinationType == s_decimalType) return XmlConvert.ToDecimal((string)value); - if (destinationType == s_doubleType) return XmlConvert.ToDouble((string)value); - if (destinationType == s_int16Type) return Int32ToInt16(XmlConvert.ToInt32((string)value)); - if (destinationType == s_int32Type) return XmlConvert.ToInt32((string)value); - if (destinationType == s_int64Type) return XmlConvert.ToInt64((string)value); - if (destinationType == s_SByteType) return Int32ToSByte(XmlConvert.ToInt32((string)value)); - if (destinationType == s_singleType) return XmlConvert.ToSingle((string)value); - if (destinationType == s_timeSpanType) return StringToDuration((string)value); - if (destinationType == s_UInt16Type) return Int32ToUInt16(XmlConvert.ToInt32((string)value)); - if (destinationType == s_UInt32Type) return Int64ToUInt32(XmlConvert.ToInt64((string)value)); - if (destinationType == s_UInt64Type) return DecimalToUInt64(XmlConvert.ToDecimal((string)value)); - if (destinationType == s_uriType) return XmlConvert.ToUri((string)value); - if (destinationType == s_xmlQualifiedNameType) return StringToQName((string)value, nsResolver); - if (destinationType == s_stringType) return ((string)value); - - return StringToListType(value, destinationType, nsResolver); - } - - private byte Int32ToByte(int value) - { - if (value < (int)byte.MinValue || value > (int)byte.MaxValue) - throw new OverflowException(SR.Format(SR.XmlConvert_Overflow, new string[] { XmlConvert.ToString(value), "Byte" })); - - return (byte)value; - } - - private short Int32ToInt16(int value) - { - if (value < (int)short.MinValue || value > (int)short.MaxValue) - throw new OverflowException(SR.Format(SR.XmlConvert_Overflow, new string[] { XmlConvert.ToString(value), "Int16" })); - - return (short)value; - } - - private sbyte Int32ToSByte(int value) - { - if (value < (int)sbyte.MinValue || value > (int)sbyte.MaxValue) - throw new OverflowException(SR.Format(SR.XmlConvert_Overflow, new string[] { XmlConvert.ToString(value), "SByte" })); - - return (sbyte)value; - } - - private ushort Int32ToUInt16(int value) - { - if (value < (int)ushort.MinValue || value > (int)ushort.MaxValue) - throw new OverflowException(SR.Format(SR.XmlConvert_Overflow, new string[] { XmlConvert.ToString(value), "UInt16" })); - - return (ushort)value; - } - - private uint Int64ToUInt32(long value) - { - if (value < (long)uint.MinValue || value > (long)uint.MaxValue) - throw new OverflowException(SR.Format(SR.XmlConvert_Overflow, new string[] { XmlConvert.ToString(value), "UInt32" })); - - return (uint)value; - } - - private ulong DecimalToUInt64(decimal value) - { - if (value < (decimal)ulong.MinValue || value > (decimal)ulong.MaxValue) - throw new OverflowException(SR.Format(SR.XmlConvert_Overflow, new string[] { XmlConvert.ToString(value), "UInt64" })); - - return (ulong)value; - } - - private byte[] StringToBase64Binary(string value) - { - return Convert.FromBase64String(XmlConvert.TrimString(value)); - } - - private static DateTime StringToDateTime(string value) - { - return (DateTime)(new XsdDateTime(value, XsdDateTimeFlags.AllXsd)); - } - - private static DateTimeOffset StringToDateTimeOffset(string value) - { - return (DateTimeOffset)(new XsdDateTime(value, XsdDateTimeFlags.AllXsd)); - } - - private TimeSpan StringToDuration(string value) - { - return new XsdDuration(value, XsdDuration.DurationType.Duration).ToTimeSpan(XsdDuration.DurationType.Duration); - } - - private static XmlQualifiedName StringToQName(string value, IXmlNamespaceResolver nsResolver) - { - string prefix, localName; - string? ns; - - value = value.Trim(); - - // Parse prefix:localName - try - { - ValidateNames.ParseQNameThrow(value, out prefix, out localName); - } - catch (XmlException e) - { - throw new FormatException(e.Message); - } - - // Throw error if no namespaces are in scope - if (nsResolver == null) - throw new InvalidCastException(SR.Format(SR.XmlConvert_TypeNoNamespace, value, prefix)); - - // Lookup namespace - ns = nsResolver.LookupNamespace(prefix); - if (ns == null) - throw new InvalidCastException(SR.Format(SR.XmlConvert_TypeNoNamespace, value, prefix)); - - // Create XmlQualfiedName - return new XmlQualifiedName(localName, ns); - } - - private object StringToListType(string value, Type destinationType, IXmlNamespaceResolver nsResolver) - { - if (_listsAllowed && destinationType.IsArray) - { - Type? itemTypeDst = destinationType.GetElementType(); - - // Different StringSplitOption needs to be used because of following bugs: - // 566053: Behavior change between SL2 and Dev10 in the way string arrays are deserialized by the XmlReader.ReadContentsAs method - // 643697: Deserialization of typed arrays by the XmlReader.ReadContentsAs method fails - // - // In Silverligt 2 the XmlConvert.SplitString was not using the StringSplitOptions, which is the same as using StringSplitOptions.None. - // What it meant is that whenever there is a double space between two values in the input string it turned into - // an string.Empty entry in the intermediate string array. In Dev10 empty entries were always removed (StringSplitOptions.RemoveEmptyEntries). - // - // Moving forward in coreclr we'll use Dev10 behavior which empty entries were always removed (StringSplitOptions.RemoveEmptyEntries). - // we didn't quirk the change because we discover not many apps using ReadContentAs with string array type parameter - // - // The types Object, Byte[], String and Uri can be successfully deserialized from string.Empty, so we need to preserve the - // Silverlight 2 behavior for back-compat (=use StringSplitOptions.None). All the other array types failed to deserialize - // from string.Empty in Silverlight 2 (threw an exception), so we can fix all of these as they are not breaking changes - // (=use StringSplitOptions.RemoveEmptyEntries). - - if (itemTypeDst == s_objectType) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_booleanType) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_byteType) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_byteArrayType) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_dateTimeType) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_dateTimeOffsetType) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_decimalType) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_doubleType) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_int16Type) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_int32Type) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_int64Type) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_SByteType) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_singleType) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_stringType) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_timeSpanType) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_UInt16Type) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_UInt32Type) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_UInt64Type) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_uriType) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - if (itemTypeDst == s_xmlQualifiedNameType) return ToArray(XmlConvert.SplitString(value, StringSplitOptions.RemoveEmptyEntries), nsResolver); - } - throw CreateInvalidClrMappingException(typeof(string), destinationType); - } - - private T[] ToArray(string[] stringArray, IXmlNamespaceResolver nsResolver) - { - T[] arrDst = new T[stringArray.Length]; - for (int i = 0; i < stringArray.Length; i++) - { - arrDst[i] = (T)_listItemConverter!.FromString(stringArray[i], typeof(T), nsResolver); - } - return arrDst; - } - - private Exception CreateInvalidClrMappingException(Type sourceType, Type destinationType) - { - return new InvalidCastException(SR.Format(SR.XmlConvert_TypeListBadMapping2, UntypedStringTypeName, sourceType.Name, destinationType.Name)); - } - } -} diff --git a/src/libraries/System.Private.Xml/tests/XmlReader/ReadContentAs/ReadAsArrayTests.cs b/src/libraries/System.Private.Xml/tests/XmlReader/ReadContentAs/ReadAsArrayTests.cs index f5b94039ef5b36..e4c124f94e42c1 100644 --- a/src/libraries/System.Private.Xml/tests/XmlReader/ReadContentAs/ReadAsArrayTests.cs +++ b/src/libraries/System.Private.Xml/tests/XmlReader/ReadContentAs/ReadAsArrayTests.cs @@ -1,6 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Xml.Schema; +using System.Xml.XPath; using Xunit; namespace System.Xml.Tests @@ -14,7 +16,6 @@ public static void DeserializationOfTypedArraysByXmlReader1() reader.PositionOnElement("a"); reader.Read(); var values = (int[])reader.ReadContentAs(typeof(int[]), null); - Assert.Equal(4, values.Length); Assert.Equal(1, values[0]); Assert.Equal(2, values[1]); @@ -22,6 +23,232 @@ public static void DeserializationOfTypedArraysByXmlReader1() Assert.Equal(4, values[3]); } + [Fact] + public static void DeserializationOfTypedArraysByXmlReader10() + { + var reader = Utils.CreateFragmentReader("true false"); + reader.PositionOnElement("a"); + reader.MoveToAttribute("b"); + reader.Read(); + var values = (bool[])reader.ReadContentAs(typeof(bool[]), null); + Assert.Equal(2, values.Length); + Assert.True(values[0]); + Assert.False(values[1]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader11() + { + var reader = Utils.CreateFragmentReader + ( + @" 0002-01-01T00:00:00+00:00 + 9998-12-31T12:59:59-00:00 +2000-02-29T23:59:59+13:60" + ); + + reader.PositionOnElement("a"); + reader.Read(); + var values = (DateTime[])reader.ReadContentAs(typeof(DateTime[]), null); + Assert.Equal(3, values.Length); + + Assert.Equal + ( + new DateTime(2, 1, 1, 0, 0, 0) + .Add(TimeZoneInfo.Local.GetUtcOffset(new DateTime(2, 1, 1))), + values[0] + ); + + Assert.Equal + ( + new DateTime(9998, 12, 31, 12, 59, 59) + .Add(TimeZoneInfo.Local.GetUtcOffset(new DateTime(9998, 12, 31))), + values[1] + ); + + Assert.Equal + ( + new DateTime(2000, 2, 29, 23, 59, 59) + .Add(TimeZoneInfo.Local.GetUtcOffset(new DateTime(2000, 2, 29)) + - new TimeSpan(14, 0, 0)), + values[2] + ); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader12() + { + var reader = Utils.CreateFragmentReader + ( + @" 0002-01-01T00:00:00+00:00 + 9998-12-31T12:59:59-00:00 +2000-02-29T23:59:59+13:60" + ); + + reader.PositionOnElement("a"); + reader.MoveToAttribute("b"); + var values = (DateTime[])reader.ReadContentAs(typeof(DateTime[]), null); + Assert.Equal(3, values.Length); + + Assert.Equal + ( + new DateTime(2, 1, 1, 0, 0, 0) + .Add(TimeZoneInfo.Local.GetUtcOffset(new DateTime(2, 1, 1))), + values[0] + ); + + Assert.Equal + ( + new DateTime(9998, 12, 31, 12, 59, 59) + .Add(TimeZoneInfo.Local.GetUtcOffset(new DateTime(9998, 12, 31))), + values[1] + ); + + Assert.Equal + ( + new DateTime(2000, 2, 29, 23, 59, 59) + .Add(TimeZoneInfo.Local.GetUtcOffset(new DateTime(2000, 2, 29)) + - new TimeSpan(14, 0, 0)), + values[2] + ); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader13() + { + var reader = Utils.CreateFragmentReader + ( + @" + 3.14 42 13.75559 -5.743 " + ); + + reader.PositionOnElement("a"); + reader.Read(); + var values = (decimal[])reader.ReadContentAs(typeof(decimal[]), null); + Assert.Equal(4, values.Length); + Assert.Equal(3.14M, values[0]); + Assert.Equal(42M, values[1]); + Assert.Equal(13.75559M, values[2]); + Assert.Equal(-5.743M, values[3]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader14() + { + var reader = Utils.CreateFragmentReader + ( + @" + 3.14 42 13.75559 -5.743 " + ); + + reader.PositionOnElement("a"); + reader.MoveToAttribute("b"); + var values = (decimal[])reader.ReadContentAs(typeof(decimal[]), null); + Assert.Equal(4, values.Length); + Assert.Equal(3.14M, values[0]); + Assert.Equal(42M, values[1]); + Assert.Equal(13.75559M, values[2]); + Assert.Equal(-5.743M, values[3]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader15() + { + var reader = Utils.CreateFragmentReader + ( + @" + 3.14 42 13.75559 -5.743 " + ); + + reader.PositionOnElement("a"); + reader.Read(); + var values = (double[])reader.ReadContentAs(typeof(double[]), null); + Assert.Equal(4, values.Length); + Assert.Equal(3.14, values[0]); + Assert.Equal(42, values[1]); + Assert.Equal(13.75559, values[2]); + Assert.Equal(-5.743, values[3]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader16() + { + var reader = Utils.CreateFragmentReader + ( + @" + 3.14 42 13.75559 -5.743 " + ); + + reader.PositionOnElement("a"); + reader.MoveToAttribute("b"); + var values = (double[])reader.ReadContentAs(typeof(double[]), null); + Assert.Equal(4, values.Length); + Assert.Equal(3.14, values[0]); + Assert.Equal(42, values[1]); + Assert.Equal(13.75559, values[2]); + Assert.Equal(-5.743, values[3]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader17() + { + var reader = Utils.CreateFragmentReader + ( + @" + 36 442 19 -5743" + ); + + reader.PositionOnElement("a"); + reader.Read(); + var values = (short[])reader.ReadContentAs(typeof(short[]), null); + Assert.Equal(4, values.Length); + Assert.Equal(36, values[0]); + Assert.Equal(442, values[1]); + Assert.Equal(19, values[2]); + Assert.Equal(-5743, values[3]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader18() + { + var reader = Utils.CreateFragmentReader + ( + @" + 36 442 19 -5743" + ); + + reader.PositionOnElement("a"); + reader.MoveToAttribute("b"); + var values = (short[])reader.ReadContentAs(typeof(short[]), null); + Assert.Equal(4, values.Length); + Assert.Equal(36, values[0]); + Assert.Equal(442, values[1]); + Assert.Equal(19, values[2]); + Assert.Equal(-5743, values[3]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader19() + { + var reader = Utils.CreateFragmentReader + ( + @" + 36 442 -39 9223372036854775807" + ); + + reader.PositionOnElement("a"); + reader.Read(); + var values = (long[])reader.ReadContentAs(typeof(long[]), null); + Assert.Equal(4, values.Length); + Assert.Equal(36L, values[0]); + Assert.Equal(442L, values[1]); + Assert.Equal(-39L, values[2]); + Assert.Equal(9223372036854775807L, values[3]); + } + [Fact] public static void DeserializationOfTypedArraysByXmlReader2() { @@ -29,7 +256,53 @@ public static void DeserializationOfTypedArraysByXmlReader2() reader.PositionOnElement("a"); reader.MoveToAttribute("b"); var values = (int[])reader.ReadContentAs(typeof(int[]), null); + Assert.Equal(4, values.Length); + Assert.Equal(1, values[0]); + Assert.Equal(2, values[1]); + Assert.Equal(3, values[2]); + Assert.Equal(4, values[3]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader20() + { + var reader = Utils.CreateFragmentReader + ( + @" + 36 442 -39 9223372036854775807" + ); + + reader.PositionOnElement("a"); + reader.MoveToAttribute("b"); + var values = (long[])reader.ReadContentAs(typeof(long[]), null); + Assert.Equal(4, values.Length); + Assert.Equal(36L, values[0]); + Assert.Equal(442L, values[1]); + Assert.Equal(-39L, values[2]); + Assert.Equal(9223372036854775807L, values[3]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader21() + { + var reader = Utils.CreateFragmentReader("1 2 3 4"); + reader.PositionOnElement("a"); + reader.Read(); + var values = (sbyte[])reader.ReadContentAs(typeof(sbyte[]), null); + Assert.Equal(4, values.Length); + Assert.Equal(1, values[0]); + Assert.Equal(2, values[1]); + Assert.Equal(3, values[2]); + Assert.Equal(4, values[3]); + } + [Fact] + public static void DeserializationOfTypedArraysByXmlReader22() + { + var reader = Utils.CreateFragmentReader("1 2 3 4"); + reader.PositionOnElement("a"); + reader.MoveToAttribute("b"); + var values = (sbyte[])reader.ReadContentAs(typeof(sbyte[]), null); Assert.Equal(4, values.Length); Assert.Equal(1, values[0]); Assert.Equal(2, values[1]); @@ -37,6 +310,120 @@ public static void DeserializationOfTypedArraysByXmlReader2() Assert.Equal(4, values[3]); } + [Fact] + public static void DeserializationOfTypedArraysByXmlReader23() + { + var reader = Utils.CreateFragmentReader + ( + @" + 3.14 42 13.75559 -5.743 " + ); + + reader.PositionOnElement("a"); + reader.Read(); + var values = (float[])reader.ReadContentAs(typeof(float[]), null); + Assert.Equal(4, values.Length); + Assert.Equal(3.14F, values[0]); + Assert.Equal(42F, values[1]); + Assert.Equal(13.75559F, values[2]); + Assert.Equal(-5.743F, values[3]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader24() + { + var reader = Utils.CreateFragmentReader + ( + @" + 3.14 42 13.75559 -5.743 " + ); + + reader.PositionOnElement("a"); + reader.MoveToAttribute("b"); + var values = (float[])reader.ReadContentAs(typeof(float[]), null); + Assert.Equal(4, values.Length); + Assert.Equal(3.14F, values[0]); + Assert.Equal(42F, values[1]); + Assert.Equal(13.75559F, values[2]); + Assert.Equal(-5.743F, values[3]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader25() + { + var reader = Utils.CreateFragmentReader(" PT2M10S PT130S"); + reader.PositionOnElement("a"); + reader.Read(); + var values = (TimeSpan[])reader.ReadContentAs(typeof(TimeSpan[]), null); + Assert.Equal(2, values.Length); + Assert.Equal(new TimeSpan(0, 0, 2, 10), values[0]); + + Assert.Equal + ( + new TimeSpan(0, 0, 0, 130, 0), + values[1] + ); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader26() + { + var reader = Utils.CreateFragmentReader(" PT2M10S PT130S"); + reader.PositionOnElement("a"); + reader.MoveToAttribute("b"); + var values = (TimeSpan[])reader.ReadContentAs(typeof(TimeSpan[]), null); + Assert.Equal(2, values.Length); + Assert.Equal(new TimeSpan(0, 0, 2, 10), values[0]); + + Assert.Equal + ( + new TimeSpan(0, 0, 0, 130, 0), + values[1] + ); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader27() + { + var reader = Utils.CreateFragmentReader("1 2 3 4"); + reader.PositionOnElement("a"); + reader.Read(); + var values = (ushort[])reader.ReadContentAs(typeof(ushort[]), null); + Assert.Equal(4, values.Length); + Assert.Equal(1, values[0]); + Assert.Equal(2, values[1]); + Assert.Equal(3, values[2]); + Assert.Equal(4, values[3]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader28() + { + var reader = Utils.CreateFragmentReader("1 2 3 4"); + reader.PositionOnElement("a"); + reader.MoveToAttribute("b"); + var values = (ushort[])reader.ReadContentAs(typeof(ushort[]), null); + Assert.Equal(4, values.Length); + Assert.Equal(1, values[0]); + Assert.Equal(2, values[1]); + Assert.Equal(3, values[2]); + Assert.Equal(4, values[3]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader29() + { + var reader = Utils.CreateFragmentReader("1 2 3 4"); + reader.PositionOnElement("a"); + reader.Read(); + var values = (uint[])reader.ReadContentAs(typeof(uint[]), null); + Assert.Equal(4, values.Length); + Assert.Equal((uint)1, values[0]); + Assert.Equal((uint)2, values[1]); + Assert.Equal((uint)3, values[2]); + Assert.Equal((uint)4, values[3]); + } + [Fact] public static void DeserializationOfTypedArraysByXmlReader3() { @@ -44,7 +431,6 @@ public static void DeserializationOfTypedArraysByXmlReader3() reader.PositionOnElement("a"); reader.Read(); var values = (object[])reader.ReadContentAs(typeof(string[]), null); - Assert.Equal(4, values.Length); Assert.Equal("1", values[0]); Assert.Equal("2", values[1]); @@ -52,6 +438,146 @@ public static void DeserializationOfTypedArraysByXmlReader3() Assert.Equal("4", values[3]); } + [Fact] + public static void DeserializationOfTypedArraysByXmlReader30() + { + var reader = Utils.CreateFragmentReader("1 2 3 4"); + reader.PositionOnElement("a"); + reader.MoveToAttribute("b"); + var values = (uint[])reader.ReadContentAs(typeof(uint[]), null); + Assert.Equal(4, values.Length); + Assert.Equal((uint)1, values[0]); + Assert.Equal((uint)2, values[1]); + Assert.Equal((uint)3, values[2]); + Assert.Equal((uint)4, values[3]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader31() + { + var reader = Utils.CreateFragmentReader("1 2 3 4"); + reader.PositionOnElement("a"); + reader.Read(); + var values = (ulong[])reader.ReadContentAs(typeof(ulong[]), null); + Assert.Equal(4, values.Length); + Assert.Equal((ulong)1, values[0]); + Assert.Equal((ulong)2, values[1]); + Assert.Equal((ulong)3, values[2]); + Assert.Equal((ulong)4, values[3]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader32() + { + var reader = Utils.CreateFragmentReader("1 2 3 4"); + reader.PositionOnElement("a"); + reader.MoveToAttribute("b"); + var values = (ulong[])reader.ReadContentAs(typeof(ulong[]), null); + Assert.Equal(4, values.Length); + Assert.Equal((ulong)1, values[0]); + Assert.Equal((ulong)2, values[1]); + Assert.Equal((ulong)3, values[2]); + Assert.Equal((ulong)4, values[3]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader33() + { + var reader = Utils.CreateFragmentReader + ( + "https://github.com/dotnet/wpf https://sharplab.io/" + ); + + reader.PositionOnElement("a"); + reader.Read(); + var values = (Uri[])reader.ReadContentAs(typeof(Uri[]), null); + Assert.Equal(2, values.Length); + Assert.Equal(new Uri("https://github.com/dotnet/wpf"), values[0]); + Assert.Equal(new Uri("https://sharplab.io/"), values[1]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader34() + { + var reader = Utils.CreateFragmentReader + ( + "https://github.com/dotnet/wpf https://sharplab.io/" + ); + + reader.PositionOnElement("a"); + reader.MoveToAttribute("b"); + var values = (Uri[])reader.ReadContentAs(typeof(Uri[]), null); + Assert.Equal(2, values.Length); + Assert.Equal(new Uri("https://github.com/dotnet/wpf"), values[0]); + Assert.Equal(new Uri("https://sharplab.io/"), values[1]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader35() + { + var reader = Utils.CreateFragmentReader("xmlns:os xmlns:a"); + reader.PositionOnElement("a"); + reader.Read(); + var values = (XmlQualifiedName[])reader.ReadContentAs(typeof(XmlQualifiedName[]), null); + Assert.Equal(2, values.Length); + Assert.Equal(new XmlQualifiedName("os", "http://www.w3.org/2000/xmlns/"), values[0]); + Assert.Equal(new XmlQualifiedName("a", "http://www.w3.org/2000/xmlns/"), values[1]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader36() + { + var reader = Utils.CreateFragmentReader("xmlns:os xmlns:a"); + reader.PositionOnElement("a"); + reader.MoveToAttribute("b"); + var values = (XmlQualifiedName[])reader.ReadContentAs(typeof(XmlQualifiedName[]), null); + Assert.Equal(2, values.Length); + Assert.Equal(new XmlQualifiedName("os", "http://www.w3.org/2000/xmlns/"), values[0]); + Assert.Equal(new XmlQualifiedName("a", "http://www.w3.org/2000/xmlns/"), values[1]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader37() + { + var reader = Utils.CreateFragmentReader("sdf"); + reader.PositionOnElement("a"); + reader.MoveToAttribute("b"); + var values = (XmlAtomicValue[])reader.ReadContentAs(typeof(XmlAtomicValue[]), null); + Assert.Equal(6, values.Length); + Assert.Equal("a", values[0].Value); + Assert.True(values[1].ValueAsBoolean); + Assert.Equal(16, values[2].ValueAsInt); + Assert.Equal(42L, values[3].ValueAsLong); + Assert.Equal(.555, values[4].ValueAsDouble); + + Assert.Equal + ( + new DateTime(2, 1, 1).Add(TimeZoneInfo.Local.GetUtcOffset(new DateTime(2, 1, 1))), + values[5].ValueAsDateTime + ); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader38() + { + var reader = Utils.CreateFragmentReader("sdf"); + reader.PositionOnElement("a"); + reader.MoveToAttribute("b"); + var values = (XPathItem[])reader.ReadContentAs(typeof(XPathItem[]), null); + Assert.Equal(6, values.Length); + Assert.Equal("a", values[0].Value); + Assert.True(values[1].ValueAsBoolean); + Assert.Equal(16, values[2].ValueAsInt); + Assert.Equal(42L, values[3].ValueAsLong); + Assert.Equal(.555, values[4].ValueAsDouble); + + Assert.Equal + ( + new DateTime(2, 1, 1).Add(TimeZoneInfo.Local.GetUtcOffset(new DateTime(2, 1, 1))), + values[5].ValueAsDateTime + ); + } + [Fact] public static void DeserializationOfTypedArraysByXmlReader4() { @@ -59,7 +585,6 @@ public static void DeserializationOfTypedArraysByXmlReader4() reader.PositionOnElement("a"); reader.MoveToAttribute("b"); var values = (object[])reader.ReadContentAs(typeof(string[]), null); - Assert.Equal(4, values.Length); Assert.Equal("1", values[0]); Assert.Equal("2", values[1]); @@ -74,7 +599,6 @@ public static void DeserializationOfTypedArraysByXmlReader5() reader.PositionOnElement("a"); reader.Read(); var values = (object[])reader.ReadContentAs(typeof(string[]), null); - Assert.Equal(4, values.Length); Assert.Equal("1", values[0]); Assert.Equal("2", values[1]); @@ -89,12 +613,51 @@ public static void DeserializationOfTypedArraysByXmlReader6() reader.PositionOnElement("a"); reader.MoveToAttribute("b"); var values = (object[])reader.ReadContentAs(typeof(string[]), null); + Assert.Equal(4, values.Length); + Assert.Equal("1", values[0]); + Assert.Equal("2", values[1]); + Assert.Equal("3", values[2]); + Assert.Equal("4", values[3]); + } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader7() + { + var reader = Utils.CreateFragmentReader("1 2 3 4"); + reader.PositionOnElement("a"); + reader.Read(); + var values = (object[])reader.ReadContentAs(typeof(object[]), null); + Assert.Equal(4, values.Length); + Assert.Equal("1", values[0]); + Assert.Equal("2", values[1]); + Assert.Equal("3", values[2]); + Assert.Equal("4", values[3]); + } + [Fact] + public static void DeserializationOfTypedArraysByXmlReader8() + { + var reader = Utils.CreateFragmentReader("1 2 3 4"); + reader.PositionOnElement("a"); + reader.MoveToAttribute("b"); + var values = (object[])reader.ReadContentAs(typeof(object[]), null); Assert.Equal(4, values.Length); Assert.Equal("1", values[0]); Assert.Equal("2", values[1]); Assert.Equal("3", values[2]); Assert.Equal("4", values[3]); } + + [Fact] + public static void DeserializationOfTypedArraysByXmlReader9() + { + var reader = Utils.CreateFragmentReader("true false"); + reader.PositionOnElement("a"); + reader.Read(); + var values = (bool[])reader.ReadContentAs(typeof(bool[]), null); + Assert.Equal(2, values.Length); + Assert.True(values[0]); + Assert.False(values[1]); + } } }