private static void TestNonCollectionCore(
            Action <NilImplicationTestTarget> adjuster,
            Action <Packer, MessagePackObject, MessagePackObject, MessagePackObject, MessagePackObject, MessagePackObject> packing,
            MessagePackObject?memberDefault            = null,
            MessagePackObject?nullButValueType         = null,
            MessagePackObject?nullAndNullableValueType = null,
            MessagePackObject?nullAndReferenceType     = null,
            MessagePackObject?prohibitReferenceType    = null
            )
        {
            using (var buffer = new MemoryStream())
                using (var packer = Packer.Create(buffer))
                {
                    var serializer = MessagePackSerializer.Create <NilImplicationTestTarget>(new SerializationContext());
                    var target     = new NilImplicationTestTarget();

                    if (adjuster != null)
                    {
                        adjuster(target);
                    }

                    packing(
                        packer,
                        memberDefault ?? target.MemberDefault,
                        nullButValueType ?? target.NullButValueType,
                        nullAndNullableValueType ?? (target.NullAndNullableValueType == null ? MessagePackObject.Nil : target.NullAndNullableValueType.Value),
                        nullAndReferenceType ?? target.NullAndReferenceType,
                        prohibitReferenceType ?? target.ProhibitReferenceType
                        );

                    buffer.Position = 0;

                    var result = serializer.Unpack(buffer);
                    Assert.That(result.MemberDefault, Is.EqualTo(target.MemberDefault));
                    Assert.That(result.NullButValueType, Is.EqualTo(target.NullButValueType));
                    Assert.That(result.NullAndNullableValueType, Is.EqualTo(target.NullAndNullableValueType));
                    Assert.That(result.NullAndReferenceType, Is.EqualTo(target.NullAndReferenceType));
                    Assert.That(result.ProhibitReferenceType, Is.EqualTo(target.ProhibitReferenceType));

                    var expectedBytes = buffer.ToArray();
                    using (var actual = new MemoryStream())
                    {
                        serializer.Pack(actual, target);
                    }
                }
        }
		private static void TestNonCollectionCore(
			Action<NilImplicationTestTarget> adjuster,
			Action<Packer, MessagePackObject, MessagePackObject, MessagePackObject, MessagePackObject, MessagePackObject> packing,
			MessagePackObject? memberDefault = null,
			MessagePackObject? nullButValueType = null,
			MessagePackObject? nullAndNullableValueType = null,
			MessagePackObject? nullAndReferenceType = null,
			MessagePackObject? prohibitReferenceType = null
		)
		{
			using ( var buffer = new MemoryStream() )
			using ( var packer = Packer.Create( buffer ) )
			{
				var serializer = MessagePackSerializer.Create<NilImplicationTestTarget>( new SerializationContext() );
				var target = new NilImplicationTestTarget();

				if ( adjuster != null )
				{
					adjuster( target );
				}

				packing(
					packer,
					memberDefault ?? target.MemberDefault,
					nullButValueType ?? target.NullButValueType,
					nullAndNullableValueType ?? ( target.NullAndNullableValueType == null ? MessagePackObject.Nil : target.NullAndNullableValueType.Value ),
					nullAndReferenceType ?? target.NullAndReferenceType,
					prohibitReferenceType ?? target.ProhibitReferenceType
				);

				buffer.Position = 0;

				var result = serializer.Unpack( buffer );
				Assert.That( result.MemberDefault, Is.EqualTo( target.MemberDefault ) );
				Assert.That( result.NullButValueType, Is.EqualTo( target.NullButValueType ) );
				Assert.That( result.NullAndNullableValueType, Is.EqualTo( target.NullAndNullableValueType ) );
				Assert.That( result.NullAndReferenceType, Is.EqualTo( target.NullAndReferenceType ) );
				Assert.That( result.ProhibitReferenceType, Is.EqualTo( target.ProhibitReferenceType ) );

				var expectedBytes = buffer.ToArray();
				using ( var actual = new MemoryStream() )
				{
					serializer.Pack( actual, target );
				}
			}
		}