toBeInstanceOf(Money::class) ->and($money->currency)->toBe(Currency::EUR) ->and($money->value)->toBe($value); }); it('accepts a zero value', function (): void { // WHEN $money = new Money(Currency::EUR, 0); // THEN expect($money->value)->toBe(0); }); it('rejects a negative value', function (): void { // WHEN $action = fn (): Money => new Money(Currency::EUR, -1); // THEN expect($action)->toThrow(\DomainException::class, 'Money value cannot be negative.'); }); it('implements equals correctly', function (): void { // GIVEN $money1 = new Money(Currency::EUR, 300); $money2 = new Money(Currency::EUR, 300); $money3 = new Money(Currency::EUR, 500); // THEN expect($money1->equals($money2))->toBeTrue() ->and($money1->equals($money3))->toBeFalse() ->and($money1->equals(null))->toBeFalse(); }); it('converts to string', function (): void { // GIVEN $money = new Money(Currency::EUR, 300); // THEN expect((string) $money)->toBe('300 EUR'); }); });