toString())->toBe('1200w.webp'); expect((string) $variant)->toBe('1200w.webp'); }); it('accepts variant names with scale', function () { $variant = VariantName::fromString('thumb@1x'); expect($variant->toString())->toBe('thumb@1x'); expect($variant->getScale())->toBe('1x'); }); it('accepts variant names with scale and extension', function () { $variant = VariantName::fromString('thumb@2x.webp'); expect($variant->toString())->toBe('thumb@2x.webp'); expect($variant->getScale())->toBe('2x'); expect($variant->getExtension())->toBe('webp'); }); it('accepts variant names without scale or extension', function () { $variant = VariantName::fromString('cover'); expect($variant->toString())->toBe('cover'); expect($variant->getScale())->toBeNull(); expect($variant->getExtension())->toBeNull(); }); it('extracts extension correctly', function () { expect(VariantName::fromString('image.webp')->getExtension())->toBe('webp'); expect(VariantName::fromString('image.jpg')->getExtension())->toBe('jpg'); expect(VariantName::fromString('waveform.json')->getExtension())->toBe('json'); }); it('extracts scale correctly', function () { expect(VariantName::fromString('thumb@1x')->getScale())->toBe('1x'); expect(VariantName::fromString('thumb@2x')->getScale())->toBe('2x'); expect(VariantName::fromString('cover@3x.webp')->getScale())->toBe('3x'); }); it('throws exception for empty string', function () { expect(fn () => VariantName::fromString('')) ->toThrow(InvalidArgumentException::class, 'Variant name cannot be empty'); }); it('throws exception for invalid format', function () { expect(fn () => VariantName::fromString('invalid@format')) ->toThrow(InvalidArgumentException::class, 'Invalid variant name format'); expect(fn () => VariantName::fromString('UPPERCASE')) ->toThrow(InvalidArgumentException::class); expect(fn () => VariantName::fromString('with spaces')) ->toThrow(InvalidArgumentException::class); }); it('throws exception for variant name exceeding 100 characters', function () { $longName = str_repeat('a', 101); expect(fn () => VariantName::fromString($longName)) ->toThrow(InvalidArgumentException::class, 'Variant name cannot exceed 100 characters'); }); it('can compare two VariantNames for equality', function () { $variant1 = VariantName::fromString('1200w.webp'); $variant2 = VariantName::fromString('1200w.webp'); $variant3 = VariantName::fromString('800w.webp'); expect($variant1->equals($variant2))->toBeTrue(); expect($variant1->equals($variant3))->toBeFalse(); }); });