2018-11-09 14:36:28 +01:00
< ? php
/**
2020-02-09 16:18:46 +01:00
* @ copyright Copyright ( C ) 2020 , Friendica
*
* @ 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 14:36:28 +01: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 14:36:28 +01:00
use Friendica\Util\Strings ;
use PHPUnit\Framework\TestCase ;
/**
2020-01-19 07:05:23 +01:00
* Strings utility test class
2018-11-09 14:36:28 +01:00
*/
class StringsTest extends TestCase
{
2019-10-11 07:21:22 +02:00
/**
2018-11-09 14:36:28 +01:00
* randomnames should be random , even length
*/
public function testRandomEven ()
{
$randomname1 = Strings :: getRandomName ( 10 );
$randomname2 = Strings :: getRandomName ( 10 );
$this -> assertNotEquals ( $randomname1 , $randomname2 );
}
/**
* randomnames should be random , odd length
*/
public function testRandomOdd ()
{
$randomname1 = Strings :: getRandomName ( 9 );
$randomname2 = Strings :: getRandomName ( 9 );
$this -> assertNotEquals ( $randomname1 , $randomname2 );
}
/**
* try to fail ramdonnames
*/
public function testRandomNameNoLength ()
{
$randomname1 = Strings :: getRandomName ( 0 );
$this -> assertEquals ( 0 , strlen ( $randomname1 ));
}
/**
* try to fail it with invalid input
*
* @ todo What ' s corect behaviour here ? An exception ?
*/
public function testRandomNameNegativeLength ()
{
$randomname1 = Strings :: getRandomName ( - 23 );
$this -> assertEquals ( 0 , strlen ( $randomname1 ));
}
/**
* test with a length , that may be too short
*/
public function testRandomNameLength1 ()
{
$randomname1 = Strings :: getRandomName ( 1 );
$this -> assertEquals ( 1 , strlen ( $randomname1 ));
$randomname2 = Strings :: getRandomName ( 1 );
$this -> assertEquals ( 1 , strlen ( $randomname2 ));
2019-10-11 07:21:22 +02:00
}
/**
2018-11-09 14:36:28 +01:00
* test , that tags are escaped
*/
2018-11-09 19:27:58 +01:00
public function testEscapeHtml ()
2018-11-09 14:36:28 +01:00
{
$invalidstring = '<submit type="button" onclick="alert(\'failed!\');" />' ;
2018-11-09 19:29:42 +01:00
$validstring = Strings :: escapeTags ( $invalidstring );
2018-11-09 19:27:58 +01:00
$escapedString = Strings :: escapeHtml ( $invalidstring );
2018-11-09 14:36:28 +01:00
$this -> assertEquals ( '[submit type="button" onclick="alert(\'failed!\');" /]' , $validstring );
$this -> assertEquals (
2019-10-12 12:56:16 +02:00
" <submit type="button" onclick="alert('failed!');" /> " ,
2018-11-09 14:36:28 +01: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 ,
],
'nullHex' => [
'input' => null ,
'valid' => false ,
],
];
}
/**
* Tests if the string is a valid hexadecimal value
*
* @ param string $input
* @ param bool $valid
*
* @ dataProvider dataIsHex
*/
public function testIsHex ( $input , $valid )
{
$this -> assertEquals ( $valid , Strings :: isHex ( $input ));
}
2020-03-30 07:57:10 +02: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 ) {
$this -> assertEquals (
substr_replace ( 'string' , 'replacement' , $start ),
Strings :: substringReplace ( 'string' , 'replacement' , $start )
);
for ( $length = - 10 ; $length <= 10 ; $length += 5 ) {
$this -> assertEquals (
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 )
{
$this -> assertEquals (
$expected ,
Strings :: substringReplace (
$string ,
$replacement ,
$start ,
$length
)
);
}
2018-11-09 14:36:28 +01:00
}