value)->toBe(PageNumber::DEFAULT_PAGE) ->and($page->value())->toBe(PageNumber::DEFAULT_PAGE); }); it('creates page number with explicit value', function (): void { // WHEN $page = new PageNumber(5); // THEN expect($page->value)->toBe(5) ->and($page->value())->toBe(5); }); it('creates page number via of factory', function (): void { // WHEN $page = PageNumber::of(3); // THEN expect($page->value)->toBe(3) ->and($page->value())->toBe(3); }); it('creates page number via default factory', function (): void { // WHEN $page = PageNumber::default(); // THEN expect($page->value)->toBe(PageNumber::DEFAULT_PAGE); }); it('rejects page number less than or equal to zero', function (int $invalidValue): void { // WHEN / THEN expect(fn (): PageNumber => new PageNumber($invalidValue)) ->toThrow(\InvalidArgumentException::class, 'Page number must be greater than 0'); })->with([ 'zero' => [0], 'negative' => [-1], 'large negative' => [-99], ]); it('implements equals correctly', function (): void { // GIVEN $page1 = new PageNumber(2); $page2 = new PageNumber(2); $page3 = new PageNumber(3); // THEN expect($page1->equals($page2))->toBeTrue() ->and($page1->equals($page3))->toBeFalse() ->and($page1->equals(2))->toBeFalse() ->and($page1->equals('2'))->toBeFalse() ->and($page1->equals(null))->toBeFalse(); }); it('converts to string via __toString', function (): void { // GIVEN $page = new PageNumber(4); // THEN expect((string) $page)->toBe('4'); }); it('serializes to json as integer', function (): void { // GIVEN $page = new PageNumber(7); // THEN expect($page->jsonSerialize())->toBe(7) ->and(json_encode($page))->toBe('7'); }); });