FastRng/FastRngTests/Double/MultiThreadedRngTests.cs

288 lines
11 KiB
C#
Raw Normal View History

2020-09-24 18:22:17 +00:00
using System;
using System.Diagnostics.CodeAnalysis;
2020-09-26 11:32:27 +00:00
using System.Threading;
2020-09-24 18:22:17 +00:00
using System.Threading.Tasks;
2020-09-26 09:40:01 +00:00
using FastRng.Double;
using FastRng.Double.Distributions;
2020-09-24 18:22:17 +00:00
using NUnit.Framework;
2020-09-26 09:42:38 +00:00
namespace FastRngTests.Double
2020-09-24 18:22:17 +00:00
{
[ExcludeFromCodeCoverage]
public class MultiThreadedRngTests
{
private readonly IRandom rng = new MultiThreadedRng();
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public async Task TestRange01Uint()
{
2020-09-25 22:05:41 +00:00
var dist = new Uniform();
2020-09-24 18:22:17 +00:00
for (uint n = 0; n < 1_000_000; n++)
2020-09-25 22:05:41 +00:00
Assert.That(await rng.NextNumber(n, 100_000 + n, dist), Is.InRange(n, 100_000 + n));
2020-09-24 18:22:17 +00:00
}
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public async Task TestRange01Ulong()
{
2020-09-25 22:05:41 +00:00
var dist = new Uniform();
2020-09-24 18:22:17 +00:00
for (ulong n = 0; n < 1_000_000; n++)
2020-09-25 22:05:41 +00:00
Assert.That(await rng.NextNumber(n, 100_000 + n, dist), Is.InRange(n, 100_000 + n));
2020-09-24 18:22:17 +00:00
}
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public async Task TestRange01Float()
{
2020-09-25 22:05:41 +00:00
var dist = new Uniform();
2020-09-26 10:51:49 +00:00
for (var n = 0.0; n < 1e6; n++)
2020-09-25 22:05:41 +00:00
Assert.That(await rng.NextNumber(n, 100_000 + n, dist), Is.InRange(n, 100_000 + n));
2020-09-24 18:22:17 +00:00
}
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public async Task TestRange02Uint()
{
2020-09-25 22:05:41 +00:00
var dist = new Uniform();
Assert.That(await rng.NextNumber(5, 5, dist), Is.EqualTo(5));
Assert.That(await rng.NextNumber(0, 0, dist), Is.EqualTo(0));
Assert.That(await rng.NextNumber(3_000_000_000, 3_000_000_000, dist), Is.EqualTo(3_000_000_000));
2020-09-24 18:22:17 +00:00
}
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public async Task TestRange02Ulong()
{
2020-09-25 22:05:41 +00:00
var dist = new Uniform();
Assert.That(await rng.NextNumber(5UL, 5, dist), Is.EqualTo(5));
Assert.That(await rng.NextNumber(0UL, 0, dist), Is.EqualTo(0));
Assert.That(await rng.NextNumber(3_000_000_000UL, 3_000_000_000, dist), Is.EqualTo(3_000_000_000));
2020-09-24 18:22:17 +00:00
}
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public async Task TestRange02Float()
{
2020-09-25 22:05:41 +00:00
var dist = new Uniform();
Assert.That(await rng.NextNumber(5f, 5f, dist), Is.EqualTo(5));
Assert.That(await rng.NextNumber(0f, 0f, dist), Is.EqualTo(0));
2020-09-26 10:51:49 +00:00
Assert.That(await rng.NextNumber(3e9, 3e9, dist), Is.EqualTo(3e9));
2020-09-24 18:22:17 +00:00
}
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public async Task TestRange03Uint()
{
2020-09-25 22:05:41 +00:00
var dist = new Uniform();
Assert.That(await rng.NextNumber(5, 6, dist), Is.InRange(5, 6));
Assert.That(await rng.NextNumber(0, 1, dist), Is.InRange(0, 1));
Assert.That(await rng.NextNumber(3_000_000_000, 3_000_000_002, dist), Is.InRange(3_000_000_000, 3_000_000_002));
2020-09-24 18:22:17 +00:00
}
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public async Task TestRange03Ulong()
{
2020-09-25 22:05:41 +00:00
var dist = new Uniform();
Assert.That(await rng.NextNumber(5UL, 6, dist), Is.InRange(5, 6));
Assert.That(await rng.NextNumber(0UL, 1, dist), Is.InRange(0, 1));
Assert.That(await rng.NextNumber(3_000_000_000UL, 3_000_000_002, dist), Is.InRange(3_000_000_000, 3_000_000_002));
2020-09-24 18:22:17 +00:00
}
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public async Task TestRange03Float()
{
2020-09-25 22:05:41 +00:00
var dist = new Uniform();
Assert.That(await rng.NextNumber(5f, 6, dist), Is.InRange(5, 6));
Assert.That(await rng.NextNumber(0f, 1, dist), Is.InRange(0, 1));
2020-09-26 10:51:49 +00:00
Assert.That(await rng.NextNumber(3e9, 3e9+2, dist), Is.InRange(3e9, 3e9+2));
2020-09-24 18:22:17 +00:00
}
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public async Task TestRange04Uint()
{
2020-09-25 22:05:41 +00:00
var dist = new Uniform();
Assert.That(await rng.NextNumber(10, 1, dist), Is.InRange(1, 10));
Assert.That(await rng.NextNumber(20, 1, dist), Is.InRange(1, 20));
2020-09-24 18:22:17 +00:00
}
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public async Task TestRange04Ulong()
{
2020-09-25 22:05:41 +00:00
var dist = new Uniform();
Assert.That(await rng.NextNumber(10UL, 1, dist), Is.InRange(1, 10));
Assert.That(await rng.NextNumber(20UL, 1, dist), Is.InRange(1, 20));
2020-09-24 18:22:17 +00:00
}
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public async Task TestRange04Float()
{
2020-09-25 22:05:41 +00:00
var dist = new Uniform();
2020-09-26 10:51:49 +00:00
Assert.That(await rng.NextNumber(10.0, 1, dist), Is.InRange(1, 10));
Assert.That(await rng.NextNumber(20.0, 1, dist), Is.InRange(1, 20));
2020-09-24 18:22:17 +00:00
}
2020-09-26 11:32:27 +00:00
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public async Task TestStoppingProducers01()
{
var rng = new MultiThreadedRng();
rng.StopProducer();
var masterToken = new CancellationTokenSource(TimeSpan.FromSeconds(16)).Token;
var wasCanceled = false;
while(true)
{
var tokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(3));
await rng.GetUniform(tokenSource.Token);
if (tokenSource.IsCancellationRequested)
{
wasCanceled = true;
break;
}
if (masterToken.IsCancellationRequested)
{
break;
}
}
Assert.That(masterToken.IsCancellationRequested, Is.False, "Master token was used to stop test");
Assert.That(wasCanceled, Is.True, "The consumer was not canceled");
2020-09-26 12:23:47 +00:00
var tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3));
2020-10-31 18:44:18 +00:00
await rng.NextNumber(new NormalS02M05(), tokenSource2.Token);
2020-09-26 12:23:47 +00:00
Assert.That(tokenSource2.IsCancellationRequested, Is.True);
tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3));
2020-10-31 18:44:18 +00:00
await rng.NextNumber(-1d, 1d, new NormalS02M05(), tokenSource2.Token);
2020-09-26 12:23:47 +00:00
Assert.That(tokenSource2.IsCancellationRequested, Is.True);
tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3));
2020-10-31 18:44:18 +00:00
await rng.NextNumber(0u, 6u, new NormalS02M05(), tokenSource2.Token);
2020-09-26 12:23:47 +00:00
Assert.That(tokenSource2.IsCancellationRequested, Is.True);
tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3));
2020-10-31 18:44:18 +00:00
await rng.NextNumber(0ul, 6ul, new NormalS02M05(), tokenSource2.Token);
2020-09-26 12:23:47 +00:00
Assert.That(tokenSource2.IsCancellationRequested, Is.True);
2020-09-26 11:32:27 +00:00
}
2020-09-26 12:02:26 +00:00
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public async Task OneSeed01()
{
var rng1 = new MultiThreadedRng(6);
var rng2 = new MultiThreadedRng(6);
var rng3 = new MultiThreadedRng(7);
var rng1Sample = new double[10];
for (var n = 0; n < rng1Sample.Length; n++)
rng1Sample[n] = await rng1.GetUniform();
var rng2Sample = new double[10];
for (var n = 0; n < rng2Sample.Length; n++)
rng2Sample[n] = await rng2.GetUniform();
var rng3Sample = new double[10];
for (var n = 0; n < rng3Sample.Length; n++)
rng3Sample[n] = await rng3.GetUniform();
rng1.StopProducer();
rng2.StopProducer();
rng3.StopProducer();
Assert.That(rng1Sample, Is.EquivalentTo(rng2Sample));
Assert.That(rng1Sample, Is.Not.EquivalentTo(rng3Sample));
Assert.That(rng2Sample, Is.Not.EquivalentTo(rng3Sample));
}
2020-09-26 12:10:04 +00:00
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public async Task TwoSeeds01()
{
var rng1 = new MultiThreadedRng(3, 6);
var rng2 = new MultiThreadedRng(3, 6);
var rng3 = new MultiThreadedRng(3, 7);
var rng4 = new MultiThreadedRng(6, 3);
var rng1Sample = new double[10];
for (var n = 0; n < rng1Sample.Length; n++)
rng1Sample[n] = await rng1.GetUniform();
var rng2Sample = new double[10];
for (var n = 0; n < rng2Sample.Length; n++)
rng2Sample[n] = await rng2.GetUniform();
var rng3Sample = new double[10];
for (var n = 0; n < rng3Sample.Length; n++)
rng3Sample[n] = await rng3.GetUniform();
var rng4Sample = new double[10];
for (var n = 0; n < rng4Sample.Length; n++)
rng4Sample[n] = await rng4.GetUniform();
rng1.StopProducer();
rng2.StopProducer();
rng3.StopProducer();
rng4.StopProducer();
Assert.That(rng1Sample, Is.EquivalentTo(rng2Sample));
Assert.That(rng1Sample, Is.Not.EquivalentTo(rng3Sample));
Assert.That(rng1Sample, Is.Not.EquivalentTo(rng4Sample));
Assert.That(rng2Sample, Is.Not.EquivalentTo(rng3Sample));
Assert.That(rng2Sample, Is.Not.EquivalentTo(rng4Sample));
Assert.That(rng3Sample, Is.Not.EquivalentTo(rng4Sample));
}
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public async Task NoSeed01()
{
var rng1 = new MultiThreadedRng();
var rng2 = new MultiThreadedRng();
var rng3 = new MultiThreadedRng();
var rng1Sample = new double[10];
for (var n = 0; n < rng1Sample.Length; n++)
rng1Sample[n] = await rng1.GetUniform();
var rng2Sample = new double[10];
for (var n = 0; n < rng2Sample.Length; n++)
rng2Sample[n] = await rng2.GetUniform();
var rng3Sample = new double[10];
for (var n = 0; n < rng3Sample.Length; n++)
rng3Sample[n] = await rng3.GetUniform();
rng1.StopProducer();
rng2.StopProducer();
rng3.StopProducer();
Assert.That(rng1Sample, Is.Not.EquivalentTo(rng2Sample));
Assert.That(rng1Sample, Is.Not.EquivalentTo(rng3Sample));
Assert.That(rng2Sample, Is.Not.EquivalentTo(rng3Sample));
}
2020-09-24 18:22:17 +00:00
}
}