assertSame('https://www.php.net/images/logos/php-logo-white.svg', $icon->src); $this->assertSame('image/svg+xml', $icon->mimeType); $this->assertSame('any', $icon->sizes[0]); } public function testConstructorWithMultipleSizes(): void { $icon = new Icon('https://example.com/icon.png', 'image/png', ['48x48', '96x96']); $this->assertCount(2, $icon->sizes); $this->assertSame(['48x48', '96x96'], $icon->sizes); } public function testConstructorWithAnySizes(): void { $icon = new Icon('https://example.com/icon.svg', 'image/png', ['any']); $this->assertSame(['any'], $icon->sizes); } public function testConstructorWithNullOptionalFields(): void { $icon = new Icon('https://example.com/icon.png'); $this->assertSame('https://example.com/icon.png', $icon->src); $this->assertNull($icon->mimeType); $this->assertNull($icon->sizes); } public function testInvalidSizesFormatThrowsException(): void { $this->expectException(InvalidArgumentException::class); new Icon('https://example.com/icon.png', 'image/png', ['invalid-size']); } public function testInvalidPixelSizesFormatThrowsException(): void { $this->expectException(InvalidArgumentException::class); new Icon('https://example.com/icon.png', 'image/png', ['180x48x48']); } public function testEmptySrcThrowsException(): void { $this->expectException(InvalidArgumentException::class); new Icon('', 'image/png', ['48x48']); } public function testInvalidSrcThrowsException(): void { $this->expectException(InvalidArgumentException::class); new Icon('not-a-url', 'image/png', ['48x48']); } public function testValidDataUriSrc(): void { $dataUri = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA'; $icon = new Icon($dataUri, 'image/png', ['48x48']); $this->assertSame($dataUri, $icon->src); } public function testFromArrayReadsTheme(): void { $icon = Icon::fromArray(['src' => 'https://example.com/icon.png', 'theme' => 'dark']); $this->assertSame(IconTheme::Dark, $icon->theme); $this->assertSame('dark', $icon->jsonSerialize()['theme']); } public function testFromArrayRejectsUnknownTheme(): void { $this->expectException(InvalidArgumentException::class); Icon::fromArray(['src' => 'https://example.com/icon.png', 'theme' => 'sepia']); } }