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

import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.Test;

class ListUtilsTest {

    @Test
    void firstOrDefaultReturnsFirst() {
        assertEquals("alice", ListUtils.firstOrDefault(List.of("alice", "bob"), "nadie"));
    }

    @Test
    void firstOrDefaultOnEmptyReturnsFallback() {
        assertEquals("nadie", ListUtils.firstOrDefault(new ArrayList<String>(), "nadie"));
    }

    @Test
    void maxWorksWithIntegersAndStrings() {
        assertEquals(18, ListUtils.max(List.of(15, 18, 11)));
        assertEquals("uva", ListUtils.max(List.of("pera", "uva", "mango")));
    }

    @Test
    void maxOfEmptyListIsRejected() {
        assertThrows(IllegalArgumentException.class, () -> ListUtils.max(new ArrayList<Integer>()));
    }

    @Test
    void sumAcceptsAnyNumberList() {
        assertEquals(44.0, ListUtils.sum(List.of(15, 18, 11)));
        assertEquals(6.5, ListUtils.sum(List.of(2.5, 4.0)));
    }

    @Test
    void addCountingWritesIntoNumberList() {
        List<Number> out = new ArrayList<>();
        ListUtils.addCounting(out, 3);
        assertEquals(List.of(1, 2, 3), out);
    }

    @Test
    void copyFromIntegersToObjects() {
        List<Object> dst = new ArrayList<>(List.of("inicio"));
        ListUtils.copy(dst, List.of(1, 2));
        assertEquals(List.of("inicio", 1, 2), dst);
    }
}
