Created
April 7, 2014 13:11
-
-
Save davidwhitney/10020016 to your computer and use it in GitHub Desktop.
day of week kata
This file contains 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.Collections; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
using NUnit.Framework; | |
namespace dayofweekkata | |
{ | |
public class PrettyPrinter | |
{ | |
public static string Convert(params int[] integers) | |
{ | |
var ordered = integers.OrderBy(x=>x).ToList(); | |
var groups = new List<List<int>>(); | |
var currentGrouping = new List<int>(); | |
foreach(var integer in ordered) | |
{ | |
if (currentGrouping.Count == 0) | |
{ | |
currentGrouping.Add(integer); | |
continue; | |
} | |
var previous = currentGrouping.Last(); | |
if (integer - previous == 1) | |
{ | |
currentGrouping.Add(integer); | |
continue; | |
} | |
groups.Add(currentGrouping); | |
currentGrouping = new List<int> {integer}; | |
} | |
if (currentGrouping.Any()) | |
{ | |
groups.Add(currentGrouping); | |
} | |
var strings = new List<string>(); | |
foreach (var stack in groups) | |
{ | |
if (stack.Count < 3) | |
{ | |
var asDays = stack.Select(x => (DayOfWeek)x); | |
strings.Add(string.Join(", ", asDays)); | |
} | |
else | |
{ | |
strings.Add((DayOfWeek)stack.First() + "-" + (DayOfWeek)stack.Last()); | |
} | |
} | |
return string.Join(", ", strings); | |
} | |
} | |
public enum DayOfWeek | |
{ | |
Mon = 1, | |
Tue, | |
Wed, | |
Thu, | |
Fri, | |
Sat, | |
Sun | |
} | |
[TestFixture] | |
public class PrettyPrinterTests | |
{ | |
[TestCase(1, "Mon")] | |
[TestCase(2, "Tue")] | |
[TestCase(3, "Wed")] | |
[TestCase(4, "Thu")] | |
[TestCase(5, "Fri")] | |
[TestCase(6, "Sat")] | |
[TestCase(7, "Sun")] | |
public void Convert_SingleDayProvided_ConvertsToAppropriateValue(int dayId, string dayShort) | |
{ | |
var output = PrettyPrinter.Convert(dayId); | |
Assert.That(output, Is.EqualTo(dayShort)); | |
} | |
[Test] | |
public void Convert_TwoSequentialDays_Joins() | |
{ | |
var output = PrettyPrinter.Convert(1, 2); | |
Assert.That(output, Is.EqualTo("Mon, Tue")); | |
} | |
[Test] | |
public void Convert_TwoSequentialDaysProvidedBackwards_Joins() | |
{ | |
var output = PrettyPrinter.Convert(2, 1); | |
Assert.That(output, Is.EqualTo("Mon, Tue")); | |
} | |
[Test] | |
public void Convert_ThreeSequentialDays_Hyphenates() | |
{ | |
var output = PrettyPrinter.Convert(1, 2, 3); | |
Assert.That(output, Is.EqualTo("Mon-Wed")); | |
} | |
[Test] | |
public void Convert_ThreeSequentialDaysPlusWeekend_Hyphenates() | |
{ | |
var output = PrettyPrinter.Convert(1, 2, 3, 6, 7); | |
Assert.That(output, Is.EqualTo("Mon-Wed, Sat, Sun")); | |
} | |
[Test] | |
public void Convert_ThreeSequentialDaysFromTheMiddlePlusWeekend_Hyphenates() | |
{ | |
var output = PrettyPrinter.Convert(2, 3, 4, 6, 7); | |
Assert.That(output, Is.EqualTo("Tue-Thu, Sat, Sun")); | |
} | |
} | |
/* 1,2,3,4,5,6,7: Mon-Sun | |
1,2,3,6,7: Mon-Wed, Sat, Sun | |
1,3,4,5,6: Mon, Wed-Sat | |
2,3,4,6,7: Tue-Thu, Sat, Sun | |
1,3,4,6,7: Mon, Wed, Thu, Sat, Sun | |
7: Sun | |
1,7: Mon, Sun | |
1,8: ArgumentError*/ | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment