@@ -2,6 +2,7 @@ namespace SpacetimeDB;
2
2
3
3
using System . Diagnostics . CodeAnalysis ;
4
4
using CsCheck ;
5
+ using SpacetimeDB . BSATN ;
5
6
using Xunit ;
6
7
7
8
public static partial class BSATNRuntimeTests
@@ -328,6 +329,29 @@ public void AssertCollisionsLessThan(double fraction)
328
329
}
329
330
}
330
331
332
+ static void TestRoundTrip < T , BSATN > ( Gen < T > gen , BSATN serializer )
333
+ where BSATN : IReadWrite < T >
334
+ {
335
+ gen . Sample ( ( value ) =>
336
+ {
337
+ var stream = new MemoryStream ( ) ;
338
+ var writer = new BinaryWriter ( stream ) ;
339
+ serializer . Write ( writer , value ) ;
340
+ stream . Seek ( 0 , SeekOrigin . Begin ) ;
341
+ var reader = new BinaryReader ( stream ) ;
342
+ var result = serializer . Read ( reader ) ;
343
+ Assert . Equal ( value , result ) ;
344
+ } , iter : 10_000 ) ;
345
+ }
346
+
347
+ [ Fact ]
348
+ public static void GeneratedProductRoundTrip ( )
349
+ {
350
+ TestRoundTrip ( GenBasic . Select ( value => new BasicDataClass ( value ) ) , new BasicDataClass . BSATN ( ) ) ;
351
+ TestRoundTrip ( GenBasic . Select ( value => new BasicDataRecord ( value ) ) , new BasicDataRecord . BSATN ( ) ) ;
352
+ TestRoundTrip ( GenBasic . Select ( value => new BasicDataStruct ( value ) ) , new BasicDataStruct . BSATN ( ) ) ;
353
+ }
354
+
331
355
[ Fact ]
332
356
public static void GeneratedProductEqualsWorks ( )
333
357
{
@@ -408,7 +432,8 @@ public partial record BasicEnum
408
432
BasicDataClass U ,
409
433
BasicDataStruct V ,
410
434
BasicDataRecord W
411
- ) > { }
435
+ ) >
436
+ { }
412
437
413
438
static readonly Gen < BasicEnum > GenBasicEnum = Gen . SelectMany < int , BasicEnum > (
414
439
Gen . Int [ 0 , 7 ] ,
@@ -432,6 +457,12 @@ BasicDataRecord W
432
457
( e1 , e2 ) => ( e1 , e2 )
433
458
) ;
434
459
460
+ [ Fact ]
461
+ public static void GeneratedSumRoundTrip ( )
462
+ {
463
+ TestRoundTrip ( GenBasicEnum , new BasicEnum . BSATN ( ) ) ;
464
+ }
465
+
435
466
[ Fact ]
436
467
public static void GeneratedSumEqualsWorks ( )
437
468
{
@@ -500,6 +531,12 @@ public ContainsList(List<BasicEnum?>? theList)
500
531
( e1 , e2 ) => ( e1 , e2 )
501
532
) ;
502
533
534
+ [ Fact ]
535
+ public static void GeneratedListRoundTrip ( )
536
+ {
537
+ TestRoundTrip ( GenContainsList , new ContainsList . BSATN ( ) ) ;
538
+ }
539
+
503
540
[ Fact ]
504
541
public static void GeneratedListEqualsWorks ( )
505
542
{
@@ -550,6 +587,24 @@ public ContainsNestedList(List<BasicEnum[][]> theList)
550
587
TheList = theList ;
551
588
}
552
589
}
590
+
591
+ // For the serialization test, forbid nulls.
592
+ static readonly Gen < ContainsNestedList > GenContainsNestedListNoNulls = GenBasicEnum
593
+ . Array [ 0 , 2 ]
594
+ . Array [ 0 , 2 ]
595
+ . List [ 0 , 2 ]
596
+ . Select ( list => new ContainsNestedList ( list ) ) ;
597
+
598
+
599
+ [ Fact ]
600
+ public static void GeneratedNestedListRoundTrip ( )
601
+ {
602
+ TestRoundTrip ( GenContainsNestedListNoNulls , new ContainsNestedList . BSATN ( ) ) ;
603
+ }
604
+
605
+ // However, for the equals + hashcode test, throw in some nulls, just to be paranoid.
606
+ // The user might have constructed a bad one of these in-memory.
607
+
553
608
#pragma warning disable CS8620 // Argument cannot be used for parameter due to differences in the nullability of reference types.
554
609
static readonly Gen < ContainsNestedList > GenContainsNestedList = GenBasicEnum
555
610
. Null ( )
@@ -561,6 +616,7 @@ public ContainsNestedList(List<BasicEnum[][]> theList)
561
616
. Select ( list => new ContainsNestedList ( list ) ) ;
562
617
#pragma warning restore CS8620 // Argument cannot be used for parameter due to differences in the nullability of reference types.
563
618
619
+
564
620
static readonly Gen < ( ContainsNestedList e1 , ContainsNestedList e2 ) > GenTwoContainsNestedList =
565
621
Gen . Select ( GenContainsNestedList , GenContainsNestedList , ( e1 , e2 ) => ( e1 , e2 ) ) ;
566
622
@@ -590,6 +646,7 @@ public override int GetHashCode([DisallowNull] IEnumerable<T> obj)
590
646
}
591
647
}
592
648
649
+
593
650
[ Fact ]
594
651
public static void GeneratedNestedListEqualsWorks ( )
595
652
{
0 commit comments