Jds.TestingUtils.Randomization
0.4.0-build-20220214-011232-sha-4d58823
See the version list below for details.
dotnet add package Jds.TestingUtils.Randomization --version 0.4.0-build-20220214-011232-sha-4d58823
NuGet\Install-Package Jds.TestingUtils.Randomization -Version 0.4.0-build-20220214-011232-sha-4d58823
<PackageReference Include="Jds.TestingUtils.Randomization" Version="0.4.0-build-20220214-011232-sha-4d58823" />
paket add Jds.TestingUtils.Randomization --version 0.4.0-build-20220214-011232-sha-4d58823
#r "nuget: Jds.TestingUtils.Randomization, 0.4.0-build-20220214-011232-sha-4d58823"
// Install Jds.TestingUtils.Randomization as a Cake Addin #addin nuget:?package=Jds.TestingUtils.Randomization&version=0.4.0-build-20220214-011232-sha-4d58823&prerelease // Install Jds.TestingUtils.Randomization as a Cake Tool #tool nuget:?package=Jds.TestingUtils.Randomization&version=0.4.0-build-20220214-011232-sha-4d58823&prerelease
Testing Utils: Randomization
This collection of randomization test utilities supports creating test arrangements.
How to Use
All examples below use the thread-safe, static
Jds.TestingUtils.Randomization.Randomizer.Shared
instance ofIRandomizationSource
, which generates random values usingSystem.Random.Shared
. ThisIRandomizationSource
is advised for most tests.If a different algorithm is needed, e.g., a cryptographically strong random number generator is required, consider creating a
Jds.TestingUtils.Randomization.ArrangedRandomizationSource
. It uses providedFunc<IEnumerable<>>
delegates to supply values when requested.If a specific set of random-seeming data is needed, consider creating a
Jds.TestingUtils.Randomization.DeterministicRandomizationSource
. It uses providedIEnumerable<>
sources to supply values when requested.
Add Jds.TestingUtils.Randomization
NuGet Package and Add using
Add Jds.TestingUtils.Randomization
NuGet package to the test project.
Add the extensions to your test files with the following using
statement:
using Jds.TestingUtils.Randomization;
All examples below assume the following additional using
statements:
using System;
using System.Collections.Generic;
using System.Linq;
Generate Pseudo-random Numbers
IRandomizationSource.Boolean()
- Gets a pseudo-random
bool
.
- Gets a pseudo-random
IRandomizationSource.Byte()
- Gets a pseudo-random
byte
, greater than or equal tobyte.MinValue
, and less thanbyte.MaxValue
.
- Gets a pseudo-random
IRandomizationSource.ByteInRange(byte minInclusive, byte maxExclusive)
- Gets a pseudo-random
byte
, greater than or equal tominInclusive
, and less thanmaxExclusive
.
- Gets a pseudo-random
IRandomizationSource.Double()
- Gets a pseudo-random
double
, usingIRandomizationSource.NextDouble
. The value should be greater than or equal to0.0
, and less than1.0
.
- Gets a pseudo-random
IRandomizationSource.Float()
- Gets a pseudo-random
float
, usingIRandomizationSource.NextFloat
. The value should be greater than or equal to0.0
, and less than1.0
.
- Gets a pseudo-random
IRandomizationSource.Int()
- Gets a pseudo-random
int
, usingIRandomizationSource.NextIntInRange
. The value should be greater than or equal toint.MinValue
, and less thanint.MaxValue
.
- Gets a pseudo-random
IRandomizationSource.IntInRange(int minInclusive, int maxExclusive)
- Gets a pseudo-random
int
, usingIRandomizationSource.NextIntInRange
. The value should be greater than or equal tominInclusive
, and less thanmaxExclusive
.
- Gets a pseudo-random
IRandomizationSource.IntNegative()
- Gets a pseudo-random
int
, usingIRandomizationSource.NextIntInRange
. The value should be greater than or equal toint.MinValue
, and less than0
.
- Gets a pseudo-random
IRandomizationSource.IntPositive()
- Gets a pseudo-random
int
, usingIRandomizationSource.NextIntInRange
. The value should be greater than or equal to0
, and less thanint.MaxValue
.
- Gets a pseudo-random
IRandomizationSource.Long()
- Gets a pseudo-random
long
, usingIRandomizationSource.NextLongInRange
. The value should be greater than or equal tolong.MinValue
, and less thanlong.MaxValue
.
- Gets a pseudo-random
IRandomizationSource.LongInRange(long minInclusive, long maxExclusive)
- Gets a pseudo-random
long
, usingIRandomizationSource.NextLongInRange
. The value should be greater than or equal tominInclusive
, and less thanmaxExclusive
.
- Gets a pseudo-random
IRandomizationSource.LongNegative()
- Gets a pseudo-random
long
, usingIRandomizationSource.NextLongInRange
. The value should be greater than or equal tolong.MinValue
, and less than0
.
- Gets a pseudo-random
IRandomizationSource.LongPositive()
- Gets a pseudo-random
long
, usingIRandomizationSource.NextLongInRange
. The value should be greater than or equal to0
, and less thanlong.MaxValue
.
- Gets a pseudo-random
Select a Random Item or Enumeration Value
IRandomizationSource.RandomEnumValue<TEnum>()
- Selects a pseudo-random value from the
enum
of type specified (TEnum
). - Example:
Randomizer.Shared.RandomEnumValue<System.Net.HttpStatusCode>()
- Selects a pseudo-random value from the
IRandomizationSource.RandomListItem<T>(IReadOnlyList<T> items)
IReadOnlyList<T>.GetRandomItem<T>()
- Selects a pseudo-random item from provided
items
. - Example:
Randomizer.Shared.RandomListItem(System.Linq.Enumerable.Range(1, 20).ToArray())
- Selects a pseudo-random item from provided
Select a Weighted Random Item or Dictionary Key
IRandomizationSource.RandomListItem<T>(IReadOnlyList<(T Item, double Weight)> weightedItems)
IRandomizationSource.RandomListItem<T>(IReadOnlyList<(T Item, int Weight)> weightedItems)
IReadOnlyList<(T Key, double Weight)>.GetWeightedRandomItem<T>()
IReadOnlyList<(T Key, int Weight)>.GetWeightedRandomItem<T>()
- Selects a pseudo-random
.Item
from providedweightedItems
; item selection is weighted based upon relative.Weight
. - Example:
- Selects a pseudo-random
Randomizer.Shared.WeightedRandomListItem(
new[] { ("Sure", 1000), ("Likely", 500), ("Possible", 200), ("Unlikely", 50), ("Rare", 5), ("Apocryphal", 1) }
);
IRandomizationSource.GetWeightedRandomKey<T>(IReadOnlyDictionary<T, double> weightedKeys)
IRandomizationSource.GetWeightedRandomKey<T>(IReadOnlyDictionary<T, int> weightedKeys)
IReadOnlyDictionary<T, double>.GetWeightedRandomKey<T>()
IReadOnlyDictionary<T, int>.GetWeightedRandomKey<T>()
- Selects a pseudo-random
.Key
from providedweightedItems
; item selection is weighted based upon relative.Value
. - Example:
- Selects a pseudo-random
Randomizer.Shared.WeightedRandomKey(new Dictionary<string, double>
{
{ "North", 0.4 }, { "East", 0.1 }, { "West", 0.1 }, { "South", 0.4 }
});
Generate a Random String
IRandomizationSource.RandomString(int length, IReadOnlyList<char> chars)
- Generates a pseudo-random
string
oflength
characters, using providedchars
. Random selections fromchars
are concatenated until reachinglength
characters.
- Generates a pseudo-random
IRandomizationSource.RandomString(int length, IReadOnlyList<string> strings)
- Generates a pseudo-random
string
oflength
characters, using providedstrings
. Random selections fromstrings
are concatenated until reachinglength
characters. The result is truncated tolength
characters.
- Generates a pseudo-random
IRandomizationSource.RandomStringLatin(int length, bool uppercase = false, bool alphanumeric = false)
- Generates a pseudo-random
string
oflength
characters using ASCII Latin characters. Usesa
-z
by default. Ifuppercase
, usesA
-Z
. Ifalphanumeric
, also includes0
-9
with either casing.
- Generates a pseudo-random
Generate a Mail Address
IRandomizationSource.MailAddress()
IRandomizationSource.MailAddress(int length)
- Generates a pseudo-random
System.Net.Mail.MailAddress
. The generatedSystem.Net.Mail.MailAddress.User
will be adot-atom
form oflocal-part
(see RFC-2822 section 3.4.1). The generatedSystem.Net.Mail.MailAddress.Host
will be adomain
(see RFC-1035 section 2.3.1).
- Generates a pseudo-random
IRandomizationSource.MailAddressAddrSpec(int length)
IRandomizationSource.MailAddressAddrSpec((int LocalPartLength, int DomainLength) componentLengths)
- Generates a pseudo-random
string
according toaddr-spec
(see RFC-2822 section 3.4.1). The generatedlocal-part
will be ofdot-atom
form (see RFC-2822 section 3.4.1). The generateddomain
will be ofdot-atom
form (see RFC-2822 section 3.4.1), and its value will be generated as a RFC-1035 section 2.3.1domain
.
- Generates a pseudo-random
Generate a Domain
IRandomizationSource.DomainName(int length)
IRandomizationSource.DomainName(IReadOnlyList<int> domainLabelLengths)
- Generates a pseudo-random
string
according todomain
(see RFC-1035 section 2.3.1).
- Generates a pseudo-random
Generate a URL
IRandomizationSource.RandomUrl(int hostLength, int pathLength = 0, int queryLength = 0, int fragmentLength = 0, string scheme = "https", int? port = null)
- Generates a pseudo-random
string
URL according to RFC-3986 URI syntax. Thehost
segment is generated usingIRandomizationSource.DomainName(int length)
.
- Generates a pseudo-random
Generate a Sequence of Items from a Markov Chain Model
IRandomizationSource.CreateMarkovGenerator(IReadOnlyCollection<IReadOnlyList<T>> sources, int chainLength = 1) where T : notnull, IEquatable<T>
- Generates a
Func<int, IReadOnlyList<T>>
which accepts anint maxLength
and uses a Markov Chain model, derived fromsources
, to generate sequences ofT
of up to lengthmaxLength
.- The
chainLength
determines how manyT
are grouped to determine Markov Chain probability.
- The
- Generates a
IRandomizationSource.CreateMarkovGenerator(IEnumerable<string> sources, int chainLength = 1)
- Generates a
Func<int, string>
which accepts anint maxLength
and uses a Markov Chain model, derived fromsources
, to generate strings of up to lengthmaxLength
.- The
chainLength
determines how many characters in each inputstring
are grouped to determine Markov Chain probability.
- The
- Example uses: create a random word or name generator using a list of example words or names.
- Example:
- Generates a
var exampleFruitNames = new[]
{
"apple", "apricot", "avocado", "banana", "blackberry", "blackcurrant", "blueberry", "boysenberry", "cantaloupe",
"caper", "cherry", "cranberry", "elderberry", "fig", "gooseberry", "grape", "grapefruit", "guava", "jujube",
"kiwi", "kumquat", "lemon", "lime", "lychee", "mango", "mulberry", "olive", "orange", "papaya", "pear",
"persimmon", "pineapple", "plantain", "plum", "pomegranate", "raspberry", "starfruit", "strawberry", "tangerine",
"watermelon"
};
Func<int, string> fruitGenerator = Randomizer.Shared.CreateMarkovGenerator(sources: exampleFruitNames, chainLength: 2);
string generatedFruit = fruitGenerator(maxLength: 12);
string possiblyLongerGeneratedFruit = fruitGenerator(maxLength: 20);
string likelyShorterGeneratedFruit = fruitGenerator(maxLength: 6);
IRandomizationSource.GenerateRandomMarkov<T>(IReadOnlyCollection<IReadOnlyList<T>> sources, int? maxLength = null, int chainLength = 1)
- Generates a
IReadOnlyList<T>
based upon a Markov Chain model, derived fromsources
..- The
chainLength
determines how many items in each inputIReadOnlyList<T>
are grouped to determine Markov Chain probability.
- The
- Use
IRandomizationSource.CreateMarkovGenerator()
(above), instead of this function, unless only a single value is needed.- The resources needed to generate the Markov Chain model are non-trivial. This function creates a new model each time it is executed, consuming both computational and memory resources.
- Generates a
IRandomizationSource.GenerateRandomMarkov(IEnumerable<string> sources, int? maxLength = null, int chainLength = 1)
- Generates a
string
based upon a Markov Chain model, derived fromsources
..- The
chainLength
determines how many characters in each inputstring
are grouped to determine Markov Chain probability.
- The
- Use
IRandomizationSource.CreateMarkovGenerator()
(above), instead of this function, unless only a single value is needed.- The resources needed to generate the Markov Chain model are non-trivial. This function creates a new model each time it is executed, consuming both computational and memory resources.
- Example uses: create a random word or name generator using a list of example words or names.
- Example:
- Generates a
var exampleFruitNames = new[]
{
"apple", "apricot", "avocado", "banana", "blackberry", "blackcurrant", "blueberry", "boysenberry", "cantaloupe",
"caper", "cherry", "cranberry", "elderberry", "fig", "gooseberry", "grape", "grapefruit", "guava", "jujube",
"kiwi", "kumquat", "lemon", "lime", "lychee", "mango", "mulberry", "olive", "orange", "papaya", "pear",
"persimmon", "pineapple", "plantain", "plum", "pomegranate", "raspberry", "starfruit", "strawberry", "tangerine",
"watermelon"
};
string similarGeneratedFruit = Randomizer.Shared.GenerateRandomMarkov(sources: exampleFruitNames, maxLength: 12, chainLength: 2);
string slightlySimilarGeneratedFruit = Randomizer.Shared.GenerateRandomMarkov(sources: exampleFruitNames, maxLength: 20, chainLength: 1);
string verySimilarGeneratedFruit = Randomizer.Shared.GenerateRandomMarkov(sources: exampleFruitNames, maxLength: 15, chainLength: 3);
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net6.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated | |
---|---|---|---|
0.9.0 | 238 | 10/5/2024 | |
0.8.0 | 726 | 6/25/2024 | |
0.7.0 | 845 | 11/12/2023 | |
0.6.0 | 1,965 | 5/16/2023 | |
0.5.0 | 924 | 1/10/2023 | |
0.5.0-build-20220414-050254... | 205 | 4/14/2022 | |
0.4.0 | 1,377 | 2/19/2022 | |
0.4.0-build-20220214-011232... | 165 | 2/14/2022 | |
0.3.0 | 485 | 2/14/2022 | |
0.3.0-build-20220214-010752... | 181 | 2/14/2022 | |
0.3.0-build-20220214-004124... | 181 | 2/14/2022 | |
0.3.0-build-20220208-010440... | 184 | 2/8/2022 | |
0.2.0 | 405 | 2/8/2022 | |
0.2.0-build-20220208-005756... | 176 | 2/8/2022 | |
0.2.0-build-20220206-223707... | 178 | 2/6/2022 | |
0.2.0-build-20220206-212627... | 202 | 2/6/2022 | |
0.2.0-build-20220204-031004... | 207 | 2/4/2022 | |
0.1.0 | 475 | 2/4/2022 | |
0.1.0-build-20220204-024107... | 201 | 2/4/2022 | |
0.0.0-build-20220204-022926... | 206 | 2/4/2022 | |
0.0.0-build-20220204-021830... | 217 | 2/4/2022 | |
0.0.0-build-20220202-013346... | 209 | 2/2/2022 |