assertSame(['category' => 'cs', 'slice' => 'new'], $parsed); $this->assertSame('cat:cs*', ArxivListUrlParser::buildCategorySearchQuery('https://arxiv.org/list/cs/new')); $this->assertSame('cat:cs.AI', ArxivListUrlParser::buildCategorySearchQuery('https://arxiv.org/list/cs.AI/new')); $this->assertSame('cat:astro-ph*', ArxivListUrlParser::buildCategorySearchQuery('https://arxiv.org/list/astro-ph/new')); } public function test_builds_list_page_url_with_paging(): void { $url = ArxivListUrlParser::buildListPageUrl('https://arxiv.org/list/math/new', 50, 100); $this->assertStringContainsString('skip=50', $url); $this->assertStringContainsString('show=100', $url); } public function test_combines_category_and_keyword_queries(): void { $query = CrawlKeywordParser::combineArxivSearchQueries('cat:math*', 'graph neural'); $this->assertSame('(cat:math*) AND ((all:graph AND all:neural))', $query); } }