|
1 | 1 | namespace SpacetimeDB; |
2 | 2 |
|
3 | 3 | using System.Diagnostics.CodeAnalysis; |
| 4 | +using System.Security.Cryptography; |
4 | 5 | using CsCheck; |
5 | 6 | using SpacetimeDB.BSATN; |
6 | 7 | using Xunit; |
@@ -861,4 +862,86 @@ public static void GeneratedEnumEqualsWorks() |
861 | 862 | iter: 10_000 |
862 | 863 | ); |
863 | 864 | } |
| 865 | + |
| 866 | + [Fact] |
| 867 | + public static void UUidRoundTrip() |
| 868 | + { |
| 869 | + var u1 = Uuid.NIL; |
| 870 | + var s = u1.ToString(); |
| 871 | + var u2 = Uuid.Parse(s); |
| 872 | + Assert.Equal(u1, u2); |
| 873 | + Assert.Equal(u1.ToGuid(), u2.ToGuid()); |
| 874 | + Assert.Equal(s, u2.ToString()); |
| 875 | + } |
| 876 | + |
| 877 | + [Fact] |
| 878 | + public static void UuidToString() |
| 879 | + { |
| 880 | + foreach ( |
| 881 | + var uuid in new[] |
| 882 | + { |
| 883 | + Uuid.NIL, |
| 884 | + new Uuid(new U128(0x0102030405060708UL, 0x090A0B0C0D0E0F10UL)), |
| 885 | + Uuid.MAX, |
| 886 | + } |
| 887 | + ) |
| 888 | + { |
| 889 | + var s = uuid.ToString(); |
| 890 | + var uuid2 = Uuid.Parse(s); |
| 891 | + Assert.Equal(uuid, uuid2); |
| 892 | + var g = new Guid(s); |
| 893 | + Assert.Equal(s, g.ToString()); // same canonical form |
| 894 | + } |
| 895 | + } |
| 896 | + |
| 897 | + [Fact] |
| 898 | + public static void UuidOrdered() |
| 899 | + { |
| 900 | + var u1 = new Uuid(new U128(1, 0)); |
| 901 | + var u2 = new Uuid(new U128(2, 0)); |
| 902 | + |
| 903 | + Assert.True(u1 < u2); |
| 904 | + Assert.True(u2 > u1); |
| 905 | + Assert.Equal(u1, u1); |
| 906 | + Assert.NotEqual(u1, u2); |
| 907 | + |
| 908 | + var clock = new ClockGenerator(new Timestamp()); |
| 909 | + |
| 910 | + var uuids = Enumerable |
| 911 | + .Range(0, 1000) |
| 912 | + .Select(_ => |
| 913 | + { |
| 914 | + var bytes = new byte[10]; |
| 915 | + RandomNumberGenerator.Fill(bytes); |
| 916 | + return Uuid.FromClockV7(clock, bytes); |
| 917 | + }) |
| 918 | + .ToList(); |
| 919 | + |
| 920 | + for (var i = 0; i < uuids.Count - 1; i++) |
| 921 | + { |
| 922 | + var a = uuids[i]; |
| 923 | + var b = uuids[i + 1]; |
| 924 | + |
| 925 | + Assert.True(a < b, $"UUIDs are not ordered at {i}: {a} !< {b}"); |
| 926 | + } |
| 927 | + } |
| 928 | + |
| 929 | + [Fact] |
| 930 | + public static void UuidVariant() |
| 931 | + { |
| 932 | + var u = Uuid.NIL; |
| 933 | + Assert.Equal(Uuid.UuidVersion.Nil, u.GetVersion()); |
| 934 | + |
| 935 | + u = Uuid.MAX; |
| 936 | + Assert.Equal(Uuid.UuidVersion.Max, u.GetVersion()); |
| 937 | + |
| 938 | + var randomBytes = new byte[16]; |
| 939 | + RandomNumberGenerator.Fill(randomBytes); |
| 940 | + u = Uuid.FromRandomBytesV4(randomBytes); |
| 941 | + Assert.Equal(Uuid.UuidVersion.V4, u.GetVersion()); |
| 942 | + |
| 943 | + var clock = new ClockGenerator(new Timestamp()); |
| 944 | + u = Uuid.FromClockV7(clock, randomBytes.AsSpan()[..10]); |
| 945 | + Assert.Equal(Uuid.UuidVersion.V7, u.GetVersion()); |
| 946 | + } |
864 | 947 | } |
0 commit comments