288 lines
11 KiB
C#
288 lines
11 KiB
C#
using System;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using FastRng.Float;
|
|
using FastRng.Float.Distributions;
|
|
using NUnit.Framework;
|
|
|
|
namespace FastRngTests.Float
|
|
{
|
|
[ExcludeFromCodeCoverage]
|
|
public class MultiThreadedRngTests
|
|
{
|
|
private readonly IRandom rng = new MultiThreadedRng();
|
|
|
|
[Test]
|
|
[Category(TestCategories.COVER)]
|
|
[Category(TestCategories.NORMAL)]
|
|
public async Task TestRange01Uint()
|
|
{
|
|
var dist = new Uniform();
|
|
for (uint n = 0; n < 1_000_000; n++)
|
|
Assert.That(await rng.NextNumber(n, 100_000 + n, dist), Is.InRange(n, 100_000 + n));
|
|
}
|
|
|
|
[Test]
|
|
[Category(TestCategories.COVER)]
|
|
[Category(TestCategories.NORMAL)]
|
|
public async Task TestRange01Ulong()
|
|
{
|
|
var dist = new Uniform();
|
|
for (ulong n = 0; n < 1_000_000; n++)
|
|
Assert.That(await rng.NextNumber(n, 100_000 + n, dist), Is.InRange(n, 100_000 + n));
|
|
}
|
|
|
|
[Test]
|
|
[Category(TestCategories.COVER)]
|
|
[Category(TestCategories.NORMAL)]
|
|
public async Task TestRange01Float()
|
|
{
|
|
var dist = new Uniform();
|
|
for (var n = 0.0f; n < 1e6f; n++)
|
|
Assert.That(await rng.NextNumber(n, 100_000 + n, dist), Is.InRange(n, 100_000 + n));
|
|
}
|
|
|
|
[Test]
|
|
[Category(TestCategories.COVER)]
|
|
[Category(TestCategories.NORMAL)]
|
|
public async Task TestRange02Uint()
|
|
{
|
|
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));
|
|
}
|
|
|
|
[Test]
|
|
[Category(TestCategories.COVER)]
|
|
[Category(TestCategories.NORMAL)]
|
|
public async Task TestRange02Ulong()
|
|
{
|
|
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));
|
|
}
|
|
|
|
[Test]
|
|
[Category(TestCategories.COVER)]
|
|
[Category(TestCategories.NORMAL)]
|
|
public async Task TestRange02Float()
|
|
{
|
|
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));
|
|
Assert.That(await rng.NextNumber(3e9f, 3e9f, dist), Is.EqualTo(3e9f));
|
|
}
|
|
|
|
[Test]
|
|
[Category(TestCategories.COVER)]
|
|
[Category(TestCategories.NORMAL)]
|
|
public async Task TestRange03Uint()
|
|
{
|
|
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));
|
|
}
|
|
|
|
[Test]
|
|
[Category(TestCategories.COVER)]
|
|
[Category(TestCategories.NORMAL)]
|
|
public async Task TestRange03Ulong()
|
|
{
|
|
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));
|
|
}
|
|
|
|
[Test]
|
|
[Category(TestCategories.COVER)]
|
|
[Category(TestCategories.NORMAL)]
|
|
public async Task TestRange03Float()
|
|
{
|
|
var dist = new Uniform();
|
|
Assert.That(await rng.NextNumber(5f, 6f, dist), Is.InRange(5f, 6f));
|
|
Assert.That(await rng.NextNumber(0f, 1f, dist), Is.InRange(0f, 1f));
|
|
Assert.That(await rng.NextNumber(3e9f, 3e9f+2f, dist), Is.InRange(3e9f, 3e9f+2f));
|
|
}
|
|
|
|
[Test]
|
|
[Category(TestCategories.COVER)]
|
|
[Category(TestCategories.NORMAL)]
|
|
public async Task TestRange04Uint()
|
|
{
|
|
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));
|
|
}
|
|
|
|
[Test]
|
|
[Category(TestCategories.COVER)]
|
|
[Category(TestCategories.NORMAL)]
|
|
public async Task TestRange04Ulong()
|
|
{
|
|
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));
|
|
}
|
|
|
|
[Test]
|
|
[Category(TestCategories.COVER)]
|
|
[Category(TestCategories.NORMAL)]
|
|
public async Task TestRange04Float()
|
|
{
|
|
var dist = new Uniform();
|
|
Assert.That(await rng.NextNumber(10.0f, 1f, dist), Is.InRange(1f, 10f));
|
|
Assert.That(await rng.NextNumber(20.0f, 1f, dist), Is.InRange(1f, 20f));
|
|
}
|
|
|
|
[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");
|
|
|
|
var tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3));
|
|
await rng.NextNumber(new NormalS02M05(), tokenSource2.Token);
|
|
Assert.That(tokenSource2.IsCancellationRequested, Is.True);
|
|
|
|
tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3));
|
|
await rng.NextNumber(-1f, 1f, new NormalS02M05(), tokenSource2.Token);
|
|
Assert.That(tokenSource2.IsCancellationRequested, Is.True);
|
|
|
|
tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3));
|
|
await rng.NextNumber(0u, 6u, new NormalS02M05(), tokenSource2.Token);
|
|
Assert.That(tokenSource2.IsCancellationRequested, Is.True);
|
|
|
|
tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3));
|
|
await rng.NextNumber(0ul, 6ul, new NormalS02M05(), tokenSource2.Token);
|
|
Assert.That(tokenSource2.IsCancellationRequested, Is.True);
|
|
}
|
|
|
|
[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 float[10];
|
|
for (var n = 0; n < rng1Sample.Length; n++)
|
|
rng1Sample[n] = await rng1.GetUniform();
|
|
|
|
var rng2Sample = new float[10];
|
|
for (var n = 0; n < rng2Sample.Length; n++)
|
|
rng2Sample[n] = await rng2.GetUniform();
|
|
|
|
var rng3Sample = new float[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));
|
|
}
|
|
|
|
[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 float[10];
|
|
for (var n = 0; n < rng1Sample.Length; n++)
|
|
rng1Sample[n] = await rng1.GetUniform();
|
|
|
|
var rng2Sample = new float[10];
|
|
for (var n = 0; n < rng2Sample.Length; n++)
|
|
rng2Sample[n] = await rng2.GetUniform();
|
|
|
|
var rng3Sample = new float[10];
|
|
for (var n = 0; n < rng3Sample.Length; n++)
|
|
rng3Sample[n] = await rng3.GetUniform();
|
|
|
|
var rng4Sample = new float[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 float[10];
|
|
for (var n = 0; n < rng1Sample.Length; n++)
|
|
rng1Sample[n] = await rng1.GetUniform();
|
|
|
|
var rng2Sample = new float[10];
|
|
for (var n = 0; n < rng2Sample.Length; n++)
|
|
rng2Sample[n] = await rng2.GetUniform();
|
|
|
|
var rng3Sample = new float[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));
|
|
}
|
|
}
|
|
} |