private static void VerifyInvalidVariantCombination <T, TDefault>(
            Func <Type, TDefault, IVariantConfigurationCollection, Variant <T> > variantFactory
            , TDefault defaultValue, IVariantConfigurationCollection expectedConfiguration)
        {
            var defaultValueType = typeof(TDefault);
            var derivedClassType = typeof(DerivedClass);

            // ReSharper disable once ImplicitlyCapturedClosure
            Assert.Throws <ArgumentException>(() => variantFactory(derivedClassType, defaultValue, expectedConfiguration)
                                              ).VerifyException(x =>
            {
                var data = x.Data;

                var keys = new[] { variantTypeArgumentName, configuration, ProtectedValue, VariantTypeFullName };
                Assert.Equal(keys.Length, data.Count);
                Assert.All(keys, key => Assert.True(data.Contains(key)));

                Assert.NotNull(data[configuration]);
                Assert.Same(expectedConfiguration, Assert.IsAssignableFrom <VariantConfigurationCollection>(data[configuration]));

                Assert.Equal(derivedClassType, Assert.IsAssignableFrom <Type>(data[variantTypeArgumentName]));

                var protectedValueData      = data[ProtectedValue];
                var variantTypeFullNameData = data[VariantTypeFullName];

                if (defaultValue == null)
                {
                    Assert.All(new[] { protectedValueData, variantTypeFullNameData }, Assert.Null);
                    return;
                }

                Assert.IsAssignableFrom <TDefault>(protectedValueData);
                Assert.Equal(defaultValueType, Assert.IsAssignableFrom <Type>(variantTypeFullNameData));
            });
        }
        private static void VerifyMisconfiguredVariant <T, TDefault>(
            Func <IVariantConfigurationCollection, Variant <T> > variantFactory
            , TDefault defaultValue, IVariantConfigurationCollection expectedConfiguration)
        {
            var defaultValueType = defaultValue.GetType();

            // ReSharper disable once ImplicitlyCapturedClosure
            Assert.Throws <ArgumentException>(() => variantFactory(expectedConfiguration)
                                              ).VerifyException(x =>
            {
                var data = x.Data;

                var keys = new[] { variantTypeArgumentName, configuration, ProtectedValue, VariantTypeFullName };
                Assert.Equal(keys.Length, data.Count);
                Assert.All(keys, key => Assert.True(data.Contains(key)));

                Assert.NotNull(data[configuration]);
                Assert.Same(expectedConfiguration, Assert.IsAssignableFrom <VariantConfigurationCollection>(data[configuration]));

                Assert.Equal(defaultValue, Assert.IsAssignableFrom <TDefault>(data[ProtectedValue]));

                Assert.Equal(defaultValueType, Assert.IsAssignableFrom <Type>(data[variantTypeArgumentName]));
                Assert.Equal(defaultValueType, Assert.IsAssignableFrom <Type>(data[VariantTypeFullName]));
            });
        }
 protected override void VerifyConfigurationCorrect(IVariantConfigurationCollection configuration)
 => Assert.Collection(InternalConfiguration
                      , VerifyConfiguration <bool>
                      , VerifyConfiguration <long>
                      , VerifyConfiguration <ulong>
                      , VerifyConfiguration <float>
                      , VerifyConfiguration <double>
                      , VerifyConfiguration <string>
                      , VerifyConfiguration <IBytesEnumerable>
                      , VerifyConfiguration <IdentifierPath>
                      );
 protected abstract void VerifyConfigurationCorrect(IVariantConfigurationCollection configuration);
 protected override void VerifyConfigurationCorrect(IVariantConfigurationCollection configuration)
 => Assert.Collection(InternalConfiguration
                      , VerifyConfiguration <ProtoType>
                      , VerifyConfiguration <ElementTypeIdentifierPath>
                      );