Desarrollando un juego de mesa – Hex (parte 5)
Posts relacionados:
Desarrollando un juego de mesa – Hex (parte 1)
Desarrollando un juego de mesa – Hex (parte 2)
Desarrollando un juego de mesa – Hex (parte 3)
Desarrollando un juego de mesa – Hex (parte 4)
Una vez que la lógica del juego está armada, comienzo con el desarrollo de las "interfaces gráficas". La primer versión, es una aplicación de Consola, así que agrego un proyecto nuevo (BoardGame.Hex.UI.ConsoleUI). Como la idea es hacer TDD (Siiii, me re copé con esto, y quiero hacer también de la UI... ¿porqué? ¿no debería?) también agrego un proyecto llamado BoardGame.Hex.UI.ConsoleUI.UnitTest.
Armar los Test para la consola, me dejó medio desorientado, pero, después de pensar un rato e investigar sobre como escribir test unitarios para consola, armé los siguientes dentro de un test llamado ConsoleInterpreterTest:
- User Enter Commands To End: Valida que el usuario ingrese diferentes comandos hasta que se ingrese el que representa la salida del sistema.
- Don't Enter Commands After End: Valida que el sistema genere una excepción si se intenta ingresar un comando después de que se ingresa el comando que representa la salida del sistema.
- Check Don't Exists Command: Valida el mensaje que el sistema devuelve al ingresar un comando inválido.
- Check Commands: Valida los mensajes que el sistema devuelve al ingresar los comandos permitidos.
- Check Draw Board 5x5 Empty: Valida que el sistema "dibuje" un tablero vacío de Hex de 5x5.
- Check Draw Board 5x5 After First Move: Valida que el sistema "dibuje" el tablero después de haber hecho el primer movimiento.
En este punto, comencé a notar que estaba comenzando a dejar muchos métodos como públicos dentro de una clase llamada ConsoleInterpreter para poder testearlos, lo cual considero incorrecto... así que, con todos los tests en verde, comencé a dividir las responsabilidades, dejando en ConsoleInterpreter todo lo que sea uso de consola (algo genérico que podría reutilizarse para cualquier aplicación que sea necesario utilizar desde consola), y creé una clase nueva ConsoleGameHex que representa la consola de GameHex y dividí los test (y agregué algunos nuevos que fuí necesitando) de la siguiente manera:
- ConsoleInterpreterTest: Test para interactuar con la consola.
- Check Throw ArgumentNullException When Don't Specific ConsoleInterpreterHelper: Valida que se genere un ArgumentNullException si se pasa un ConsoleInterpreterHelper en nulo.
- Check Throw ArgumentNullException When Don't Specific ConsoleGameHex: Valida que se genere un ArgumentNullException si se pasa un ConsoleGameHex en nulo.
- Check Can Create Console Interpreter: Valida que se pueda crear un ConsoleInterpreter pasando como parámetro un ConsoleGameHex.
NOTA: En lugar de un ConsoleGameHex debería ser una Interface para poder utilizarse ConsoleInterpreter para otras aplicaciones de consola.
- User Enter Commands To End: Explicado anteriormente.
- Don't Enter Commands After End: Explicado anteriormente.
- Check Don't Exists Command: Explicado anteriormente.
Check Commands: Este test lo dividí en dos partes, que son comandos con y sin argumentos.
- Check Commands Without Args: Valida los mensajes que el sistema devuelve al ingresar los comandos (sin argumentos) permitidos.
- Check Commands With Args: Valida los mensajes que el sistema devuelve al ingresar los comandos (con argumentos) permitidos.
- ConsoleGameHexTest: Testea la consola de GameHex, que contiene especificaciones para el juego.
- Check Can Create ConsoleGameHex With Board: Valida que se pueda crear un ConsoleGameHex especificando un tablero.
- Check Can Create ConsoleGameHex Without Board: Valida que se pueda crear un ConsoleGameHex sin especificar un tablero.
- Check Draw Board 5x5 Empty: Explicado anteriormente.
- Check Draw Board 5x5 After First Move: Explicado anteriormente.
- Check Draw Board 5x5 After Second Move: Valida que el sistema "dibuje" el tablero después de haber hecho el segundo movimiento.
- Check Execute Play: Valida que se pueda realizar un movimiento.
- Check Empty Play Throw Exception: Valida que la aplicación genere una excepción si se indica un movimiento vacío.
- ConsoleInterpreterHelperTest: Test para el Helper de la Consola.
- Check Process Empty User Input Are Empty Command And Args Lenght Zero: Verifica que si se ingresa vacío, devuelve un comando vacío y cero argumentos.
- Check Process User Input No Empty Without Args Are A Command And Args Lenght Zero: Verifica que si se ingresa un comando sin argumentos, devuelve un comando y cero argumentos.
- Check Process Another User Input No Empty Without Args Are A Command And Args Lenght Zero: Verifica que si se ingresa un comando (diferente al anterior) sin argumentos, devuelve el comando ingresado y cero argumentos.
- Check Process User Input No Empty With One Args Are A Command And Args: Verifica que si se ingresa un comando con un argumento, devuelve el comando y el argumento.
- Check Process User Input No Empty With Three Args Are A Command And Args: Verifica que si se ingresa un comando con tres argumentos, devuelve el comando y los tres argumentos.
Actualización 21-06-2011 07:45
- Cobertura de BoardGame.Hex mediante tests: 100%
- Cobertura de ejecución de BoardGame.Hex.UnitTest: 100%
- Cobertura de BoardGame.Hex.UI.ConsoleUI mediante tests: 95%
- Cobertura de ejecución de BoardGame.Hex.UI.ConsoleUI.UnitTest: 100%
Actualización 23-06-2011 19:40
- Cobertura de BoardGame.Hex mediante tests: 100%
- Cobertura de ejecución de BoardGame.Hex.UnitTest: 100%
- Cobertura de BoardGame.Hex.UI.ConsoleUI mediante tests: 100%
- Cobertura de ejecución de BoardGame.Hex.UI.ConsoleUI.UnitTest: 100%