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');
}
}