periods)->toBe($periods); }); it('creates a valid coupon availability calendar with several periods', function (): void { // GIVEN $periods = [ new Period(new DateTime('2026-01-01'), new DateTime('2026-02-01')), new Period(new DateTime('2026-03-01'), new DateTime('2026-04-01')), ]; // WHEN $couponAvailabilityCalendar = new CouponAvailabilityCalendar($periods); // THEN expect($couponAvailabilityCalendar->periods)->toBe($periods); }); it('rejects a coupon availability calendar without period', function (): void { // GIVEN $periods = []; // GIVEN / THEN expect(fn (): CouponAvailabilityCalendar => new CouponAvailabilityCalendar($periods))->toThrow(\DomainException::class); }); it('rejects a coupon availability calendar with a non-period element', function (): void { // GIVEN $periods = ['2026-08-25', '2026-10-31']; // WHEN / THEN expect(fn (): CouponAvailabilityCalendar => new CouponAvailabilityCalendar($periods)) ->toThrow(\DomainException::class, 'CouponAvailabilityCalendar periods must be Period instances.'); }); });