"""Pruebas del dominio puro de calificación RA2 CDT1 (unittest estándar)."""

import sys
import unittest
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parent))

import ra2_grader as g


def respuestas_perfectas():
    """Las 20 respuestas correctas del examen."""
    return {
        "0": "Na+",
        "1": "Cl-",
        "2": "8",
        "3": "6",
        "4": "Catión",
        "5": "Anión",
        "6": "11",
        "7": "10",
        "8": "18",
        "9": "Catión sodio",
        "10": "Anión cloruro",
        "11": "20",
        "12": "18",
        "13": "Anión",
        "14": "Catión",
        "15": "13",
        "16": "10",
        "17": "Pierde",
        "18": "Gana",
        "19": "Negativa",
    }


class TestNormalizacion(unittest.TestCase):
    def test_minusculas_acentos_espacios(self):
        self.assertEqual(g.normalizar("Catión"), "cation")
        self.assertEqual(g.normalizar("  ANIÓN  "), "anion")
        self.assertEqual(g.normalizar("Catión Sodio"), "cationsodio")
        self.assertEqual(g.normalizar("pierde electrones"), "pierdeelectrones")

    def test_valor_no_texto_da_vacio(self):
        self.assertEqual(g.normalizar(None), "")
        self.assertEqual(g.normalizar(123), "")


class TestCalificacion(unittest.TestCase):
    def test_examen_perfecto_sin_incidentes(self):
        r = g.calificar_examen(respuestas_perfectas(), 0)
        self.assertEqual(r["academico"], 100)
        self.assertEqual(r["nota_final"], 100)
        self.assertEqual(r["incidentes_trampa"], 0)

    def test_variantes_tilde_espacio_aceptadas(self):
        variantes = dict(respuestas_perfectas())
        variantes["4"] = "cation"           # sin tilde
        variantes["9"] = "cation sodio"     # sin tilde
        variantes["17"] = "pierde electrones"  # con espacio
        r = g.calificar_examen(variantes, 0)
        self.assertEqual(r["academico"], 100)

    def test_respuesta_incorrecta_cero(self):
        respuestas = dict(respuestas_perfectas())
        respuestas["0"] = "K+"
        r = g.calificar_examen(respuestas, 0)
        self.assertEqual(r["academico"], 95)
        self.assertFalse(r["detalle"][0]["correcta"])
        self.assertTrue(r["detalle"][1]["correcta"])

    def test_respuestas_vacias_cero(self):
        r = g.calificar_examen({}, 0)
        self.assertEqual(r["academico"], 0)
        self.assertEqual(r["nota_final"], 0)

    def test_dos_incidentes_restan_diez(self):
        r = g.calificar_examen(respuestas_perfectas(), 2)
        self.assertEqual(r["nota_final"], 90)
        self.assertEqual(r["descuento_trampa"], 10)

    def test_suelo_en_cero(self):
        r = g.calificar_examen({}, 99)
        self.assertEqual(r["nota_final"], 0)

    def test_detalle_tiene_20_items(self):
        r = g.calificar_examen(respuestas_perfectas(), 0)
        self.assertEqual(len(r["detalle"]), g.TOTAL_PREGUNTAS)


if __name__ == "__main__":
    unittest.main()
