public void complete_header_then_half_typename_then_full_message()
{
var args = new SocketBufferFake();
var body = "Hello world";
var type = body.GetType().AssemblyQualifiedName;
var serializer = new StringSerializer();
object actual = null;
BitConverter2.GetBytes(MicroMessageEncoder.FixedHeaderLength + type.Length, args.Buffer, 0); //header length
args.Buffer[2] = MicroMessageDecoder.Version;
BitConverter2.GetBytes(body.Length, args.Buffer, 3); //content lkength
args.Buffer[7] = (byte)(sbyte)type.Length; // type len
Encoding.ASCII.GetBytes(type, 0, type.Length, args.Buffer, HeaderLengthSize + MicroMessageEncoder.FixedHeaderLength); // type name
Encoding.ASCII.GetBytes(body, 0, body.Length, args.Buffer, HeaderLengthSize + type.Length + MicroMessageEncoder.FixedHeaderLength); //body
var sut = new MicroMessageDecoder(serializer);
sut.MessageReceived = o => actual = o;
args.BytesTransferred = sizeof(short) + MicroMessageDecoder.FixedHeaderLength;
sut.ProcessReadBytes(args);
args.Offset += args.BytesTransferred;
args.BytesTransferred = type.Length - 31;
sut.ProcessReadBytes(args);
args.Offset += args.BytesTransferred;
args.BytesTransferred = 31;
sut.ProcessReadBytes(args);
args.Offset += args.BytesTransferred;
args.BytesTransferred = body.Length;
sut.ProcessReadBytes(args);
actual.Should().NotBeNull();
actual.Should().Be("Hello world");
}