harness()->measureTickTime(50, players: 2, ticks: 20); $this->assertSame(50, $report['entities']); $this->assertArrayHasKey('zombies', $report['scenarios']); $this->assertArrayHasKey('projectiles', $report['scenarios']); foreach ($report['scenarios'] as $result) { $this->assertArrayHasKey('avgMs', $result); $this->assertArrayHasKey('medianMs', $result); $this->assertArrayHasKey('maxMs', $result); $this->assertArrayHasKey('budgetOk', $result); } } #[Test] public function tick_time_is_measured_as_positive(): void { $report = $this->harness()->measureTickTime(50, players: 2, ticks: 20); foreach ($report['scenarios'] as $result) { $this->assertGreaterThan(0.0, $result['avgMs']); $this->assertGreaterThan(0.0, $result['maxMs']); } } #[Test] public function snapshot_bytes_grow_with_entity_count(): void { $small = $this->harness()->measureSnapshotBytes(50, players: 2, scenarios: ['zombies']); $large = $this->harness()->measureSnapshotBytes(400, players: 2, scenarios: ['zombies']); $this->assertGreaterThan( $small['scenarios']['zombies']['bytes'], $large['scenarios']['zombies']['bytes'], 'snapshot payload should grow as entity count grows', ); } #[Test] public function snapshot_report_tracks_bytes_per_entity(): void { $report = $this->harness()->measureSnapshotBytes(100, players: 2, scenarios: ['zombies']); $this->assertGreaterThan(0, $report['scenarios']['zombies']['bytes']); $this->assertGreaterThan(0.0, $report['scenarios']['zombies']['bytesPerEntity']); } #[Test] public function reverb_cap_flag_flips_between_small_and_large_rooms(): void { $small = $this->harness()->measureSnapshotBytes(50, players: 2, scenarios: ['zombies']); $large = $this->harness()->measureSnapshotBytes(2000, players: 2, scenarios: ['zombies']); $this->assertFalse($small['scenarios']['zombies']['exceedsReverb']); $this->assertTrue($large['scenarios']['zombies']['exceedsReverb']); } }