printableCode)->toBe($printableCode) ->and($unprinted->couponCode)->toBe($couponCode) ->and($unprinted->campaignCode)->toBe($campaignCode) ->and($unprinted->customer)->toBe($customer) ->and($unprinted->unprintedReason)->toBe($reason); }); it('keeps the reason as given without trimming it', function () use ($printableCode, $couponCode, $campaignCode, $customer): void { // GIVEN $reason = new UnprintedReason(' Printer failure '); // WHEN $unprinted = new UnprintedCoupon($printableCode, $couponCode, $campaignCode, $customer, $reason); // THEN expect($unprinted->unprintedReason)->toBe($reason); }); it('rejects an empty reason', function (string $invalidReason) use ($printableCode, $couponCode, $campaignCode, $customer): void { // GIVEN / WHEN $action = fn (): UnprintedCoupon => new UnprintedCoupon( $printableCode, $couponCode, $campaignCode, $customer, new UnprintedReason($invalidReason), ); // THEN expect($action)->toThrow(\DomainException::class, 'Unprinted reason cannot be empty.'); })->with([ 'empty' => '', 'spaces' => ' ', 'tab' => "\t", 'new lines' => "\n\r\n", 'mixed spaces' => " \t\n ", 'unicode spaces' => "\u{00A0}\u{2003}", ]); });