internal static TValue InContainer <TValue, TData>(
            TValue item,
            string paremeterName,
            Func <ContainerClass <TValue>, TData> toData,
            Func <TData, ContainerClass <TValue> > fromData,
            Action <TData, TData> isDataEqual)
        {
            try
            {
                var container1     = new ContainerClass <TValue>(item);
                var containerData1 = toData(container1);

                // doing it twice to catch errors when deserializing
                var container2 = fromData(containerData1);
                FieldAssert.Equal(container1, container2);

                var containerXml2 = toData(container2);
                isDataEqual(containerData1, containerXml2);

                return(container2.Other);
            }
            catch (Exception e)
            {
                var message = $"  Roundtrip of {paremeterName} in {nameof(ContainerClass<TValue>)} Failed.\r\n" +
                              "  This means there is an error in serialization.\r\n" +
                              $"  If you are implementing {nameof(IXmlSerializable)} check that you handle ReadEndElement properly as it is a common source of bugs.";
                throw new AssertException(message, e);
            }
        }
        /// <summary>
        /// 1. Places <paramref name="item"/> in a ContainerClass{T} container1
        /// 2. Serializes container1
        /// 3. Deserializes the containerXml to container2 and does FieldAssert.Equal(container1, container2);
        /// 4. Serializes container2
        /// 5. Checks XmlAssert.Equal(containerXml1, containerXml2, XmlAssertOptions.Verbatim);
        /// </summary>
        /// <typeparam name="T">The type of <paramref name="item"/></typeparam>
        /// <param name="item">The instance to roundtrip</param>
        /// <returns>The serialized and deserialized instance (container2.Other)</returns>
        public static T Roundtrip <T>(T item)
        {
            Roundtripper.Simple(item, nameof(item), ToXml, FromXml <T>);
            var roundtripped = Roundtripper.InContainer(
                item,
                nameof(item),
                ToXml,
                FromXml <ContainerClass <T> >,
                (e, a) => XmlAssert.Equal(e, a, XmlAssertOptions.Verbatim));

            FieldAssert.Equal(item, roundtripped);

            return(roundtripped);
        }
        internal static TValue Simple <TValue, TData>(
            TValue item,
            string paremeterName,
            Func <TValue, TData> toData,
            Func <TData, TValue> fromData)
        {
            var data         = toData(item);
            var roundtripped = fromData(data);

            try
            {
                FieldAssert.Equal(item, roundtripped);
            }
            catch (Exception e)
            {
                throw AssertException.CreateFromException(
                          $"Simple roundtrip failed. Source is not equal to roundtripped.",
                          e);
            }

            return(roundtripped);
        }