@@ -179,5 +179,92 @@ public void WhenCreatingMessageSystem_BoundTypeMessageHandlersAreRegistered()
179179 Assert . AreEqual ( handlerFour , systemThree . MessageHandlers [ systemThree . GetMessageType ( typeof ( TestMessageFour ) ) ] ) ;
180180 }
181181 }
182+
183+ internal class AAAEarlyLexicographicNetworkMessage : INetworkMessage
184+ {
185+ public void Serialize ( FastBufferWriter writer )
186+ {
187+ }
188+
189+ public bool Deserialize ( FastBufferReader reader , ref NetworkContext context )
190+ {
191+ return true ;
192+ }
193+
194+ public void Handle ( ref NetworkContext context )
195+ {
196+ }
197+ }
198+
199+ #pragma warning disable IDE1006
200+ internal class zzzLateLexicographicNetworkMessage : AAAEarlyLexicographicNetworkMessage
201+ {
202+ }
203+ #pragma warning restore IDE1006
204+
205+ internal class OrderingMessageProvider : IMessageProvider
206+ {
207+ public List < MessagingSystem . MessageWithHandler > GetMessages ( )
208+ {
209+ var listMessages = new List < MessagingSystem . MessageWithHandler > ( ) ;
210+
211+ var messageWithHandler = new MessagingSystem . MessageWithHandler ( ) ;
212+
213+ messageWithHandler . MessageType = typeof ( zzzLateLexicographicNetworkMessage ) ;
214+ listMessages . Add ( messageWithHandler ) ;
215+
216+ messageWithHandler . MessageType = typeof ( ConnectionRequestMessage ) ;
217+ listMessages . Add ( messageWithHandler ) ;
218+
219+ messageWithHandler . MessageType = typeof ( ConnectionApprovedMessage ) ;
220+ listMessages . Add ( messageWithHandler ) ;
221+
222+ messageWithHandler . MessageType = typeof ( OrderingMessage ) ;
223+ listMessages . Add ( messageWithHandler ) ;
224+
225+ messageWithHandler . MessageType = typeof ( AAAEarlyLexicographicNetworkMessage ) ;
226+ listMessages . Add ( messageWithHandler ) ;
227+
228+ return listMessages ;
229+ }
230+ }
231+
232+ [ Test ]
233+ public void MessagesGetPrioritizedCorrectly ( )
234+ {
235+ var sender = new NopMessageSender ( ) ;
236+ var provider = new OrderingMessageProvider ( ) ;
237+ var messagingSystem = new MessagingSystem ( sender , null , provider ) ;
238+
239+ // the 3 priority messages should appear first, in lexicographic order
240+ Assert . AreEqual ( messagingSystem . MessageTypes [ 0 ] , typeof ( ConnectionApprovedMessage ) ) ;
241+ Assert . AreEqual ( messagingSystem . MessageTypes [ 1 ] , typeof ( ConnectionRequestMessage ) ) ;
242+ Assert . AreEqual ( messagingSystem . MessageTypes [ 2 ] , typeof ( OrderingMessage ) ) ;
243+
244+ // the other should follow after
245+ Assert . AreEqual ( messagingSystem . MessageTypes [ 3 ] , typeof ( AAAEarlyLexicographicNetworkMessage ) ) ;
246+ Assert . AreEqual ( messagingSystem . MessageTypes [ 4 ] , typeof ( zzzLateLexicographicNetworkMessage ) ) ;
247+
248+ // there should not be any extras
249+ Assert . AreEqual ( messagingSystem . MessageHandlerCount , 5 ) ;
250+ Assert . AreEqual ( messagingSystem . MessageHandlerCount , 5 ) ;
251+
252+ // reorder the zzz one to position 3
253+ messagingSystem . ReorderMessage ( 3 , XXHash . Hash32 ( typeof ( zzzLateLexicographicNetworkMessage ) . FullName ) ) ;
254+
255+ // the 3 priority messages should still appear first, in lexicographic order
256+ Assert . AreEqual ( messagingSystem . MessageTypes [ 0 ] , typeof ( ConnectionApprovedMessage ) ) ;
257+ Assert . AreEqual ( messagingSystem . MessageTypes [ 1 ] , typeof ( ConnectionRequestMessage ) ) ;
258+ Assert . AreEqual ( messagingSystem . MessageTypes [ 2 ] , typeof ( OrderingMessage ) ) ;
259+
260+ // the other should follow after, but reordered
261+ Assert . AreEqual ( messagingSystem . MessageTypes [ 3 ] , typeof ( zzzLateLexicographicNetworkMessage ) ) ;
262+ Assert . AreEqual ( messagingSystem . MessageTypes [ 4 ] , typeof ( AAAEarlyLexicographicNetworkMessage ) ) ;
263+
264+ // there should still not be any extras
265+ Assert . AreEqual ( messagingSystem . MessageHandlerCount , 5 ) ;
266+ Assert . AreEqual ( messagingSystem . MessageHandlerCount , 5 ) ;
267+
268+ }
182269 }
183270}
0 commit comments