From 1000cab1381a516ea84b28b3e13c22466b378049 Mon Sep 17 00:00:00 2001 From: dcsibon Date: Sun, 13 Oct 2024 20:49:50 +0200 Subject: [PATCH] =?UTF-8?q?Modificaciones=20para=20aclarar=20el=20c=C3=B3d?= =?UTF-8?q?igo=20y=20alg=C3=BAn=20test=20m=C3=A1s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ivinar_numero.py => adivinar_numero_v1.py} | 0 src/adivinar_numero_v3.py | 38 ++++++-- tests/test_adivinar_numero_v3.py | 88 +++++++++++++++++-- 3 files changed, 114 insertions(+), 12 deletions(-) rename src/{adivinar_numero.py => adivinar_numero_v1.py} (100%) diff --git a/src/adivinar_numero.py b/src/adivinar_numero_v1.py similarity index 100% rename from src/adivinar_numero.py rename to src/adivinar_numero_v1.py diff --git a/src/adivinar_numero_v3.py b/src/adivinar_numero_v3.py index 88fe04d..fcb526c 100644 --- a/src/adivinar_numero_v3.py +++ b/src/adivinar_numero_v3.py @@ -3,6 +3,16 @@ import time +TITULOS = ( + "--- SECCIÓN NO DEFINIDA ---", + "--- BIENVENIDOS AL JUEGO DE ADIVINAR EL NÚMERO OCULTO ---", + "--- MENÚ DE ADIVINA EL NÚMERO OCULTO ---", + "--- ADIVINA EL NÚMERO OCULTO EN {intentos} INTENTOS ---", + "--- CONFIGURA EL JUEGO DE ADIVINA EL NÚMERO OCULTO ---", + "--- CONFIGURACIÓN ACTUAL DE ADIVINA EL NÚMERO OCULTO ---", +) + + def limpiar_pantalla(): """ Limpia la consola según el sistema operativo. @@ -22,7 +32,6 @@ def pausa(): También limpia la pantalla después de que el usuario presiona ENTER. """ input("\nPresione ENTER para continuar...") - input("\nPresione ENTER para continuar...") limpiar_pantalla() @@ -217,6 +226,23 @@ def configurar_intentos() -> int: return intentos +def mostrar_titulo(seccion: int, intentos: int = 0): + """ + Muestra el título correspondiente a la sección del juego. + + Args: + seccion (int): El identificador de la sección. Los valores válidos son de 1 a 5. + intentos (int): Número de intentos que puede ser usado en el título si corresponde. + """ + if 0 < seccion < len(TITULOS): + if intentos > 0: + print(TITULOS[seccion].format(intentos = intentos) + "\n\n") + else: + print(f"{TITULOS[seccion]}\n\n") + else: + print(f"{TITULOS[0]}\n\n") + + def configurar_juego() -> tuple: """ Configura todos los parámetros del juego: rango de números, pistas e intentos. @@ -225,7 +251,7 @@ def configurar_juego() -> tuple: tuple: Mínimo, máximo, número de intentos, valor para "Frío" y valor para "Caliente". """ limpiar_pantalla() - print("--- CONFIGURA EL JUEGO DE ADIVINA EL NÚMERO OCULTO ---\n\n") + mostrar_titulo(4) minimo, maximo = configurar_rangos_numeros() frio, caliente = configurar_pistas(minimo, maximo) @@ -246,7 +272,7 @@ def mostrar_configuracion(minimo, maximo, intentos, frio, caliente): caliente (int): Diferencia mayor para la pista "Caliente". """ limpiar_pantalla() - print(f"--- CONFIGURACIÓN ACTUAL DE ADIVINA EL NÚMERO OCULTO ---\n\n") + mostrar_titulo(5) print(f"* El número oculto será un número entre {minimo} y {maximo}.") print(f"* El número de intentos es {intentos}.") print(f"* Pista FRÍO si la diferencia es mayor a {frio}.") @@ -260,7 +286,7 @@ def mostrar_menu(): Muestra el menú principal del juego. """ limpiar_pantalla() - print(f"--- MENÚ DE ADIVINA EL NÚMERO OCULTO ---\n\n") + mostrar_titulo(2) print("1. Jugar.") print("2. Configurar.") print("3. Mostrar configuración.") @@ -311,7 +337,7 @@ def jugar(numero_oculto, intentos, frio, caliente): caliente (int): Diferencia máxima para la pista "Caliente". """ limpiar_pantalla() - print(f"--- ADIVINA EL NÚMERO OCULTO EN {intentos} INTENTOS ---\n\n") + mostrar_titulo(3, intentos) numero_adivinado, intentos_realizados = adivina_el_numero(numero_oculto, intentos, frio, caliente) if numero_adivinado: @@ -342,7 +368,7 @@ def main(): Configura los parámetros iniciales y gestiona el bucle principal del menú. """ limpiar_pantalla() - print("--- BIENVENIDOS AL JUEGO DE ADIVINAR EL NÚMERO OCULTO ---\n\n") + mostrar_titulo(1) time.sleep(2) # Configuración inicial por defecto diff --git a/tests/test_adivinar_numero_v3.py b/tests/test_adivinar_numero_v3.py index ecb19de..29e7bf5 100644 --- a/tests/test_adivinar_numero_v3.py +++ b/tests/test_adivinar_numero_v3.py @@ -1,11 +1,6 @@ import pytest -from src.adivinar_numero_v3 import ( - evaluar_distancia, generar_pista, mostrar_pista, - adivina_el_numero, comprobar_numero_entero, pedir_numero_usuario, - configurar_rangos_numeros, configurar_pistas, configurar_intentos, - genera_numero_oculto -) +from src.adivinar_numero_v3 import * ################################################################################################### @@ -192,3 +187,84 @@ def test_configurar_intentos(mock_input, expected, monkeypatch): # Probar si los intentos son configurados correctamente assert configurar_intentos() == expected + +################################################################################################### + +@pytest.mark.parametrize( + "seccion, intentos, expected_output", + [ + (1, 0, "--- BIENVENIDOS AL JUEGO DE ADIVINAR EL NÚMERO OCULTO ---\n\n\n"), + (2, 0, "--- MENÚ DE ADIVINA EL NÚMERO OCULTO ---\n\n\n"), + (3, 5, "--- ADIVINA EL NÚMERO OCULTO EN 5 INTENTOS ---\n\n\n"), + (0, 0, "--- SECCIÓN NO DEFINIDA ---\n\n\n"), # Sección no válida, debería usar el título por defecto + (3, 0, "--- ADIVINA EL NÚMERO OCULTO EN {intentos} INTENTOS ---\n\n\n"), # Sección con intentos en 0, no formatea + (10, 0, "--- SECCIÓN NO DEFINIDA ---\n\n\n"), # Sección fuera de rango, debería usar el título por defecto + ] +) +def test_mostrar_titulo(capsys, seccion, intentos, expected_output): + # Ejecutar la función mostrar_titulo + mostrar_titulo(seccion, intentos) + + # Capturar la salida impresa + captured = capsys.readouterr() + + # Verificar que la salida sea la esperada + assert captured.out == expected_output + +################################################################################################### + +@pytest.mark.parametrize( + "opcion, expected", + [ + (1, True), # Opción válida + (4, True), # Opción válida + (0, False), # Opción inválida (menor a 1) + (5, False), # Opción inválida (mayor a 4) + ] +) +def test_comprobar_opcion(opcion, expected): + assert comprobar_opcion(opcion) == expected + +################################################################################################### + +@pytest.mark.parametrize( + "mock_inputs, expected", + [ + (['0', '1'], 1), # Entrada inválida seguida de entrada válida + (['abc', '2'], 2), # Entrada no numérica seguida de entrada válida + (['4'], 4), # Entrada válida en el primer intento + ] +) +def test_elegir_opcion_menu(mock_inputs, expected, monkeypatch): + # Simular las entradas del usuario + inputs_iter = iter(mock_inputs) + monkeypatch.setattr('builtins.input', lambda _: next(inputs_iter)) + + # Probar si la opción es configurada correctamente + assert elegir_opcion_menu() == expected + +################################################################################################### + +def test_mostrar_menu(capsys): + mostrar_menu() + captured = capsys.readouterr() + expected_output = "--- MENÚ DE ADIVINA EL NÚMERO OCULTO ---\n\n\n1. Jugar.\n2. Configurar.\n3. Mostrar configuración.\n4. Salir.\n\n" + assert captured.out == expected_output + +################################################################################################### + +@pytest.mark.parametrize( + "mock_inputs, expected", + [ + (['0', '200', '30', '10', '5'], (0, 200, 5, 30, 10)), # Rango válido, pistas válidas, intentos válidos + (['1', '500', '50', '20', '7'], (1, 500, 7, 50, 20)), # Otro set válido + ] +) +def test_configurar_juego(mock_inputs, expected, monkeypatch): + # Simular entradas para rango, pistas e intentos + inputs_iter = iter(mock_inputs) + monkeypatch.setattr('builtins.input', lambda _: next(inputs_iter)) + + # Probar si el juego es configurado correctamente + assert configurar_juego() == expected +