public void TestNullStreamEntryResultsInExpectedBehaviour()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            streamMessage.WriteObject(null);
            streamMessage.Reset();

            // expect an NFE from the primitive integral, float, double, and char <type>.valueOf(null) conversions
            AssertGetStreamEntryThrowsNullReferenceException <byte>(streamMessage);
            AssertGetStreamEntryThrowsNullReferenceException <short>(streamMessage);
            AssertGetStreamEntryThrowsNullReferenceException <int>(streamMessage);
            AssertGetStreamEntryThrowsNullReferenceException <long>(streamMessage);
            AssertGetStreamEntryThrowsNullReferenceException <float>(streamMessage);
            AssertGetStreamEntryThrowsNullReferenceException <double>(streamMessage);
            AssertGetStreamEntryThrowsNullReferenceException <char>(streamMessage);

            // expect null
            Assert.Null(streamMessage.ReadObject());
            streamMessage.Reset(); // need to reset as read was a success
            Assert.Null(streamMessage.ReadString());
            streamMessage.Reset(); // need to reset as read was a success

            // expect completion value.
            Assert.AreEqual(-1, streamMessage.ReadBytes(new byte[1]));
            streamMessage.Reset(); // need to reset as read was a success

            // expect false
            Assert.False(streamMessage.ReadBoolean());
        }
        public void TestIllegalTypeConversionFailureDoesNotIncrementPosition1()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            byte[] bytes = { 0, 255, 78 };

            streamMessage.WriteBytes(bytes);
            streamMessage.Reset();

            AssertGetStreamEntryThrowsMessageFormatException <bool>(streamMessage);
            AssertGetStreamEntryThrowsMessageFormatException <byte>(streamMessage);
            AssertGetStreamEntryThrowsMessageFormatException <short>(streamMessage);
            AssertGetStreamEntryThrowsMessageFormatException <char>(streamMessage);
            AssertGetStreamEntryThrowsMessageFormatException <int>(streamMessage);
            AssertGetStreamEntryThrowsMessageFormatException <long>(streamMessage);
            AssertGetStreamEntryThrowsMessageFormatException <float>(streamMessage);
            AssertGetStreamEntryThrowsMessageFormatException <double>(streamMessage);
            AssertGetStreamEntryThrowsMessageFormatException <string>(streamMessage);

            byte[] retrievedByteArray = new byte[bytes.Length];
            int    readBytesLength    = streamMessage.ReadBytes(retrievedByteArray);

            Assert.AreEqual(bytes.Length, readBytesLength, "Number of bytes read did not match original array length");
            CollectionAssert.AreEqual(bytes, retrievedByteArray, "Expected array to equal retrieved bytes");
            Assert.AreEqual(-1, streamMessage.ReadBytes(retrievedByteArray), "Expected completion return value");
        }
        public void TestReadObjectAfterPartialReadBytesThrowsMFE()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            byte[] bytes = { 4, 44, 99 };
            streamMessage.WriteBytes(bytes);

            streamMessage.Reset();

            // start reading via readBytes
            int partialLength = 2;

            byte[] retrievedByteArray = new byte[partialLength];
            int    readBytesLength    = streamMessage.ReadBytes(retrievedByteArray);

            Assert.AreEqual(partialLength, readBytesLength);
            CollectionAssert.AreEqual(bytes.Take(partialLength), retrievedByteArray, "Expected array subset to equal retrieved bytes");

            // check that using readObject does not return the full/remaining bytes as a new array

            Assert.Throws <MessageFormatException>(() => streamMessage.ReadObject());

            // finish reading via reaBytes to ensure it can be completed
            readBytesLength = streamMessage.ReadBytes(retrievedByteArray);
            Assert.AreEqual(bytes.Length - partialLength, readBytesLength);
            CollectionAssert.AreEqual(bytes.Skip(partialLength).Take(bytes.Length), retrievedByteArray.Take(readBytesLength), "Expected array subset to equal retrieved bytes");
        }
        public void TestReadBytesFullWithUndersizedDestinationArrayUsingMultipleReads()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            byte[] bytes = { 3, 78, 253, 26, 8 };
            Assert.AreEqual(1, bytes.Length % 2, "bytes should be odd length");

            int undersizedLength = 2;
            int remaining        = 1;

            streamMessage.WriteBytes(bytes);
            streamMessage.Reset();

            byte[] undersizedDestination = new byte[undersizedLength];
            byte[] fullRetrievedBytes    = new byte[bytes.Length];

            Assert.AreEqual(undersizedLength, streamMessage.ReadBytes(undersizedDestination), "Number of bytes read did not match destination array length");
            int read = undersizedLength;

            Array.Copy(undersizedDestination, 0, fullRetrievedBytes, 0, undersizedLength);
            Assert.AreEqual(undersizedLength, streamMessage.ReadBytes(undersizedDestination), "Number of bytes read did not match destination array length");
            Array.Copy(undersizedDestination, 0, fullRetrievedBytes, read, undersizedLength);
            read += undersizedLength;
            Assert.AreEqual(remaining, streamMessage.ReadBytes(undersizedDestination), "Number of bytes read did not match expectation");
            Array.Copy(undersizedDestination, 0, fullRetrievedBytes, read, remaining);
            read += remaining;
            CollectionAssert.AreEqual(bytes, fullRetrievedBytes, "Expected array to equal retrieved bytes");
        }
        public void TestReadBytesWithNullArrayThrowsArgumentNullException()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            streamMessage.Reset();

            Assert.Throws <ArgumentNullException>(() => streamMessage.ReadBytes(null));
        }
        public void TestReadWithEmptyStreamThrowsMEOFE()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            streamMessage.Reset();

            Assert.Throws <MessageEOFException>(() => streamMessage.ReadBoolean(), "Expected exception to be thrown as message has no content");
        }
        public void TestMessageCopy()
        {
            NmsStreamMessage message = factory.CreateStreamMessage();

            NmsStreamMessage copy = message.Copy() as NmsStreamMessage;

            Assert.IsNotNull(copy);
        }
        public void TestWriteReadBoolean()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();
            bool             value         = true;

            streamMessage.WriteBoolean(value);
            streamMessage.Reset();

            Assert.AreEqual(value, streamMessage.ReadBoolean(), "Value not as expected");
        }
        public void TestReadBytesWithNullSignalsCompletion()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            streamMessage.WriteObject(null);

            streamMessage.Reset();

            Assert.AreEqual(-1, streamMessage.ReadBytes(new byte[1]), "Expected immediate completion signal");
        }
        public void TestWriteReadString()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            string value = "myString";

            streamMessage.WriteString(value);
            streamMessage.Reset();

            Assert.AreEqual(value, streamMessage.ReadString(), "Value not as expected");
        }
        public void TestClearBodyAppliesCorrectState()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            streamMessage.WriteObject(2);
            streamMessage.ClearBody();
            Assert.False(streamMessage.IsReadOnlyBody);
            streamMessage.WriteObject(2);

            Assert.Throws <MessageNotReadableException>(() => streamMessage.ReadObject());
        }
        public void TestWriteReadByte()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            byte value = 6;

            streamMessage.WriteByte(value);
            streamMessage.Reset();

            Assert.AreEqual(value, streamMessage.ReadByte(), "Value not as expected");
        }
        public void TestWriteReadShort()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            short value = 6;

            streamMessage.WriteInt16(value);
            streamMessage.Reset();

            Assert.AreEqual(value, streamMessage.ReadInt16(), "Value not as expected");
        }
        private void AssertGetStreamEntryEquals <T>(NmsStreamMessage testMessage, bool resetStreamAfter, object expectedValue)
        {
            object actualValue = GetStreamEntryUsingTypeMethod(testMessage, typeof(T), null);

            Assert.AreEqual(expectedValue, actualValue);

            if (resetStreamAfter)
            {
                testMessage.Reset();
            }
        }
        public void TestReadObjectGetsInvalidObjectThrowsMFE()
        {
            NmsTestStreamMessageFacade facade = new NmsTestStreamMessageFacade();

            facade.Put(new Uri("test://test"));
            NmsStreamMessage streamMessage = new NmsStreamMessage(facade);

            streamMessage.Reset();

            Assert.Throws <MessageFormatException>(() => streamMessage.ReadObject());
        }
        public void TestWriteReadFloat()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            float value = float.MaxValue;

            streamMessage.WriteSingle(value);
            streamMessage.Reset();

            Assert.AreEqual(value, streamMessage.ReadSingle(), "Value not as expected");
        }
        public void TestWriteReadDouble()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            double value = double.MaxValue;

            streamMessage.WriteDouble(value);
            streamMessage.Reset();

            Assert.AreEqual(value, streamMessage.ReadDouble(), "Value not as expected");
        }
        public void TestWriteReadInt()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            int value = int.MaxValue;

            streamMessage.WriteInt32(value);
            streamMessage.Reset();

            Assert.AreEqual(value, streamMessage.ReadInt32(), "Value not as expected");
        }
        public void TestWriteReadLong()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            long value = long.MaxValue;

            streamMessage.WriteInt64(value);
            streamMessage.Reset();

            Assert.AreEqual(value, streamMessage.ReadInt64(), "Value not as expected");
        }
        public void TestWriteReadChar()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            char value = 'c';

            streamMessage.WriteChar(value);
            streamMessage.Reset();

            Assert.AreEqual(value, streamMessage.ReadChar(), "Value not as expected correctly");
        }
        public void TestCreateStreamMessage()
        {
            AmqpMessageFactory factory = new AmqpMessageFactory(CreateMockAmqpConnection());
            NmsStreamMessage   message = factory.CreateStreamMessage();
            INmsMessageFacade  facade  = message.Facade;

            Assert.IsInstanceOf <NmsStreamMessage>(message);
            Assert.IsInstanceOf <AmqpNmsStreamMessageFacade>(facade);
            Assert.AreEqual(MessageSupport.JMS_TYPE_STRM, facade.JmsMsgType);

            Assert.False(((AmqpNmsStreamMessageFacade)facade).HasBody());
        }
        public void TestReadBytesWithZeroLengthSource()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            streamMessage.WriteBytes(new byte[0]);

            streamMessage.Reset();

            byte[] fullRetrievedBytes = new byte[1];

            Assert.AreEqual(0, streamMessage.ReadBytes(fullRetrievedBytes), "Expected no bytes to be read, as none were written");
        }
        public void TestWriteBooleanReadLegal()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            bool value = true;

            streamMessage.WriteBoolean(value);
            streamMessage.Reset();

            AssertGetStreamEntryEquals <bool>(streamMessage, true, value);
            AssertGetStreamEntryEquals <string>(streamMessage, true, value.ToString());
        }
        public void TestWriteDoubleReadLegal()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            double value = double.MaxValue;

            streamMessage.WriteDouble(value);
            streamMessage.Reset();

            AssertGetStreamEntryEquals <double>(streamMessage, true, value);
            AssertGetStreamEntryEquals <string>(streamMessage, true, value.ToString(CultureInfo.InvariantCulture));
        }
        public void TestWriteStringReadIllegal()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            string stringValue = "myString";

            streamMessage.WriteString(stringValue);
            streamMessage.Reset();

            AssertGetStreamEntryThrowsMessageFormatException <char>(streamMessage);
            AssertGetStreamEntryThrowsMessageFormatException <byte[]>(streamMessage);
        }
        public void TestWriteLongReadLegal()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            long value = long.MaxValue;

            streamMessage.WriteInt64(value);
            streamMessage.Reset();

            AssertGetStreamEntryEquals <long>(streamMessage, true, value);
            AssertGetStreamEntryEquals <string>(streamMessage, true, value.ToString());
        }
        public void TestWriteCharReadLegal()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            char value = 'c';

            streamMessage.WriteChar(value);
            streamMessage.Reset();

            AssertGetStreamEntryEquals <char>(streamMessage, true, value);
            AssertGetStreamEntryEquals <string>(streamMessage, true, value.ToString());
        }
        public void TestIllegalTypeConversionFailureDoesNotIncrementPosition2()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            String stringVal = "myString";

            streamMessage.WriteString(stringVal);
            streamMessage.Reset();

            AssertGetStreamEntryThrowsMessageFormatException <byte[]>(streamMessage);

            Assert.AreEqual(stringVal, streamMessage.ReadString(), "Expected written string");
        }
        public void TestWriteShortReadLegal()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();

            short value = 302;

            streamMessage.WriteInt16(value);
            streamMessage.Reset();

            AssertGetStreamEntryEquals <short>(streamMessage, true, value);
            AssertGetStreamEntryEquals <int>(streamMessage, true, value);
            AssertGetStreamEntryEquals <long>(streamMessage, true, value);
            AssertGetStreamEntryEquals <string>(streamMessage, true, value.ToString());
        }
        public void TestWriteByteReadIllegal()
        {
            NmsStreamMessage streamMessage = factory.CreateStreamMessage();
            byte             value         = 6;

            streamMessage.WriteByte(value);
            streamMessage.Reset();

            AssertGetStreamEntryThrowsMessageFormatException <bool>(streamMessage);
            AssertGetStreamEntryThrowsMessageFormatException <char>(streamMessage);
            AssertGetStreamEntryThrowsMessageFormatException <float>(streamMessage);
            AssertGetStreamEntryThrowsMessageFormatException <double>(streamMessage);
            AssertGetStreamEntryThrowsMessageFormatException <byte[]>(streamMessage);
        }