Skip to content

feat: implementar soporte de paréntesis en calculadora#56

Merged
Jandres25 merged 2 commits intodevfrom
feature/parenthesis-support
Dec 2, 2025
Merged

feat: implementar soporte de paréntesis en calculadora#56
Jandres25 merged 2 commits intodevfrom
feature/parenthesis-support

Conversation

@Jandres25
Copy link
Contributor

✨ Nueva Funcionalidad

📋 Descripción

Implementación de soporte completo para operaciones con paréntesis en la calculadora GUI. Ahora los usuarios pueden construir y evaluar expresiones matemáticas complejas utilizando paréntesis tanto desde los botones de la interfaz como desde el teclado.

🔗 Issue Relacionado

Related to #44

🎯 Objetivo

Resolver la limitación donde los botones de paréntesis "(" y ")" estaban visibles en la interfaz pero no eran funcionales. Ahora la calculadora puede procesar expresiones matemáticas completas con paréntesis, permitiendo operaciones como (2+3)*4, 2*(3+4), (5-2)*(6+4), etc.


💻 Implementación

Archivos Modificados

  • src/gui. py - Implementado soporte completo de paréntesis con validaciones
  • tests/test_gui.py - Agregados 13 tests para validar funcionalidad de paréntesis

Cambios Técnicos

1. Nuevas variables de estado:

self.expression = ""  # Almacena expresiones con paréntesis
self.use_expression_mode = False  # Detecta modo de expresión

2. Nuevos métodos agregados:

def open_parenthesis_click(self):
    """Agrega paréntesis de apertura y activa modo expresión."""
    self.use_expression_mode = True
    self.expression += '('
    self.display. delete(0, tk.END)
    self.display.insert(0, self.expression)

def close_parenthesis_click(self):
    """Agrega paréntesis de cierre."""
    self.use_expression_mode = True
    self.expression += ')'
    self.display.delete(0, tk.END)
    self.display.insert(0, self.expression)

3. Evaluación de expresiones mejorada en equals_click():

  • Validación de paréntesis balanceados
  • Validación de caracteres seguros con regex
  • Evaluación segura de expresiones con eval()
  • Conversión de ^ a ** para potencias
  • Manejo de errores específicos (ZeroDivisionError, SyntaxError)

4. Soporte de teclado:

  • Captura de teclas ( y ) en handle_keypress()

5. Métodos modificados para soportar ambos modos:

  • number_button_click() - Funciona en modo normal y expresión
  • decimal_click() - Soporta punto decimal en expresiones
  • operation_click() - Agrega operadores a expresiones
  • backspace_click() - Elimina caracteres en ambos modos
  • clear_click() - Resetea ambos modos

6. Importación de regex:

  • Agregado import re para validación de caracteres seguros

🧪 Testing

Tests Unitarios Agregados

Se agregaron 13 tests completos en tests/test_gui.py para validar la funcionalidad:

Tests de funcionalidad básica:

  • test_parenthesis_basic - Operaciones básicas: (2+3)*4, 2*(3+4), (5-2)*(6+4), (10/2)+5
  • test_parenthesis_nested - Paréntesis anidados: ((2+3)*4)/5, (2+(3*4)), ((10-5)*2)+3
  • test_parenthesis_with_decimals - Con números decimales: (2.5+3.5)*2, (10. 5/2)+1.5
  • test_parenthesis_with_negatives - Con números negativos: (-5+3)*2, (10-15)*2
  • test_parenthesis_with_power - Con potencias: (2+3)^2, 2^(3+1)

Tests de validación y errores:

  • test_parenthesis_unbalanced - Validación de paréntesis desbalanceados
  • test_parenthesis_division_by_zero - División por cero dentro de paréntesis

Tests de comportamiento del sistema:

  • test_parenthesis_expression_mode - Activación y desactivación del modo expresión
  • test_parenthesis_clear - Limpieza de expresiones con paréntesis
  • test_parenthesis_backspace - Borrado de caracteres en expresiones
  • test_parenthesis_display_update - Actualización correcta del display
  • test_parenthesis_mixed_mode - Compatibilidad entre modo normal y expresión
  • test_parenthesis_complex_expression - Expresiones matemáticas complejas

Ejecución de Tests

# Ejecutar solo tests de paréntesis
python -m pytest tests/test_gui.py -k "parenthesis" -v

# Ejecutar todos los tests de GUI
python -m pytest tests/test_gui.py -v

# Resultados esperados
======================== test session starts ========================
tests/test_gui.py::test_parenthesis_basic PASSED
tests/test_gui. py::test_parenthesis_nested PASSED
tests/test_gui.py::test_parenthesis_with_decimals PASSED
tests/test_gui.py::test_parenthesis_with_negatives PASSED
tests/test_gui.py::test_parenthesis_with_power PASSED
tests/test_gui. py::test_parenthesis_unbalanced PASSED
tests/test_gui.py::test_parenthesis_expression_mode PASSED
tests/test_gui.py::test_parenthesis_clear PASSED
tests/test_gui.py::test_parenthesis_backspace PASSED
tests/test_gui. py::test_parenthesis_display_update PASSED
tests/test_gui.py::test_parenthesis_mixed_mode PASSED
tests/test_gui. py::test_parenthesis_complex_expression PASSED
tests/test_gui.py::test_parenthesis_division_by_zero PASSED

======================== 13 passed ========================

Casos de Prueba Manuales

Operaciones básicas con paréntesis:

  • (2+3)*4 = 20
  • 2*(3+4) = 14
  • (5-2)*(6+4) = 30
  • (10/2)+5 = 10.0

Expresiones anidadas:

  • ((2+3)*4)/5 = 4.0
  • (2+(3*4)) = 14

Validaciones:

  • (2+3 → Error: "Paréntesis desbalanceados" ✅
  • 2+3) → Error: "Paréntesis desbalanceados" ✅
  • Caracteres inválidos → Error: "Expresión inválida" ✅

Entrada desde teclado:

  • Paréntesis ( y ) funcionan correctamente ✅
  • Operadores y números dentro de paréntesis ✅

Cobertura de Tests

  • Casos básicos funcionan correctamente
  • Manejo de casos extremos (paréntesis desbalanceados)
  • Manejo de errores apropiado
  • Entrada desde teclado
  • Entrada desde botones GUI
  • Compatibilidad con modo normal (sin paréntesis)
  • Expresiones anidadas
  • Operaciones con decimales y negativos
  • División por cero dentro de paréntesis
  • Tests unitarios automatizados completos

📝 Documentación

  • Docstrings agregados a nuevos métodos
  • Ejemplos de uso en docstrings
  • Comentarios en código complejo
  • Tests unitarios completos con documentación
  • Sección de tests de paréntesis claramente identificada

✅ Checklist de Feature

  • Funcionalidad implementada correctamente
  • Tests unitarios completos (13 tests nuevos)
  • Todos los tests pasan exitosamente
  • Probado manualmente con múltiples casos
  • Documentación en código (docstrings)
  • Sin conflictos con dev
  • Commits siguiendo Conventional Commits
  • Cobertura de casos extremos y errores

📸 Ejemplos de Uso

Expresión: (2+3)*4

  • Usuario ingresa: ( 2 + 3 ) * 4 =
  • Display muestra: 20

Expresión: (10/2)+5

  • Usuario ingresa la expresión completa
  • Display muestra: 10. 0

Expresión anidada: ((2+3)*4)/5

  • Usuario ingresa la expresión completa
  • Display muestra: 4.0

📝 Notas Adicionales

Implementación:

  • La implementación utiliza eval() con validaciones de seguridad (regex) para evitar inyección de código
  • Se mantiene compatibilidad total con el modo de operación normal (sin paréntesis)
  • El modo de expresión se activa automáticamente al presionar cualquier paréntesis
  • Se puede usar tanto el teclado como los botones de la GUI

Testing:

  • Se agregaron 13 tests unitarios que cubren todos los casos de uso
  • Los tests están organizados en una sección dedicada en tests/test_gui.py
  • Todos los tests pasan exitosamente
  • Se validan casos normales, extremos y de error

Seguridad:

  • Validación estricta de caracteres permitidos usando regex
  • Validación de paréntesis balanceados antes de evaluar
  • Manejo robusto de excepciones (SyntaxError, ZeroDivisionError)

📊 Estadísticas

  • Archivos modificados: 2
  • Líneas agregadas: ~450
  • Tests agregados: 13
  • Funciones nuevas: 2 (open_parenthesis_click, close_parenthesis_click)
  • Funciones modificadas: 7

👥 Revisores Sugeridos

@Jhos3ph @alexricardotapiacarita-ai

@Jandres25 Jandres25 added this to the v2.1.0 milestone Dec 2, 2025
@Jandres25 Jandres25 self-assigned this Dec 2, 2025
@Jandres25 Jandres25 added documentación Cambios en README, docstrings, etc. mejora Mejora a funciones existentes ayuda requerida Se necesita asistencia o revisión gui Funcionalidades de la interfaz gráfica labels Dec 2, 2025
@Jandres25 Jandres25 linked an issue Dec 2, 2025 that may be closed by this pull request
7 tasks
Copy link
Contributor

@alexricardotapiacarita-ai alexricardotapiacarita-ai left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

esta chido

@Jandres25 Jandres25 merged commit 98a1d62 into dev Dec 2, 2025
2 checks passed
@Jandres25 Jandres25 deleted the feature/parenthesis-support branch December 2, 2025 15:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ayuda requerida Se necesita asistencia o revisión documentación Cambios en README, docstrings, etc. gui Funcionalidades de la interfaz gráfica mejora Mejora a funciones existentes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Soporte de operaciones con paréntesis en la calculadora GUI

2 participants