assertSame([], $rooms->join('lobby', 'p1')); $this->assertSame(['p1'], $rooms->peersIn('lobby')); $this->assertSame('lobby', $rooms->roomOf('p1')); } public function test_second_joiner_meshes_with_the_first(): void { $rooms = new RoomManager; $rooms->join('lobby', 'p1'); $this->assertSame(['p1'], $rooms->join('lobby', 'p2')); $this->assertSame(['p1', 'p2'], $rooms->peersIn('lobby')); } public function test_leaving_returns_remaining_and_drops_empty_rooms(): void { $rooms = new RoomManager; $rooms->join('lobby', 'p1'); $rooms->join('lobby', 'p2'); $this->assertSame(['p1'], $rooms->leave('p2')); $this->assertSame([], $rooms->leave('p1')); // room now empty $this->assertSame(0, $rooms->count()); $this->assertNull($rooms->room('lobby')); } public function test_joining_a_new_room_leaves_the_old(): void { $rooms = new RoomManager; $rooms->join('a', 'p1'); $rooms->join('b', 'p1'); $this->assertSame([], $rooms->peersIn('a')); // 'a' emptied + dropped $this->assertSame(['p1'], $rooms->peersIn('b')); $this->assertSame('b', $rooms->roomOf('p1')); } }