diff --git a/src/Support/Str.php b/src/Support/Str.php index 9ed75c1f..21ee5c5b 100644 --- a/src/Support/Str.php +++ b/src/Support/Str.php @@ -61,7 +61,8 @@ final class Str { $code = self::PREFIX.str_replace(' ', '_', $code); - return (string) preg_replace('/[^A-Z_a-z0-9]/', '_', $code); + // sticks to PHP8.2 function naming rules https://www.php.net/manual/en/functions.user-defined.php + return (string) preg_replace('/[^a-zA-Z0-9_\x80-\xff]/', '_', $code); } /** diff --git a/tests/Unit/TestName.php b/tests/Unit/TestName.php index 3f52e700..b7f91d54 100644 --- a/tests/Unit/TestName.php +++ b/tests/Unit/TestName.php @@ -11,3 +11,60 @@ it('may start with P', function (string $real, string $toBePrinted) { ['PPPackages\Foo', 'PPPackages\Foo'], ['PPPackages\Foo', 'PPPackages\Foo'], ]); + +$names = [ + 'ふ+が+' => '__pest_evaluable_ふ_が_', + 'ほげ' => '__pest_evaluable_ほげ', + '卜竹弓一十山' => '__pest_evaluable_卜竹弓一十山', + 'アゴデヸ' => '__pest_evaluable_アゴデヸ', + '!p8VrB' => '__pest_evaluable__p8VrB', + '&xe6VeKWF#n4' => '__pest_evaluable__xe6VeKWF_n4', + '%%HurHUnw7zM!' => '__pest_evaluable___HurHUnw7zM_', + 'rundeliekend' => '__pest_evaluable_rundeliekend', + 'g%%c!Jt9$fy#Kf' => '__pest_evaluable_g__c_Jt9_fy_Kf', + 'NRs*Gz2@hmB$W$BPD%%b2U%3P%z%apnwSX' => '__pest_evaluable_NRs_Gz2_hmB_W_BPD__b2U_3P_z_apnwSX', + 'ÀĤ{¼÷' => '__pest_evaluable_ÀĤ_¼÷', + 'ìèéàòç' => '__pest_evaluable_ìèéàòç', + 'زهراء المعادي' => '__pest_evaluable_زهراء_المعادي', + 'الجبيهه' => '__pest_evaluable_الجبيهه', + 'الظهران' => '__pest_evaluable_الظهران', + 'Каролин' => '__pest_evaluable_Каролин', + 'অ্যান্টার্কটিকা' => '__pest_evaluable_অ্যান্টার্কটিকা', + 'Frýdek-Místek"' => '__pest_evaluable_Frýdek_Místek_', + 'Allingåbro&' => '__pest_evaluable_Allingåbro_', + 'Κεντροαφρικανική Δημοκρατία' => '__pest_evaluable_Κεντροαφρικανική_Δημοκρατία', + 'آذربایجان غربی' => '__pest_evaluable_آذربایجان_غربی', + 'זימבבואה' => '__pest_evaluable_זימבבואה', + 'Belišće' => '__pest_evaluable_Belišće', + 'Գվատեմալա' => '__pest_evaluable_Գվատեմալա', + 'パプアニューギニア' => '__pest_evaluable_パプアニューギニア', + '富山県' => '__pest_evaluable_富山県', + 'Қарағанды' => '__pest_evaluable_Қарағанды', + 'Қостанай' => '__pest_evaluable_Қостанай', + '안양시 동안구' => '__pest_evaluable_안양시_동안구', + 'Itālija' => '__pest_evaluable_Itālija', + 'Honningsvåg' => '__pest_evaluable_Honningsvåg', + 'Águeda' => '__pest_evaluable_Águeda', + 'Râșcani' => '__pest_evaluable_Râșcani', + 'Năsăud' => '__pest_evaluable_Năsăud', + 'Орехово-Зуево' => '__pest_evaluable_Орехово_Зуево', + 'Čereňany' => '__pest_evaluable_Čereňany', + 'Moravče' => '__pest_evaluable_Moravče', + 'Šentjernej' => '__pest_evaluable_Šentjernej', + 'Врање' => '__pest_evaluable_Врање', + 'Крушевац' => '__pest_evaluable_Крушевац', + 'Åkersberga' => '__pest_evaluable_Åkersberga', + 'บอสเนียและเฮอร์เซโกวีนา' => '__pest_evaluable_บอสเนียและเฮอร์เซโกวีนา', + 'Birleşik Arap Emirlikleri' => '__pest_evaluable_Birleşik_Arap_Emirlikleri', + 'Німеччина' => '__pest_evaluable_Німеччина', + 'Nam Định' => '__pest_evaluable_Nam_Định', + '呼和浩特' => '__pest_evaluable_呼和浩特', +]; + +foreach ($names as $name => $methodName) { + test($name) + ->expect(fn () => static::getLatestPrintableTestCaseMethodName()) + ->toBe($name) + ->and(fn () => $this->name()) + ->toBe($methodName); +}