Skip to content

Commit

Permalink
Changed implementation of ProbabilitiesMatter to call PickOne() and a…
Browse files Browse the repository at this point in the history
…lso Pick(n).

This made 1 test redundant.
  • Loading branch information
ndsvw committed Mar 16, 2024
1 parent 5b71913 commit d9b3ced
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 31 deletions.
21 changes: 0 additions & 21 deletions FluentRandomPicker.Tests/PrioritizedElementsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,27 +44,6 @@ public void Weight3ValuesWith3DifferentWeights_WeightsMatter()
Assert.That.ProbabilitiesMatter(pickable, valueChancesPairs: valueChancesPairs);
}

[TestMethod]
public void Weight3ValuesWith3DifferentWeights_PickN_WeightsMatter()
{
var elements = new PrioritizedElement<char>[]
{
new PrioritizedElement<char> {Value = 'a', Priority = 7},
new PrioritizedElement<char> {Value = 'b', Priority = 2},
new PrioritizedElement<char> {Value = 'c', Priority = 1},
};

var pickable = Out.Of()
.PrioritizedElements(elements)
.WithValueSelector(x => x.Value)
.AndWeightSelector(x => x.Priority);

var valueChancesPairs = new[] { ('a', 0.7), ('b', 0.2), ('c', 0.1) };

Assert.That.PickNProbabilitiesMatter(pickable, valueChancesPairs: valueChancesPairs);
}


[TestMethod]
public void Percentage3ValuesWith3DifferentPercentages_PercentagesMatter()
{
Expand Down
25 changes: 15 additions & 10 deletions FluentRandomPicker.Tests/TestUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ public static void AssertAllSpecifiedValuesAndNoOthersArePossible<T>(Func<T> pic

public static void ProbabilitiesMatter<T>(this Assert assert, IPick<T> pickable,
int tries = 1_000_000, double acceptedDeviation = 0.25, params (T value, double chance)[] valueChancesPairs)
{
Assert.That.PickOneProbabilitiesMatter(pickable, tries, acceptedDeviation, valueChancesPairs);
Assert.That.PickNProbabilitiesMatter(pickable, tries, acceptedDeviation, valueChancesPairs);
}

private static void PickOneProbabilitiesMatter<T>(this Assert assert, IPick<T> pickable,
int tries = 1_000_000, double acceptedDeviation = 0.25, params (T value, double chance)[] valueChancesPairs)
{
var occurrences = new Dictionary<T, long>();

Expand All @@ -37,29 +44,27 @@ public static void ProbabilitiesMatter<T>(this Assert assert, IPick<T> pickable,
occurrences.Add(value, 1);
}

foreach(var (value, chance) in valueChancesPairs)
{
if (chance == 0 && !occurrences.ContainsKey(value))
continue;

Assert.IsTrue(occurrences[value] >= tries * chance * (1 - acceptedDeviation));
Assert.IsTrue(occurrences[value] <= tries * chance * (1 + acceptedDeviation));
}
Assert.That.EvaluateOccurrences(occurrences, tries, acceptedDeviation, valueChancesPairs);
}

public static void PickNProbabilitiesMatter<T>(this Assert _, IPick<T> pickable, int tries = 1_000_000,
private static void PickNProbabilitiesMatter<T>(this Assert _, IPick<T> pickable, int tries = 1_000_000,
double acceptedDeviation = 0.25, params (T value, double chance)[] valueChancesPairs)
{
var occurrences = new Dictionary<T, long>(valueChancesPairs.Length);

foreach (T value in pickable.Pick(tries))
foreach (var value in pickable.Pick(tries))
{
if (occurrences.ContainsKey(value))
occurrences[value]++;
else
occurrences.Add(value, 1);
}

Assert.That.EvaluateOccurrences(occurrences, tries, acceptedDeviation, valueChancesPairs);
}

private static void EvaluateOccurrences<T>(this Assert _, Dictionary<T, long> occurrences, int tries, double acceptedDeviation, params (T value, double chance)[] valueChancesPairs)
{
foreach(var (value, chance) in valueChancesPairs)
{
if (chance == 0 && !occurrences.ContainsKey(value))
Expand Down

0 comments on commit d9b3ced

Please sign in to comment.