From 02e29e7b57d3759dc52c83401f5fa93fc38caf13 Mon Sep 17 00:00:00 2001 From: Steven Atkinson Date: Tue, 29 Jan 2019 08:10:45 +0000 Subject: [PATCH] Added the Music faker (#105) * Added the documentation. * Added the data for the Music faker. * Implemented the Music faker. * Added the MusicFaker to the main faker class. --- FakerDotNet.sln.DotSettings | 3 +- README.md | 1 + doc/music.md | 15 + src/FakerDotNet/Data/MusicData.cs | 371 ++++++++++++++++++ src/FakerDotNet/Faker.cs | 1 + src/FakerDotNet/FakerContainer.cs | 3 + src/FakerDotNet/Fakers/MusicFaker.cs | 59 +++ .../FakerDotNet.Tests/FakerContainerTests.cs | 6 + tests/FakerDotNet.Tests/FakerTests.cs | 6 + .../Fakers/MusicFakerTests.cs | 102 +++++ 10 files changed, 566 insertions(+), 1 deletion(-) create mode 100644 doc/music.md create mode 100644 src/FakerDotNet/Data/MusicData.cs create mode 100644 src/FakerDotNet/Fakers/MusicFaker.cs create mode 100644 tests/FakerDotNet.Tests/Fakers/MusicFakerTests.cs diff --git a/FakerDotNet.sln.DotSettings b/FakerDotNet.sln.DotSettings index 25c2fac..09f27ed 100644 --- a/FakerDotNet.sln.DotSettings +++ b/FakerDotNet.sln.DotSettings @@ -1,3 +1,4 @@  IP - RNG \ No newline at end of file + RNG + True \ No newline at end of file diff --git a/README.md b/README.md index e1ab1c5..7357d0c 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ A .NET port of the Ruby [faker](https://github.com/stympy/faker) gem - [Faker.HarryPotter](doc/harry_potter.md) - [Faker.Internet](doc/internet.md) - [Faker.Lorem](doc/lorem.md) + - [Faker.Music](doc/music.md) - [Faker.Name](doc/name.md) - [Faker.Number](doc/number.md) - [Faker.PhoneNumber](doc/phone_number.md) diff --git a/doc/music.md b/doc/music.md new file mode 100644 index 0000000..ae3da13 --- /dev/null +++ b/doc/music.md @@ -0,0 +1,15 @@ +# Faker.Music + +```cs +Faker.Music.Key() //=> "C" + +Faker.Music.Chord() //=> "Amaj7" + +Faker.Music.Instrument() //=> "Ukelele" + +Faker.Music.Band() //=> "The Beatles" + +Faker.Music.Album() //=> "Sgt. Pepper's Lonely Hearts Club" + +Faker.Music.Genre() //=> "Rock" +``` \ No newline at end of file diff --git a/src/FakerDotNet/Data/MusicData.cs b/src/FakerDotNet/Data/MusicData.cs new file mode 100644 index 0000000..03a422f --- /dev/null +++ b/src/FakerDotNet/Data/MusicData.cs @@ -0,0 +1,371 @@ +using System.Collections.Generic; + +namespace FakerDotNet.Data +{ + internal static class MusicData + { + public static readonly IEnumerable Keys = new[] + { + "C", + "D", + "E", + "F", + "G", + "A", + "B" + }; + + public static readonly IEnumerable KeyVariants = new[] + { + "", + "b", + "#" + }; + + public static readonly IEnumerable KeyTypes = new[] + { + "", + "m" + }; + + public static readonly IEnumerable ChordTypes = new[] + { + "", + "maj", + "6", + "maj7", + "m", + "m7", + "-7", + "7", + "dom7", + "dim", + "dim7", + "m7b5" + }; + + public static readonly IEnumerable Instruments = new[] + { + "Electric Guitar", + "Acoustic Guitar", + "Flute", + "Trumpet", + "Clarinet", + "Cello", + "Harp", + "Xylophone", + "Harmonica", + "Accordion", + "Organ", + "Piano", + "Ukelele", + "Saxophone", + "Drums", + "Violin", + "Bass Guitar", + "Oboe" + }; + + public static readonly IEnumerable Bands = new[] + { + "AC/DC", + "Adam and the Ants", + "Afrika Bambaataa", + "Al Foster", + "Alan Parsons", + "Alex Chilton", + "Amy Winehouse", + "Annie Lennox", + "Arctic Monkeys", + "B.B. King", + "Bauhaus", + "The Beatles", + "Beck", + "Billy Idol", + "The Birthday Party", + "Björk", + "Blinker The Star", + "Blondie", + "Blur", + "Bob Dylan", + "Bob Marley (and the Wailers)", + "Brian Wilson", + "Bruce Springsteen", + "Buzzcocks", + "Captain Beefheart", + "Carlos Santana", + "Cat Anderson", + "Cat Stevens", + "Catherine Wheel", + "Chic", + "Chris Isaak", + "Chrissie Hynde", + "Chuck Berry", + "The Clash", + "Cliff Richard (and the Shadows)", + "Coldplay", + "Cootie Williams", + "Cortinas", + " The", + "The Cramps", + "The Cranberries", + "Cream", + "The Cure", + "David Bowie", + "David Gilmour", + "Deepest Blue", + "Devo", + "Dizzy Gillespie", + "Dr Feelgood", + "Duke Ellington", + "Ed Sheeran", + "Ella Fitzgerald", + "Elton John", + "Elvis Costello", + "Elvis Presley", + "Eric Clapton", + "The Faces", + "Fats Domino", + "Flaming Lips", + "Florence and the Machine", + "Foo Fighters", + "Frank Sinatra", + "Frank Zappa", + "Frightened Rabbit", + "George Michael", + "Grace Jones", + "Green Day", + "Guns N' Roses", + "Herbie Hancock", + "Horace Silver", + "Hugh Masekela", + "Ian Dury", + "Iggy Pop", + "The Jam", + "James Brown", + "Jeff Beck", + "Jeff Buckley", + "Jimi Hendrix", + "John Coltrane", + "John Lydon", + "Johnny Borrell", + "Johnny Cash", + "Johnny Marr", + "Joni Mitchell", + "Joy Division", + "K.D Lang", + "Kasabian", + "Kate Bush", + "Keith Moon", + "Keith Richards", + "The Kinks", + "Kiss", + "The La's", + "Led Zeppelin", + "Lenny Kravitz", + "Leonard Cohen", + "Liam Gallagher", + "The Libertines", + "Madness", + "Madonna", + "Manic Street Preachers", + "Marc Bolan", + "Marianne Faithfull", + "Marilyn Manson", + "Maroon 5", + "The Mars Volta", + "Max Roach", + "Michael Jackson", + "Miles Davis", + "Morrissey", + "Muddy Waters", + "Mumford and Sons", + "Muse", + "Neil Young", + "New Order", + "Nick Cave", + "Nigel Kennedy", + "Nina Simone", + "Nirvana", + "Noel Gallagher", + "O.A.R.", + "Oasis", + "Offspring", + "Ozzy Osbourne", + "Paramore", + "Pat Metheny", + "Patti Smith", + "Paul Weller", + "Pearl Jam", + "Pete Townshend", + "Phil Collins", + "Phish", + "Pink Floyd", + "PJ Harvey", + "The Police", + "The Pretenders", + "Primal Scream", + "Prince", + "Program The Dead", + "Pulp", + "Queen", + "Radiohead", + "The Ramones", + "Red Hot Chili Peppers", + "R.E.M.", + "Rick Wright", + "Rod Stewart", + "The Rolling Stones", + "Rory Gallagher", + "Roxy Music", + "Roy Hargrove", + "Rufus Wainwright", + "Run-D.M.C.", + "Ryan Adams", + "Sex Pistols", + "Simply Red", + "Sinead O'connor", + "Siouxsie and The Banshees", + "The Slits", + "The Smiths", + "Sonic Youth", + "The Specials", + "Squeeze", + "Status Quo", + "Stereophonics", + "Stone Roses", + "Syd Barrett", + "Thelonius Monk", + "Thin Lizzy", + "Thornley", + "Tina Turner", + "Tom Jones", + "Tom Robinson", + "Tom Waits", + "U2", + "The Undertones", + "Van Morrison", + "Velvet Revolver", + "White Stripes", + "The Who", + "The Yardbirds", + "Yumi Matsutoya" + }; + + public static readonly IEnumerable Albums = new[] + { + "Thriller", + "Back in Black", + "The Dark Side of the Moon", + "Bat Out of Hell", + "The Bodyguard", + "Their Greatest Hits (1971–1975)", + "Saturday Night Fever", + "Rumours", + "Grease: The Original Soundtrack from the Motion Picture", + "Led Zeppelin IV", + "Bad", + "Jagged Little Pill", + "Come On Over", + "Falling into You", + "Sgt. Pepper's Lonely Hearts Club Band", + "Hotel California", + "Dirty Dancing", + "21", + "Let's Talk About Love", + "1", + "Gold: Greatest Hits", + "Dangerous", + "The Immaculate Collection", + "Abbey Road", + "Born in the U.S.A.", + "Brothers in Arms", + "Titanic: Music from the Motion Picture", + "Metallica", + "Nevermind", + "The Wall", + "Supernatural", + "Appetite for Destruction", + "Slippery When Wet", + "Music Box", + "The Eminem Show", + "Hybrid Theory", + "Come Away with Me", + "Unplugged", + "True Blue", + "Legend: The Best of Bob Marley & The Wailers", + "Tapestry", + "No Jacket Required", + "Greatest Hits", + "Bridge over Troubled Water", + "The Joshua Tree", + "...Baby One More Time", + "Backstreet's Back", + "Backstreet Boys", + "Millennium", + "Spice", + "Happy Nation", + "The Sign", + "Whitney Houston", + "(What's the Story) Morning Glory?", + "The Marshall Mathers LP", + "Like a Virgin", + "Cross Road", + "25", + "Boston", + "Oops!... I Did It Again", + "The Colour of My Love", + "Hysteria", + "Faith", + "Dookie", + "Can't Slow Down", + "Daydream", + "HIStory: Past", + " Present and Future", + " Book I", + "Off the Wall", + "The Woman in Me", + "Breakfast in America", + "Tracy Chapman", + "Flashdance: Original Soundtrack from the Motion Picture", + "Whitney", + "Confessions", + "X&Y", + "High School Musical", + "High School Musical 2", + "Viva la Vida or Death and All His Friends", + "I Dreamed a Dream", + "Recovery", + "Midnight Memories", + "Frozen", + "Lemonade", + "Brand New Eyes", + "All We Know Is Falling", + "Riot!", + "Songs About Jane", + "Hands All Over" + }; + + public static readonly IEnumerable Genres = new[] + { + "Rock", + "Pop", + "Electronic", + "Folk", + "World", + "Country", + "Jazz", + "Funk", + "Soul", + "Hip Hop", + "Classical", + "Latin", + "Reggae", + "Stage And Screen", + "Blues", + "Non Music", + "Rap" + }; + + } +} diff --git a/src/FakerDotNet/Faker.cs b/src/FakerDotNet/Faker.cs index 3e1b3e0..7e6b237 100644 --- a/src/FakerDotNet/Faker.cs +++ b/src/FakerDotNet/Faker.cs @@ -29,6 +29,7 @@ public static class Faker public static IHarryPotterFaker HarryPotter { get; } = Container.HarryPotter; public static IInternetFaker Internet { get; } = Container.Internet; public static ILoremFaker Lorem { get; } = Container.Lorem; + public static IMusicFaker Music { get; } = Container.Music; public static INameFaker Name { get; } = Container.Name; public static INumberFaker Number { get; } = Container.Number; public static IPhoneNumberFaker PhoneNumber { get; } = Container.PhoneNumber; diff --git a/src/FakerDotNet/FakerContainer.cs b/src/FakerDotNet/FakerContainer.cs index 08b6d58..471bdbf 100644 --- a/src/FakerDotNet/FakerContainer.cs +++ b/src/FakerDotNet/FakerContainer.cs @@ -27,6 +27,7 @@ internal interface IFakerContainer IHarryPotterFaker HarryPotter { get; } IInternetFaker Internet { get; } ILoremFaker Lorem { get; } + IMusicFaker Music { get; } INameFaker Name { get; } INumberFaker Number { get; } IPhoneNumberFaker PhoneNumber { get; } @@ -72,6 +73,7 @@ public FakerContainer() HarryPotter = new HarryPotterFaker(this); Internet = new InternetFaker(this); Lorem = new LoremFaker(this); + Music = new MusicFaker(this); Name = new NameFaker(this); Number = new NumberFaker(); PhoneNumber = new PhoneNumberFaker(this); @@ -113,6 +115,7 @@ public FakerContainer() public IHarryPotterFaker HarryPotter { get; } public IInternetFaker Internet { get; } public ILoremFaker Lorem { get; } + public IMusicFaker Music { get; } public INameFaker Name { get; } public INumberFaker Number { get; } public IPhoneNumberFaker PhoneNumber { get; } diff --git a/src/FakerDotNet/Fakers/MusicFaker.cs b/src/FakerDotNet/Fakers/MusicFaker.cs new file mode 100644 index 0000000..81cca6f --- /dev/null +++ b/src/FakerDotNet/Fakers/MusicFaker.cs @@ -0,0 +1,59 @@ +using System; +using FakerDotNet.Data; + +namespace FakerDotNet.Fakers +{ + public interface IMusicFaker + { + string Key(); + string Chord(); + string Instrument(); + string Band(); + string Album(); + string Genre(); + } + + internal class MusicFaker : IMusicFaker + { + private readonly IFakerContainer _fakerContainer; + + public MusicFaker(IFakerContainer fakerContainer) + { + _fakerContainer = fakerContainer; + } + + public string Key() + { + return string.Join("", + _fakerContainer.Random.Element(MusicData.Keys), + _fakerContainer.Random.Element(MusicData.KeyVariants)); + } + + public string Chord() + { + return string.Join("", + _fakerContainer.Random.Element(MusicData.Keys), + _fakerContainer.Random.Element(MusicData.ChordTypes)); + } + + public string Instrument() + { + return _fakerContainer.Random.Element(MusicData.Instruments); + } + + public string Band() + { + return _fakerContainer.Random.Element(MusicData.Bands); + } + + public string Album() + { + return _fakerContainer.Random.Element(MusicData.Albums); + } + + public string Genre() + { + return _fakerContainer.Random.Element(MusicData.Genres); + } + } +} diff --git a/tests/FakerDotNet.Tests/FakerContainerTests.cs b/tests/FakerDotNet.Tests/FakerContainerTests.cs index 984a7d8..1692d48 100644 --- a/tests/FakerDotNet.Tests/FakerContainerTests.cs +++ b/tests/FakerDotNet.Tests/FakerContainerTests.cs @@ -153,6 +153,12 @@ public void Lorem_returns_ILoremFaker() Assert.IsInstanceOf(_fakerContainer.Lorem); } + [Test] + public void Music_returns_IMusicFaker() + { + Assert.IsInstanceOf(_fakerContainer.Music); + } + [Test] public void Name_returns_INameFaker() { diff --git a/tests/FakerDotNet.Tests/FakerTests.cs b/tests/FakerDotNet.Tests/FakerTests.cs index ad8cfa6..e2bcacf 100644 --- a/tests/FakerDotNet.Tests/FakerTests.cs +++ b/tests/FakerDotNet.Tests/FakerTests.cs @@ -145,6 +145,12 @@ public void Lorem_returns_ILoremFaker() Assert.IsInstanceOf(Faker.Lorem); } + [Test] + public void Music_returns_IMusicFaker() + { + Assert.IsInstanceOf(Faker.Music); + } + [Test] public void Name_returns_INameFaker() { diff --git a/tests/FakerDotNet.Tests/Fakers/MusicFakerTests.cs b/tests/FakerDotNet.Tests/Fakers/MusicFakerTests.cs new file mode 100644 index 0000000..ce7eb11 --- /dev/null +++ b/tests/FakerDotNet.Tests/Fakers/MusicFakerTests.cs @@ -0,0 +1,102 @@ +using FakeItEasy; +using FakerDotNet.Data; +using FakerDotNet.Fakers; +using NUnit.Framework; + +namespace FakerDotNet.Tests.Fakers +{ + [TestFixture] + [Parallelizable] + public class MusicFakerTests + { + [SetUp] + public void SetUp() + { + _fakerContainer = A.Fake(); + _musicFaker = new MusicFaker(_fakerContainer); + } + + private IFakerContainer _fakerContainer; + private IMusicFaker _musicFaker; + + [Test] + public void Key_returns_a_key() + { + A.CallTo(() => _fakerContainer.Random.Element(MusicData.Keys)) + .Returns("C"); + A.CallTo(() => _fakerContainer.Random.Element(MusicData.KeyVariants)) + .Returns(""); + + Assert.AreEqual("C", _musicFaker.Key()); + } + + [Test] + public void Key_returns_a_key_with_key_variant() + { + A.CallTo(() => _fakerContainer.Random.Element(MusicData.Keys)) + .Returns("C"); + A.CallTo(() => _fakerContainer.Random.Element(MusicData.KeyVariants)) + .Returns("#"); + + Assert.AreEqual("C#", _musicFaker.Key()); + } + + [Test] + public void Chord_returns_a_chord() + { + A.CallTo(() => _fakerContainer.Random.Element(MusicData.Keys)) + .Returns("A"); + A.CallTo(() => _fakerContainer.Random.Element(MusicData.ChordTypes)) + .Returns(""); + + Assert.AreEqual("A", _musicFaker.Chord()); + } + + [Test] + public void Chord_returns_a_chord_with_a_chord_type() + { + A.CallTo(() => _fakerContainer.Random.Element(MusicData.Keys)) + .Returns("A"); + A.CallTo(() => _fakerContainer.Random.Element(MusicData.ChordTypes)) + .Returns("maj7"); + + Assert.AreEqual("Amaj7", _musicFaker.Chord()); + } + + [Test] + public void Instrument_returns_an_instrument() + { + A.CallTo(() => _fakerContainer.Random.Element(MusicData.Instruments)) + .Returns("Ukelele"); + + Assert.AreEqual("Ukelele", _musicFaker.Instrument()); + } + + [Test] + public void Band_returns_a_band() + { + A.CallTo(() => _fakerContainer.Random.Element(MusicData.Bands)) + .Returns("The Beatles"); + + Assert.AreEqual("The Beatles", _musicFaker.Band()); + } + + [Test] + public void Album_returns_an_album() + { + A.CallTo(() => _fakerContainer.Random.Element(MusicData.Albums)) + .Returns("Sgt. Pepper's Lonely Hearts Club"); + + Assert.AreEqual("Sgt. Pepper's Lonely Hearts Club", _musicFaker.Album()); + } + + [Test] + public void Genre_returns_a_genre() + { + A.CallTo(() => _fakerContainer.Random.Element(MusicData.Genres)) + .Returns("Rock"); + + Assert.AreEqual("Rock", _musicFaker.Genre()); + } + } +}