2018-11-09 08:36:28 -05:00
< ? php
/**
2022-01-02 08:27:47 +01:00
* @ copyright Copyright ( C ) 2010 - 2022 , the Friendica project
2020-02-09 16:18:46 +01:00
*
* @ license GNU AGPL version 3 or any later version
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation , either version 3 of the
* License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < https :// www . gnu . org / licenses />.
*
2018-11-09 08:36:28 -05:00
*/
2020-02-09 16:18:46 +01:00
2019-02-27 12:32:56 +01:00
namespace Friendica\Test\src\Util ;
2018-11-09 08:36:28 -05:00
use Friendica\Util\Strings ;
use PHPUnit\Framework\TestCase ;
/**
2020-01-19 06:05:23 +00:00
* Strings utility test class
2018-11-09 08:36:28 -05:00
*/
class StringsTest extends TestCase
{
2019-10-10 21:21:22 -08:00
/**
2018-11-09 08:36:28 -05:00
* randomnames should be random , even length
*/
public function testRandomEven ()
{
$randomname1 = Strings :: getRandomName ( 10 );
$randomname2 = Strings :: getRandomName ( 10 );
2020-10-17 14:19:57 +02:00
self :: assertNotEquals ( $randomname1 , $randomname2 );
2018-11-09 08:36:28 -05:00
}
/**
* randomnames should be random , odd length
*/
public function testRandomOdd ()
{
$randomname1 = Strings :: getRandomName ( 9 );
$randomname2 = Strings :: getRandomName ( 9 );
2020-10-17 14:19:57 +02:00
self :: assertNotEquals ( $randomname1 , $randomname2 );
2018-11-09 08:36:28 -05:00
}
/**
* try to fail ramdonnames
*/
public function testRandomNameNoLength ()
{
$randomname1 = Strings :: getRandomName ( 0 );
2020-10-17 14:19:57 +02:00
self :: assertEquals ( 0 , strlen ( $randomname1 ));
2018-11-09 08:36:28 -05:00
}
/**
* try to fail it with invalid input
*
* @ todo What ' s corect behaviour here ? An exception ?
*/
public function testRandomNameNegativeLength ()
{
$randomname1 = Strings :: getRandomName ( - 23 );
2020-10-17 14:19:57 +02:00
self :: assertEquals ( 0 , strlen ( $randomname1 ));
2018-11-09 08:36:28 -05:00
}
/**
* test with a length , that may be too short
*/
public function testRandomNameLength1 ()
{
$randomname1 = Strings :: getRandomName ( 1 );
2020-10-17 14:19:57 +02:00
self :: assertEquals ( 1 , strlen ( $randomname1 ));
2018-11-09 08:36:28 -05:00
$randomname2 = Strings :: getRandomName ( 1 );
2020-10-17 14:19:57 +02:00
self :: assertEquals ( 1 , strlen ( $randomname2 ));
2019-10-10 21:21:22 -08:00
}
/**
2018-11-09 08:36:28 -05:00
* test , that tags are escaped
*/
2018-11-09 13:27:58 -05:00
public function testEscapeHtml ()
2018-11-09 08:36:28 -05:00
{
$invalidstring = '<submit type="button" onclick="alert(\'failed!\');" />' ;
2018-11-09 13:27:58 -05:00
$escapedString = Strings :: escapeHtml ( $invalidstring );
2018-11-09 08:36:28 -05:00
2020-10-17 14:19:57 +02:00
self :: assertEquals (
2019-10-12 10:56:16 +00:00
" <submit type="button" onclick="alert('failed!');" /> " ,
2018-11-09 08:36:28 -05:00
$escapedString
);
}
2019-05-30 12:26:29 +02:00
public function dataIsHex ()
{
return [
'validHex' => [
'input' => '90913473615bf00c122ac78338492980' ,
'valid' => true ,
],
'invalidHex' => [
'input' => '90913473615bf00c122ac7833849293' ,
'valid' => false ,
],
'emptyHex' => [
'input' => '' ,
'valid' => false ,
],
];
}
/**
* Tests if the string is a valid hexadecimal value
*
2022-06-20 18:55:17 +02:00
* @ param string $input Input string
* @ param bool $valid Whether testing on valid or invalid
2019-05-30 12:26:29 +02:00
*
* @ dataProvider dataIsHex
*/
2022-06-20 18:55:17 +02:00
public function testIsHex ( string $input , bool $valid = false )
2019-05-30 12:26:29 +02:00
{
2020-10-17 14:19:57 +02:00
self :: assertEquals ( $valid , Strings :: isHex ( $input ));
2019-05-30 12:26:29 +02:00
}
2020-03-30 01:57:10 -04:00
/**
* Tests that Strings :: substringReplace behaves the same as substr_replace with ASCII strings in all the possible
* numerical parameter configurations ( positive , negative , zero , out of bounds either side , null )
*/
public function testSubstringReplaceASCII ()
{
for ( $start = - 10 ; $start <= 10 ; $start += 5 ) {
2020-10-17 14:19:57 +02:00
self :: assertEquals (
2020-03-30 01:57:10 -04:00
substr_replace ( 'string' , 'replacement' , $start ),
Strings :: substringReplace ( 'string' , 'replacement' , $start )
);
for ( $length = - 10 ; $length <= 10 ; $length += 5 ) {
2020-10-17 14:19:57 +02:00
self :: assertEquals (
2020-03-30 01:57:10 -04:00
substr_replace ( 'string' , 'replacement' , $start , $length ),
Strings :: substringReplace ( 'string' , 'replacement' , $start , $length )
);
}
}
}
public function dataSubstringReplaceMultiByte ()
{
return [
'issue-8470' => [
'expected' => 'Je n’ y pense que maintenant (pask ma sonnette ne fonctionne pas) : mettre un gentil mot avec mes coordonnées sur ma porte est le moyen le plus simple de rester en contact si besoin avec mon voisinage direct ! [url=https://www.instagram.com/p/B-UdH2loee1/?igshid=x4aglyju9kva]instagram.com/p/B-UdH2loee1/…[/url] [rest of the post]' ,
'string' => 'Je n’ y pense que maintenant (pask ma sonnette ne fonctionne pas) : mettre un gentil mot avec mes coordonnées sur ma porte est le moyen le plus simple de rester en contact si besoin avec mon voisinage direct ! https://t.co/YoBWTHsAAk [rest of the post]' ,
'replacement' => '[url=https://www.instagram.com/p/B-UdH2loee1/?igshid=x4aglyju9kva]instagram.com/p/B-UdH2loee1/…[/url]' ,
'start' => 209 ,
'length' => 23 ,
],
];
}
/**
* Tests cases where Strings :: substringReplace is needed over substr_replace with multi - byte strings and character
* offsets
*
* @ param string $expected
* @ param string $string
* @ param string $replacement
* @ param int $start
* @ param int | null $length
*
* @ dataProvider dataSubstringReplaceMultiByte
*/
public function testSubstringReplaceMultiByte ( string $expected , string $string , string $replacement , int $start , int $length = null )
{
2020-10-17 14:19:57 +02:00
self :: assertEquals (
2020-03-30 01:57:10 -04:00
$expected ,
Strings :: substringReplace (
$string ,
$replacement ,
$start ,
$length
)
);
}
2020-06-04 19:25:48 -04:00
public function testPerformWithEscapedBlocks ()
{
$originalText = '[noparse][/noparse][nobb]nobb[/nobb][noparse]noparse[/noparse]' ;
$text = Strings :: performWithEscapedBlocks ( $originalText , '#[(?:noparse|nobb)].*?\[/(?:noparse|nobb)]#is' , function ( $text ) {
return $text ;
});
2020-10-17 14:19:57 +02:00
self :: assertEquals ( $originalText , $text );
2020-06-04 19:25:48 -04:00
}
public function testPerformWithEscapedBlocksNested ()
{
$originalText = '[noparse][/noparse][nobb]nobb[/nobb][noparse]noparse[/noparse]' ;
$text = Strings :: performWithEscapedBlocks ( $originalText , '#[nobb].*?\[/nobb]#is' , function ( $text ) {
$text = Strings :: performWithEscapedBlocks ( $text , '#[noparse].*?\[/noparse]#is' , function ( $text ) {
return $text ;
});
return $text ;
});
2020-10-17 14:19:57 +02:00
self :: assertEquals ( $originalText , $text );
2020-06-04 19:25:48 -04:00
}
2018-11-09 08:36:28 -05:00
}