value)->toBe($coupons) ->and($array->value)->toHaveCount(2); }); it('rejects an empty array', function (): void { // GIVEN / WHEN $action = fn (): CampaignCouponArray => new CampaignCouponArray([]); // THEN expect($action)->toThrow(\DomainException::class, 'Coupons requires at least one CampaignCoupon.'); }); it('rejects a non-coupon element', function (): void { // GIVEN / WHEN $action = fn (): CampaignCouponArray => new CampaignCouponArray(['PC1']); // THEN expect($action)->toThrow(\DomainException::class, 'Coupons must be CampaignCoupon instances.'); }); it('rejects a non-coupon element mixed with valid coupons', function () use ($coupon): void { // GIVEN $coupons = [$coupon, 'PC1']; // WHEN $action = fn (): CampaignCouponArray => new CampaignCouponArray($coupons); // THEN expect($action)->toThrow(\DomainException::class, 'Coupons must be CampaignCoupon instances.'); }); it('rejects the same coupon twice', function (): void { // GIVEN $coupons = [ new CampaignCoupon(new CouponCode('AAA01')), new CampaignCoupon(new CouponCode('AAA01')), ]; // WHEN $action = fn (): CampaignCouponArray => new CampaignCouponArray($coupons); //WHEN / THEN expect($action)->toThrow(\DomainException::class, 'Coupon "AAA01" is present more than once.'); }); });