import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

import org.junit.jupiter.api.Test;

class ShapesTest {

    @Test
    void areaOfEachShape() {
        assertEquals(Math.PI, Shapes.area(new Circle(1)), 1e-9);
        assertEquals(4.0, Shapes.area(new Square(2)), 1e-9);
        assertEquals(6.0, Shapes.area(new Triangle(3, 4)), 1e-9);
    }

    @Test
    void guardsChooseTheFirstMatchingCase() {
        assertEquals("círculo grande", Shapes.describe(new Circle(10)));
        assertEquals("círculo de radio 2.0", Shapes.describe(new Circle(2)));
        assertEquals("cuadrado unitario", Shapes.describe(new Square(1)));
        assertEquals("cuadrado de lado 3.0", Shapes.describe(new Square(3)));
    }

    @Test
    void nullHasItsOwnCase() {
        assertEquals("sin figura", Shapes.describe(null));
    }

    @Test
    void recordsRejectInvalidSizes() {
        assertThrows(IllegalArgumentException.class, () -> new Circle(0));
        assertThrows(IllegalArgumentException.class, () -> new Triangle(3, -1));
    }
}
