public void AckNak_CheckConstructorsAndFactories()
        {
            Tick t1 = new Tick();
            AckNak m = new AckNak(Reply.PossibleStatus.Success, 10, t1, "Test Message", "Test Note");
            Assert.AreEqual(Reply.PossibleTypes.AckNak, m.ReplyType);
            Assert.AreEqual(Reply.PossibleStatus.Success, m.Status);
            Assert.AreEqual(10, m.IntResult);
            Assert.AreSame(t1, m.ObjResult);
            Assert.AreEqual("Test Message", m.Message);
            Assert.AreEqual("Test Note", m.Note);

            m = new AckNak(Reply.PossibleStatus.Failure, 20);
            Assert.AreEqual(Reply.PossibleTypes.AckNak, m.ReplyType);
            Assert.AreEqual(Reply.PossibleStatus.Failure, m.Status);
            Assert.AreEqual(20, m.IntResult);
            Assert.IsNull(m.ObjResult);
            Assert.AreEqual("", m.Message);
            Assert.AreEqual("", m.Note);

            m = new AckNak(Reply.PossibleStatus.Failure, 20, "Test Message");
            Assert.AreEqual(Reply.PossibleTypes.AckNak, m.ReplyType);
            Assert.AreEqual(Reply.PossibleStatus.Failure, m.Status);
            Assert.AreEqual(20, m.IntResult);
            Assert.IsNull(m.ObjResult);
            Assert.AreEqual("Test Message", m.Message);
            Assert.AreEqual("", m.Note);

            m = new AckNak(Reply.PossibleStatus.Failure, t1);
            Assert.AreEqual(Reply.PossibleTypes.AckNak, m.ReplyType);
            Assert.AreEqual(Reply.PossibleStatus.Failure, m.Status);
            Assert.AreEqual(0, m.IntResult);
            Assert.AreSame(t1, m.ObjResult);
            Assert.AreEqual("", m.Message);
            Assert.AreEqual("", m.Note);

            m = new AckNak(Reply.PossibleStatus.Failure, t1, "Test Message");
            Assert.AreEqual(Reply.PossibleTypes.AckNak, m.ReplyType);
            Assert.AreEqual(Reply.PossibleStatus.Failure, m.Status);
            Assert.AreEqual(0, m.IntResult);
            Assert.AreSame(t1, m.ObjResult);
            Assert.AreEqual("Test Message", m.Message);
            Assert.AreEqual("", m.Note);

            ByteList bytes = new ByteList();
            m.Encode(bytes);
            Message msg = Message.Create(bytes);
            Assert.IsNotNull(msg);
            Assert.IsTrue(msg is AckNak);
            AckNak m2 = msg as AckNak;
            Assert.AreEqual(m.Status, m2.Status);
            Assert.AreEqual(m.Note, m2.Note);
        }
        public void AckNak_CheckEncodeDecode()
        {
            Tick t1 = new Tick();
            AckNak m1 = new AckNak(Reply.PossibleStatus.Success, 10, t1, "Test Message", "Test Note");
            Assert.AreEqual(Reply.PossibleTypes.AckNak, m1.ReplyType);
            Assert.AreEqual(Reply.PossibleStatus.Success, m1.Status);
            Assert.AreEqual(10, m1.IntResult);
            Assert.AreSame(t1, m1.ObjResult);
            Assert.AreEqual("Test Message", m1.Message);
            Assert.AreEqual("Test Note", m1.Note);

            ByteList bytes = new ByteList();
            m1.Encode(bytes);
            AckNak m2 = AckNak.Create(bytes);
            Assert.AreEqual(m1.Status, m2.Status);
            Assert.AreEqual(m1.IntResult, m2.IntResult);
            Assert.AreEqual(((Tick)m1.ObjResult).LogicalClock, ((Tick)m2.ObjResult).LogicalClock);
            Assert.AreEqual(m1.Message, m2.Message);
            Assert.AreEqual(m1.Note, m2.Note);

            bytes.Clear();
            m1.Encode(bytes);
            bytes.GetByte();            // Read one byte, which will throw the length off
            try
            {
                m2 = AckNak.Create(bytes);
                Assert.Fail("Expected an exception to be thrown");
            }
            catch (ApplicationException)
            {
            }

            bytes.Clear();
            m1.Encode(bytes);
            bytes.Add((byte)100);       // Add a byte
            bytes.GetByte();            // Read one byte, which will make the ID wrong
            try
            {
                m2 = AckNak.Create(bytes);
                Assert.Fail("Expected an exception to be thrown");
            }
            catch (ApplicationException)
            {
            }
        }
        public void CreateEncodingSamples()
        {
            StreamWriter writer = new StreamWriter("MessageSamples.txt");

            MessageNumber msgNumber = MessageNumber.Create(100, 120);
            MessageNumber conversationNumber = MessageNumber.Create(200, 240);
            AgentInfo agentInfo = new AgentInfo(10, AgentInfo.PossibleAgentType.BrilliantStudent, new Common.EndPoint("129.123.5.10:1234"))
                                        {
                                            AgentStatus = AgentInfo.PossibleAgentStatus.InGame,
                                            ANumber = "A00001",
                                            FirstName = "Joe",
                                            LastName = "Jones",
                                            Location = new FieldLocation(10, 20),
                                            Points = 100,
                                            Strength = 200,
                                            Speed = 1.2
                                        };

            AckNak ackNak = new AckNak(Reply.PossibleStatus.Success, agentInfo, "Test Message")
                                        {
                                            MessageNr = msgNumber,
                                            ConversationId = conversationNumber,
                                            IntResult = 99,
                                            Note = "Test Note"
                                        };
            writer.WriteLine("AckNak");
            writer.WriteLine("\tMessageNr={0}", ackNak.MessageNr.ToString());
            writer.WriteLine("\tConversationId={0}", ackNak.ConversationId.ToString());
            writer.WriteLine("\tReplyType={0}", ackNak.ReplyType);
            writer.WriteLine("\tAckNak Status={0}", ackNak.Status);
            writer.WriteLine("\tAgent Info:");
            writer.WriteLine("\t\tId={0}", agentInfo.Id);
            writer.WriteLine("\t\tAgentStatus={0}", agentInfo.AgentStatus);
            writer.WriteLine("\t\tANumber={0}", agentInfo.ANumber);
            writer.WriteLine("\t\tFirstName={0}", agentInfo.FirstName);
            writer.WriteLine("\t\tLastName={0}", agentInfo.LastName);
            writer.WriteLine("\t\tLocation={0}", agentInfo.Location.ToString());
            writer.WriteLine("\t\tPoints={0}", agentInfo.Points);
            writer.WriteLine("\t\tStrength={0}", agentInfo.Strength);
            writer.WriteLine("\t\tSpeed={0}", agentInfo.Speed);

            ByteList byteList = new ByteList();
            ackNak.Encode(byteList);

            writer.WriteLine("");
            writer.WriteLine("Encoding:");
            writer.WriteLine(byteList.CreateLogString());
            writer.WriteLine("");
            writer.WriteLine("------------------------------------");
            writer.WriteLine("");

            JoinGame joinGame = new JoinGame(20, agentInfo)
                                        {
                                            MessageNr = msgNumber,
                                            ConversationId = conversationNumber,
                                        };

            writer.WriteLine("JoinGame");
            writer.WriteLine("\tMessageNr={0}", joinGame.MessageNr.ToString());
            writer.WriteLine("\tConversationId={0}", joinGame.ConversationId.ToString());
            writer.WriteLine("\tGameId={0}", joinGame.GameId);
            writer.WriteLine("\tAgent Info:");
            writer.WriteLine("\t\tId={0}", agentInfo.Id);
            writer.WriteLine("\t\tAgentStatus={0}", agentInfo.AgentStatus);
            writer.WriteLine("\t\tANumber={0}", agentInfo.ANumber);
            writer.WriteLine("\t\tFirstName={0}", agentInfo.FirstName);
            writer.WriteLine("\t\tLastName={0}", agentInfo.LastName);
            writer.WriteLine("\t\tLocation={0}", agentInfo.Location.ToString());
            writer.WriteLine("\t\tPoints={0}", agentInfo.Points);
            writer.WriteLine("\t\tStrength={0}", agentInfo.Strength);
            writer.WriteLine("\t\tSpeed={0}", agentInfo.Speed);

            byteList = new ByteList();
            joinGame.Encode(byteList);

            writer.WriteLine("");
            writer.WriteLine("Encoding:");
            writer.WriteLine(byteList.CreateLogString());
            writer.WriteLine("");
            writer.WriteLine("------------------------------------");
            writer.WriteLine("");

            // TODO: All of the other message types
        }