id); self::assertSame([], $days[1]['slots']); // A slot outside the week is not bucketed anywhere. $ids = array_merge(...array_map( static fn (array $day): array => array_map(static fn (AvailabilitySlot $s): ?int => $s->id, $day['slots']), $days )); self::assertNotContains(4, $ids); } public function testDaysCrossesMonthBoundary(): void { $days = WeekCalendar::days('2026-06-29', []); self::assertSame('2026-06-29', $days[0]['date']); self::assertSame('2026-07-05', $days[6]['date']); } public function testBucketGroupsItemsByExtractedDay(): void { $items = [ ['day' => '2026-07-06', 'label' => 'a'], ['day' => '2026-07-06', 'label' => 'b'], ['day' => '2026-07-09', 'label' => 'c'], ['day' => '2026-07-13', 'label' => 'outside'], ['day' => '', 'label' => 'dayless'], ]; $days = WeekCalendar::bucket('2026-07-06', $items, static fn (array $i): string => $i['day']); self::assertCount(7, $days); self::assertSame('2026-07-06', $days[0]['date']); self::assertSame('2026-07-12', $days[6]['date']); self::assertSame(['a', 'b'], array_column($days[0]['items'], 'label')); self::assertSame(['c'], array_column($days[3]['items'], 'label')); self::assertSame([], $days[1]['items']); // Items outside the week (or with no day) are not bucketed anywhere. $labels = array_merge(...array_column($days, 'items')); self::assertNotContains('outside', array_column($labels, 'label')); self::assertNotContains('dayless', array_column($labels, 'label')); } }