Angel "Java" Lopez

NET, Java, PHP y Desarrollo de Software

This Blog

Syndication

Search

Tags

Community

Email Notifications

Archives

.NET

ASP.NET

Windows Form

VB.NET

C#

Sitios

Blogs

TDD Paso a Paso (6) La semana del panadero

Anterior Post

Sigamos mejorando la clase de calendario de días laborables. Quiero ahora plantear el caso:

- El sábado y domingo se trabaja
- El lunes no se trabaja

Acá en Argentina, es común que así sea la semana del panadero (aunque dado los tiempos que corren, muchos abren todos los días). Este es el test que me armé: configuro al calendario con sábado y domingo como días laborales, y lunes como no laborable. Luego se prueban esos tres días:

[TestMethod]
public void SetWeekendAsWorkingDaysAndMondayAsANonWorkingDay()
{
	WorkingDaysCalendar calendar = new WorkingDaysCalendar();

	calendar.AddDayOfWeekAsWorkingDay(DayOfWeek.Saturday);
	calendar.AddDayOfWeekAsWorkingDay(DayOfWeek.Sunday);
	calendar.AddDayOfWeekAsNonWorkingDay(DayOfWeek.Monday);

	DateTime saturday = new DateTime(2012, 3, 10);
	Assert.AreEqual(saturday.DayOfWeek, DayOfWeek.Saturday);

	Assert.IsTrue(calendar.IsWorkingDay(saturday));
	Assert.IsTrue(calendar.IsWorkingDay(saturday.AddDays(1)));
	Assert.IsFalse(calendar.IsWorkingDay(saturday.AddDays(2)));
}

Al ejecutar este código, si tenemos la clase calendario del post anterior, da en rojo, porque no tengo contemplado más que un día especial por tipo: sólo un día laborable especial, o sólo un día no laborable especial. Pero al llegar a este test, puedo implementar mejor el algoritmo interno. Llegó la hora de tener una lista de días:

public class WorkingDaysCalendar
{
	private IList<DayOfWeek> nonWorkingDaysOfWeek = new List<DayOfWeek>() { DayOfWeek.Saturday, DayOfWeek.Sunday };

	public bool IsWorkingDay(DateTime day)
	{
		if (this.nonWorkingDaysOfWeek.Contains(day.DayOfWeek))
			return false;

		return true;
	}

	public void AddDayOfWeekAsWorkingDay(DayOfWeek dayOfWeek)
	{
		if (this.nonWorkingDaysOfWeek.Contains(dayOfWeek))
			this.nonWorkingDaysOfWeek.Remove(dayOfWeek);
	}

	public void AddDayOfWeekAsNonWorkingDay(DayOfWeek dayOfWeek)
	{
		if (!this.nonWorkingDaysOfWeek.Contains(dayOfWeek))
			this.nonWorkingDaysOfWeek.Add(dayOfWeek);
	}
}

Agregué una lista interna de días no laborables, sin cambiar la interfaz pública de la clase. ¿Pero habré cumplido con lo pedido con el test? Ejecuto, y da verde. ¿Pero no habré roto algo? Ejecuto el resto de los tests, también estan en verde. En cualquier caso, seguiría trabajando hasta que todo quede en verde. Luego, vendría refactorización. Por ejemplo, no estoy conforme conque los métodos comienzen con Add. No se agregan días, sólo se informa de su carácter de laborable o no laborable. Pero bueno, eso será para otro post.

Próximos temas: refactorizar, soporte de días feriados, feriados puentes, etc…

Nos leemos!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

Published Fri, May 25 2012 23:36 by lopez

Comments

# TDD y Baby Steps@ Thursday, January 31, 2013 8:04 AM

Ya saben que TDD (Test-Driven Development) es uno de mis temas favoritos. Y no sólo porque me gusta,

Angel "Java" Lopez

Leave a Comment

(required) 
(required) 
(optional)
(required) 
If you can't read this number refresh your screen
Enter the numbers above: