package pr2.enums.eigene.test;

import org.junit.jupiter.api.Test;
import pr2.enums.eigene.Wuerfel;

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

/**
 * Test für die Würfel.
 */
public class WuerfelTest {

    /**
     * Anzahl der Durchläufe (Gesetz der großen Zahl!).
     */
    private static final int RUNS = 10000000;


    @Test
    void testFairnessD4() {
        internalTestFairness(new Wuerfel(Wuerfel.D4), 2.5);
    }

    @Test
    void testFairnessD6() {
        internalTestFairness(new Wuerfel(Wuerfel.D6), 3.5);
    }

    @Test
    void testFairnessD8() {
        internalTestFairness(new Wuerfel(Wuerfel.D8), 4.5);
    }

    @Test
    void testFairnessD10() {
        internalTestFairness(new Wuerfel(Wuerfel.D10), 5.5);
    }

    @Test
    void testFairnessD12() {
        internalTestFairness(new Wuerfel(Wuerfel.D12), 6.5);
    }

    /**
     * Interne Hilfsmethode, um die Fairness zu testen.
     *
     * @param w        der zu testende Wuerfel.
     * @param expected Erwartungswert.
     */
    private void internalTestFairness(Wuerfel w, double expected) {
        long sum = 0;

        for (int i = 0; i < RUNS; i++) {
            sum += w.roll();
        }
        double average = (double) sum / (double) RUNS;
        assertEquals(expected, average, 0.1);
    }
}
