package com.thealgorithms.maths.prime;

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

import com.thealgorithms.maths.Prime.MobiusFunction;
import org.junit.jupiter.api.Test;

class MobiusFunctionTest {

    @Test
    void testMobiusForZero() {
        // given
        int number = 0;
        String expectedMessage = "Number must be greater than zero.";

        // when
        Exception exception = assertThrows(IllegalArgumentException.class, () -> { MobiusFunction.mobius(number); });
        String actualMessage = exception.getMessage();

        // then
        assertEquals(expectedMessage, actualMessage);
    }

    @Test
    void testMobiusForNegativeNumber() {
        // given
        int number = -1;
        String expectedMessage = "Number must be greater than zero.";

        // when
        Exception exception = assertThrows(IllegalArgumentException.class, () -> { MobiusFunction.mobius(number); });
        String actualMessage = exception.getMessage();

        // then
        assertEquals(expectedMessage, actualMessage);
    }

    @Test
    void testMobiusFunction() {
        int[] expectedResultArray = {
            1,
            -1,
            -1,
            0,
            -1,
            1,
            -1,
            0,
            0,
            1,
            -1,
            0,
            -1,
            1,
            1,
            0,
            -1,
            0,
            -1,
            0,
            1,
            1,
            -1,
            0,
            0,
            1,
            0,
            0,
            -1,
            -1,
            -1,
            0,
            1,
            1,
            1,
            0,
            -1,
            1,
            1,
            0,
            -1,
            -1,
            -1,
            0,
            0,
            1,
            -1,
            0,
            0,
            0,
            1,
            0,
            -1,
            0,
            1,
            0,
            1,
            1,
            -1,
            0,
            -1,
            1,
            0,
            0,
            1,
            -1,
            -1,
            0,
            1,
            -1,
            -1,
            0,
            -1,
            1,
            0,
            0,
            1,
            -1,
            -1,
            0,
            0,
            1,
            -1,
            0,
            1,
            1,
            1,
            0,
            -1,
            0,
            1,
            0,
            1,
            1,
            1,
            0,
            -1,
            0,
            0,
            0,
        };

        for (int i = 1; i <= 100; i++) {
            // given
            int expectedValue = expectedResultArray[i - 1];

            // when
            int actualValue = MobiusFunction.mobius(i);

            // then
            assertEquals(expectedValue, actualValue);
        }
    }
}
