coverJpeg(srcJpeg(2000, 2000), 300, 250); $info = getimagesizefromstring($out); expect($info)->not->toBeFalse() ->and($info[0])->toBe(300) ->and($info[1])->toBe(250) ->and($info['mime'])->toBe('image/jpeg') ->and(strlen($out))->toBeLessThanOrEqual(512000); }); it('работает для широкого и высокого форматов (cover, точные пиксели)', function () { $gen = new BannerGenerator(); $wide = getimagesizefromstring($gen->coverJpeg(srcJpeg(1200, 1200), 728, 90)); expect($wide[0])->toBe(728)->and($wide[1])->toBe(90); $tall = getimagesizefromstring($gen->coverJpeg(srcJpeg(1200, 1200), 240, 600)); expect($tall[0])->toBe(240)->and($tall[1])->toBe(600); }); it('бросает исключение на нечитаемой картинке', function () { expect(fn () => (new BannerGenerator())->coverJpeg('не картинка', 300, 250)) ->toThrow(RuntimeException::class); });