Skip to content

Instantly share code, notes, and snippets.

@davidwhitney
Created April 7, 2014 13:11
Show Gist options
  • Save davidwhitney/10020016 to your computer and use it in GitHub Desktop.
Save davidwhitney/10020016 to your computer and use it in GitHub Desktop.
day of week kata
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