getMethod('parseAddressFields'); $reflection->setAccessible(true); return $reflection->invoke($service, $address); } it('keeps an explicit house number unchanged', function () { $address = invokeParseAddressFields([ 'street' => 'Musterstrasse', 'houseNumber' => '42a', ]); expect($address['street'])->toBe('Musterstrasse') ->and($address['houseNumber'])->toBe('42a'); }); it('extracts the house number from a combined street field', function () { $address = invokeParseAddressFields([ 'street' => 'Musterstrasse 42a', 'houseNumber' => '', ]); expect($address['street'])->toBe('Musterstrasse') ->and($address['houseNumber'])->toBe('42a'); }); it('throws when the street contains no parseable house number instead of defaulting to 1', function () { invokeParseAddressFields([ 'street' => 'Postfach', 'houseNumber' => '', ]); })->throws(InvalidArgumentException::class, 'Hausnummer fehlt'); it('does not throw when neither street nor house number are provided', function () { $address = invokeParseAddressFields([ 'street' => '', 'houseNumber' => '', ]); expect($address)->toBe(['street' => '', 'houseNumber' => '']); });