namespace Just.Core.Tests.GuidV8Tests; public class NewGuid { [Theory] [InlineData(RngEntropy.Weak)] [InlineData(RngEntropy.Strong)] public void Version_And_Variant_Should_Be_Correct(RngEntropy entropy) { var rng = new Random(25); var referenceTime = new DateTime(2020, 05, 17, 15, 36, 13, 771, DateTimeKind.Utc); for (int i = 0; i < 2000; i++) { var timestamp = referenceTime.AddSeconds(rng.Next()); var result = GuidV8.NewGuid(timestamp, entropy); result.Version.Should().Be(8); (result.Variant & 0b1100).Should().Be(0b1000); } } [Theory] [InlineData(RngEntropy.Weak, -25000000, -20000000, -10000000, -5000000, -2000000, -1000000, -500000, -250000, -100000, -25000, -10000, -5000, -2500, -1000, -500, -499, -497, -450, -300, -200, -50, -1, 0, 1, 2, 5, 10, 20, 50, 100, 200, 350, 500, 1000, 2500, 5000, 10000, 25000, 100000, 250000, 500000, 1000000, 2000000, 5000000, 10000000, 20000000, 50000000, 100000000)] [InlineData(RngEntropy.Strong, -25000000, -20000000, -10000000, -5000000, -2000000, -1000000, -500000, -250000, -100000, -25000, -10000, -5000, -2500, -1000, -500, -499, -497, -450, -300, -200, -50, -1, 0, 1, 2, 5, 10, 20, 50, 100, 200, 350, 500, 1000, 2500, 5000, 10000, 25000, 100000, 250000, 500000, 1000000, 2000000, 5000000, 10000000, 20000000, 50000000, 100000000)] [InlineData(RngEntropy.Weak, -9863, -9740, -9214, -8878, -8674, -8652, -8640, -8565, -8518, -8449, -8390, -8193, -8108, -7808, -7501, -7203, -7133, -7020, -6983, -6855, -6576, -6162, -5630, -5505, -5472, -5382, -4706, -4680, -4509, -4454, -4314, -3920, -3251, -3233, -3116, -2792, -2685, -2574, -2338, -2173, -1934, -1914, -1528, -1483, -1410, -870, -757, -730, -263, -220, 151, 426, 588, 970, 1213, 1269, 1376, 1397, 1450, 1770, 2063, 2577, 2750, 2860, 3139, 3161, 3488, 3630, 3774, 4004, 4163, 4198, 4366, 4662, 4746, 4879, 5467, 5601, 5912, 5979, 6128, 6277, 6323, 6437, 6699, 6853, 7556, 7776, 7795, 8099, 8336, 8592, 8682, 8683, 8818, 8904, 9375, 9466, 9551, 9708)] [InlineData(RngEntropy.Strong, -9863, -9740, -9214, -8878, -8674, -8652, -8640, -8565, -8518, -8449, -8390, -8193, -8108, -7808, -7501, -7203, -7133, -7020, -6983, -6855, -6576, -6162, -5630, -5505, -5472, -5382, -4706, -4680, -4509, -4454, -4314, -3920, -3251, -3233, -3116, -2792, -2685, -2574, -2338, -2173, -1934, -1914, -1528, -1483, -1410, -870, -757, -730, -263, -220, 151, 426, 588, 970, 1213, 1269, 1376, 1397, 1450, 1770, 2063, 2577, 2750, 2860, 3139, 3161, 3488, 3630, 3774, 4004, 4163, 4198, 4366, 4662, 4746, 4879, 5467, 5601, 5912, 5979, 6128, 6277, 6323, 6437, 6699, 6853, 7556, 7776, 7795, 8099, 8336, 8592, 8682, 8683, 8818, 8904, 9375, 9466, 9551, 9708)] [InlineData(RngEntropy.Weak, 10024, 28660, 289641, 356015, 443164, 478759, 599586, 705860, 791271, 876512, 884503, 894899, 898584, 980136, 1007927, 1680328, 1690193, 1804615, 1847117, 2005534, 2106684, 2111936, 2252935, 2271396, 2298685, 2385409, 2414094, 2451706, 2549138, 2605538, 2864629, 2923476, 3004288, 3182875, 3266693, 3379019, 3542110, 3851467, 3871420, 4035463, 4316004, 4726381, 4814068, 4902666, 4979292, 4993443, 5117765, 5240585, 5249671, 5319528, 5387595, 5434544, 5504506, 5531264, 5546173, 5780381, 5889341, 6066328, 6167883, 6185073, 6299021, 6412136, 6621498, 6666562, 6741169, 6870279, 6949855, 6965427, 7153467, 7184150, 7300456, 7311381, 7413697, 7505235, 7802811, 7979134, 8053665, 8177676, 8260284, 8260773, 8269944, 8406526, 8442932, 8475162, 8555250, 8853347, 8861733, 8892200, 9069869, 9117839, 9225445, 9245837, 9378644, 9497874, 9553625, 9650968, 9704053, 9713592, 9715054, 9735988)] [InlineData(RngEntropy.Strong, 10024, 28660, 289641, 356015, 443164, 478759, 599586, 705860, 791271, 876512, 884503, 894899, 898584, 980136, 1007927, 1680328, 1690193, 1804615, 1847117, 2005534, 2106684, 2111936, 2252935, 2271396, 2298685, 2385409, 2414094, 2451706, 2549138, 2605538, 2864629, 2923476, 3004288, 3182875, 3266693, 3379019, 3542110, 3851467, 3871420, 4035463, 4316004, 4726381, 4814068, 4902666, 4979292, 4993443, 5117765, 5240585, 5249671, 5319528, 5387595, 5434544, 5504506, 5531264, 5546173, 5780381, 5889341, 6066328, 6167883, 6185073, 6299021, 6412136, 6621498, 6666562, 6741169, 6870279, 6949855, 6965427, 7153467, 7184150, 7300456, 7311381, 7413697, 7505235, 7802811, 7979134, 8053665, 8177676, 8260284, 8260773, 8269944, 8406526, 8442932, 8475162, 8555250, 8853347, 8861733, 8892200, 9069869, 9117839, 9225445, 9245837, 9378644, 9497874, 9553625, 9650968, 9704053, 9713592, 9715054, 9735988)] public void Guids_Differing_By_Minutes_Should_Be_Sortable(RngEntropy entropy, params int[] seconds) { var rng = new Random(25); var referenceTime = new DateTime(2024, 05, 17, 15, 36, 13, 771, DateTimeKind.Utc); SortedList expected = new(seconds.Length); foreach (var s in seconds) { var timestamp = referenceTime.AddMinutes(s); expected.Add(timestamp, GuidV8.NewGuid(timestamp, entropy)); } var sut = expected.Values.ToArray(); rng.Shuffle(sut); sut.Order().Should().Equal(expected.Select(x => x.Value)); sut.OrderBy(x => x.ToString()).Should().Equal(expected.Select(x => x.Value)); sut.OrderDescending().Should().Equal(expected.Reverse().Select(x => x.Value)); sut.OrderByDescending(x => x.ToString()).Should().Equal(expected.Reverse().Select(x => x.Value)); } [Theory] [InlineData(RngEntropy.Weak, -100000000, -25000000, -10000000, -5000000, -2000000, -1000000, -500000, -250000, -100000, -25000, -10000, -5000, -2500, -1000, -500, -499, -497, -450, -300, -200, -50, -1, 0, 1, 2, 5, 10, 20, 50, 100, 200, 350, 500, 1000, 2500, 5000, 10000, 25000, 100000, 250000, 500000, 1000000, 2000000, 5000000, 10000000, 100000000, 200000000)] [InlineData(RngEntropy.Strong, -100000000, -25000000, -10000000, -5000000, -2000000, -1000000, -500000, -250000, -100000, -25000, -10000, -5000, -2500, -1000, -500, -499, -497, -450, -300, -200, -50, -1, 0, 1, 2, 5, 10, 20, 50, 100, 200, 350, 500, 1000, 2500, 5000, 10000, 25000, 100000, 250000, 500000, 1000000, 2000000, 5000000, 10000000, 100000000, 200000000)] [InlineData(RngEntropy.Weak, -9863, -9740, -9214, -8878, -8674, -8652, -8640, -8565, -8518, -8449, -8390, -8193, -8108, -7808, -7501, -7203, -7133, -7020, -6983, -6855, -6576, -6162, -5630, -5505, -5472, -5382, -4706, -4680, -4509, -4454, -4314, -3920, -3251, -3233, -3116, -2792, -2685, -2574, -2338, -2173, -1934, -1914, -1528, -1483, -1410, -870, -757, -730, -263, -220, 151, 426, 588, 970, 1213, 1269, 1376, 1397, 1450, 1770, 2063, 2577, 2750, 2860, 3139, 3161, 3488, 3630, 3774, 4004, 4163, 4198, 4366, 4662, 4746, 4879, 5467, 5601, 5912, 5979, 6128, 6277, 6323, 6437, 6699, 6853, 7556, 7776, 7795, 8099, 8336, 8592, 8682, 8683, 8818, 8904, 9375, 9466, 9551, 9708)] [InlineData(RngEntropy.Strong, -9863, -9740, -9214, -8878, -8674, -8652, -8640, -8565, -8518, -8449, -8390, -8193, -8108, -7808, -7501, -7203, -7133, -7020, -6983, -6855, -6576, -6162, -5630, -5505, -5472, -5382, -4706, -4680, -4509, -4454, -4314, -3920, -3251, -3233, -3116, -2792, -2685, -2574, -2338, -2173, -1934, -1914, -1528, -1483, -1410, -870, -757, -730, -263, -220, 151, 426, 588, 970, 1213, 1269, 1376, 1397, 1450, 1770, 2063, 2577, 2750, 2860, 3139, 3161, 3488, 3630, 3774, 4004, 4163, 4198, 4366, 4662, 4746, 4879, 5467, 5601, 5912, 5979, 6128, 6277, 6323, 6437, 6699, 6853, 7556, 7776, 7795, 8099, 8336, 8592, 8682, 8683, 8818, 8904, 9375, 9466, 9551, 9708)] [InlineData(RngEntropy.Weak, 6629058, 24114993, 40561510, 46245969, 46876997, 48747281, 80489854, 110237218, 117445694, 118974860, 135132579, 141760591, 149114066, 158322437, 159065333, 164925904, 173848639, 175086337, 175704556, 176335514, 200302773, 207133553, 230088723, 234521706, 239587338, 263755571, 264571928, 290118284, 292346548, 319322378, 320988273, 322638028, 324110126, 326855208, 332533719, 336668313, 350798512, 366520367, 380595181, 405033666, 410929500, 414099488, 417697882, 421269768, 431907031, 435262715, 442168482, 449797406, 458508845, 489039529, 503344305, 514934509, 537515867, 555210743, 563951463, 578783864, 580560518, 580902916, 605801607, 635231377, 636537435, 637241486, 676077268, 691630262, 696158602, 714007596, 715537265, 718873134, 724266320, 741049828, 749379956, 757561933, 758668417, 761735205, 770349479, 797570403, 805896481, 809050934, 821655964, 821980469, 830824227, 840429528, 851772315, 859717719, 859763860, 867675943, 912124563, 914880620, 923914294, 930298008, 932610035, 937468680, 945565998, 949277691, 949397209, 951283050, 953249971, 953953188, 976210158, 982233484, 982233485)] [InlineData(RngEntropy.Strong, 6629058, 24114993, 40561510, 46245969, 46876997, 48747281, 80489854, 110237218, 117445694, 118974860, 135132579, 141760591, 149114066, 158322437, 159065333, 164925904, 173848639, 175086337, 175704556, 176335514, 200302773, 207133553, 230088723, 234521706, 239587338, 263755571, 264571928, 290118284, 292346548, 319322378, 320988273, 322638028, 324110126, 326855208, 332533719, 336668313, 350798512, 366520367, 380595181, 405033666, 410929500, 414099488, 417697882, 421269768, 431907031, 435262715, 442168482, 449797406, 458508845, 489039529, 503344305, 514934509, 537515867, 555210743, 563951463, 578783864, 580560518, 580902916, 605801607, 635231377, 636537435, 637241486, 676077268, 691630262, 696158602, 714007596, 715537265, 718873134, 724266320, 741049828, 749379956, 757561933, 758668417, 761735205, 770349479, 797570403, 805896481, 809050934, 821655964, 821980469, 830824227, 840429528, 851772315, 859717719, 859763860, 867675943, 912124563, 914880620, 923914294, 930298008, 932610035, 937468680, 945565998, 949277691, 949397209, 951283050, 953249971, 953953188, 976210158, 982233484, 982233485)] public void Guids_Differing_By_Seconds_Should_Be_Sortable(RngEntropy entropy, params int[] seconds) { var rng = new Random(25); var referenceTime = new DateTime(2024, 05, 17, 15, 36, 13, 771, DateTimeKind.Utc); SortedList expected = new(seconds.Length); foreach (var s in seconds) { var timestamp = referenceTime.AddSeconds(s); expected.Add(timestamp, GuidV8.NewGuid(timestamp, entropy)); } var sut = expected.Values.ToArray(); rng.Shuffle(sut); sut.Order().Should().Equal(expected.Select(x => x.Value)); sut.OrderBy(x => x.ToString()).Should().Equal(expected.Select(x => x.Value)); sut.OrderDescending().Should().Equal(expected.Reverse().Select(x => x.Value)); sut.OrderByDescending(x => x.ToString()).Should().Equal(expected.Reverse().Select(x => x.Value)); } [Theory] [InlineData(RngEntropy.Weak, -250000000, -25000000, -10000000, -5000000, -2000000, -1000000, -500000, -250000, -100000, -25000, -10000, -5000, -2500, -1000, -500, -499, -497, -450, -300, -200, -50, -1, 0, 1, 2, 5, 10, 20, 50, 100, 200, 350, 500, 1000, 2500, 5000, 10000, 25000, 100000, 250000, 500000, 1000000, 2000000, 5000000, 10000000, 100000000, 2100000000)] [InlineData(RngEntropy.Strong, -250000000, -25000000, -10000000, -5000000, -2000000, -1000000, -500000, -250000, -100000, -25000, -10000, -5000, -2500, -1000, -500, -499, -497, -450, -300, -200, -50, -1, 0, 1, 2, 5, 10, 20, 50, 100, 200, 350, 500, 1000, 2500, 5000, 10000, 25000, 100000, 250000, 500000, 1000000, 2000000, 5000000, 10000000, 100000000, 2100000000)] [InlineData(RngEntropy.Weak, -9863, -9740, -9214, -8878, -8674, -8652, -8640, -8565, -8518, -8449, -8390, -8193, -8108, -7808, -7501, -7203, -7133, -7020, -6983, -6855, -6576, -6162, -5630, -5505, -5472, -5382, -4706, -4680, -4509, -4454, -4314, -3920, -3251, -3233, -3116, -2792, -2685, -2574, -2338, -2173, -1934, -1914, -1528, -1483, -1410, -870, -757, -730, -263, -220, 151, 426, 588, 970, 1213, 1269, 1376, 1397, 1450, 1770, 2063, 2577, 2750, 2860, 3139, 3161, 3488, 3630, 3774, 4004, 4163, 4198, 4366, 4662, 4746, 4879, 5467, 5601, 5912, 5979, 6128, 6277, 6323, 6437, 6699, 6853, 7556, 7776, 7795, 8099, 8336, 8592, 8682, 8683, 8818, 8904, 9375, 9466, 9551, 9708)] [InlineData(RngEntropy.Strong, -9863, -9740, -9214, -8878, -8674, -8652, -8640, -8565, -8518, -8449, -8390, -8193, -8108, -7808, -7501, -7203, -7133, -7020, -6983, -6855, -6576, -6162, -5630, -5505, -5472, -5382, -4706, -4680, -4509, -4454, -4314, -3920, -3251, -3233, -3116, -2792, -2685, -2574, -2338, -2173, -1934, -1914, -1528, -1483, -1410, -870, -757, -730, -263, -220, 151, 426, 588, 970, 1213, 1269, 1376, 1397, 1450, 1770, 2063, 2577, 2750, 2860, 3139, 3161, 3488, 3630, 3774, 4004, 4163, 4198, 4366, 4662, 4746, 4879, 5467, 5601, 5912, 5979, 6128, 6277, 6323, 6437, 6699, 6853, 7556, 7776, 7795, 8099, 8336, 8592, 8682, 8683, 8818, 8904, 9375, 9466, 9551, 9708)] [InlineData(RngEntropy.Weak, 6629058, 24114993, 40561510, 46245969, 46876997, 48747281, 80489854, 110237218, 117445694, 118974860, 135132579, 141760591, 149114066, 158322437, 159065333, 164925904, 173848639, 175086337, 175704556, 176335514, 200302773, 207133553, 230088723, 234521706, 239587338, 263755571, 264571928, 290118284, 292346548, 319322378, 320988273, 322638028, 324110126, 326855208, 332533719, 336668313, 350798512, 366520367, 380595181, 405033666, 410929500, 414099488, 417697882, 421269768, 431907031, 435262715, 442168482, 449797406, 458508845, 489039529, 503344305, 514934509, 537515867, 555210743, 563951463, 578783864, 580560518, 580902916, 605801607, 635231377, 636537435, 637241486, 676077268, 691630262, 696158602, 714007596, 715537265, 718873134, 724266320, 741049828, 749379956, 757561933, 758668417, 761735205, 770349479, 797570403, 805896481, 809050934, 821655964, 821980469, 830824227, 840429528, 851772315, 859717719, 859763860, 867675943, 912124563, 914880620, 923914294, 930298008, 932610035, 937468680, 945565998, 949277691, 949397209, 951283050, 953249971, 953953188, 976210158, 982233484, 982233485)] [InlineData(RngEntropy.Strong, 6629058, 24114993, 40561510, 46245969, 46876997, 48747281, 80489854, 110237218, 117445694, 118974860, 135132579, 141760591, 149114066, 158322437, 159065333, 164925904, 173848639, 175086337, 175704556, 176335514, 200302773, 207133553, 230088723, 234521706, 239587338, 263755571, 264571928, 290118284, 292346548, 319322378, 320988273, 322638028, 324110126, 326855208, 332533719, 336668313, 350798512, 366520367, 380595181, 405033666, 410929500, 414099488, 417697882, 421269768, 431907031, 435262715, 442168482, 449797406, 458508845, 489039529, 503344305, 514934509, 537515867, 555210743, 563951463, 578783864, 580560518, 580902916, 605801607, 635231377, 636537435, 637241486, 676077268, 691630262, 696158602, 714007596, 715537265, 718873134, 724266320, 741049828, 749379956, 757561933, 758668417, 761735205, 770349479, 797570403, 805896481, 809050934, 821655964, 821980469, 830824227, 840429528, 851772315, 859717719, 859763860, 867675943, 912124563, 914880620, 923914294, 930298008, 932610035, 937468680, 945565998, 949277691, 949397209, 951283050, 953249971, 953953188, 976210158, 982233484, 982233485)] public void Guids_Differing_By_Milliseconds_Should_Be_Sortable(RngEntropy entropy, params int[] seconds) { var rng = new Random(26); var referenceTime = new DateTime(2024, 05, 17, 15, 36, 13, 771, DateTimeKind.Utc); SortedList expected = new(seconds.Length); foreach (var s in seconds) { var timestamp = referenceTime.AddMilliseconds(s); expected.Add(timestamp, GuidV8.NewGuid(timestamp, entropy)); } var sut = expected.Values.ToArray(); rng.Shuffle(sut); sut.Order().Should().Equal(expected.Select(x => x.Value)); sut.OrderBy(x => x.ToString()).Should().Equal(expected.Select(x => x.Value)); sut.OrderDescending().Should().Equal(expected.Reverse().Select(x => x.Value)); sut.OrderByDescending(x => x.ToString()).Should().Equal(expected.Reverse().Select(x => x.Value)); } }