@@ -11,9 +11,13 @@ namespace TestProject.RuntimeTests
11
11
public class RpcUserSerializableTypesTest : BaseMultiInstanceTest
12
12
{
13
13
private UserSerializableClass m_UserSerializableClass ;
14
+ private UserSerializableStruct m_UserSerializableStruct ;
14
15
private List < UserSerializableClass > m_UserSerializableClassArray ;
16
+ private List < UserSerializableStruct > m_UserSerializableStructArray ;
15
17
16
18
private bool m_FinishedTest ;
19
+ private bool m_FinishedStructTest ;
20
+ private bool m_FinishedClassTest ;
17
21
18
22
private bool m_IsSendingNull ;
19
23
private bool m_IsArrayEmpty ;
@@ -34,6 +38,8 @@ public override IEnumerator Setup()
34
38
public IEnumerator NetworkSerializableTest ( )
35
39
{
36
40
m_FinishedTest = false ;
41
+ m_FinishedStructTest = false ;
42
+ m_FinishedClassTest = false ;
37
43
var startTime = Time . realtimeSinceStartup ;
38
44
39
45
yield return StartSomeClientsAndServerWithPlayers ( true , NbClients , playerPrefab =>
@@ -46,6 +52,7 @@ public IEnumerator NetworkSerializableTest()
46
52
yield return MultiInstanceHelpers . Run ( MultiInstanceHelpers . GetNetworkObjectByRepresentation ( ( x => x . IsPlayerObject && x . OwnerClientId == m_ClientNetworkManagers [ 0 ] . LocalClientId ) , m_ClientNetworkManagers [ 0 ] , clientClientPlayerResult ) ) ;
47
53
var clientSideNetworkBehaviourClass = clientClientPlayerResult . Result . gameObject . GetComponent < TestSerializationComponent > ( ) ;
48
54
clientSideNetworkBehaviourClass . OnSerializableClassUpdated = OnClientReceivedUserSerializableClassUpdated ;
55
+ clientSideNetworkBehaviourClass . OnSerializableStructUpdated = OnClientReceivedUserSerializableStructUpdated ;
49
56
50
57
51
58
var userSerializableClass = new UserSerializableClass ( ) ;
@@ -57,7 +64,13 @@ public IEnumerator NetworkSerializableTest()
57
64
userSerializableClass . MyintValue = 1 ;
58
65
userSerializableClass . MyulongValue = 100 ;
59
66
67
+ var userSerializableStruct = new UserSerializableStruct ( ) ;
68
+
69
+ userSerializableStruct . MyintValue = 1 ;
70
+ userSerializableStruct . MyulongValue = 100 ;
71
+
60
72
clientSideNetworkBehaviourClass . ClientStartTest ( userSerializableClass ) ;
73
+ clientSideNetworkBehaviourClass . ClientStartTest ( userSerializableStruct ) ;
61
74
62
75
// Wait until the test has finished or we time out
63
76
var timeOutPeriod = Time . realtimeSinceStartup + 5 ;
@@ -86,6 +99,9 @@ public IEnumerator NetworkSerializableTest()
86
99
Assert . AreEqual ( m_UserSerializableClass . MyByteListValues [ i ] , i ) ;
87
100
}
88
101
102
+ Assert . AreEqual ( m_UserSerializableStruct . MyintValue , userSerializableStruct . MyintValue + 1 ) ;
103
+ Assert . AreEqual ( m_UserSerializableStruct . MyulongValue , userSerializableStruct . MyulongValue + 1 ) ;
104
+
89
105
// End of test
90
106
m_ClientNetworkManagers [ 0 ] . Shutdown ( ) ;
91
107
m_ServerNetworkManager . Shutdown ( ) ;
@@ -286,7 +302,19 @@ public IEnumerator ExtensionMethodArrayRpcTest()
286
302
private void OnClientReceivedUserSerializableClassUpdated ( UserSerializableClass userSerializableClass )
287
303
{
288
304
m_UserSerializableClass = userSerializableClass ;
289
- m_FinishedTest = true ;
305
+ m_FinishedClassTest = true ;
306
+ m_FinishedTest = m_FinishedClassTest && m_FinishedStructTest ;
307
+ }
308
+
309
+ /// <summary>
310
+ /// Delegate handler invoked towards the end of the when the NetworkSerializableTest
311
+ /// </summary>
312
+ /// <param name="userSerializableStruct"></param>
313
+ private void OnClientReceivedUserSerializableStructUpdated ( UserSerializableStruct userSerializableStruct )
314
+ {
315
+ m_UserSerializableStruct = userSerializableStruct ;
316
+ m_FinishedStructTest = true ;
317
+ m_FinishedTest = m_FinishedClassTest && m_FinishedStructTest ;
290
318
}
291
319
292
320
/// <summary>
@@ -352,14 +380,17 @@ public IEnumerator NetworkSerializableArrayTestHandler(int arraySize, bool sendN
352
380
yield return MultiInstanceHelpers . Run ( MultiInstanceHelpers . GetNetworkObjectByRepresentation ( ( x => x . IsPlayerObject && x . OwnerClientId == m_ClientNetworkManagers [ 0 ] . LocalClientId ) , m_ServerNetworkManager , serverClientPlayerResult ) ) ;
353
381
var serverSideNetworkBehaviourClass = serverClientPlayerResult . Result . gameObject . GetComponent < TestCustomTypesArrayComponent > ( ) ;
354
382
serverSideNetworkBehaviourClass . OnSerializableClassesUpdatedServerRpc = OnServerReceivedUserSerializableClassesUpdated ;
383
+ serverSideNetworkBehaviourClass . OnSerializableStructsUpdatedServerRpc = OnServerReceivedUserSerializableStructsUpdated ;
355
384
356
385
// [Client-Side] Get the client side Player's NetworkObject so we can grab that instance of the TestCustomTypesArrayComponent
357
386
var clientClientPlayerResult = new MultiInstanceHelpers . CoroutineResultWrapper < NetworkObject > ( ) ;
358
387
yield return MultiInstanceHelpers . Run ( MultiInstanceHelpers . GetNetworkObjectByRepresentation ( ( x => x . IsPlayerObject && x . OwnerClientId == m_ClientNetworkManagers [ 0 ] . LocalClientId ) , m_ClientNetworkManagers [ 0 ] , clientClientPlayerResult ) ) ;
359
388
var clientSideNetworkBehaviourClass = clientClientPlayerResult . Result . gameObject . GetComponent < TestCustomTypesArrayComponent > ( ) ;
360
389
clientSideNetworkBehaviourClass . OnSerializableClassesUpdatedClientRpc = OnClientReceivedUserSerializableClassesUpdated ;
390
+ clientSideNetworkBehaviourClass . OnSerializableStructsUpdatedClientRpc = OnClientReceivedUserSerializableStructsUpdated ;
361
391
362
392
m_UserSerializableClassArray = new List < UserSerializableClass > ( ) ;
393
+ m_UserSerializableStructArray = new List < UserSerializableStruct > ( ) ;
363
394
364
395
if ( ! m_IsSendingNull )
365
396
{
@@ -370,13 +401,20 @@ public IEnumerator NetworkSerializableArrayTestHandler(int arraySize, bool sendN
370
401
//Used for testing order of the array
371
402
userSerializableClass . MyintValue = i ;
372
403
m_UserSerializableClassArray . Add ( userSerializableClass ) ;
404
+
405
+ var userSerializableStruct = new UserSerializableStruct ( ) ;
406
+ //Used for testing order of the array
407
+ userSerializableStruct . MyintValue = i ;
408
+ m_UserSerializableStructArray . Add ( userSerializableStruct ) ;
373
409
}
374
410
375
411
clientSideNetworkBehaviourClass . ClientStartTest ( m_UserSerializableClassArray . ToArray ( ) ) ;
412
+ clientSideNetworkBehaviourClass . ClientStartStructTest ( m_UserSerializableStructArray . ToArray ( ) ) ;
376
413
}
377
414
else
378
415
{
379
416
clientSideNetworkBehaviourClass . ClientStartTest ( null ) ;
417
+ clientSideNetworkBehaviourClass . ClientStartStructTest ( null ) ;
380
418
}
381
419
382
420
// Wait until the test has finished or we time out
@@ -437,7 +475,8 @@ private void ValidateUserSerializableClasses(UserSerializableClass[] userSeriali
437
475
private void OnClientReceivedUserSerializableClassesUpdated ( UserSerializableClass [ ] userSerializableClass )
438
476
{
439
477
ValidateUserSerializableClasses ( userSerializableClass ) ;
440
- m_FinishedTest = true ;
478
+ m_FinishedClassTest = true ;
479
+ m_FinishedTest = m_FinishedClassTest && m_FinishedStructTest ;
441
480
}
442
481
443
482
/// <summary>
@@ -450,6 +489,55 @@ private void OnServerReceivedUserSerializableClassesUpdated(UserSerializableClas
450
489
ValidateUserSerializableClasses ( userSerializableClass ) ;
451
490
}
452
491
492
+ /// <summary>
493
+ /// Verifies that the UserSerializableStruct array is in the same order
494
+ /// that it was sent.
495
+ /// </summary>
496
+ /// <param name="userSerializableStruct"></param>
497
+ private void ValidateUserSerializableStructs ( UserSerializableStruct [ ] userSerializableStruct )
498
+ {
499
+ if ( m_IsSendingNull )
500
+ {
501
+ Assert . IsNull ( userSerializableStruct ) ;
502
+ }
503
+ else if ( m_IsArrayEmpty )
504
+ {
505
+ Assert . AreEqual ( userSerializableStruct . Length , 0 ) ;
506
+ }
507
+ else
508
+ {
509
+ var indexCount = 0 ;
510
+ // Check the order of the array
511
+ foreach ( var customTypeEntry in userSerializableStruct )
512
+ {
513
+ Assert . AreEqual ( customTypeEntry . MyintValue , indexCount ) ;
514
+ indexCount ++ ;
515
+ }
516
+ }
517
+ }
518
+
519
+ /// <summary>
520
+ /// Delegate handler invoked when the server sends the client
521
+ /// the UserSerializableStruct array during the NetworkSerializableArrayTest
522
+ /// </summary>
523
+ /// <param name="userSerializableStruct"></param>
524
+ private void OnClientReceivedUserSerializableStructsUpdated ( UserSerializableStruct [ ] userSerializableStruct )
525
+ {
526
+ ValidateUserSerializableStructs ( userSerializableStruct ) ;
527
+ m_FinishedStructTest = true ;
528
+ m_FinishedTest = m_FinishedClassTest && m_FinishedStructTest ;
529
+ }
530
+
531
+ /// <summary>
532
+ /// Delegate handler invoked when the client sends the server
533
+ /// the UserSerializableStruct array during the NetworkSerializableArrayTest
534
+ /// </summary>
535
+ /// <param name="userSerializableStruct"></param>
536
+ private void OnServerReceivedUserSerializableStructsUpdated ( UserSerializableStruct [ ] userSerializableStruct )
537
+ {
538
+ ValidateUserSerializableStructs ( userSerializableStruct ) ;
539
+ }
540
+
453
541
}
454
542
455
543
/// <summary>
@@ -461,6 +549,9 @@ public class TestSerializationComponent : NetworkBehaviour
461
549
public delegate void OnSerializableClassUpdatedDelgateHandler ( UserSerializableClass userSerializableClass ) ;
462
550
public OnSerializableClassUpdatedDelgateHandler OnSerializableClassUpdated ;
463
551
552
+ public delegate void OnSerializableStructUpdatedDelgateHandler ( UserSerializableStruct userSerializableStruct ) ;
553
+ public OnSerializableStructUpdatedDelgateHandler OnSerializableStructUpdated ;
554
+
464
555
public delegate void OnMySharedObjectReferencedByIdUpdatedDelgateHandler ( MySharedObjectReferencedById obj ) ;
465
556
public OnMySharedObjectReferencedByIdUpdatedDelgateHandler OnMySharedObjectReferencedByIdUpdated ;
466
557
@@ -511,6 +602,41 @@ private void SendClientSerializedDataClientRpc(UserSerializableClass userSeriali
511
602
}
512
603
}
513
604
605
+ /// <summary>
606
+ /// Starts the unit test and passes the UserSerializableStruct from the client to the server
607
+ /// </summary>
608
+ /// <param name="userSerializableStruct"></param>
609
+ public void ClientStartTest ( UserSerializableStruct userSerializableStruct )
610
+ {
611
+ SendServerSerializedDataServerRpc ( userSerializableStruct ) ;
612
+ }
613
+
614
+ /// <summary>
615
+ /// Server receives the UserSerializableStruct, modifies it, and sends it back
616
+ /// </summary>
617
+ /// <param name="userSerializableStruct"></param>
618
+ [ ServerRpc ( RequireOwnership = false ) ]
619
+ private void SendServerSerializedDataServerRpc ( UserSerializableStruct userSerializableStruct )
620
+ {
621
+ userSerializableStruct . MyintValue ++ ;
622
+ userSerializableStruct . MyulongValue ++ ;
623
+
624
+ SendClientSerializedDataClientRpc ( userSerializableStruct ) ;
625
+ }
626
+
627
+ /// <summary>
628
+ /// Client receives the UserSerializableStruct and then invokes the OnSerializableStructUpdated (if set)
629
+ /// </summary>
630
+ /// <param name="userSerializableStruct"></param>
631
+ [ ClientRpc ]
632
+ private void SendClientSerializedDataClientRpc ( UserSerializableStruct userSerializableStruct )
633
+ {
634
+ if ( OnSerializableStructUpdated != null )
635
+ {
636
+ OnSerializableStructUpdated . Invoke ( userSerializableStruct ) ;
637
+ }
638
+ }
639
+
514
640
[ ClientRpc ]
515
641
public void SendMyObjectClientRpc ( MyObject obj )
516
642
{
@@ -559,6 +685,7 @@ public void SendMySharedObjectReferencedByIdServerRpc(MySharedObjectReferencedBy
559
685
public class TestCustomTypesArrayComponent : NetworkBehaviour
560
686
{
561
687
public delegate void OnSerializableClassesUpdatedDelgateHandler ( UserSerializableClass [ ] userSerializableClasses ) ;
688
+ public delegate void OnSerializableStructsUpdatedDelgateHandler ( UserSerializableStruct [ ] userSerializableStructs ) ;
562
689
563
690
public delegate void OnMySharedObjectReferencedByIdUpdatedDelgateHandler ( MySharedObjectReferencedById [ ] obj ) ;
564
691
public OnMySharedObjectReferencedByIdUpdatedDelgateHandler OnMySharedObjectReferencedByIdUpdated ;
@@ -568,6 +695,8 @@ public class TestCustomTypesArrayComponent : NetworkBehaviour
568
695
569
696
public OnSerializableClassesUpdatedDelgateHandler OnSerializableClassesUpdatedServerRpc ;
570
697
public OnSerializableClassesUpdatedDelgateHandler OnSerializableClassesUpdatedClientRpc ;
698
+ public OnSerializableStructsUpdatedDelgateHandler OnSerializableStructsUpdatedServerRpc ;
699
+ public OnSerializableStructsUpdatedDelgateHandler OnSerializableStructsUpdatedClientRpc ;
571
700
572
701
/// <summary>
573
702
/// Starts the unit test and passes the userSerializableClasses array
@@ -595,10 +724,10 @@ private void SendServerSerializedDataServerRpc(UserSerializableClass[] userSeria
595
724
}
596
725
597
726
/// <summary>
598
- /// Client receives the UserSerializableClasses array and invokes the callback
727
+ /// Client receives the UserSerializableClass array and invokes the callback
599
728
/// for verification and signaling the test is complete.
600
729
/// </summary>
601
- /// <param name="userSerializableClass "></param>
730
+ /// <param name="userSerializableClasses "></param>
602
731
[ ClientRpc ]
603
732
private void SendClientSerializedDataClientRpc ( UserSerializableClass [ ] userSerializableClasses )
604
733
{
@@ -608,6 +737,45 @@ private void SendClientSerializedDataClientRpc(UserSerializableClass[] userSeria
608
737
}
609
738
}
610
739
740
+ /// <summary>
741
+ /// Starts the unit test and passes the userSerializableStructs array
742
+ /// from the client to the server
743
+ /// </summary>
744
+ /// <param name="userSerializableStructs"></param>
745
+ public void ClientStartStructTest ( UserSerializableStruct [ ] userSerializableStructs )
746
+ {
747
+ SendServerSerializedDataServerRpc ( userSerializableStructs ) ;
748
+ }
749
+
750
+ /// <summary>
751
+ /// Server receives the UserSerializableStructs array, invokes the callback
752
+ /// that checks the order, and then passes it back to the client
753
+ /// </summary>
754
+ /// <param name="userSerializableStructs"></param>
755
+ [ ServerRpc ( RequireOwnership = false ) ]
756
+ private void SendServerSerializedDataServerRpc ( UserSerializableStruct [ ] userSerializableStructs )
757
+ {
758
+ if ( OnSerializableStructsUpdatedServerRpc != null )
759
+ {
760
+ OnSerializableStructsUpdatedServerRpc . Invoke ( userSerializableStructs ) ;
761
+ }
762
+ SendClientSerializedDataClientRpc ( userSerializableStructs ) ;
763
+ }
764
+
765
+ /// <summary>
766
+ /// Client receives the userSerializableStructs array and invokes the callback
767
+ /// for verification and signaling the test is complete.
768
+ /// </summary>
769
+ /// <param name="userSerializableStructs"></param>
770
+ [ ClientRpc ]
771
+ private void SendClientSerializedDataClientRpc ( UserSerializableStruct [ ] userSerializableStructs )
772
+ {
773
+ if ( OnSerializableStructsUpdatedClientRpc != null )
774
+ {
775
+ OnSerializableStructsUpdatedClientRpc . Invoke ( userSerializableStructs ) ;
776
+ }
777
+ }
778
+
611
779
[ ClientRpc ]
612
780
public void SendMyObjectClientRpc ( MyObject [ ] objs )
613
781
{
@@ -682,6 +850,21 @@ public UserSerializableClass()
682
850
}
683
851
}
684
852
853
+ /// <summary>
854
+ /// The test version of a custom user-defined struct that implements INetworkSerializable
855
+ /// </summary>
856
+ public struct UserSerializableStruct : INetworkSerializable
857
+ {
858
+ public int MyintValue ;
859
+ public ulong MyulongValue ;
860
+
861
+ public void NetworkSerialize < T > ( BufferSerializer < T > serializer ) where T : IReaderWriter
862
+ {
863
+ serializer . SerializeValue ( ref MyintValue ) ;
864
+ serializer . SerializeValue ( ref MyulongValue ) ;
865
+ }
866
+ }
867
+
685
868
public class MyObject
686
869
{
687
870
public int I ;
0 commit comments