makeDb(); $sprints = new SprintRepository($pdo); $weeks = new SprintWeekRepository($pdo); $sprint = $sprints->create('S', '2026-01-05', '2026-01-30', 0.2); $sprints->materializeWeeks($sprint->id, '2026-01-05', 4); return [$sprints, $weeks, $sprint->id]; } public function testMaterializeWeeksDefaultsToAllFiveDays(): void { [, $weeks, $sprintId] = $this->seedSprint(); $rows = $weeks->allForSprint($sprintId); $this->assertCount(4, $rows); foreach ($rows as $w) { $this->assertSame(SprintWeek::MASK_ALL, $w->activeDaysMask); $this->assertSame(5.0, $w->maxWorkingDays); } } public function testUpdateActiveDaysWritesBothColumns(): void { [, $weeks, $sprintId] = $this->seedSprint(); $first = $weeks->allForSprint($sprintId)[0]; $result = $weeks->updateActiveDays($first->id, 0b01111); // drop Fr $this->assertSame(SprintWeek::MASK_ALL, $result['before']->activeDaysMask); $this->assertSame(0b01111, $result['after']->activeDaysMask); $this->assertSame(4.0, $result['after']->maxWorkingDays); // Second query hydrates the same row from disk. $reloaded = $weeks->find($first->id); $this->assertNotNull($reloaded); $this->assertSame(0b01111, $reloaded->activeDaysMask); $this->assertSame(4.0, $reloaded->maxWorkingDays); } public function testUpdateActiveDaysClampsBitsOutsideMoFr(): void { [, $weeks, $sprintId] = $this->seedSprint(); $first = $weeks->allForSprint($sprintId)[0]; $result = $weeks->updateActiveDays($first->id, 0xFF); $this->assertSame(SprintWeek::MASK_ALL, $result['after']->activeDaysMask); $this->assertSame(5.0, $result['after']->maxWorkingDays); } public function testUpdateActiveDaysToEmptyMaskZeroesCount(): void { [, $weeks, $sprintId] = $this->seedSprint(); $first = $weeks->allForSprint($sprintId)[0]; $result = $weeks->updateActiveDays($first->id, 0); $this->assertSame(0, $result['after']->activeDaysMask); $this->assertSame(0.0, $result['after']->maxWorkingDays); $this->assertSame([], $result['after']->activeDays()); } public function testSyncCountAppendsWeeksWithAllDaysActive(): void { [, $weeks, $sprintId] = $this->seedSprint(); $diff = $weeks->syncCount($sprintId, '2026-01-05', 6); $this->assertCount(2, $diff['added']); foreach ($diff['added'] as $w) { $this->assertSame(SprintWeek::MASK_ALL, $w->activeDaysMask); $this->assertSame(5.0, $w->maxWorkingDays); } } }