DatabaseDAOTest.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. declare(strict_types=1);
  3. use PHPUnit\Framework\Attributes\DataProvider;
  4. final class DatabaseDAOTest extends \PHPUnit\Framework\TestCase {
  5. /** @return list<array{string,string,bool,bool}> */
  6. public static function provideStrilikeCommon(): array {
  7. return [
  8. ['abc', 'abc', false, true],
  9. ['AbC', 'aBc', false, true],
  10. ['zabc', 'abc', false, false],
  11. ['abcd', 'abc', false, false],
  12. ['aéc', 'ac', false, false],
  13. ['abcd', 'bc', true, true],
  14. ['abcd', 'BC', true, true],
  15. ['aßc', 'ß', true, true],
  16. ['aéc', 'é', true, true],
  17. ['Été', 'Ét', true, true],
  18. ['aßc', 'ac', true, false],
  19. ['ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz', false, true],
  20. ['abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', true, true],
  21. ];
  22. }
  23. /** @return list<array{string,string,bool,bool}> */
  24. public static function provideStrilikeAccents(): array {
  25. return [
  26. ['café', 'cafè', false, false],
  27. ['Été', 'Eté', false, false],
  28. ['Été', 'Et', true, false],
  29. ];
  30. }
  31. /** @return list<array{string,string,bool,bool}> */
  32. public static function provideStrilikeNoAccents(): array {
  33. return [
  34. ['café', 'cafè', false, true],
  35. ['Été', 'Eté', false, true],
  36. ['Été', 'Et', true, true],
  37. ];
  38. }
  39. /** @return list<array{string,string,bool,bool}> */
  40. public static function provideStrilikeAccentsCasing(): array {
  41. return [
  42. ['Été', 'été', false, true],
  43. ['AÎNÉE', 'aîné', true, true],
  44. ['AÎNÉ', 'aine', false, false],
  45. ['AÎNÉE', 'aine', true, false],
  46. ];
  47. }
  48. /** @return list<array{string,string,bool,bool}> */
  49. public static function provideStrilikeUnicodeCasing(): array {
  50. return [
  51. ['ČĆĐŠŽ', 'čćđšž', false, true], // Croatian
  52. ['ÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ', 'áčďéěíňóřšťúůýž', false, true], // Czech
  53. ['ÆØÅ', 'æøå', false, true], // Danish
  54. ['ŠŽÕÄÖÜ', 'šžõäöü', false, true], // Estonian
  55. ['ÄÖ', 'äö', false, true], // Finnish
  56. ['ÀÂÆÇÈÉÊËÎÏÔŒÙÛÜŸ', 'àâæçèéêëîïôœùûüÿ', false, true], // French
  57. ['ÄÖÜ', 'äöü', false, true], // German
  58. ['ΑΆΒΓΔΕΈΖΗΉΘΙΊΪΚΛΜΝΞΟΌΠΡΣΤΥΎΫΦΧΨΩΏ', 'αάβγδεέζηήθιίϊκλμνξοόπρστυύϋφχψωώ', false, true], // Greek
  59. ['ÁÉÍÓÖŐÚÜŰ', 'áéíóöőúüű', false, true], // Hungarian
  60. ['ÁÉÍÓÚ', 'áéíóú', false, true], // Irish
  61. ['ÀÈÉÌÒÓÙ', 'àèéìòóù', false, true], // Italian
  62. ['ĀČĒĢĪĶĻŅŠŪŽ', 'āčēģīķļņšūž', false, true], // Latvian
  63. ['ĄČĘĖĮŠŲŪŽ', 'ąčęėįšųūž', false, true], // Lithuanian
  64. ['ĊĠĦŻ', 'ċġħż', false, true], // Maltese
  65. ['ĄĆĘŁŃÓŚŹŻ', 'ąćęłńóśźż', false, true], // Polish
  66. ['ÁÂÃÇÉÍÓÕÚ', 'áâãçéíóõú', false, true], // Portuguese
  67. ['ĂÂÎȘȚ', 'ăâîșț', false, true], // Romanian
  68. ['ÁÄČĎÉÍĹĽŇÓÔŔŠŤÚÝŽ', 'áäčďéíĺľňóôŕšťúýž', false, true], // Slovak
  69. ['ČŠŽ', 'čšž', false, true], // Slovenian
  70. ['ÁÉÍÑÓÚÜ', 'áéíñóúü', false, true], // Spanish
  71. ['ÅÄÖ', 'åäö', false, true], // Swedish
  72. ];
  73. }
  74. /** @return list<array{string,string,bool,bool}> */
  75. public static function provideStrilikeNoUnicodeCasing(): array {
  76. return [
  77. ['café', 'cafè', false, false],
  78. ['café', 'Café', true, true],
  79. ['Été', 'été', true, false],
  80. ];
  81. }
  82. #[DataProvider('provideStrilikeCommon')]
  83. #[DataProvider('provideStrilikeNoAccents')]
  84. #[DataProvider('provideStrilikeUnicodeCasing')]
  85. public static function test_strilike_MySQL(string $haystack, string $needle, bool $contains, bool $expected): void {
  86. if (!function_exists('transliterator_transliterate') && str_contains($haystack, 'α')) {
  87. self::markTestSkipped('transliterator_transliterate function not available to handle e.g. Greek.');
  88. return; // @phpstan-ignore deadCode.unreachable
  89. }
  90. self::assertSame($expected, FreshRSS_DatabaseDAO::strilike($haystack, $needle, $contains));
  91. }
  92. #[DataProvider('provideStrilikeCommon')]
  93. #[DataProvider('provideStrilikeAccents')]
  94. #[DataProvider('provideStrilikeAccentsCasing')]
  95. #[DataProvider('provideStrilikeUnicodeCasing')]
  96. public static function test_strilike_PGSQL(string $haystack, string $needle, bool $contains, bool $expected): void {
  97. self::assertSame($expected, FreshRSS_DatabaseDAOPGSQL::strilike($haystack, $needle, $contains));
  98. }
  99. #[DataProvider('provideStrilikeCommon')]
  100. #[DataProvider('provideStrilikeAccents')]
  101. #[DataProvider('provideStrilikeNoUnicodeCasing')]
  102. public static function test_strilike_SQLite(string $haystack, string $needle, bool $contains, bool $expected): void {
  103. self::assertSame($expected, FreshRSS_DatabaseDAOSQLite::strilike($haystack, $needle, $contains));
  104. }
  105. }