순번 목록 */ public function numbers(string $sortOrder): array { return $this->mapWithRowNumber(fn ($item) => ['id' => $item], $sortOrder) ->pluck('number') ->all(); } }; } /** * 상한형 페이지를 만듭니다. */ private function boundedPage(int $page, int $perPage, int $total, TotalRelation $relation): BoundedPage { return new BoundedPage( items: new Collection(range(1, $perPage)), total: $total, perPage: $perPage, currentPage: $page, totalRelation: $relation, resultCap: 10000, hasMorePages: true, ); } public function test_총건수가_정확하면_순번은_총건수부터_내림차순이다(): void { $paginator = new LengthAwarePaginator(new Collection(range(1, 5)), 120, 5, 1); $this->assertSame( [120, 119, 118, 117, 116], $this->collectionFor($paginator)->numbers('desc') ); } public function test_총건수가_잘리면_순번은_null_이다(): void { $page = $this->boundedPage(1, 5, 10000, TotalRelation::AtLeast); $this->assertSame( [null, null, null, null, null], $this->collectionFor($page)->numbers('desc') ); } public function test_상한을_넘은_페이지에서_0이나_음수_순번이_없다(): void { foreach ([501, 502, 601] as $pageNumber) { $page = $this->boundedPage($pageNumber, 20, 10000, TotalRelation::AtLeast); foreach ($this->collectionFor($page)->numbers('desc') as $number) { $this->assertFalse( is_int($number), "{$pageNumber} 페이지에서 상한 총 건수로 역산한 순번이 그대로 나왔습니다." ); } } } public function test_오름차순_순번은_총건수가_잘려도_유지된다(): void { $page = $this->boundedPage(3, 5, 10000, TotalRelation::AtLeast); $this->assertSame( [11, 12, 13, 14, 15], $this->collectionFor($page)->numbers('asc') ); } }