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

This entry was posted in 10549, 11699, 3463, 5374. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>