assertSame($expected, AccentFolding::fold($input)); } public static function foldProvider(): array { return [ 'french name' => ['Théophile', 'Theophile'], 'lowercase + mixed' => ['sévère où ça', 'severe ou ca'], // Upper diacritics fold to lower base letters (LIKE is case-insensitive in SQLite, // so this is fine for matching; the point is É and é both fold to e). 'upper diacritics' => ['ÉCOLE À ö', 'eCOLE a o'], 'cedilla' => ['garçon', 'garcon'], 'n tilde' => ['señor', 'senor'], 'umlauts' => ['üöä', 'uoa'], 'apex/apostrophe' => ['l\'erg', "l'erg"], 'empty' => ['', ''], 'no diacritics' => ['plain text', 'plain text'], ]; } public function testFoldReturnsNullForNull(): void { $this->assertNull(AccentFolding::fold(null)); } public function testPublicSearchMatchedWithoutAccent(): void { TestDatabase::seedBasicThesis('TFE ac', 'Théophile Dupont', 2024); $db = TestDatabase::getInstance(); $res = $db->searchTheses(['query' => 'theophile']); $this->assertCount(1, $res); $this->assertStringContainsString('Théophile', $res[0]['authors']); } public function testPublicSearchMatchedWithAccent(): void { TestDatabase::seedBasicThesis('TFE ac', 'Théophile Dupont', 2024); $db = TestDatabase::getInstance(); $res = $db->searchTheses(['query' => 'Théophile']); $this->assertCount(1, $res); } public function testTitleSearchIgnoresAccent(): void { TestDatabase::seedBasicThesis('Sévère étude', 'Auteur', 2024); $db = TestDatabase::getInstance(); $res = $db->searchTheses(['query' => 'severe']); $this->assertCount(1, $res); } public function testSearchReturnsNothingForMismatch(): void { TestDatabase::seedBasicThesis('Distinct Title', 'Autre Auteur', 2024); $db = TestDatabase::getInstance(); $this->assertCount(0, $db->searchTheses(['query' => 'xyzzy-no-match'])); } public function testAuthorNamePreviewIgnoresAccent(): void { [$authorId, $thesisId] = TestDatabase::seedBasicThesis('P', 'Théophile Dupont', 2024); $db = TestDatabase::getInstance(); $this->assertCount(1, $db->getThesesByAuthorName('Theophile Dupont')); $this->assertCount(1, $db->getThesesByAuthorName('Théophile Dupont')); $this->assertCount(0, $db->getThesesByAuthorName('Jean-Claude')); } public function testAdminListIgnoresAccent(): void { TestDatabase::seedBasicThesis('Étude de cas', 'Théophile Martin', 2025); $db = TestDatabase::getInstance(); $accented = $db->getThesesList(['search' => 'Théophile'], 0, 0); $plain = $db->getThesesList(['search' => 'theophile'], 0, 0); $this->assertCount(1, $accented); $this->assertEquals($accented, $plain); $this->assertSame(0, $db->getThesesListCount(['search' => 'zz-nope'])); } public function testAdminIdentifierSearchStillMatchesAscii(): void { [$authorId, $thesisId] = TestDatabase::seedBasicThesis('X', 'Auteur', 2024); $db = TestDatabase::getInstance(); // seedBasicThesis uses identifier "$year-001" → "2024-001" $pdo = TestDatabase::getPDO(); $id = $pdo->query("SELECT identifier FROM theses WHERE id = $thesisId")->fetchColumn(); $this->assertCount(1, $db->getThesesList(['search' => $id], 0, 0)); } }