value)->toBe(PageSize::DEFAULT_SIZE) ->and($size->value())->toBe(PageSize::DEFAULT_SIZE); }); it('creates page size with explicit value', function (): void { // WHEN $size = new PageSize(50); // THEN expect($size->value)->toBe(50) ->and($size->value())->toBe(50); }); it('creates page size via of factory', function (): void { // WHEN $size = PageSize::of(10); // THEN expect($size->value)->toBe(10) ->and($size->value())->toBe(10); }); it('creates page size via default factory', function (): void { // WHEN $size = PageSize::default(); // THEN expect($size->value)->toBe(PageSize::DEFAULT_SIZE); }); it('allows maximum page size', function (): void { // WHEN $size = new PageSize(PageSize::MAX_PAGE_SIZE); // THEN expect($size->value)->toBe(PageSize::MAX_PAGE_SIZE); }); it('rejects page size less than or equal to zero', function (int $invalidValue): void { // WHEN / THEN expect(fn () => new PageSize($invalidValue)) ->toThrow(\InvalidArgumentException::class, 'Page size must be greater than 0'); })->with([ 'zero' => [0], 'negative' => [-1], 'large negative' => [-100], ]); it('rejects page size exceeding maximum page size', function (): void { // WHEN / THEN expect(fn () => new PageSize(PageSize::MAX_PAGE_SIZE + 1)) ->toThrow(\InvalidArgumentException::class, 'Page size must be less than or equal to 10000'); }); it('implements equals correctly', function (): void { // GIVEN $size1 = new PageSize(25); $size2 = new PageSize(25); $size3 = new PageSize(50); // THEN expect($size1->equals($size2))->toBeTrue() ->and($size1->equals($size3))->toBeFalse() ->and($size1->equals(25))->toBeFalse() ->and($size1->equals('25'))->toBeFalse() ->and($size1->equals(null))->toBeFalse(); }); it('converts to string via __toString', function (): void { // GIVEN $size = new PageSize(15); // THEN expect((string) $size)->toBe('15'); }); it('serializes to json as integer', function (): void { // GIVEN $size = new PageSize(30); // THEN expect($size->jsonSerialize())->toBe(30) ->and(json_encode($size))->toBe('30'); }); });