{"id":32663915,"url":"https://github.com/luisfelipediaz/lift-kata","last_synced_at":"2026-05-18T05:44:55.951Z","repository":{"id":321816650,"uuid":"1086737489","full_name":"luisfelipediaz/Lift-Kata","owner":"luisfelipediaz","description":" Kata de TDD en C#/.NET: Construye un sistema de ascensores paso a paso usando Test-Driven Development. Incluye guía completa del ciclo Red-Green-Refactor con ejemplos prácticos.","archived":false,"fork":false,"pushed_at":"2025-10-31T18:21:11.000Z","size":41,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-31T18:24:05.240Z","etag":null,"topics":["clean-code","coding-kata","csharp","dotnet","kata","refactoring","software-craftmanship","tdd","test-driven-development","xunit"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/luisfelipediaz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-30T20:42:59.000Z","updated_at":"2025-10-31T18:21:15.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/luisfelipediaz/Lift-Kata","commit_stats":null,"previous_names":["luisfelipediaz/lift-kata"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/luisfelipediaz/Lift-Kata","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luisfelipediaz%2FLift-Kata","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luisfelipediaz%2FLift-Kata/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luisfelipediaz%2FLift-Kata/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luisfelipediaz%2FLift-Kata/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/luisfelipediaz","download_url":"https://codeload.github.com/luisfelipediaz/Lift-Kata/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luisfelipediaz%2FLift-Kata/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":282070789,"owners_count":26608933,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-31T02:00:07.401Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clean-code","coding-kata","csharp","dotnet","kata","refactoring","software-craftmanship","tdd","test-driven-development","xunit"],"created_at":"2025-10-31T23:00:56.906Z","updated_at":"2025-10-31T23:02:16.221Z","avatar_url":"https://github.com/luisfelipediaz.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Lift Kata - Práctica de TDD\n\nUna kata diseñada para practicar **Test-Driven Development (TDD)** construyendo un sistema de ascensores paso a paso.\n\n## Sobre TDD y esta Kata\n\n**Test-Driven Development** es una técnica de desarrollo donde escribes las pruebas ANTES que el código de producción. El ciclo es:\n\n1. **🔴 Red**: Escribe un test que falla\n2. **🟢 Green**: Escribe el código mínimo para que pase\n3. **🔵 Refactor**: Mejora el código manteniendo los tests en verde\n\n### ¿Por qué esta kata es ideal para TDD?\n\n- **Requisitos claros e incrementales**: Cada característica del ascensor es pequeña y bien definida\n- **Feedback inmediato**: Sabes cuando algo funciona o no\n- **Diseño emergente**: El código evoluciona naturalmente desde lo simple hacia lo complejo\n- **Errores de estado**: El ascensor tiene muchos estados (piso actual, puertas, dirección) que son perfectos para practicar TDD\n\n## Requisitos del Ascensor\n\n### Funcionalidad Básica\n\n- Un ascensor se mueve entre varios pisos\n- Tiene un panel de botones que los pasajeros presionan para solicitar pisos (requests)\n- Las personas pueden llamar al ascensor desde otros pisos. Una llamada (call) tiene un piso y una dirección deseada\n- Tiene puertas que pueden estar abiertas o cerradas\n- Cumple un **request** cuando se mueve al piso solicitado y abre las puertas\n- Cumple un **call** cuando se mueve al piso correcto, está por ir en la dirección solicitada, y abre las puertas\n- **Solo puede moverse entre pisos si las puertas están cerradas**\n\n### Características Adicionales\n\nCuando tengas un ascensor funcionando, puedes abordar estas características:\n\n- Puede haber más de un ascensor\n- Solo un ascensor necesita responder a cada llamada\n- En cada piso hay un monitor sobre cada puerta. Mientras el ascensor se mueve, muestra en qué piso está\n- Cuando el ascensor se detiene para responder una llamada, el monitor muestra en qué dirección irá\n- Al cumplir una llamada, el ascensor relevante hace un 'DING' al abrir las puertas\n\n## Cómo Empezar con TDD\n\n### Primer Test: Lo más simple posible\n\n```csharp\n[Fact]\npublic void Lift_CanOpenDoors()\n{\n    var lift = new Lift();\n\n    lift.OpenDoors();\n\n    lift.AreDoorsOpen.Should().BeTrue();\n}\n```\n\n**🔴 Red**: Este test fallará porque `Lift` no existe\n**🟢 Green**: Crea la clase `Lift` con `OpenDoors()` y `AreDoorsOpen`\n**🔵 Refactor**: ¿Hay algo que mejorar? Aún no\n\n### Progresión Sugerida (Baby Steps)\n\n1. El ascensor puede abrir puertas\n2. El ascensor puede cerrar puertas\n3. El ascensor puede subir un piso\n4. El ascensor puede bajar un piso\n5. El ascensor no puede moverse con puertas abiertas\n6. El ascensor puede recibir requests (botones internos)\n7. El ascensor se mueve al piso solicitado\n8. El ascensor puede recibir calls (botones externos)\n9. El ascensor respeta la dirección de las llamadas\n10. El ascensor maneja múltiples requests en cola\n11. El sistema tiene límites de pisos\n12. ... y así sucesivamente\n\n## Convención de Commits para TDD\n\nEste proyecto usa emojis para marcar cada fase del ciclo TDD:\n\n- **🔴 Red**: Test fallando\n  ```\n  🔴 El ascensor no puede moverse con puertas abiertas\n  ```\n\n- **🟢 Green**: Test pasando\n  ```\n  🟢 El ascensor no puede moverse con puertas abiertas\n  ```\n\n- **🔵 Refactor**: Mejora sin cambiar comportamiento\n  ```\n  🔵 Extraer lógica de validación de puertas a método privado\n  ```\n\n### ¿Por qué hacer commit de cada fase?\n\n- **Historial legible**: Puedes ver exactamente cómo evolucionó el código\n- **Seguridad**: Si un refactor sale mal, vuelves al último 🟢\n- **Aprendizaje**: Puedes revisar tu proceso y mejorarlo\n- **Evidencia**: Demuestra que seguiste TDD disciplinadamente\n\n## Ejemplo de un Ciclo Completo Red-Green-Refactor\n\n### 🔴 Red: Escribir el test que falla\n\n```csharp\n[Fact]\npublic void Lift_CantMoveUpIfTheDoorsAreOpen()\n{\n    var lift = new Lift();\n    lift.OpenDoors();\n\n    var action = () =\u003e lift.MoveUp();\n\n    action.Should().Throw\u003cInvalidOperationException\u003e();\n}\n```\n\nEjecuta el test → **Falla** porque `MoveUp()` no valida las puertas.\n\n```bash\ngit add .\ngit commit -m \"🔴 El ascensor no puede moverse con puertas abiertas\"\n```\n\n### 🟢 Green: Hacer que pase (código mínimo)\n\n```csharp\npublic void MoveUp()\n{\n    if (AreDoorsOpen)\n        throw new InvalidOperationException(\"Cannot move with doors open\");\n\n    CurrentFloor++;\n}\n```\n\nEjecuta el test → **Pasa** ✓\n\n```bash\ngit add .\ngit commit -m \"🟢 El ascensor no puede moverse con puertas abiertas\"\n```\n\n### 🔵 Refactor: Mejorar el diseño\n\n```csharp\npublic void MoveUp()\n{\n    ValidateDoorsAreClosed();\n    CurrentFloor++;\n}\n\npublic void MoveDown()\n{\n    ValidateDoorsAreClosed();\n    CurrentFloor--;\n}\n\nprivate void ValidateDoorsAreClosed()\n{\n    if (AreDoorsOpen)\n        throw new InvalidOperationException(\"Cannot move with doors open\");\n}\n```\n\nEjecuta los tests → **Todos pasan** ✓\n\n```bash\ngit add .\ngit commit -m \"🔵 Extraer validación de puertas a método privado\"\n```\n\n## Estructura del Proyecto\n\n```\nLift-Kata/\n├── Domain/\n│   ├── Lift.cs              # Clase principal del ascensor\n│   ├── LiftSystem.cs        # Sistema que maneja múltiples ascensores\n│   └── Extensions/          # Métodos de extensión para mejorar semántica\n├── Lift.Tests/\n│   ├── LiftTests.cs         # Tests unitarios del Lift\n│   └── LiftSystemTests.cs   # Tests de integración del sistema\n└── Cosmos.Katas.sln\n```\n\n### Tecnologías y Dependencias\n\n- **.NET 9**: Framework principal\n- **xUnit**: Framework de testing\n- **AwesomeAssertions**: Assertions fluidas (`.Should().BeTrue()`)\n\n### Ejecutar los Tests\n\n```bash\ndotnet test\n```\n\nPara ver tests específicos:\n```bash\ndotnet test --filter \"FullyQualifiedName~LiftUnitTests\"\n```\n\n## Tips Específicos de TDD para esta Kata\n\n### 1. Manejo de Estado\n\nEl ascensor tiene múltiples estados interdependientes:\n- Piso actual\n- Estado de las puertas\n- Dirección\n- Cola de requests/calls\n\n**Tip**: Empieza con el estado más simple (puertas) antes de abordar la cola de requests.\n\n### 2. Testing de Excepciones\n\nMuchas reglas se expresan como \"no puede hacer X si Y\":\n\n```csharp\nvar action = () =\u003e lift.MoveUp();\naction.Should().Throw\u003cInvalidOperationException\u003e();\n```\n\n**Tip**: Valida el mensaje de la excepción para hacer tests más específicos.\n\n### 3. Organización de Tests\n\n- **Tests Unitarios** (`LiftTests.cs`): Prueban comportamientos individuales\n- **Tests de Sistema** (`LiftSystemTests.cs`): Prueban escenarios completos\n\n**Tip**: Empieza con tests unitarios. Los tests de sistema vienen después.\n\n### 4. Evita estos Anti-Patrones\n\n❌ **Escribir mucho código antes de testear**\n```csharp\n// NO hagas esto: implementar 5 métodos antes de escribir tests\n```\n\n✅ **Un test, un cambio mínimo**\n```csharp\n// SÍ: un test → código mínimo → siguiente test\n```\n\n❌ **Tests que prueban demasiado**\n```csharp\n// NO: un test que valida 10 cosas diferentes\n```\n\n✅ **Tests enfocados**\n```csharp\n// SÍ: cada test valida una sola regla de negocio\n```\n\n## Progresión de la Kata (Niveles)\n\n### 📗 Nivel Básico\n- [ ] El ascensor tiene puertas que abren/cierran\n- [ ] El ascensor se mueve un piso arriba/abajo\n- [ ] No puede moverse con puertas abiertas\n- [ ] Acepta requests de pisos\n- [ ] Se mueve al piso solicitado y abre puertas\n\n### 📘 Nivel Intermedio\n- [ ] Maneja múltiples requests en cola\n- [ ] Acepta calls con dirección\n- [ ] Respeta la dirección de las llamadas\n- [ ] Tiene límites de pisos (no puede ir más allá)\n- [ ] Optimiza el recorrido (no va y viene innecesariamente)\n\n### 📕 Nivel Avanzado\n- [ ] Sistema con múltiples ascensores\n- [ ] Solo un ascensor responde cada llamada\n- [ ] Monitores que muestran piso actual\n- [ ] Monitores que muestran dirección\n- [ ] Hace 'DING' al cumplir una llamada\n\n## Preguntas para Reflexionar\n\nDespués de completar la kata, reflexiona sobre:\n\n1. **Diseño**: ¿Cómo emergió el diseño? ¿Fue diferente de lo que imaginabas al inicio?\n2. **Tests**: ¿Cuántos tests tienes? ¿Cuántas líneas de código de producción por test?\n3. **Confianza**: ¿Qué tan seguro te sientes haciendo cambios? ¿Por qué?\n4. **Baby Steps**: ¿En qué momentos diste pasos demasiado grandes? ¿Qué pasó?\n5. **Refactoring**: ¿Cuándo refactorizaste? ¿Por qué en esos momentos?\n6. **Fallos**: ¿Qué tests fallaron inesperadamente? ¿Qué aprendiste?\n\n## Recursos Adicionales\n\n- [Kata-Log: Lift Kata](https://kata-log.rocks/lift-kata)\n- [Samman Coaching: Lift](https://sammancoaching.org/kata_descriptions/lift.html)\n- [Test-Driven Development by Kent Beck](https://www.amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530)\n\n## Agradecimientos\n\nEsta kata está descrita en [Kata-Log](https://kata-log.rocks/lift-kata), aunque ha sido modificada ligeramente para este proyecto.\n\n---\n\n**¡Feliz práctica de TDD!** Recuerda: 🔴 → 🟢 → 🔵 → Repetir","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluisfelipediaz%2Flift-kata","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fluisfelipediaz%2Flift-kata","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluisfelipediaz%2Flift-kata/lists"}