7, 'title' => '논리 시계 투표', 'multipleOptions' => 1, 'opener' => 'SYSTEM', 'startDate' => '2035-01-01 01:00:00', 'endDate' => '2035-01-01 03:00:00', 'options' => ['찬성', '반대'], ]; $stored = VoteInfo::normalizeGameStorage($raw, $clock); self::assertSame(GameClock::TICKS_PER_TURN, $stored['startTick']); self::assertSame(GameClock::TICKS_PER_TURN * 3, $stored['endTick']); self::assertSame('2035-01-01 01:00:00', $stored['startDate']); self::assertSame('2035-01-01 03:00:00', $stored['endDate']); } public function testStoredTicksRemainAuthoritativeWhenProjectionBaseChanges(): void { $oldBase = new \DateTimeImmutable('2035-01-01 00:00:00'); $newBase = new \DateTimeImmutable('2040-05-01 12:00:00'); $clock = new GameClock($newBase, 60, 0, GameClock::MODE_MANUAL, $newBase); $stored = [ 'id' => 8, 'title' => 'tick 우선', 'multipleOptions' => 1, 'opener' => null, 'startDate' => $oldBase->format('Y-m-d H:i:s'), 'endDate' => $oldBase->modify('+1 hour')->format('Y-m-d H:i:s'), 'startTick' => GameClock::TICKS_PER_TURN * 2, 'endTick' => GameClock::TICKS_PER_TURN * 4, 'options' => ['A'], ]; $normalized = VoteInfo::normalizeGameStorage($stored, $clock); self::assertSame('2040-05-01 14:00:00', $normalized['startDate']); self::assertSame('2040-05-01 16:00:00', $normalized['endDate']); } }