← Code-Übersicht

AmountTest.php

Pfad: tests/Rechnung/AmountTest.php

Ext: php

Größe: 1831 Bytes

Geändert: 2026-07-16 16:54:17+02

<?php
declare(strict_types=1);

namespace Tests\Rechnung;

use Demo\Domain\Rechnung\Amount;
use Demo\Domain\Rechnung\ExtractedInvoiceData;
use InvalidArgumentException;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;

/**
 * Prueft exakte, locale-sichere Rechnungsbetraege.
 */
final class AmountTest extends TestCase
{
    /** @return iterable<string,array{string,string}> Dezimalbeispiele. */
    public static function decimals(): iterable
    {
        yield 'deutsch' => ['1.234,56', '1234.5600'];
        yield 'international' => ['1234.56', '1234.5600'];
        yield 'vier stellen' => ['26,0504', '26.0504'];
        yield 'ganzzahl' => ['31', '31.0000'];
    }

    /** Prueft die Normalisierung ohne Float-Arithmetik. */
    #[DataProvider('decimals')]
    public function testDecimalNormalisierung(string $input, string $expected): void
    {
        self::assertSame($expected, Amount::decimal($input));
    }

    /** Prueft die exakte WEtell-Kreuzsumme. */
    public function testWetellBetragIstKonsistent(): void
    {
        $amount = new Amount('26.0504', '4.9496', '31.0000', 'EUR');
        self::assertTrue($amount->isConsistent(0.0));
        self::assertTrue($amount->isPositive());
    }

    /** Nullbetraege duerfen die fachliche Pflichtpruefung nicht passieren. */
    public function testNullbetragIstNichtVollstaendig(): void
    {
        $data = new ExtractedInvoiceData('WEtell GmbH', 'hash', 'RF1', '2026-07-04', new Amount('0', '0', '0', 'EUR'), 1.0);
        self::assertFalse($data->hasRequiredFields());
    }

    /** Mehr als vier Nachkommastellen werden nicht still gerundet. */
    public function testUngueltigerBetragWirdAbgewiesen(): void
    {
        $this->expectException(InvalidArgumentException::class);
        Amount::decimal('1,23456');
    }
}