com.wallstop-studios.unity-helpers 2.0.0-rc06 → 2.0.0-rc08

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/Runtime/Core/Extension/DirectionExtensions.cs +5 -2
  2. package/Runtime/Core/Extension/IEnumerableExtensions.cs +19 -6
  3. package/Runtime/Core/Extension/RandomExtensions.cs +9 -87
  4. package/Runtime/Core/Extension/UnityExtensions.cs +2 -2
  5. package/Runtime/Core/Helper/Helpers.cs +1 -556
  6. package/Runtime/Core/Helper/Partials/LogHelpers.cs +13 -0
  7. package/Runtime/Core/Helper/Partials/LogHelpers.cs.meta +3 -0
  8. package/Runtime/Core/Helper/Partials/MathHelpers.cs +30 -0
  9. package/Runtime/Core/Helper/Partials/MathHelpers.cs.meta +3 -0
  10. package/Runtime/Core/Helper/Partials/ObjectHelpers.cs +388 -0
  11. package/Runtime/Core/Helper/Partials/ObjectHelpers.cs.meta +3 -0
  12. package/Runtime/Core/Helper/Partials/TransformHelpers.cs +167 -0
  13. package/Runtime/Core/Helper/Partials/TransformHelpers.cs.meta +3 -0
  14. package/Runtime/Core/Helper/Partials.meta +3 -0
  15. package/Runtime/Core/Random/AbstractRandom.cs +140 -154
  16. package/Runtime/Core/Random/IRandom.cs +26 -7
  17. package/Runtime/Core/Random/PerlinNoise.cs +369 -0
  18. package/Runtime/Core/Random/PerlinNoise.cs.meta +3 -0
  19. package/Runtime/Core/Random/SquirrelRandom.cs +9 -10
  20. package/Runtime/Core/Random/SystemRandom.cs +78 -41
  21. package/Tests/Runtime/Extensions/RandomExtensionTests.cs +27 -0
  22. package/Tests/Runtime/Extensions/RandomExtensionTests.cs.meta +3 -0
  23. package/Tests/Runtime/Helper/ObjectHelperTests.cs +402 -0
  24. package/Tests/Runtime/Helper/ObjectHelperTests.cs.meta +3 -0
  25. package/Tests/Runtime/Performance/RandomPerformanceTests.cs +58 -3
  26. package/Tests/Runtime/Random/RandomTestBase.cs +557 -6
  27. package/Tests/Runtime/Random/SquirrelRandomTests.cs +5 -0
  28. package/package.json +1 -1
@@ -0,0 +1,402 @@
1
+ namespace UnityHelpers.Tests.Tests.Runtime.Helper
2
+ {
3
+ using System.Collections;
4
+ using Core.Helper;
5
+ using JetBrains.Annotations;
6
+ using NUnit.Framework;
7
+ using UnityEngine;
8
+ using UnityEngine.TestTools;
9
+
10
+ [UsedImplicitly]
11
+ public sealed class ObjectHelperComponent : MonoBehaviour { }
12
+
13
+ public sealed class ObjectHelperTests
14
+ {
15
+ [UnityTest]
16
+ public IEnumerator HasComponent()
17
+ {
18
+ GameObject go = new("Test SpriteRenderer", typeof(SpriteRenderer));
19
+ SpriteRenderer spriteRenderer = go.GetComponent<SpriteRenderer>();
20
+
21
+ Assert.IsTrue(go.HasComponent(typeof(SpriteRenderer)));
22
+ Assert.IsTrue(go.HasComponent<SpriteRenderer>());
23
+ Assert.IsTrue(spriteRenderer.HasComponent<SpriteRenderer>());
24
+ Assert.IsTrue(spriteRenderer.HasComponent(typeof(SpriteRenderer)));
25
+
26
+ Assert.IsFalse(go.HasComponent<LineRenderer>());
27
+ Assert.IsFalse(go.HasComponent(typeof(LineRenderer)));
28
+ Assert.IsFalse(spriteRenderer.HasComponent<LineRenderer>());
29
+ Assert.IsFalse(spriteRenderer.HasComponent(typeof(LineRenderer)));
30
+
31
+ Object obj = go;
32
+ Assert.IsTrue(obj.HasComponent<SpriteRenderer>());
33
+ Assert.IsTrue(obj.HasComponent(typeof(SpriteRenderer)));
34
+ Assert.IsFalse(obj.HasComponent<LineRenderer>());
35
+ Assert.IsFalse(obj.HasComponent(typeof(LineRenderer)));
36
+
37
+ yield break;
38
+ }
39
+
40
+ [UnityTest]
41
+ public IEnumerator EnableRendererRecursively()
42
+ {
43
+ GameObject one = New("1");
44
+ GameObject two = New("2");
45
+ two.transform.SetParent(one.transform);
46
+ GameObject three = New("3");
47
+ three.transform.SetParent(two.transform);
48
+ GameObject four = New("4");
49
+ four.transform.SetParent(three.transform);
50
+
51
+ // Act
52
+ two.transform.EnableRendererRecursively<SpriteRenderer>(false);
53
+ Assert.IsTrue(one.GetComponent<SpriteRenderer>().enabled);
54
+ Assert.IsFalse(two.GetComponent<SpriteRenderer>().enabled);
55
+ Assert.IsFalse(three.GetComponent<SpriteRenderer>().enabled);
56
+ Assert.IsFalse(four.GetComponent<SpriteRenderer>().enabled);
57
+
58
+ Assert.IsTrue(one.GetComponent<CircleCollider2D>().enabled);
59
+ Assert.IsTrue(two.GetComponent<CircleCollider2D>().enabled);
60
+ Assert.IsTrue(three.GetComponent<CircleCollider2D>().enabled);
61
+ Assert.IsTrue(four.GetComponent<CircleCollider2D>().enabled);
62
+
63
+ // Act
64
+ three.transform.EnableRendererRecursively<SpriteRenderer>(true);
65
+
66
+ Assert.IsTrue(one.GetComponent<SpriteRenderer>().enabled);
67
+ Assert.IsFalse(two.GetComponent<SpriteRenderer>().enabled);
68
+ Assert.IsTrue(three.GetComponent<SpriteRenderer>().enabled);
69
+ Assert.IsTrue(four.GetComponent<SpriteRenderer>().enabled);
70
+
71
+ Assert.IsTrue(one.GetComponent<CircleCollider2D>().enabled);
72
+ Assert.IsTrue(two.GetComponent<CircleCollider2D>().enabled);
73
+ Assert.IsTrue(three.GetComponent<CircleCollider2D>().enabled);
74
+ Assert.IsTrue(four.GetComponent<CircleCollider2D>().enabled);
75
+
76
+ // Act
77
+ one.transform.EnableRendererRecursively<SpriteRenderer>(true);
78
+
79
+ Assert.IsTrue(one.GetComponent<SpriteRenderer>().enabled);
80
+ Assert.IsTrue(two.GetComponent<SpriteRenderer>().enabled);
81
+ Assert.IsTrue(three.GetComponent<SpriteRenderer>().enabled);
82
+ Assert.IsTrue(four.GetComponent<SpriteRenderer>().enabled);
83
+
84
+ Assert.IsTrue(one.GetComponent<CircleCollider2D>().enabled);
85
+ Assert.IsTrue(two.GetComponent<CircleCollider2D>().enabled);
86
+ Assert.IsTrue(three.GetComponent<CircleCollider2D>().enabled);
87
+ Assert.IsTrue(four.GetComponent<CircleCollider2D>().enabled);
88
+
89
+ // Act
90
+ two.transform.EnableRendererRecursively<SpriteRenderer>(
91
+ false,
92
+ renderer => renderer.gameObject == three
93
+ );
94
+
95
+ Assert.IsTrue(one.GetComponent<SpriteRenderer>().enabled);
96
+ Assert.IsFalse(two.GetComponent<SpriteRenderer>().enabled);
97
+ Assert.IsTrue(three.GetComponent<SpriteRenderer>().enabled);
98
+ Assert.IsFalse(four.GetComponent<SpriteRenderer>().enabled);
99
+
100
+ Assert.IsTrue(one.GetComponent<CircleCollider2D>().enabled);
101
+ Assert.IsTrue(two.GetComponent<CircleCollider2D>().enabled);
102
+ Assert.IsTrue(three.GetComponent<CircleCollider2D>().enabled);
103
+ Assert.IsTrue(four.GetComponent<CircleCollider2D>().enabled);
104
+
105
+ // Act
106
+ one.transform.EnableRendererRecursively<SpriteRenderer>(
107
+ true,
108
+ renderer => renderer.gameObject == four
109
+ );
110
+
111
+ Assert.IsTrue(one.GetComponent<SpriteRenderer>().enabled);
112
+ Assert.IsTrue(two.GetComponent<SpriteRenderer>().enabled);
113
+ Assert.IsTrue(three.GetComponent<SpriteRenderer>().enabled);
114
+ Assert.IsFalse(four.GetComponent<SpriteRenderer>().enabled);
115
+
116
+ Assert.IsTrue(one.GetComponent<CircleCollider2D>().enabled);
117
+ Assert.IsTrue(two.GetComponent<CircleCollider2D>().enabled);
118
+ Assert.IsTrue(three.GetComponent<CircleCollider2D>().enabled);
119
+ Assert.IsTrue(four.GetComponent<CircleCollider2D>().enabled);
120
+
121
+ yield break;
122
+
123
+ GameObject New(string name)
124
+ {
125
+ return new GameObject(name, typeof(SpriteRenderer), typeof(CircleCollider2D));
126
+ }
127
+ }
128
+
129
+ [UnityTest]
130
+ public IEnumerator EnableRecursively()
131
+ {
132
+ GameObject one = New("1");
133
+ GameObject two = New("2");
134
+ two.transform.SetParent(one.transform);
135
+ GameObject three = New("3");
136
+ three.transform.SetParent(two.transform);
137
+ GameObject four = New("4");
138
+ four.transform.SetParent(three.transform);
139
+
140
+ // Act
141
+ two.transform.EnableRecursively<CircleCollider2D>(false);
142
+ Assert.IsTrue(one.GetComponent<SpriteRenderer>().enabled);
143
+ Assert.IsTrue(two.GetComponent<SpriteRenderer>().enabled);
144
+ Assert.IsTrue(three.GetComponent<SpriteRenderer>().enabled);
145
+ Assert.IsTrue(four.GetComponent<SpriteRenderer>().enabled);
146
+
147
+ Assert.IsTrue(one.GetComponent<CircleCollider2D>().enabled);
148
+ Assert.IsFalse(two.GetComponent<CircleCollider2D>().enabled);
149
+ Assert.IsFalse(three.GetComponent<CircleCollider2D>().enabled);
150
+ Assert.IsFalse(four.GetComponent<CircleCollider2D>().enabled);
151
+
152
+ // Act
153
+ three.transform.EnableRecursively<CircleCollider2D>(true);
154
+
155
+ Assert.IsTrue(one.GetComponent<SpriteRenderer>().enabled);
156
+ Assert.IsTrue(two.GetComponent<SpriteRenderer>().enabled);
157
+ Assert.IsTrue(three.GetComponent<SpriteRenderer>().enabled);
158
+ Assert.IsTrue(four.GetComponent<SpriteRenderer>().enabled);
159
+
160
+ Assert.IsTrue(one.GetComponent<CircleCollider2D>().enabled);
161
+ Assert.IsFalse(two.GetComponent<CircleCollider2D>().enabled);
162
+ Assert.IsTrue(three.GetComponent<CircleCollider2D>().enabled);
163
+ Assert.IsTrue(four.GetComponent<CircleCollider2D>().enabled);
164
+
165
+ // Act
166
+ one.transform.EnableRecursively<CircleCollider2D>(true);
167
+
168
+ Assert.IsTrue(one.GetComponent<SpriteRenderer>().enabled);
169
+ Assert.IsTrue(two.GetComponent<SpriteRenderer>().enabled);
170
+ Assert.IsTrue(three.GetComponent<SpriteRenderer>().enabled);
171
+ Assert.IsTrue(four.GetComponent<SpriteRenderer>().enabled);
172
+
173
+ Assert.IsTrue(one.GetComponent<CircleCollider2D>().enabled);
174
+ Assert.IsTrue(two.GetComponent<CircleCollider2D>().enabled);
175
+ Assert.IsTrue(three.GetComponent<CircleCollider2D>().enabled);
176
+ Assert.IsTrue(four.GetComponent<CircleCollider2D>().enabled);
177
+
178
+ // Act
179
+ two.transform.EnableRecursively<CircleCollider2D>(
180
+ false,
181
+ collider => collider.gameObject == three
182
+ );
183
+
184
+ Assert.IsTrue(one.GetComponent<SpriteRenderer>().enabled);
185
+ Assert.IsTrue(two.GetComponent<SpriteRenderer>().enabled);
186
+ Assert.IsTrue(three.GetComponent<SpriteRenderer>().enabled);
187
+ Assert.IsTrue(four.GetComponent<SpriteRenderer>().enabled);
188
+
189
+ Assert.IsTrue(one.GetComponent<CircleCollider2D>().enabled);
190
+ Assert.IsFalse(two.GetComponent<CircleCollider2D>().enabled);
191
+ Assert.IsTrue(three.GetComponent<CircleCollider2D>().enabled);
192
+ Assert.IsFalse(four.GetComponent<CircleCollider2D>().enabled);
193
+
194
+ // Act
195
+ one.transform.EnableRecursively<CircleCollider2D>(
196
+ true,
197
+ collider => collider.gameObject == four
198
+ );
199
+
200
+ Assert.IsTrue(one.GetComponent<SpriteRenderer>().enabled);
201
+ Assert.IsTrue(two.GetComponent<SpriteRenderer>().enabled);
202
+ Assert.IsTrue(three.GetComponent<SpriteRenderer>().enabled);
203
+ Assert.IsTrue(four.GetComponent<SpriteRenderer>().enabled);
204
+
205
+ Assert.IsTrue(one.GetComponent<CircleCollider2D>().enabled);
206
+ Assert.IsTrue(two.GetComponent<CircleCollider2D>().enabled);
207
+ Assert.IsTrue(three.GetComponent<CircleCollider2D>().enabled);
208
+ Assert.IsFalse(four.GetComponent<CircleCollider2D>().enabled);
209
+
210
+ yield break;
211
+
212
+ GameObject New(string name)
213
+ {
214
+ return new GameObject(name, typeof(SpriteRenderer), typeof(CircleCollider2D));
215
+ }
216
+ }
217
+
218
+ [UnityTest]
219
+ public IEnumerator DestroyAllChildGameObjects()
220
+ {
221
+ GameObject one = new("1");
222
+ GameObject two = new("2");
223
+ two.transform.SetParent(one.transform);
224
+ GameObject three = new("3");
225
+ three.transform.SetParent(two.transform);
226
+ GameObject four = new("4");
227
+ four.transform.SetParent(three.transform);
228
+
229
+ // Act
230
+ two.DestroyAllChildrenGameObjects();
231
+ yield return null;
232
+
233
+ Assert.IsTrue(one != null);
234
+ Assert.IsTrue(two != null);
235
+ Assert.IsTrue(three == null);
236
+ Assert.IsTrue(four == null);
237
+
238
+ three = new GameObject("3");
239
+ three.transform.SetParent(two.transform);
240
+ four = new GameObject("4");
241
+ four.transform.SetParent(three.transform);
242
+
243
+ // Act
244
+ one.DestroyAllChildrenGameObjects();
245
+ yield return null;
246
+
247
+ Assert.IsTrue(one != null);
248
+ Assert.IsTrue(two == null);
249
+ Assert.IsTrue(three == null);
250
+ Assert.IsTrue(four == null);
251
+ }
252
+
253
+ [UnityTest]
254
+ public IEnumerator DestroyAllComponentsOfType()
255
+ {
256
+ GameObject one = New("1");
257
+ Assert.AreEqual(4, one.GetComponents<ObjectHelperComponent>().Length);
258
+
259
+ GameObject two = New("2");
260
+ two.transform.SetParent(one.transform);
261
+
262
+ one.DestroyAllComponentsOfType<ObjectHelperComponent>();
263
+ yield return null;
264
+ Assert.AreEqual(0, one.GetComponents<ObjectHelperComponent>().Length);
265
+ Assert.IsTrue(one.GetComponent<SpriteRenderer>() != null);
266
+ Assert.AreEqual(4, two.GetComponents<ObjectHelperComponent>().Length);
267
+
268
+ two.DestroyAllComponentsOfType<ObjectHelperComponent>();
269
+ yield return null;
270
+ Assert.AreEqual(0, one.GetComponents<ObjectHelperComponent>().Length);
271
+ Assert.IsTrue(one.GetComponent<SpriteRenderer>() != null);
272
+ Assert.AreEqual(0, two.GetComponents<ObjectHelperComponent>().Length);
273
+ Assert.IsTrue(two.GetComponent<SpriteRenderer>() != null);
274
+
275
+ GameObject New(string name)
276
+ {
277
+ return new GameObject(
278
+ name,
279
+ typeof(SpriteRenderer),
280
+ typeof(ObjectHelperComponent),
281
+ typeof(ObjectHelperComponent),
282
+ typeof(ObjectHelperComponent),
283
+ typeof(ObjectHelperComponent)
284
+ );
285
+ }
286
+ }
287
+
288
+ [UnityTest]
289
+ public IEnumerator SmartDestroy()
290
+ {
291
+ GameObject one = new("1");
292
+
293
+ one.SmartDestroy();
294
+ yield return null;
295
+ Assert.IsTrue(one == null);
296
+
297
+ GameObject two = new("2");
298
+ two.SmartDestroy(1.5f);
299
+ yield return null;
300
+ Assert.IsTrue(two != null);
301
+ yield return new WaitForSeconds(1.6f);
302
+
303
+ Assert.IsTrue(two == null);
304
+ }
305
+
306
+ [UnityTest]
307
+ public IEnumerator DestroyAllChildrenGameObjectsImmediatelyConditionally()
308
+ {
309
+ GameObject one = new("1");
310
+ GameObject two = new("2");
311
+ two.transform.SetParent(one.transform);
312
+ GameObject three = new("3");
313
+ three.transform.SetParent(two.transform);
314
+ GameObject four = new("4");
315
+ four.transform.SetParent(two.transform);
316
+
317
+ two.DestroyAllChildrenGameObjectsImmediatelyConditionally(go => go == four);
318
+ Assert.IsTrue(one != null);
319
+ Assert.IsTrue(two != null);
320
+ Assert.IsTrue(three != null);
321
+ Assert.IsTrue(four == null);
322
+
323
+ one.DestroyAllChildrenGameObjectsImmediatelyConditionally(go => go != two);
324
+ Assert.IsTrue(one != null);
325
+ Assert.IsTrue(two != null);
326
+ Assert.IsTrue(three != null);
327
+ Assert.IsTrue(four == null);
328
+
329
+ one.DestroyAllChildrenGameObjectsImmediatelyConditionally(go => go == two);
330
+ Assert.IsTrue(one != null);
331
+ Assert.IsTrue(two == null);
332
+ Assert.IsTrue(three == null);
333
+ Assert.IsTrue(four == null);
334
+
335
+ yield break;
336
+ }
337
+
338
+ [UnityTest]
339
+ public IEnumerator DestroyAllChildGameObjectsConditionally()
340
+ {
341
+ GameObject one = new("1");
342
+ GameObject two = new("2");
343
+ two.transform.SetParent(one.transform);
344
+ GameObject three = new("3");
345
+ three.transform.SetParent(two.transform);
346
+ GameObject four = new("4");
347
+ four.transform.SetParent(two.transform);
348
+
349
+ two.DestroyAllChildGameObjectsConditionally(go => go == four);
350
+ yield return null;
351
+ Assert.IsTrue(one != null);
352
+ Assert.IsTrue(two != null);
353
+ Assert.IsTrue(three != null);
354
+ Assert.IsTrue(four == null);
355
+
356
+ one.DestroyAllChildGameObjectsConditionally(go => go != two);
357
+ yield return null;
358
+ Assert.IsTrue(one != null);
359
+ Assert.IsTrue(two != null);
360
+ Assert.IsTrue(three != null);
361
+ Assert.IsTrue(four == null);
362
+
363
+ one.DestroyAllChildGameObjectsConditionally(go => go == two);
364
+ yield return null;
365
+ Assert.IsTrue(one != null);
366
+ Assert.IsTrue(two == null);
367
+ Assert.IsTrue(three == null);
368
+ Assert.IsTrue(four == null);
369
+ }
370
+
371
+ [UnityTest]
372
+ public IEnumerator DestroyAllChildrenGameObjectsImmediately()
373
+ {
374
+ GameObject one = new("1");
375
+ GameObject two = new("2");
376
+ two.transform.SetParent(one.transform);
377
+ GameObject three = new("3");
378
+ three.transform.SetParent(two.transform);
379
+ GameObject four = new("4");
380
+ four.transform.SetParent(two.transform);
381
+
382
+ two.DestroyAllChildrenGameObjectsImmediately();
383
+ Assert.IsTrue(one != null);
384
+ Assert.IsTrue(two != null);
385
+ Assert.IsTrue(three == null);
386
+ Assert.IsTrue(four == null);
387
+
388
+ three = new GameObject("3");
389
+ three.transform.SetParent(two.transform);
390
+ four = new("4");
391
+ four.transform.SetParent(two.transform);
392
+
393
+ one.DestroyAllChildrenGameObjectsImmediately();
394
+ Assert.IsTrue(one != null);
395
+ Assert.IsTrue(two == null);
396
+ Assert.IsTrue(three == null);
397
+ Assert.IsTrue(four == null);
398
+
399
+ yield break;
400
+ }
401
+ }
402
+ }
@@ -0,0 +1,3 @@
1
+ fileFormatVersion: 2
2
+ guid: 7cff29f44c1e49f1bc4149eeacea7b9b
3
+ timeCreated: 1732646804
@@ -12,8 +12,12 @@
12
12
  {
13
13
  TimeSpan timeout = TimeSpan.FromSeconds(1.125);
14
14
 
15
- UnityEngine.Debug.Log($"| Random | Next | NextFloat | NextDouble |");
16
- UnityEngine.Debug.Log($"| ------ | ---- | --------- | ---------- |");
15
+ UnityEngine.Debug.Log(
16
+ $"| Random | NextBool | Next | NextUInt | NextFloat | NextDouble | NextUint - Range | "
17
+ );
18
+ UnityEngine.Debug.Log(
19
+ $"| ------ | -------- | ---- | -------- | --------- | ---------- | ---------------- |"
20
+ );
17
21
 
18
22
  RunTest(new PcgRandom(), timeout);
19
23
  RunTest(new SystemRandom(), timeout);
@@ -26,12 +30,21 @@
26
30
  private static void RunTest<T>(T random, TimeSpan timeout)
27
31
  where T : IRandom
28
32
  {
33
+ int nextBool = RunNextBool(timeout, random);
29
34
  int nextInt = RunNext(timeout, random);
35
+ int nextUint = RunNextUint(timeout, random);
30
36
  int nextFloat = RunNextFloat(timeout, random);
31
37
  int nextDouble = RunNextDouble(timeout, random);
38
+ int nextUintRange = RunNextUintRange(timeout, random);
32
39
 
33
40
  UnityEngine.Debug.Log(
34
- $"| {random.GetType().Name} | {(nextInt / timeout.TotalSeconds):N0} | {(nextFloat / timeout.TotalSeconds):N0} | {(nextDouble / timeout.TotalSeconds):N0} |"
41
+ $"| {random.GetType().Name} | "
42
+ + $"{(nextBool / timeout.TotalSeconds):N0} | "
43
+ + $"{(nextInt / timeout.TotalSeconds):N0} | "
44
+ + $"{(nextUint / timeout.TotalSeconds):N0} | "
45
+ + $"{(nextFloat / timeout.TotalSeconds):N0} | "
46
+ + $"{(nextDouble / timeout.TotalSeconds):N0} |"
47
+ + $"{(nextUintRange / timeout.TotalSeconds):N0} |"
35
48
  );
36
49
  }
37
50
 
@@ -50,6 +63,48 @@
50
63
  return count;
51
64
  }
52
65
 
66
+ private static int RunNextBool<T>(TimeSpan timeout, T random)
67
+ where T : IRandom
68
+ {
69
+ int count = 0;
70
+ Stopwatch timer = Stopwatch.StartNew();
71
+ do
72
+ {
73
+ _ = random.NextBool();
74
+ ++count;
75
+ } while (timer.Elapsed < timeout);
76
+
77
+ return count;
78
+ }
79
+
80
+ private static int RunNextUint<T>(TimeSpan timeout, T random)
81
+ where T : IRandom
82
+ {
83
+ int count = 0;
84
+ Stopwatch timer = Stopwatch.StartNew();
85
+ do
86
+ {
87
+ _ = random.NextUint();
88
+ ++count;
89
+ } while (timer.Elapsed < timeout);
90
+
91
+ return count;
92
+ }
93
+
94
+ private static int RunNextUintRange<T>(TimeSpan timeout, T random)
95
+ where T : IRandom
96
+ {
97
+ int count = 0;
98
+ Stopwatch timer = Stopwatch.StartNew();
99
+ do
100
+ {
101
+ _ = random.NextUint(1_000);
102
+ ++count;
103
+ } while (timer.Elapsed < timeout);
104
+
105
+ return count;
106
+ }
107
+
53
108
  private static int RunNextFloat<T>(TimeSpan timeout, T random)
54
109
  where T : IRandom
55
110
  {