From 92fb2cdac955236145e84235a0f7c49e70c8f296 Mon Sep 17 00:00:00 2001 From: Michael Whelan Date: Thu, 18 Sep 2014 09:23:52 +0100 Subject: [PATCH 1/2] made helper data classes internal, began adding XML comments, renamed some incorrectly named tests, removed Guard class --- .../Generators/RandomGeneratorTests.cs | 4 +- .../Generators/SequentiaGeneratorTests.cs | 8 ++-- .../CompanyEquivalenceClassTests.cs | 2 +- NTestDataBuilder/DataSources/DataSource.cs | 27 ++++++++----- .../FileData/FileDataRepository.cs | 17 +++++++++ ...PersonData.cs => FileDataSourceHelpers.cs} | 38 +++---------------- .../DataSources/FileData/Person.cs | 17 +++++++++ .../DataSources/FirstNameSource.cs | 33 +++++++--------- .../DataSources/FullNameSource.cs | 28 ++++++++++++++ .../DataSources/Generators/IGenerator.cs | 15 ++++++++ .../DataSources/Generators/RandomGenerator.cs | 22 ++++++++--- .../Generators/SequentialGenerator.cs | 22 ++++++++--- .../DataSources/LastNameSource.cs | 28 ++++++++++++++ .../PersonEquivalenceClasses.cs | 30 +++++++++++++-- NTestDataBuilder/Guard.cs | 18 --------- NTestDataBuilder/NTestDataBuilder.csproj | 7 +++- 16 files changed, 210 insertions(+), 106 deletions(-) create mode 100644 NTestDataBuilder/DataSources/FileData/FileDataRepository.cs rename NTestDataBuilder/DataSources/FileData/{PersonData.cs => FileDataSourceHelpers.cs} (67%) create mode 100644 NTestDataBuilder/DataSources/FileData/Person.cs create mode 100644 NTestDataBuilder/DataSources/FullNameSource.cs create mode 100644 NTestDataBuilder/DataSources/LastNameSource.cs delete mode 100644 NTestDataBuilder/Guard.cs diff --git a/NTestDataBuilder.Tests/DataSources/Generators/RandomGeneratorTests.cs b/NTestDataBuilder.Tests/DataSources/Generators/RandomGeneratorTests.cs index 206b862..b85c63e 100644 --- a/NTestDataBuilder.Tests/DataSources/Generators/RandomGeneratorTests.cs +++ b/NTestDataBuilder.Tests/DataSources/Generators/RandomGeneratorTests.cs @@ -41,7 +41,7 @@ public void WhenGeneratingRandomIntegers_ThenShouldBeAbleToGenerateLowerBoundary { var results = new List(); var sut = new RandomGenerator(0, 3); - for (int i = 0; i < 10; i++) + for (int i = 0; i < 20; i++) { results.Add(sut.Generate()); } @@ -53,7 +53,7 @@ public void WhenGeneratingRandomIntegers_ThenShouldBeAbleToGenerateUpperBoundary { var results = new List(); var sut = new RandomGenerator(0, 3); - for (int i = 0; i < 10; i++) + for (int i = 0; i < 20; i++) { results.Add(sut.Generate()); } diff --git a/NTestDataBuilder.Tests/DataSources/Generators/SequentiaGeneratorTests.cs b/NTestDataBuilder.Tests/DataSources/Generators/SequentiaGeneratorTests.cs index 2dc0442..72744d0 100644 --- a/NTestDataBuilder.Tests/DataSources/Generators/SequentiaGeneratorTests.cs +++ b/NTestDataBuilder.Tests/DataSources/Generators/SequentiaGeneratorTests.cs @@ -11,7 +11,7 @@ public class SequentiaGeneratorTests [Theory, InlineData(5, 4), InlineData(5, 5)] - public void WhenCreatingRandomGenerator_ThenStartIndexMustBeLessThanListSize(int startIndex, int listSize) + public void WhenCreatingSequentialGenerator_ThenStartIndexMustBeLessThanListSize(int startIndex, int listSize) { Action factory = () => new SequentialGenerator(startIndex, listSize); Should.Throw(factory) @@ -19,7 +19,7 @@ public void WhenCreatingRandomGenerator_ThenStartIndexMustBeLessThanListSize(int } [Fact] - public void WhenCreatingRandomGenerator_ThenStartIndexMustBeZeroOrMore() + public void WhenCreatingSequentialGenerator_ThenStartIndexMustBeZeroOrMore() { Action factory = () => new SequentialGenerator(-1, 1); Should.Throw(factory) @@ -29,7 +29,7 @@ public void WhenCreatingRandomGenerator_ThenStartIndexMustBeZeroOrMore() [Theory, InlineData(0, 0), InlineData(0, -1)] - public void WhenCreatingRandomGenerator_ThenListSizeMustBeGreaterThanZero(int startIndex, int listSize) + public void WhenCreatingSequentialGenerator_ThenListSizeMustBeGreaterThanZero(int startIndex, int listSize) { Action factory = () => new SequentialGenerator(startIndex, listSize); Should.Throw(factory) @@ -60,7 +60,7 @@ public void GivenGeneratorIsNotUnique_WhenGeneratingIntegers_ThenShouldResetAtEn } [Fact] - public void GivenGeneratorIsUnique_WhenGeneratingIntegers_ThenShouldResetAtEndOfList() + public void GivenGeneratorIsUnique_WhenGeneratingIntegers_ThenShouldThrowAtEndOfList() { var sut = new SequentialGenerator(0, 2, true); for (int index = sut.StartIndex; index < sut.ListSize; index++) diff --git a/NTestDataBuilder.Tests/EquivalenceClasses/CompanyEquivalenceClassTests.cs b/NTestDataBuilder.Tests/EquivalenceClasses/CompanyEquivalenceClassTests.cs index ca26ebb..8840162 100644 --- a/NTestDataBuilder.Tests/EquivalenceClasses/CompanyEquivalenceClassTests.cs +++ b/NTestDataBuilder.Tests/EquivalenceClasses/CompanyEquivalenceClassTests.cs @@ -17,7 +17,7 @@ public CompanyEquivalenceClassTests() } [Fact] - public void WhenGettingAnyCountry_ThenReturnRandomCompanyWhichIsReasonablyUnique() + public void WhenGettingAnyCompany_ThenReturnRandomCompanyWhichIsReasonablyUnique() { var companySource = new CompanySource(); diff --git a/NTestDataBuilder/DataSources/DataSource.cs b/NTestDataBuilder/DataSources/DataSource.cs index 1a16eed..9fae134 100644 --- a/NTestDataBuilder/DataSources/DataSource.cs +++ b/NTestDataBuilder/DataSources/DataSource.cs @@ -3,25 +3,32 @@ namespace NTestDataBuilder.DataSources { - //public interface IDataSource - //{ - // T Next(); - //} - public abstract class DataSource //: IDataSource + /// + /// The base class for data sources to inherit from. + /// + /// + public abstract class DataSource { - public IList List { get; private set; } - public IGenerator Generator { get; private set; } - - public DataSource(IGenerator generator) + /// + /// Allows a custom data generation strategy to be passed to the data source + /// + /// The generator that determines the strategy for returning each item from the data source collection + protected DataSource(IGenerator generator) { Generator = generator; List = InitializeList(); Generator.ListSize = List.Count; } - public DataSource() + /// + /// The default constructor implements a RandomGenerator strategy + /// + protected DataSource() : this(new RandomGenerator()) { } + public IList List { get; private set; } + public IGenerator Generator { get; private set; } + protected abstract IList InitializeList(); public virtual T Next() diff --git a/NTestDataBuilder/DataSources/FileData/FileDataRepository.cs b/NTestDataBuilder/DataSources/FileData/FileDataRepository.cs new file mode 100644 index 0000000..d65e6c9 --- /dev/null +++ b/NTestDataBuilder/DataSources/FileData/FileDataRepository.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using System.Linq; + +namespace NTestDataBuilder.DataSources.FileData +{ + internal class FileDataRepository + { + internal static IList People { get; private set; } + + static FileDataRepository() + { + People = FileDataSourceHelpers.ConvertCsvToDataTable("NTestDataBuilder.DataSources.FileData.uk-500.csv") + .AsEnumerable() + .ToList(); + } + } +} diff --git a/NTestDataBuilder/DataSources/FileData/PersonData.cs b/NTestDataBuilder/DataSources/FileData/FileDataSourceHelpers.cs similarity index 67% rename from NTestDataBuilder/DataSources/FileData/PersonData.cs rename to NTestDataBuilder/DataSources/FileData/FileDataSourceHelpers.cs index bc5d422..60c0786 100644 --- a/NTestDataBuilder/DataSources/FileData/PersonData.cs +++ b/NTestDataBuilder/DataSources/FileData/FileDataSourceHelpers.cs @@ -2,14 +2,13 @@ using System.Collections.Generic; using System.Data; using System.IO; -using System.Linq; using System.Reflection; namespace NTestDataBuilder.DataSources.FileData { - public static class DataTableExtensions + internal static class FileDataSourceHelpers { - public static IEnumerable AsEnumerable(this DataTable table) where T : new() + internal static IEnumerable AsEnumerable(this DataTable table) where T : new() { if (table == null) throw new NullReferenceException("DataTable"); @@ -36,39 +35,12 @@ public static class DataTableExtensions } objList.Add(obj); } - return objList; } - } - - public class Person - { - public string FirstName { get; set; } - public string LastName { get; set; } - public string CompanyName { get; set; } - public string Address { get; set; } - public string City { get; set; } - public string County { get; set; } - public string Postal { get; set; } - public string Phone1 { get; set; } - public string Phone2 { get; set; } - public string Email { get; set; } - public string Web { get; set; } - } - public class PersonData - { - public static IList People { get; private set; } - - static PersonData() - { - People = ConvertCSVtoDataTable() - .AsEnumerable() - .ToList(); - } - private static DataTable ConvertCSVtoDataTable() + internal static DataTable ConvertCsvToDataTable(string embeddedFilename) { - var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("NTestDataBuilder.DataSources.FileData.uk-500.csv"); + var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedFilename); var sr = new StreamReader(stream); var headers = sr.ReadLine().Split(','); var dt = new DataTable(); @@ -89,4 +61,4 @@ private static DataTable ConvertCSVtoDataTable() return dt; } } -} +} \ No newline at end of file diff --git a/NTestDataBuilder/DataSources/FileData/Person.cs b/NTestDataBuilder/DataSources/FileData/Person.cs new file mode 100644 index 0000000..b0f183f --- /dev/null +++ b/NTestDataBuilder/DataSources/FileData/Person.cs @@ -0,0 +1,17 @@ +namespace NTestDataBuilder.DataSources.FileData +{ + internal class Person + { + public string FirstName { get; set; } + public string LastName { get; set; } + public string CompanyName { get; set; } + public string Address { get; set; } + public string City { get; set; } + public string County { get; set; } + public string Postal { get; set; } + public string Phone1 { get; set; } + public string Phone2 { get; set; } + public string Email { get; set; } + public string Web { get; set; } + } +} \ No newline at end of file diff --git a/NTestDataBuilder/DataSources/FirstNameSource.cs b/NTestDataBuilder/DataSources/FirstNameSource.cs index b867016..6473e1e 100644 --- a/NTestDataBuilder/DataSources/FirstNameSource.cs +++ b/NTestDataBuilder/DataSources/FirstNameSource.cs @@ -1,35 +1,28 @@ using System.Collections.Generic; using System.Linq; using NTestDataBuilder.DataSources.FileData; +using NTestDataBuilder.DataSources.Generators; namespace NTestDataBuilder.DataSources { + /// + /// Free sample data for testing obtained from http://www.briandunning.com/sample-data/ + /// public class FirstNameSource : DataSource { + /// + public FirstNameSource() + : base() { } + + /// + public FirstNameSource(IGenerator generator) + : base(generator) { } + protected override IList InitializeList() { - return PersonData.People + return FileDataRepository.People .Select(person => person.FirstName) .ToList(); } } - public class LastNameSource : DataSource - { - protected override IList InitializeList() - { - return PersonData.People - .Select(person => person.LastName) - .ToList(); - } - } - public class FullNameSource : DataSource - { - protected override IList InitializeList() - { - return PersonData.People - .Select(person => person.FirstName + " " + person.LastName) - .ToList(); - } - } - } diff --git a/NTestDataBuilder/DataSources/FullNameSource.cs b/NTestDataBuilder/DataSources/FullNameSource.cs new file mode 100644 index 0000000..ada4381 --- /dev/null +++ b/NTestDataBuilder/DataSources/FullNameSource.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using System.Linq; +using NTestDataBuilder.DataSources.FileData; +using NTestDataBuilder.DataSources.Generators; + +namespace NTestDataBuilder.DataSources +{ + /// + /// Free sample data for testing obtained from http://www.briandunning.com/sample-data/ + /// + public class FullNameSource : DataSource + { + /// + public FullNameSource() + : base() { } + + /// + public FullNameSource(IGenerator generator) + : base(generator) { } + + protected override IList InitializeList() + { + return FileDataRepository.People + .Select(person => person.FirstName + " " + person.LastName) + .ToList(); + } + } +} \ No newline at end of file diff --git a/NTestDataBuilder/DataSources/Generators/IGenerator.cs b/NTestDataBuilder/DataSources/Generators/IGenerator.cs index 3e6e504..c450dc8 100644 --- a/NTestDataBuilder/DataSources/Generators/IGenerator.cs +++ b/NTestDataBuilder/DataSources/Generators/IGenerator.cs @@ -1,9 +1,24 @@ namespace NTestDataBuilder.DataSources.Generators { + /// + /// A strategy to determine the index of the next item to be selected from a list + /// public interface IGenerator { + /// + /// Derives the next item to be selected in the list + /// + /// The index of the next item to be selected in the list int Generate(); + + /// + /// The first index that can be selected in a list. Ranges from 0 to one less than the number of items in the list + /// int StartIndex { get; set; } + + /// + /// The number of items in the list + /// int ListSize { get; set; } } } \ No newline at end of file diff --git a/NTestDataBuilder/DataSources/Generators/RandomGenerator.cs b/NTestDataBuilder/DataSources/Generators/RandomGenerator.cs index 8b4d889..606b80a 100644 --- a/NTestDataBuilder/DataSources/Generators/RandomGenerator.cs +++ b/NTestDataBuilder/DataSources/Generators/RandomGenerator.cs @@ -2,21 +2,31 @@ namespace NTestDataBuilder.DataSources.Generators { + /// + /// A strategy that randomly selects an index from the collection + /// public class RandomGenerator : IGenerator { private readonly Random _random; public int StartIndex { get; set; } public int ListSize { get; set; } - public RandomGenerator() : this(0,1) - { - } + /// + /// Default constructor. + /// + public RandomGenerator() + : this(0,1) { } + /// + /// Specify the startIndex and listSize + /// + /// The first index that can be selected in a list. Ranges from 0 to one less than the number of items in the list + /// The number of items in the list public RandomGenerator(int startIndex, int listSize) { - Guard.Against(startIndex < 0, "startIndex must be zero or more"); - Guard.Against(listSize < 1, "listSize must be greater than zero"); - Guard.Against(startIndex >= listSize, "startIndex must be less than listSize"); + if(startIndex < 0) throw new ArgumentException("startIndex must be zero or more"); + if(listSize < 1) throw new ArgumentException("listSize must be greater than zero"); + if(startIndex >= listSize) throw new ArgumentException("startIndex must be less than listSize"); StartIndex = startIndex; ListSize = listSize; diff --git a/NTestDataBuilder/DataSources/Generators/SequentialGenerator.cs b/NTestDataBuilder/DataSources/Generators/SequentialGenerator.cs index 4bc854d..8bae4fa 100644 --- a/NTestDataBuilder/DataSources/Generators/SequentialGenerator.cs +++ b/NTestDataBuilder/DataSources/Generators/SequentialGenerator.cs @@ -2,6 +2,9 @@ namespace NTestDataBuilder.DataSources.Generators { + /// + /// A strategy that selects each item from the collection in sequence. At the end of the collection it can optionally start from the beginning or throw an exception. By default it starts from the beginning again. + /// public class SequentialGenerator : IGenerator { private int _currentListIndex; @@ -9,15 +12,22 @@ public class SequentialGenerator : IGenerator public int ListSize { get; set; } public bool ListShouldBeUnique { get; private set; } - public SequentialGenerator() : this(0,1) - { - } + /// + /// Default constructor. + /// + public SequentialGenerator() + : this(0, 1) { } + /// + /// Specify the startIndex and listSize + /// + /// The first index that can be selected in a list. Ranges from 0 to one less than the number of items in the list + /// The number of items in the list public SequentialGenerator(int startIndex, int listSize, bool listShouldBeUnique = false) { - Guard.Against(startIndex < 0, "startIndex must be zero or more"); - Guard.Against(listSize < 1, "listSize must be greater than zero"); - Guard.Against(startIndex >= listSize, "startIndex must be less than listSize"); + if (startIndex < 0) throw new ArgumentException("startIndex must be zero or more"); + if (listSize < 1) throw new ArgumentException("listSize must be greater than zero"); + if (startIndex >= listSize) throw new ArgumentException("startIndex must be less than listSize"); StartIndex = startIndex; ListSize = listSize; diff --git a/NTestDataBuilder/DataSources/LastNameSource.cs b/NTestDataBuilder/DataSources/LastNameSource.cs new file mode 100644 index 0000000..112197f --- /dev/null +++ b/NTestDataBuilder/DataSources/LastNameSource.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using System.Linq; +using NTestDataBuilder.DataSources.FileData; +using NTestDataBuilder.DataSources.Generators; + +namespace NTestDataBuilder.DataSources +{ + /// + /// Free sample data for testing obtained from http://www.briandunning.com/sample-data/ + /// + public class LastNameSource : DataSource + { + /// + public LastNameSource() + : base() { } + + /// + public LastNameSource(IGenerator generator) + : base(generator) { } + + protected override IList InitializeList() + { + return FileDataRepository.People + .Select(person => person.LastName) + .ToList(); + } + } +} \ No newline at end of file diff --git a/NTestDataBuilder/EquivalenceClasses/PersonEquivalenceClasses.cs b/NTestDataBuilder/EquivalenceClasses/PersonEquivalenceClasses.cs index 1c08ab4..c1f5e8e 100644 --- a/NTestDataBuilder/EquivalenceClasses/PersonEquivalenceClasses.cs +++ b/NTestDataBuilder/EquivalenceClasses/PersonEquivalenceClasses.cs @@ -2,25 +2,47 @@ namespace NTestDataBuilder.EquivalenceClasses { + /// + /// Extension methods that describe equivalence classes for generating anonymous person-related values. + /// public static class PersonEquivalenceClasses { - private static readonly FirstNameSource _firstNameSource = new FirstNameSource(); - private static readonly LastNameSource _lastNameSource = new LastNameSource(); - private static readonly FullNameSource _fullNameSource = new FullNameSource(); + private static FirstNameSource _firstNameSource; + private static LastNameSource _lastNameSource; + private static FullNameSource _fullNameSource; + /// + /// Generate and return a first name. + /// + /// The fixture to generate a string for + /// The generated string public static string FirstName(this AnonymousValueFixture fixture) { + if(_firstNameSource == null) _firstNameSource = new FirstNameSource(); return _firstNameSource.Next(); } + + /// + /// Generate and return a last name. + /// + /// The fixture to generate a string for + /// The generated string public static string LastName(this AnonymousValueFixture fixture) { + if (_lastNameSource == null) _lastNameSource = new LastNameSource(); return _lastNameSource.Next(); } + + /// + /// Generate and return a first and last name. + /// + /// The fixture to generate a string for + /// The generated string public static string FullName(this AnonymousValueFixture fixture) { + if (_fullNameSource == null) _fullNameSource = new FullNameSource(); return _fullNameSource.Next(); } - } } diff --git a/NTestDataBuilder/Guard.cs b/NTestDataBuilder/Guard.cs deleted file mode 100644 index 58f16b1..0000000 --- a/NTestDataBuilder/Guard.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace NTestDataBuilder -{ - public static class Guard - { - public static void Against(bool condition, string errorMessage) - { - if (condition) - { - throw new ArgumentException(errorMessage); - } - } - } -} diff --git a/NTestDataBuilder/NTestDataBuilder.csproj b/NTestDataBuilder/NTestDataBuilder.csproj index 2636c6b..9d02c4a 100644 --- a/NTestDataBuilder/NTestDataBuilder.csproj +++ b/NTestDataBuilder/NTestDataBuilder.csproj @@ -54,13 +54,16 @@ - + + + + + - From cc2e92b3f7c9f08155270476284b4f1fa3d14d84 Mon Sep 17 00:00:00 2001 From: Michael Whelan Date: Thu, 18 Sep 2014 12:37:15 +0100 Subject: [PATCH 2/2] added the 8 additional person data sources --- .../DataSources/DataSourceTests.cs | 10 +- .../DataSources/PersonSourceTests.cs | 40 ++++++ .../CompanyEquivalenceClassTests.cs | 40 ------ .../PersonEquivalenceClassesTests.cs | 63 ++++++++++ .../NTestDataBuilder.Tests.csproj | 3 +- NTestDataBuilder/DataSources/CitySource.cs | 30 +++++ NTestDataBuilder/DataSources/CompanySource.cs | 115 ++---------------- NTestDataBuilder/DataSources/CountySource.cs | 30 +++++ NTestDataBuilder/DataSources/DataSource.cs | 2 +- NTestDataBuilder/DataSources/EmailSource.cs | 30 +++++ .../FileData/FileDataRepository.cs | 9 +- .../FileData/FileDataSourceHelpers.cs | 42 +++++-- .../DataSources/FirstNameSource.cs | 2 + .../DataSources/FullNameSource.cs | 2 + NTestDataBuilder/DataSources/IDataSource.cs | 12 ++ .../DataSources/LastNameSource.cs | 2 + NTestDataBuilder/DataSources/PhoneSource.cs | 30 +++++ .../DataSources/PostCodeSource.cs | 30 +++++ NTestDataBuilder/DataSources/StreetSource.cs | 30 +++++ NTestDataBuilder/DataSources/WebsiteSource.cs | 30 +++++ .../CompanyEquivalenceClass.cs | 14 --- .../PersonEquivalenceClasses.cs | 96 +++++++++++++++ NTestDataBuilder/NTestDataBuilder.csproj | 9 +- .../cd7eeea2d0b941bda2d056ab2cb6b839 | Bin 0 -> 22190 bytes 24 files changed, 487 insertions(+), 184 deletions(-) create mode 100644 NTestDataBuilder.Tests/DataSources/PersonSourceTests.cs delete mode 100644 NTestDataBuilder.Tests/EquivalenceClasses/CompanyEquivalenceClassTests.cs create mode 100644 NTestDataBuilder.Tests/EquivalenceClasses/PersonEquivalenceClassesTests.cs create mode 100644 NTestDataBuilder/DataSources/CitySource.cs create mode 100644 NTestDataBuilder/DataSources/CountySource.cs create mode 100644 NTestDataBuilder/DataSources/EmailSource.cs create mode 100644 NTestDataBuilder/DataSources/IDataSource.cs create mode 100644 NTestDataBuilder/DataSources/PhoneSource.cs create mode 100644 NTestDataBuilder/DataSources/PostCodeSource.cs create mode 100644 NTestDataBuilder/DataSources/StreetSource.cs create mode 100644 NTestDataBuilder/DataSources/WebsiteSource.cs delete mode 100644 NTestDataBuilder/EquivalenceClasses/CompanyEquivalenceClass.cs create mode 100644 _NCrunch_NTestDataBuilder/StoredText/cd7eeea2d0b941bda2d056ab2cb6b839 diff --git a/NTestDataBuilder.Tests/DataSources/DataSourceTests.cs b/NTestDataBuilder.Tests/DataSources/DataSourceTests.cs index 8b1c372..e2c374d 100644 --- a/NTestDataBuilder.Tests/DataSources/DataSourceTests.cs +++ b/NTestDataBuilder.Tests/DataSources/DataSourceTests.cs @@ -34,7 +34,7 @@ public void WhenGeneratingValuesFromDefaultDataSource_ThenShouldGenerateRandomIt var sut = new DummyDataSource(); var results = new List(); - for (int i = 0; i < 10; i++) + for (int i = 0; i < 20; i++) { results.Add(sut.Next()); } @@ -66,14 +66,6 @@ public void WhenGeneratingValuesFromUniqueSequentialDataSource_ThenShouldThrowWh sut.Next().ShouldBe(sut.List[2]); Should.Throw(() => sut.Next()); } - - [Fact] - public void WhenGeneratingValuesFromPersonDataSource_ThenShouldHave500Records() - { - new FirstNameSource().List.Count.ShouldBe(500); - new LastNameSource().List.Count.ShouldBe(500); - new FullNameSource().List.Count.ShouldBe(500); - } } public class DummyDataSource : DataSource diff --git a/NTestDataBuilder.Tests/DataSources/PersonSourceTests.cs b/NTestDataBuilder.Tests/DataSources/PersonSourceTests.cs new file mode 100644 index 0000000..1c40dc0 --- /dev/null +++ b/NTestDataBuilder.Tests/DataSources/PersonSourceTests.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using System.Linq; +using NTestDataBuilder.DataSources; +using Shouldly; +using Xunit.Extensions; + +namespace NTestDataBuilder.Tests.DataSources +{ + public class PersonSourceTests + { + [Theory] + [PropertyData("TestCases")] + public void PersonSourceSpec(DataSource sut, int expectedCount) + { + var collection = sut.List.ToList(); + collection.Count.ShouldBe(expectedCount); + collection.Count.ShouldBe(sut.List.Distinct().ToList().Count); + collection.ForEach(item => item.ShouldNotBeNullOrEmpty()); + } + + public static IEnumerable TestCases + { + get + { + yield return new object[] { new FirstNameSource(), 479 }; + yield return new object[] { new LastNameSource(), 498 }; + yield return new object[] { new FullNameSource(), 500 }; + yield return new object[] { new CompanySource(), 496 }; + yield return new object[] { new StreetSource(), 498 }; + yield return new object[] { new CitySource(), 483 }; + yield return new object[] { new CountySource(), 214 }; + yield return new object[] { new PostCodeSource(), 433 }; + yield return new object[] { new PhoneSource(), 500 }; + yield return new object[] { new EmailSource(), 500 }; + yield return new object[] { new WebsiteSource(), 498 }; + + } + } + } +} \ No newline at end of file diff --git a/NTestDataBuilder.Tests/EquivalenceClasses/CompanyEquivalenceClassTests.cs b/NTestDataBuilder.Tests/EquivalenceClasses/CompanyEquivalenceClassTests.cs deleted file mode 100644 index 8840162..0000000 --- a/NTestDataBuilder.Tests/EquivalenceClasses/CompanyEquivalenceClassTests.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using NTestDataBuilder.DataSources; -using NTestDataBuilder.EquivalenceClasses; -using Shouldly; -using Xunit; - -namespace NTestDataBuilder.Tests.EquivalenceClasses -{ - public class CompanyEquivalenceClassTests - { - public AnonymousValueFixture Any { get; private set; } - - public CompanyEquivalenceClassTests() - { - Any = new AnonymousValueFixture(); - } - - [Fact] - public void WhenGettingAnyCompany_ThenReturnRandomCompanyWhichIsReasonablyUnique() - { - var companySource = new CompanySource(); - - var results = new List(); - for (int i = 0; i < 10; i++) - { - results.Add(Any.Company()); - } - - foreach (var result in results) - { - result.ShouldBeOfType(); - result.ShouldNotBeNullOrEmpty(); - companySource.List.ShouldContain(result); - } - var unique = results.Distinct().Count(); - unique.ShouldBeGreaterThan(5); - } - } -} diff --git a/NTestDataBuilder.Tests/EquivalenceClasses/PersonEquivalenceClassesTests.cs b/NTestDataBuilder.Tests/EquivalenceClasses/PersonEquivalenceClassesTests.cs new file mode 100644 index 0000000..e0fbcda --- /dev/null +++ b/NTestDataBuilder.Tests/EquivalenceClasses/PersonEquivalenceClassesTests.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using NTestDataBuilder.DataSources; +using NTestDataBuilder.EquivalenceClasses; +using Shouldly; +using Xunit.Extensions; + +namespace NTestDataBuilder.Tests.EquivalenceClasses +{ + public class PersonEquivalenceClassesTests + { + public static AnonymousValueFixture Any { get; private set; } + + public PersonEquivalenceClassesTests() + { + Any = new AnonymousValueFixture(); + } + + [Theory] + [PropertyData("TestCases")] + public void WhenGettingAnyPersonData_ThenReturnRandomPersonDataWhichIsReasonablyUnique(DataSource source, + List testCases) + { + foreach (var testCase in testCases) + { + testCase.ShouldBeOfType(); + testCase.ShouldNotBeNullOrEmpty(); + source.List.ShouldContain(testCase); + } + var unique = testCases.Distinct().Count(); + unique.ShouldBeGreaterThan(5); + } + + public static IEnumerable TestCases + { + get + { + yield return new object[] { new FirstNameSource(), GenerateTestCasesForSut(Any.FirstName) }; + yield return new object[] { new LastNameSource(), GenerateTestCasesForSut(Any.LastName) }; + yield return new object[] { new FullNameSource(), GenerateTestCasesForSut(Any.FullName) }; + yield return new object[] { new CompanySource(), GenerateTestCasesForSut(Any.Company) }; + yield return new object[] { new StreetSource(), GenerateTestCasesForSut(Any.Street) }; + yield return new object[] { new CitySource(), GenerateTestCasesForSut(Any.City) }; + yield return new object[] { new CountySource(), GenerateTestCasesForSut(Any.County) }; + yield return new object[] { new PostCodeSource(), GenerateTestCasesForSut(Any.PostCode) }; + yield return new object[] { new PhoneSource(), GenerateTestCasesForSut(Any.Phone) }; + yield return new object[] { new EmailSource(), GenerateTestCasesForSut(Any.Email) }; + yield return new object[] { new WebsiteSource(), GenerateTestCasesForSut(Any.Website) }; + } + } + + private static List GenerateTestCasesForSut(Func any) + { + var results = new List(); + for (int i = 0; i < 10; i++) + { + results.Add(any()); + } + return results; + } + } +} diff --git a/NTestDataBuilder.Tests/NTestDataBuilder.Tests.csproj b/NTestDataBuilder.Tests/NTestDataBuilder.Tests.csproj index 45b275c..89790c2 100644 --- a/NTestDataBuilder.Tests/NTestDataBuilder.Tests.csproj +++ b/NTestDataBuilder.Tests/NTestDataBuilder.Tests.csproj @@ -55,7 +55,8 @@ - + + diff --git a/NTestDataBuilder/DataSources/CitySource.cs b/NTestDataBuilder/DataSources/CitySource.cs new file mode 100644 index 0000000..da51aa1 --- /dev/null +++ b/NTestDataBuilder/DataSources/CitySource.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Linq; +using NTestDataBuilder.DataSources.FileData; +using NTestDataBuilder.DataSources.Generators; + +namespace NTestDataBuilder.DataSources +{ + /// + /// Free sample data for testing obtained from http://www.briandunning.com/sample-data/ + /// + public class CitySource : DataSource + { + /// + public CitySource() + : base() { } + + /// + public CitySource(IGenerator generator) + : base(generator) { } + + /// + protected override IList InitializeList() + { + return FileDataRepository.People + .Select(person => person.City) + .Distinct() + .ToList(); + } + } +} diff --git a/NTestDataBuilder/DataSources/CompanySource.cs b/NTestDataBuilder/DataSources/CompanySource.cs index 6978c16..32d681d 100644 --- a/NTestDataBuilder/DataSources/CompanySource.cs +++ b/NTestDataBuilder/DataSources/CompanySource.cs @@ -1,121 +1,30 @@ using System.Collections.Generic; +using System.Linq; +using NTestDataBuilder.DataSources.FileData; using NTestDataBuilder.DataSources.Generators; namespace NTestDataBuilder.DataSources { + /// + /// Free sample data for testing obtained from http://www.briandunning.com/sample-data/ + /// public class CompanySource : DataSource { + /// public CompanySource() : base() { } + /// public CompanySource(IGenerator generator) : base(generator) { } + /// protected override IList InitializeList() { - return new List - { - "Wal-Mart Stores", - "Exxon Mobil", - "Chevron", - "Phillips ", - "Berkshire Hathaway", - "Apple", - "General Motors", - "General Electric", - "Valero Energy", - "Ford Motor", - "AT&T", - "Fannie Mae", - "CVS Caremark", - "McKesson", - "Hewlett-Packard", - "Verizon Communications", - "UnitedHealth Group", - "J.P. Morgan Chase & Co.", - "Cardinal Health", - "International Business Machines", - "Bank of America Corp.", - "Costco Wholesale", - "Kroger", - "Express Scripts Holding", - "Wells Fargo", - "Citigroup", - "Archer Daniels Midland", - "Procter & Gamble", - "Prudential Financial", - "Boeing", - "Freddie Mac", - "AmerisourceBergen", - "Marathon Petroleum", - "Home Depot", - "Microsoft", - "Target", - "Walgreen", - "American International Group", - "INTL FCStone", - "MetLife", - "Johnson & Johnson", - "Caterpillar", - "PepsiCo", - "State Farm Insurance Cos.", - "ConocoPhillips", - "Comcast", - "WellPoint", - "Pfizer", - "Amazon.com", - "United Technologies", - "Dell", - "Dow Chemical", - "United Parcel Service", - "Intel", - "Google", - "Lowe's", - "Coca-Cola", - "Merck", - "Lockheed Martin", - "Cisco Systems", - "Best Buy", - "Safeway", - "FedEx", - "Enterprise Products Partners", - "Sysco", - "Walt Disney", - "Johnson Controls", - "Goldman Sachs Group", - "CHS", - "Abbott Laboratories", - "Sears Holdings", - "DuPont", - "Humana", - "World Fuel Services", - "Hess", - "Ingram Micro", - "Plains All American Pipeline", - "Honeywell International", - "United Continental Holdings", - "Oracle", - "Liberty Mutual Insurance Group", - "HCA Holdings", - "Delta Air Lines", - "Aetna", - "Deere", - "Supervalu", - "Sprint Nextel", - "Mondelēz International", - "New York Life Insurance", - "American Express", - "News Corp.", - "Allstate", - "Tyson Foods", - "Massachusetts Mutual Life Insurance", - "Tesoro", - "Morgan Stanley", - "TIAA-CREF", - "General Dynamics", - "Philip Morris International", - "Nationwide" - }; + return FileDataRepository.People + .Select(person => person.CompanyName) + .Distinct() + .ToList(); } } } diff --git a/NTestDataBuilder/DataSources/CountySource.cs b/NTestDataBuilder/DataSources/CountySource.cs new file mode 100644 index 0000000..30a7897 --- /dev/null +++ b/NTestDataBuilder/DataSources/CountySource.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Linq; +using NTestDataBuilder.DataSources.FileData; +using NTestDataBuilder.DataSources.Generators; + +namespace NTestDataBuilder.DataSources +{ + /// + /// Free sample data for testing obtained from http://www.briandunning.com/sample-data/ + /// + public class CountySource : DataSource + { + /// + public CountySource() + : base() { } + + /// + public CountySource(IGenerator generator) + : base(generator) { } + + /// + protected override IList InitializeList() + { + return FileDataRepository.People + .Select(person => person.County) + .Distinct() + .ToList(); + } + } +} diff --git a/NTestDataBuilder/DataSources/DataSource.cs b/NTestDataBuilder/DataSources/DataSource.cs index 9fae134..53dada7 100644 --- a/NTestDataBuilder/DataSources/DataSource.cs +++ b/NTestDataBuilder/DataSources/DataSource.cs @@ -7,7 +7,7 @@ namespace NTestDataBuilder.DataSources /// The base class for data sources to inherit from. /// /// - public abstract class DataSource + public abstract class DataSource : IDataSource { /// /// Allows a custom data generation strategy to be passed to the data source diff --git a/NTestDataBuilder/DataSources/EmailSource.cs b/NTestDataBuilder/DataSources/EmailSource.cs new file mode 100644 index 0000000..42892a7 --- /dev/null +++ b/NTestDataBuilder/DataSources/EmailSource.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Linq; +using NTestDataBuilder.DataSources.FileData; +using NTestDataBuilder.DataSources.Generators; + +namespace NTestDataBuilder.DataSources +{ + /// + /// Free sample data for testing obtained from http://www.briandunning.com/sample-data/ + /// + public class EmailSource : DataSource + { + /// + public EmailSource() + : base() { } + + /// + public EmailSource(IGenerator generator) + : base(generator) { } + + /// + protected override IList InitializeList() + { + return FileDataRepository.People + .Select(person => person.Email) + .Distinct() + .ToList(); + } + } +} diff --git a/NTestDataBuilder/DataSources/FileData/FileDataRepository.cs b/NTestDataBuilder/DataSources/FileData/FileDataRepository.cs index d65e6c9..298441f 100644 --- a/NTestDataBuilder/DataSources/FileData/FileDataRepository.cs +++ b/NTestDataBuilder/DataSources/FileData/FileDataRepository.cs @@ -9,9 +9,12 @@ internal class FileDataRepository static FileDataRepository() { - People = FileDataSourceHelpers.ConvertCsvToDataTable("NTestDataBuilder.DataSources.FileData.uk-500.csv") - .AsEnumerable() - .ToList(); + var dt = FileDataSourceHelpers.ConvertCsvToDataTable("NTestDataBuilder.DataSources.FileData.uk-500.csv"); + var people = dt.AsEnumerable().ToList(); + People = people; + //People = FileDataSourceHelpers.ConvertCsvToDataTable("NTestDataBuilder.DataSources.FileData.uk-500.csv") + // .AsEnumerable() + // .ToList(); } } } diff --git a/NTestDataBuilder/DataSources/FileData/FileDataSourceHelpers.cs b/NTestDataBuilder/DataSources/FileData/FileDataSourceHelpers.cs index 60c0786..f4ae1a5 100644 --- a/NTestDataBuilder/DataSources/FileData/FileDataSourceHelpers.cs +++ b/NTestDataBuilder/DataSources/FileData/FileDataSourceHelpers.cs @@ -3,6 +3,7 @@ using System.Data; using System.IO; using System.Reflection; +using Castle.Core.Internal; namespace NTestDataBuilder.DataSources.FileData { @@ -40,25 +41,42 @@ internal static class FileDataSourceHelpers internal static DataTable ConvertCsvToDataTable(string embeddedFilename) { + if (embeddedFilename.IsNullOrEmpty()) + { + throw new ArgumentException("embeddedFilename cannot be null or empty"); + } var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedFilename); - var sr = new StreamReader(stream); - var headers = sr.ReadLine().Split(','); - var dt = new DataTable(); + if (stream == null) + { + throw new InvalidOperationException("embeddedFilename must contain the fully qualified name of a CSV embedded resource"); + } + + var table = new DataTable(); + var reader = new StreamReader(stream); + + var headers = reader.ReadLine().Split(','); foreach (string header in headers) { - dt.Columns.Add(header); + table.Columns.Add(header.RemoveSurroundingQuotationMarks()); } - while (!sr.EndOfStream) + + while (!reader.EndOfStream) { - var rows = sr.ReadLine().Split(','); - var dr = dt.NewRow(); - for (int i = 0; i < headers.Length; i++) + var columns = reader.ReadLine().Split(','); + var row = table.NewRow(); + for (int index = 0; index < headers.Length; index++) { - dr[i] = rows[i]; + row[index] = columns[index].RemoveSurroundingQuotationMarks(); } - dt.Rows.Add(dr); + table.Rows.Add(row); } - return dt; - } + return table; + } + + private static string RemoveSurroundingQuotationMarks(this string original) + { + original = original.Remove(0, 1); + return original.Remove(original.Length - 1); + } } } \ No newline at end of file diff --git a/NTestDataBuilder/DataSources/FirstNameSource.cs b/NTestDataBuilder/DataSources/FirstNameSource.cs index 6473e1e..67677db 100644 --- a/NTestDataBuilder/DataSources/FirstNameSource.cs +++ b/NTestDataBuilder/DataSources/FirstNameSource.cs @@ -18,10 +18,12 @@ public FirstNameSource() public FirstNameSource(IGenerator generator) : base(generator) { } + /// protected override IList InitializeList() { return FileDataRepository.People .Select(person => person.FirstName) + .Distinct() .ToList(); } } diff --git a/NTestDataBuilder/DataSources/FullNameSource.cs b/NTestDataBuilder/DataSources/FullNameSource.cs index ada4381..b0d9293 100644 --- a/NTestDataBuilder/DataSources/FullNameSource.cs +++ b/NTestDataBuilder/DataSources/FullNameSource.cs @@ -18,10 +18,12 @@ public FullNameSource() public FullNameSource(IGenerator generator) : base(generator) { } + /// protected override IList InitializeList() { return FileDataRepository.People .Select(person => person.FirstName + " " + person.LastName) + .Distinct() .ToList(); } } diff --git a/NTestDataBuilder/DataSources/IDataSource.cs b/NTestDataBuilder/DataSources/IDataSource.cs new file mode 100644 index 0000000..d2a40ea --- /dev/null +++ b/NTestDataBuilder/DataSources/IDataSource.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using NTestDataBuilder.DataSources.Generators; + +namespace NTestDataBuilder.DataSources +{ + public interface IDataSource + { + IList List { get; } + IGenerator Generator { get; } + T Next(); + } +} \ No newline at end of file diff --git a/NTestDataBuilder/DataSources/LastNameSource.cs b/NTestDataBuilder/DataSources/LastNameSource.cs index 112197f..e2436f7 100644 --- a/NTestDataBuilder/DataSources/LastNameSource.cs +++ b/NTestDataBuilder/DataSources/LastNameSource.cs @@ -18,10 +18,12 @@ public LastNameSource() public LastNameSource(IGenerator generator) : base(generator) { } + /// protected override IList InitializeList() { return FileDataRepository.People .Select(person => person.LastName) + .Distinct() .ToList(); } } diff --git a/NTestDataBuilder/DataSources/PhoneSource.cs b/NTestDataBuilder/DataSources/PhoneSource.cs new file mode 100644 index 0000000..21b4341 --- /dev/null +++ b/NTestDataBuilder/DataSources/PhoneSource.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Linq; +using NTestDataBuilder.DataSources.FileData; +using NTestDataBuilder.DataSources.Generators; + +namespace NTestDataBuilder.DataSources +{ + /// + /// Free sample data for testing obtained from http://www.briandunning.com/sample-data/ + /// + public class PhoneSource : DataSource + { + /// + public PhoneSource() + : base() { } + + /// + public PhoneSource(IGenerator generator) + : base(generator) { } + + /// + protected override IList InitializeList() + { + return FileDataRepository.People + .Select(person => person.Phone1) + .Distinct() + .ToList(); + } + } +} diff --git a/NTestDataBuilder/DataSources/PostCodeSource.cs b/NTestDataBuilder/DataSources/PostCodeSource.cs new file mode 100644 index 0000000..24bf42e --- /dev/null +++ b/NTestDataBuilder/DataSources/PostCodeSource.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Linq; +using NTestDataBuilder.DataSources.FileData; +using NTestDataBuilder.DataSources.Generators; + +namespace NTestDataBuilder.DataSources +{ + /// + /// Free sample data for testing obtained from http://www.briandunning.com/sample-data/ + /// + public class PostCodeSource : DataSource + { + /// + public PostCodeSource() + : base() { } + + /// + public PostCodeSource(IGenerator generator) + : base(generator) { } + + /// + protected override IList InitializeList() + { + return FileDataRepository.People + .Select(person => person.Postal) + .Distinct() + .ToList(); + } + } +} diff --git a/NTestDataBuilder/DataSources/StreetSource.cs b/NTestDataBuilder/DataSources/StreetSource.cs new file mode 100644 index 0000000..0a0e0c1 --- /dev/null +++ b/NTestDataBuilder/DataSources/StreetSource.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Linq; +using NTestDataBuilder.DataSources.FileData; +using NTestDataBuilder.DataSources.Generators; + +namespace NTestDataBuilder.DataSources +{ + /// + /// Free sample data for testing obtained from http://www.briandunning.com/sample-data/ + /// + public class StreetSource : DataSource + { + /// + public StreetSource() + : base() { } + + /// + public StreetSource(IGenerator generator) + : base(generator) { } + + /// + protected override IList InitializeList() + { + return FileDataRepository.People + .Select(person => person.Address) + .Distinct() + .ToList(); + } + } +} diff --git a/NTestDataBuilder/DataSources/WebsiteSource.cs b/NTestDataBuilder/DataSources/WebsiteSource.cs new file mode 100644 index 0000000..f3335da --- /dev/null +++ b/NTestDataBuilder/DataSources/WebsiteSource.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Linq; +using NTestDataBuilder.DataSources.FileData; +using NTestDataBuilder.DataSources.Generators; + +namespace NTestDataBuilder.DataSources +{ + /// + /// Free sample data for testing obtained from http://www.briandunning.com/sample-data/ + /// + public class WebsiteSource : DataSource + { + /// + public WebsiteSource() + : base() { } + + /// + public WebsiteSource(IGenerator generator) + : base(generator) { } + + /// + protected override IList InitializeList() + { + return FileDataRepository.People + .Select(person => person.Web) + .Distinct() + .ToList(); + } + } +} diff --git a/NTestDataBuilder/EquivalenceClasses/CompanyEquivalenceClass.cs b/NTestDataBuilder/EquivalenceClasses/CompanyEquivalenceClass.cs deleted file mode 100644 index c1edd0b..0000000 --- a/NTestDataBuilder/EquivalenceClasses/CompanyEquivalenceClass.cs +++ /dev/null @@ -1,14 +0,0 @@ -using NTestDataBuilder.DataSources; - -namespace NTestDataBuilder.EquivalenceClasses -{ - public static class CompanyEquivalenceClass - { - private static readonly CompanySource _companySource = new CompanySource(); - - public static string Company(this AnonymousValueFixture fixture) - { - return _companySource.Next(); - } - } -} diff --git a/NTestDataBuilder/EquivalenceClasses/PersonEquivalenceClasses.cs b/NTestDataBuilder/EquivalenceClasses/PersonEquivalenceClasses.cs index c1f5e8e..2234e68 100644 --- a/NTestDataBuilder/EquivalenceClasses/PersonEquivalenceClasses.cs +++ b/NTestDataBuilder/EquivalenceClasses/PersonEquivalenceClasses.cs @@ -10,6 +10,14 @@ public static class PersonEquivalenceClasses private static FirstNameSource _firstNameSource; private static LastNameSource _lastNameSource; private static FullNameSource _fullNameSource; + private static CompanySource _companySource; + private static StreetSource _streetSource; + private static CitySource _citySource; + private static CountySource _countySource; + private static PostCodeSource _postCodeSource; + private static PhoneSource _phoneSource; + private static EmailSource _emailSource; + private static WebsiteSource _websiteSource; /// /// Generate and return a first name. @@ -43,6 +51,94 @@ public static string FullName(this AnonymousValueFixture fixture) if (_fullNameSource == null) _fullNameSource = new FullNameSource(); return _fullNameSource.Next(); } + + /// + /// Generate and return a company name. + /// + /// The fixture to generate a string for + /// The generated string + public static string Company(this AnonymousValueFixture fixture) + { + if (_companySource == null) _companySource = new CompanySource(); + return _companySource.Next(); + } + + /// + /// Generate and return a UK street name. + /// + /// The fixture to generate a string for + /// The generated string + public static string Street(this AnonymousValueFixture fixture) + { + if (_streetSource == null) _streetSource = new StreetSource(); + return _streetSource.Next(); + } + + /// + /// Generate and return a city name. + /// + /// The fixture to generate a string for + /// The generated string + public static string City(this AnonymousValueFixture fixture) + { + if (_citySource == null) _citySource = new CitySource(); + return _citySource.Next(); + } + + /// + /// Generate and return a UK county name. + /// + /// The fixture to generate a string for + /// The generated string + public static string County(this AnonymousValueFixture fixture) + { + if (_countySource == null) _countySource = new CountySource(); + return _countySource.Next(); + } + + /// + /// Generate and return a UK post code. + /// + /// The fixture to generate a string for + /// The generated string + public static string PostCode(this AnonymousValueFixture fixture) + { + if (_postCodeSource == null) _postCodeSource = new PostCodeSource(); + return _postCodeSource.Next(); + } + + /// + /// Generate and return a UK phone number. + /// + /// The fixture to generate a string for + /// The generated string + public static string Phone(this AnonymousValueFixture fixture) + { + if (_phoneSource == null) _phoneSource = new PhoneSource(); + return _phoneSource.Next(); + } + + /// + /// Generate and return an email. + /// + /// The fixture to generate a string for + /// The generated string + public static string Email(this AnonymousValueFixture fixture) + { + if (_emailSource == null) _emailSource = new EmailSource(); + return _emailSource.Next(); + } + + /// + /// Generate and return a website. + /// + /// The fixture to generate a string for + /// The generated string + public static string Website(this AnonymousValueFixture fixture) + { + if (_websiteSource == null) _websiteSource = new WebsiteSource(); + return _websiteSource.Next(); + } } } diff --git a/NTestDataBuilder/NTestDataBuilder.csproj b/NTestDataBuilder/NTestDataBuilder.csproj index 9d02c4a..5ffc506 100644 --- a/NTestDataBuilder/NTestDataBuilder.csproj +++ b/NTestDataBuilder/NTestDataBuilder.csproj @@ -54,6 +54,13 @@ + + + + + + + @@ -61,9 +68,9 @@ + - diff --git a/_NCrunch_NTestDataBuilder/StoredText/cd7eeea2d0b941bda2d056ab2cb6b839 b/_NCrunch_NTestDataBuilder/StoredText/cd7eeea2d0b941bda2d056ab2cb6b839 new file mode 100644 index 0000000000000000000000000000000000000000..627bbc4413eaffd354305666858bf9fadf151d8a GIT binary patch literal 22190 zcmeHPT~8B16g|&P{11IZV+cZ3%8P-D#)Js57<@B@F0$G$yITYQo^xg?U}`5tx<$*$ zrm&sP&Yh2Y=j^$2XPUS`h8zjHSj7kQ@Cz+;kfM!!446LT_nhDR{B0NKIAPl0I%Nx0 zH1AnP6)Ht#OWsMSO`9oe{0t~vHR$pe)pE$%K4@-NWf|1Pf<^R%y?P`yT>1}p5BV|-_B)wCMY)PoK7T8m|7 zc#7%Ln=J7M%X~-K=X`2JiOE7F?oiHYXkmhF-W9#Mh_>#rt*4YOEz&qHLgu8VZims_ z52H8;e;XVxY4W_r;0ecFpQE5lJ-iQXR;zo|SIHmimb6;mzFz5F51&F_)kOD&=1B{S zz8dFO$tm^jjFy^(XQXkm%ocUB!xBI9KE+SADZvWfgiF@-k&+VT&GD9bbAEQ1C*?D3 zrVpu+x@qo zzf_oKa;z%%o>M$8$-X@={RsiabMRxCmuyX%A&v6ozR^4uYg$f}-y=THit%-98sqr} zW9~64+cEbLlPr^a7~_rc<$EoR@&7lIACd2OX5jHJ>3dr<#v9|qTj6XTO=G+<-rjn7 zUFWerU~4MdnwFEt|Gr)j^VHYz$_Q_SH^Nf~Zm$oIR|h6nrOIDHG>bQjH;eard~7|w z$(4A;j3}NWj_>x;J3{C#F-hheWpfVWyYb!lZhVj7dxLRuIV1UE*uIGkb9Zxhb9Zz1 z5T|<+kMCIeMMRhTO}Xqh<>mFxYbQz^-`DX1HRHSS-S}>NH@t_Y9kLl+8NqpSOSB{(1Z7WB&OA?!K3mBoPn2