<?php

declare(strict_types=1);

namespace DNW\Skills\Tests\TrueSkill;

use DNW\Skills\TrueSkill\TruncatedGaussianCorrectionFunctions;
use DNW\Skills\Numerics\BasicMath;
use DNW\Skills\Numerics\GaussianDistribution;
use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\UsesClass;

#[CoversClass(TruncatedGaussianCorrectionFunctions::class)]
#[UsesClass(BasicMath::class)]
#[UsesClass(GaussianDistribution::class)]
class TruncatedGaussianCorrectionFunctionsTest extends TestCase
{
    public function testvGreaterThan(): void
    {
        // Test values taken from Ralf Herbrich's F# TrueSkill implementation
        $want = 0.4181660649773850;
        $tVar = 0.7495591915280050;
        $eps = 0.0631282276750071;
        $this->assertEqualsWithDelta($want, TruncatedGaussianCorrectionFunctions::vExceedsMargin($tVar, $eps), 1e-6);
    }
    
    public function testwGreaterThan(): void
    {
        // Test values taken from Ralf Herbrich's F# TrueSkill implementation
        $want = 0.4619049929317120;
        $tVar = 0.7495591915280050;
        $eps = 0.0631282276750071;
        $this->assertEqualsWithDelta($want, TruncatedGaussianCorrectionFunctions::wExceedsMargin($tVar, $eps), 1e-6);
    }
    
    public function testvWithin(): void
    {
        // Test values taken from Ralf Herbrich's F# TrueSkill implementation
        $want = -0.7485644072749330;
        $tVar = 0.7495591915280050;
        $eps = 0.0631282276750071;
        $this->assertEqualsWithDelta($want, TruncatedGaussianCorrectionFunctions::vWithinMargin($tVar, $eps), 1e-6);
    }
    
    public function testwWithin(): void
    {
        // Test values taken from Ralf Herbrich's F# TrueSkill implementation
        $want = 0.9986734210033660;
        $tVar = 0.7495591915280050;
        $eps = 0.0631282276750071;
        $this->assertEqualsWithDelta($want, TruncatedGaussianCorrectionFunctions::wWithinMargin($tVar, $eps), 1e-6);
    }
}