Skip to content

Commit

Permalink
Merge pull request #3 from mrstebo/feature/number-faker
Browse files Browse the repository at this point in the history
Feature/number faker
  • Loading branch information
mrstebo committed Oct 3, 2018
2 parents c8b6202 + 684e571 commit 333e223
Show file tree
Hide file tree
Showing 22 changed files with 548 additions and 92 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ Contents
- [Faker.App](doc/app.md)
- [Faker.Fake](doc/fake.md)
- [Faker.Name](doc/name.md)
- [Faker.Number](doc/number.md)
- [Faker.Random](doc/random.md)

## Installing
Expand Down
4 changes: 2 additions & 2 deletions appveyor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ after_test:
- nuget install OpenCover -Version 4.6.519 -OutputDirectory tools
- nuget install coveralls.net -Version 0.7.0 -OutputDirectory tools
- ps: >-
.\tools\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -filter:"+[FakerDotNet*]* -[FakerDotNet.Tests*]*" -target:"C:\Program Files\dotnet\dotnet.exe" -targetargs:"test -f netcoreapp2.0 tests\FakerDotNet.Tests\FakerDotNet.Tests.csproj" -output:opencoverCoverage.xml -mergeoutput -hideskipped:File -oldStyle -searchdirs:tests\FakerDotNet.Tests\bin\$env:CONFIGURATION\netcoreapp2.0
.\tools\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user -filter:"+[FakerDotNet*]* -[FakerDotNet.Tests*]* -[FakerDotNet.Wrappers*]*" -target:"C:\Program Files\dotnet\dotnet.exe" -targetargs:"test -f netcoreapp2.0 tests\FakerDotNet.Tests\FakerDotNet.Tests.csproj" -output:opencoverCoverage.xml -mergeoutput -hideskipped:File -oldStyle -searchdirs:tests\FakerDotNet.Tests\bin\$env:CONFIGURATION\netcoreapp2.0
$coveralls = (Resolve-Path "tools/coveralls.net.*/tools/csmacnz.coveralls.exe").ToString()
Expand All @@ -55,4 +55,4 @@ deploy:
- provider: Environment
name: Public NuGet Feed
on:
appveyor_repo_tag: true
appveyor_repo_tag: true
25 changes: 25 additions & 0 deletions doc/number.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Faker.Number

```js
Faker.Number.Number(10) //=> "1968353479"

Faker.Number.LeadingZeroNumber(10) //=> "0669336915"

Faker.Number.Decimal(2) //=> "11.88"

Faker.Number.Decimal(2, 3) //=> "18.843"

Faker.Number.Normal(50, 3.5) //=> 47.14669604069156

Faker.Number.Hexadecimal(3) //=> "e74"

Faker.Number.Between(1, 10) //=> 7

Faker.Number.Positive() //=> 235.59238499107653

Faker.Number.Negative() //=> -4480.042585669558

Faker.Number.NonZeroDigit() //=> "8"

Faker.Number.Digit() //=> "1"
```
2 changes: 1 addition & 1 deletion src/FakerDotNet/Data/AppData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,4 +99,4 @@ internal class AppData
"#.#."
};
}
}
}
1 change: 1 addition & 0 deletions src/FakerDotNet/Faker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public static class Faker
public static IAppFaker App { get; } = Container.App;
public static IFakeFaker Fake { get; } = Container.Fake;
public static INameFaker Name { get; } = Container.Name;
public static INumberFaker Number { get; } = Container.Number;
public static IRandomFaker Random { get; } = Container.Random;
}
}
13 changes: 8 additions & 5 deletions src/FakerDotNet/FakerContainer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,25 @@ internal interface IFakerContainer
IAppFaker App { get; }
IFakeFaker Fake { get; }
INameFaker Name { get; }
INumberFaker Number { get; }
IRandomFaker Random { get; }
}

internal class FakerContainer : IFakerContainer
{
public IAppFaker App { get; }
public IFakeFaker Fake { get; }
public INameFaker Name { get; }
public IRandomFaker Random { get; }

public FakerContainer()
{
App = new AppFaker(this);
Fake = new FakeFaker(this);
Name = new NameFaker(this);
Number = new NumberFaker();
Random = new RandomFaker();
}

public IAppFaker App { get; }
public IFakeFaker Fake { get; }
public INameFaker Name { get; }
public INumberFaker Number { get; }
public IRandomFaker Random { get; }
}
}
2 changes: 1 addition & 1 deletion src/FakerDotNet/Fakers/AppFaker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,4 @@ public string Author()
return $"{_fakerContainer.Name.FirstName()} {_fakerContainer.Name.LastName()}";
}
}
}
}
4 changes: 2 additions & 2 deletions src/FakerDotNet/Fakers/FakeFaker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public FakeFaker(IFakerContainer fakerContainer)
public string F(string format)
{
if (string.IsNullOrEmpty(format)) throw new FormatException("A string must be specified");

var result = format;
Match match;
while ((match = Regex.Match(result, @"\{(\w+).(\w+)\}")).Success)
Expand Down Expand Up @@ -60,4 +60,4 @@ private static (string faker, string method) ExtractMatchDataFrom(Match match)
return (className, methodName);
}
}
}
}
6 changes: 3 additions & 3 deletions src/FakerDotNet/Fakers/NameFaker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@ public interface INameFaker
internal class NameFaker : INameFaker
{
private static readonly NameData Data = new NameData();

private readonly IFakerContainer _fakerContainer;

public NameFaker(IFakerContainer fakerContainer)
{
_fakerContainer = fakerContainer;
}

public string Name()
{
return $"{FirstName()} {LastName()}";
Expand Down Expand Up @@ -62,4 +62,4 @@ public string Title()
_fakerContainer.Random.Element(Data.TitleJobs));
}
}
}
}
107 changes: 107 additions & 0 deletions src/FakerDotNet/Fakers/NumberFaker.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
using System;
using System.Linq;
using System.Text;
using FakerDotNet.Wrappers;

namespace FakerDotNet.Fakers
{
public interface INumberFaker
{
string Number(int digits = 10);
string LeadingZeroNumber(int digits = 10);
string Decimal(int leftDigits = 5, int rightDigits = 2);
double Normal(int mean = 1, int standardDeviation = 1);
string Hexadecimal(int digits = 6);
double Between(double min, double max);
double Within(Range<double> range);
double Positive(double from = 1.00D, double to = 5000.00D);
double Negative(double from = -5000.00D, double to = -1.00D);
string NonZeroDigit();
string Digit();
}

internal class NumberFaker : INumberFaker
{
private readonly IRandomWrapper _randomWrapper;

public NumberFaker()
: this(new RandomWrapper())
{
}

internal NumberFaker(IRandomWrapper randomWrapper)
{
_randomWrapper = randomWrapper;
}

public string Number(int digits = 10)
{
var sb = new StringBuilder();

if (digits > 1)
{
sb.Append(NonZeroDigit());
digits--;
}
sb.Append(LeadingZeroNumber(digits));

return sb.ToString();
}

public string LeadingZeroNumber(int digits = 10)
{
return string.Join("", Enumerable.Range(0, digits).Select(_ => _randomWrapper.Next(0, 9)));
}

public string Decimal(int leftDigits = 5, int rightDigits = 2)
{
return $"{Number(leftDigits)}.{Number(rightDigits)}";
}

public double Normal(int mean = 1, int standardDeviation = 1)
{
var theta = 2 * Math.PI * _randomWrapper.NextDouble();
var rho = Math.Sqrt(-2 * Math.Log(1 - +_randomWrapper.NextDouble()));
var scale = standardDeviation * rho;
return mean + scale * Math.Cos(theta);
}

public string Hexadecimal(int digits = 6)
{
return string.Join("", Enumerable.Range(0, digits).Select(_ => int.Parse(Digit()).ToString("X")));
}

public double Between(double min, double max)
{
var realMin = Math.Min(min, max);
var realMax = Math.Max(min, max);

return _randomWrapper.NextDouble() * (realMax - realMin) + realMin;
}

public double Within(Range<double> range)
{
return Between(range.Minimum, range.Maximum);
}

public double Positive(double from = 1.00D, double to = 5000.00D)
{
return Between(from, to);
}

public double Negative(double from = -5000.00D, double to = -1.00D)
{
return Between(from, to);
}

public string NonZeroDigit()
{
return Convert.ToString(_randomWrapper.Next(1, 9));
}

public string Digit()
{
return Convert.ToString(_randomWrapper.Next(0, 9));
}
}
}
4 changes: 2 additions & 2 deletions src/FakerDotNet/Fakers/RandomFaker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public interface IRandomFaker
internal class RandomFaker : IRandomFaker
{
private static readonly Random RNG = new Random();

public T Element<T>(IEnumerable<T> collection)
{
// ReSharper disable PossibleMultipleEnumeration
Expand All @@ -22,4 +22,4 @@ public T Element<T>(IEnumerable<T> collection)
// ReSharper restore PossibleMultipleEnumeration
}
}
}
}
2 changes: 1 addition & 1 deletion src/FakerDotNet/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@
[assembly: AssemblyFileVersion("1.0.0.0")]

[assembly: InternalsVisibleTo("FakerDotNet.Tests")]
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
14 changes: 14 additions & 0 deletions src/FakerDotNet/Range.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace FakerDotNet
{
public sealed class Range<T> where T : struct
{
public T Minimum { get; }
public T Maximum { get; }

public Range(T minimum, T maximum)
{
Minimum = minimum;
Maximum = maximum;
}
}
}
21 changes: 21 additions & 0 deletions src/FakerDotNet/Wrappers/RandomWrapper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using System;
using System.Diagnostics.CodeAnalysis;

namespace FakerDotNet.Wrappers
{
internal interface IRandomWrapper
{
int Next(int min, int max);
double NextDouble();
}

[ExcludeFromCodeCoverage]
internal class RandomWrapper : IRandomWrapper
{
private static readonly Random RandomInstance = new Random();

public int Next(int min, int max) => RandomInstance.Next(min, max);

public double NextDouble() => RandomInstance.NextDouble();
}
}
6 changes: 6 additions & 0 deletions tests/FakerDotNet.Tests/FakerContainerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@ public void Name_returns_INameFaker()
Assert.IsInstanceOf<INameFaker>(_fakerContainer.Name);
}

[Test]
public void Number_returns_INumberFaker()
{
Assert.IsInstanceOf<INumberFaker>(_fakerContainer.Number);
}

[Test]
public void Random_returns_IRandomFaker()
{
Expand Down
6 changes: 6 additions & 0 deletions tests/FakerDotNet.Tests/FakerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@ public void Name_returns_INameFaker()
Assert.IsInstanceOf<INameFaker>(Faker.Name);
}

[Test]
public void Number_returns_INumberFaker()
{
Assert.IsInstanceOf<INumberFaker>(Faker.Number);
}

[Test]
public void Random_returns_IRandomFaker()
{
Expand Down
31 changes: 17 additions & 14 deletions tests/FakerDotNet.Tests/Fakers/AppFakerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,32 @@ namespace FakerDotNet.Tests.Fakers
[Parallelizable]
public class AppFakerTests
{
private static readonly AppData Data = new AppData();

[SetUp]
public void SetUp()
{
_fakerContainer = A.Fake<IFakerContainer>();
_appFaker = new AppFaker(_fakerContainer);
}

private static readonly AppData Data = new AppData();

private IFakerContainer _fakerContainer;
private IAppFaker _appFaker;

[Test]
public void Author_returns_a_full_name()
{
A.CallTo(() => _fakerContainer.Name.FirstName()).Returns("John");
A.CallTo(() => _fakerContainer.Name.LastName()).Returns("Smith");

Assert.AreEqual("John Smith", _appFaker.Author());
}

[Test]
public void Name_returns_a_name()
{
A.CallTo(() => _fakerContainer.Random.Element(A<IEnumerable<string>>.That.IsSameSequenceAs(Data.Names)))
A.CallTo(() => _fakerContainer.Random.Element(
A<IEnumerable<string>>.That.IsSameSequenceAs(Data.Names)))
.Returns("My App");

Assert.AreEqual("My App", _appFaker.Name());
Expand All @@ -37,21 +47,14 @@ public void Version_returns_a_formatted_version()
{
var numbers = Enumerable.Range(0, 9);

A.CallTo(() => _fakerContainer.Random.Element(A<IEnumerable<string>>.That.IsSameSequenceAs(Data.Versions)))
A.CallTo(() => _fakerContainer.Random.Element(
A<IEnumerable<string>>.That.IsSameSequenceAs(Data.Versions)))
.Returns("0.#.#");
A.CallTo(() => _fakerContainer.Random.Element(A<IEnumerable<int>>.That.IsSameSequenceAs(numbers)))
A.CallTo(() => _fakerContainer.Random.Element(
A<IEnumerable<int>>.That.IsSameSequenceAs(numbers)))
.ReturnsNextFromSequence(1, 2);

Assert.AreEqual("0.1.2", _appFaker.Version());
}

[Test]
public void Author_returns_a_full_name()
{
A.CallTo(() => _fakerContainer.Name.FirstName()).Returns("John");
A.CallTo(() => _fakerContainer.Name.LastName()).Returns("Smith");

Assert.AreEqual("John Smith", _appFaker.Author());
}
}
}
Loading

0 comments on commit 333e223

Please sign in to comment.