Created
November 21, 2014 13:04
-
-
Save MikeMKH/ea067c50297f31196e1c to your computer and use it in GitHub Desktop.
FizzBuzz kata in C# using LINQ and "infinite" list.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Linq; | |
using Microsoft.VisualStudio.TestTools.UnitTesting; | |
namespace FizzBuzz | |
{ | |
[TestClass] | |
public class FizzBuzzerTests | |
{ | |
private static void AssertThat(string expected, int value) | |
{ | |
Assert.AreEqual(expected, FizzBuzzer.ValueOf(value)); | |
} | |
private static void AssertContainsFizz(int value) | |
{ | |
AssertContains(value, "Fizz"); | |
} | |
private static void AssertContainsBuzz(int value) | |
{ | |
AssertContains(value, "Buzz"); | |
} | |
private static void AssertContains(int value, string expected) | |
{ | |
Assert.IsTrue(FizzBuzzer.ValueOf(value).Contains(expected)); | |
} | |
[TestMethod] | |
public void GivenNumberNotDivisibleBy3Or5_ItMustReturnSelfAsString() | |
{ | |
AssertThat("2", 2); | |
AssertThat("4", 4); | |
AssertThat("22", 22); | |
AssertThat("44", 44); | |
} | |
[TestMethod] | |
public void Given3_ItMustReturnFizz() | |
{ | |
AssertThat("Fizz", 3); | |
} | |
[TestMethod] | |
public void GivenNumberDivisibleBy3_ResultMustContainFizz() | |
{ | |
AssertContainsFizz(3); | |
AssertContainsFizz(9); | |
AssertContainsFizz(33); | |
AssertContainsFizz(333); | |
} | |
[TestMethod] | |
public void Given5_ItMustReturnBuzz() | |
{ | |
AssertThat("Buzz", 5); | |
} | |
[TestMethod] | |
public void GivenNumberDivisibleBy5_ResultMustContainBuzz() | |
{ | |
AssertContainsBuzz(5); | |
AssertContainsBuzz(25); | |
AssertContainsBuzz(55); | |
AssertContainsBuzz(555); | |
} | |
[TestMethod] | |
public void Given15_ItMustReturnFizzBuzz() | |
{ | |
AssertThat("FizzBuzz", 15); | |
} | |
[TestMethod] | |
public void GivenNumberDivisibleByBoth3And5_ItMustReturnFizzBuzz() | |
{ | |
AssertThat("FizzBuzz", 30); | |
AssertThat("FizzBuzz", 45); | |
AssertThat("FizzBuzz", 15000); | |
} | |
} | |
public class FizzBuzzer | |
{ | |
public static string ValueOf(int n) | |
{ | |
var fizzes = Enumerable.Range(0, int.MaxValue).Select(s => s%3 == 0 ? "Fizz" : string.Empty); | |
var buzzes = Enumerable.Range(0, int.MaxValue).Select(s => s%5 == 0 ? "Buzz" : string.Empty); | |
var result = fizzes.Zip(buzzes, (f, b) => f + b) | |
.Zip(Enumerable.Range(0, int.MaxValue).Select(s => s.ToString()), | |
(fb, d) => string.IsNullOrEmpty(fb) ? d : fb); | |
return result.Skip(n).First(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment