protected void AssertAreEquivalent(Message original, Message created) { Assert.AreEqual(original.GetType(), created.GetType()); Assert.AreEqual(original.ChannelId, created.ChannelId); Assert.AreEqual(original.MessageType, created.MessageType); switch (original.MessageType) { case MessageType.Binary: Assert.AreEqual(((BinaryMessage)original).Bytes, ((BinaryMessage)created).Bytes); return; case MessageType.Object: Assert.AreEqual(((ObjectMessage)original).Object, ((ObjectMessage)created).Object); return; case MessageType.String: Assert.AreEqual(((StringMessage)original).Text, ((StringMessage)created).Text); return; case MessageType.System: Assert.AreEqual(original.GetType(), created.GetType()); Assert.AreEqual(original.ToString(), created.ToString()); return; case MessageType.Session: Assert.AreEqual(((SessionMessage)original).Action, ((SessionMessage)created).Action); Assert.AreEqual(((SessionMessage)original).ClientId, ((SessionMessage)created).ClientId); return; case MessageType.Tuple1D: Assert.AreEqual(((TupleMessage)original).ClientId, ((TupleMessage)created).ClientId); Assert.AreEqual(((TupleMessage)original).X, ((TupleMessage)created).X); return; case MessageType.Tuple2D: Assert.AreEqual(((TupleMessage)original).ClientId, ((TupleMessage)created).ClientId); Assert.AreEqual(((TupleMessage)original).X, ((TupleMessage)created).X); Assert.AreEqual(((TupleMessage)original).Y, ((TupleMessage)created).Y); return; case MessageType.Tuple3D: Assert.AreEqual(((TupleMessage)original).ClientId, ((TupleMessage)created).ClientId); Assert.AreEqual(((TupleMessage)original).X, ((TupleMessage)created).X); Assert.AreEqual(((TupleMessage)original).Y, ((TupleMessage)created).Y); Assert.AreEqual(((TupleMessage)original).Z, ((TupleMessage)created).Z); return; default: throw new NotImplementedException(); } }
/// <summary> /// Marshal the contents of the message <see cref="m"/> onto the stream <see cref="output"/>. /// The channelId and message type have already been placed on <see cref="output"/>. /// This method is **not responsible** for encoding the message payload length. /// </summary> /// <param name="m">the message contents to be marshalled</param> /// <param name="output">the destination for the marshalled message payload</param> /// <param name="tdc">the characteristics of the transport that is to be used for sending</param> protected virtual void MarshalContents(Message m, Stream output, ITransportDeliveryCharacteristics tdc) { // Individual marshalling methods are **NO LONGER RESPONSIBLE** for encoding // the payload length switch (m.MessageType) { case MessageType.Session: MarshalSessionAction((SessionMessage)m, output); break; case MessageType.System: // channelId is the system message type MarshalSystemMessage((SystemMessage)m, output); break; default: throw new MarshallingException(String.Format("ERROR: {0} cannot handle messages of type {1}", this.GetType().Name, m.GetType().Name)); } }