assertArrayHasKey('roots', $data); $this->assertSame([], $data['roots']); } public function testSerializesRootsWithListChanged(): void { $capabilities = new ClientCapabilities(roots: true, rootsListChanged: true); $data = json_decode(json_encode($capabilities), true); $this->assertSame(['listChanged' => true], $data['roots']); } public function testSerializesEmptyCapabilitiesAsObject(): void { $capabilities = new ClientCapabilities(); $this->assertSame('{}', json_encode($capabilities)); } public function testFromArrayReadsRootsListChanged(): void { $capabilities = ClientCapabilities::fromArray(['roots' => ['listChanged' => true]]); $this->assertTrue($capabilities->roots); $this->assertTrue($capabilities->rootsListChanged); } public function testFromArrayRootsWithoutListChanged(): void { $capabilities = ClientCapabilities::fromArray(['roots' => []]); $this->assertTrue($capabilities->roots); $this->assertNull($capabilities->rootsListChanged); } public function testRoundTripPreservesRootsListChanged(): void { $capabilities = new ClientCapabilities(roots: true, rootsListChanged: true); $data = json_decode(json_encode($capabilities), true); $restored = ClientCapabilities::fromArray($data); $this->assertTrue($restored->roots); $this->assertTrue($restored->rootsListChanged); } }