mirror of
				https://github.com/yiisoft/yii2.git
				synced 2025-11-04 14:46:19 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			231 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			231 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						||
namespace yiiunit\framework\helpers;
 | 
						||
 | 
						||
use yii\helpers\StringHelper;
 | 
						||
use yiiunit\TestCase;
 | 
						||
 | 
						||
/**
 | 
						||
 * StringHelperTest
 | 
						||
 * @group helpers
 | 
						||
 */
 | 
						||
class StringHelperTest extends TestCase
 | 
						||
{
 | 
						||
    protected function setUp()
 | 
						||
    {
 | 
						||
        parent::setUp();
 | 
						||
        $this->mockApplication();
 | 
						||
    }
 | 
						||
 | 
						||
    public function testStrlen()
 | 
						||
    {
 | 
						||
        $this->assertEquals(4, StringHelper::byteLength('this'));
 | 
						||
        $this->assertEquals(6, StringHelper::byteLength('это'));
 | 
						||
    }
 | 
						||
 | 
						||
    public function testSubstr()
 | 
						||
    {
 | 
						||
        $this->assertEquals('th', StringHelper::byteSubstr('this', 0, 2));
 | 
						||
        $this->assertEquals('э', StringHelper::byteSubstr('это', 0, 2));
 | 
						||
 | 
						||
        $this->assertEquals('abcdef', StringHelper::byteSubstr('abcdef', 0));
 | 
						||
        $this->assertEquals('abcdef', StringHelper::byteSubstr('abcdef', 0, null));
 | 
						||
 | 
						||
        $this->assertEquals('de',     StringHelper::byteSubstr('abcdef', 3, 2));
 | 
						||
        $this->assertEquals('def',    StringHelper::byteSubstr('abcdef', 3));
 | 
						||
        $this->assertEquals('def',    StringHelper::byteSubstr('abcdef', 3, null));
 | 
						||
 | 
						||
        $this->assertEquals('cd',     StringHelper::byteSubstr('abcdef', -4, 2));
 | 
						||
        $this->assertEquals('cdef',   StringHelper::byteSubstr('abcdef', -4));
 | 
						||
        $this->assertEquals('cdef',   StringHelper::byteSubstr('abcdef', -4, null));
 | 
						||
 | 
						||
        $this->assertEquals('',   StringHelper::byteSubstr('abcdef', 4, 0));
 | 
						||
        $this->assertEquals('',   StringHelper::byteSubstr('abcdef', -4, 0));
 | 
						||
 | 
						||
        $this->assertEquals('это', StringHelper::byteSubstr('это', 0));
 | 
						||
        $this->assertEquals('это', StringHelper::byteSubstr('это', 0, null));
 | 
						||
 | 
						||
        $this->assertEquals('т',     StringHelper::byteSubstr('это', 2, 2));
 | 
						||
        $this->assertEquals('то',    StringHelper::byteSubstr('это', 2));
 | 
						||
        $this->assertEquals('то',    StringHelper::byteSubstr('это', 2, null));
 | 
						||
 | 
						||
        $this->assertEquals('т',     StringHelper::byteSubstr('это', -4, 2));
 | 
						||
        $this->assertEquals('то',   StringHelper::byteSubstr('это', -4));
 | 
						||
        $this->assertEquals('то',   StringHelper::byteSubstr('это', -4, null));
 | 
						||
 | 
						||
        $this->assertEquals('',   StringHelper::byteSubstr('это', 4, 0));
 | 
						||
        $this->assertEquals('',   StringHelper::byteSubstr('это', -4, 0));
 | 
						||
    }
 | 
						||
 | 
						||
    public function testBasename()
 | 
						||
    {
 | 
						||
        $this->assertEquals('', StringHelper::basename(''));
 | 
						||
 | 
						||
        $this->assertEquals('file', StringHelper::basename('file'));
 | 
						||
        $this->assertEquals('file.test', StringHelper::basename('file.test', '.test2'));
 | 
						||
        $this->assertEquals('file', StringHelper::basename('file.test', '.test'));
 | 
						||
 | 
						||
        $this->assertEquals('file', StringHelper::basename('/file'));
 | 
						||
        $this->assertEquals('file.test', StringHelper::basename('/file.test', '.test2'));
 | 
						||
        $this->assertEquals('file', StringHelper::basename('/file.test', '.test'));
 | 
						||
 | 
						||
        $this->assertEquals('file', StringHelper::basename('/path/to/file'));
 | 
						||
        $this->assertEquals('file.test', StringHelper::basename('/path/to/file.test', '.test2'));
 | 
						||
        $this->assertEquals('file', StringHelper::basename('/path/to/file.test', '.test'));
 | 
						||
 | 
						||
        $this->assertEquals('file', StringHelper::basename('\file'));
 | 
						||
        $this->assertEquals('file.test', StringHelper::basename('\file.test', '.test2'));
 | 
						||
        $this->assertEquals('file', StringHelper::basename('\file.test', '.test'));
 | 
						||
 | 
						||
        $this->assertEquals('file', StringHelper::basename('C:\file'));
 | 
						||
        $this->assertEquals('file.test', StringHelper::basename('C:\file.test', '.test2'));
 | 
						||
        $this->assertEquals('file', StringHelper::basename('C:\file.test', '.test'));
 | 
						||
 | 
						||
        $this->assertEquals('file', StringHelper::basename('C:\path\to\file'));
 | 
						||
        $this->assertEquals('file.test', StringHelper::basename('C:\path\to\file.test', '.test2'));
 | 
						||
        $this->assertEquals('file', StringHelper::basename('C:\path\to\file.test', '.test'));
 | 
						||
 | 
						||
        // mixed paths
 | 
						||
        $this->assertEquals('file.test', StringHelper::basename('/path\to/file.test'));
 | 
						||
        $this->assertEquals('file.test', StringHelper::basename('/path/to\file.test'));
 | 
						||
        $this->assertEquals('file.test', StringHelper::basename('\path/to\file.test'));
 | 
						||
 | 
						||
        // \ and / in suffix
 | 
						||
        $this->assertEquals('file', StringHelper::basename('/path/to/filete/st', 'te/st'));
 | 
						||
        $this->assertEquals('st', StringHelper::basename('/path/to/filete/st', 'te\st'));
 | 
						||
        $this->assertEquals('file', StringHelper::basename('/path/to/filete\st', 'te\st'));
 | 
						||
        $this->assertEquals('st', StringHelper::basename('/path/to/filete\st', 'te/st'));
 | 
						||
 | 
						||
        // http://www.php.net/manual/en/function.basename.php#72254
 | 
						||
        $this->assertEquals('foo', StringHelper::basename('/bar/foo/'));
 | 
						||
        $this->assertEquals('foo', StringHelper::basename('\\bar\\foo\\'));
 | 
						||
    }
 | 
						||
 | 
						||
    public function testTruncate()
 | 
						||
    {
 | 
						||
        $this->assertEquals('привет, я multibyte...', StringHelper::truncate('привет, я multibyte строка!', 20));
 | 
						||
        $this->assertEquals('Не трогаем строку', StringHelper::truncate('Не трогаем строку', 20));
 | 
						||
        $this->assertEquals('исполь!!!', StringHelper::truncate('используем восклицательные знаки', 6, '!!!'));
 | 
						||
 | 
						||
        // With Html
 | 
						||
        $this->assertEquals('<span>This is a test </span>...', StringHelper::truncate('<span>This is a test sentance</span>', 14, '...', null, true));
 | 
						||
        $this->assertEquals('<span><img src="image.png" />This is a test </span>...', StringHelper::truncate('<span><img src="image.png" />This is a test sentance</span>', 14, '...', null, true));
 | 
						||
    }
 | 
						||
 | 
						||
    public function testTruncateWords()
 | 
						||
    {
 | 
						||
        $this->assertEquals('это тестовая multibyte строка', StringHelper::truncateWords('это тестовая multibyte строка', 5));
 | 
						||
        $this->assertEquals('это тестовая multibyte...', StringHelper::truncateWords('это тестовая multibyte строка', 3));
 | 
						||
        $this->assertEquals('это тестовая multibyte!!!', StringHelper::truncateWords('это тестовая multibyte строка', 3, '!!!'));
 | 
						||
        $this->assertEquals('это строка с          неожиданными...', StringHelper::truncateWords('это строка с          неожиданными пробелами', 4));
 | 
						||
 | 
						||
        // With Html
 | 
						||
        $this->assertEquals('<span>This is a test</span>...', StringHelper::truncateWords('<span>This is a test sentance</span>', 4, '...', true));
 | 
						||
        $this->assertEquals('<span><img src="image.png" />This is a test</span>...', StringHelper::truncateWords('<span><img src="image.png" />This is a test sentance</span>', 4, '...', true));
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     * @dataProvider providerStartsWith
 | 
						||
     */
 | 
						||
    public function testStartsWith($result, $string, $with)
 | 
						||
    {
 | 
						||
        // case sensitive version check
 | 
						||
        $this->assertSame($result, StringHelper::startsWith($string, $with));
 | 
						||
        // case insensitive version check
 | 
						||
        $this->assertSame($result, StringHelper::startsWith($string, $with, false));
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     * Rules that should work the same for case-sensitive and case-insensitive `startsWith()`
 | 
						||
     */
 | 
						||
    public function providerStartsWith()
 | 
						||
    {
 | 
						||
        return [
 | 
						||
            // positive check
 | 
						||
            [true, '', ''],
 | 
						||
            [true, '', null],
 | 
						||
            [true, 'string', ''],
 | 
						||
            [true, ' string', ' '],
 | 
						||
            [true, 'abc', 'abc'],
 | 
						||
            [true, 'Bürger', 'Bürger'],
 | 
						||
            [true, '我Я multibyte', '我Я'],
 | 
						||
            [true, 'Qנטשופ צרכנות', 'Qנ'],
 | 
						||
            [true, 'ไทย.idn.icann.org', 'ไ'],
 | 
						||
            [true, '!?+', "\x21\x3F"],
 | 
						||
            [true, "\x21?+", '!?'],
 | 
						||
            // false-positive check
 | 
						||
            [false, '', ' '],
 | 
						||
            [false, ' ', '  '],
 | 
						||
            [false, 'Abc', 'Abcde'],
 | 
						||
            [false, 'abc', 'abe'],
 | 
						||
            [false, 'abc', 'b'],
 | 
						||
            [false, 'abc', 'c'],
 | 
						||
        ];
 | 
						||
    }
 | 
						||
 | 
						||
    public function testStartsWithCaseSensitive()
 | 
						||
    {
 | 
						||
        $this->assertFalse(StringHelper::startsWith('Abc', 'a'));
 | 
						||
        $this->assertFalse(StringHelper::startsWith('üЯ multibyte', 'Üя multibyte'));
 | 
						||
    }
 | 
						||
 | 
						||
    public function testStartsWithCaseInsensitive()
 | 
						||
    {
 | 
						||
        $this->assertTrue(StringHelper::startsWith('sTrInG', 'StRiNg', false));
 | 
						||
        $this->assertTrue(StringHelper::startsWith('CaSe', 'cAs', false));
 | 
						||
        $this->assertTrue(StringHelper::startsWith('HTTP://BÜrger.DE/', 'http://bürger.de', false));
 | 
						||
        $this->assertTrue(StringHelper::startsWith('üЯйΨB', 'ÜяЙΨ', false));
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     * @dataProvider providerEndsWith
 | 
						||
     */
 | 
						||
    public function testEndsWith($result, $string, $with)
 | 
						||
    {
 | 
						||
        // case sensitive version check
 | 
						||
        $this->assertSame($result, StringHelper::endsWith($string, $with));
 | 
						||
        // case insensitive version check
 | 
						||
        $this->assertSame($result, StringHelper::endsWith($string, $with, false));
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     * Rules that should work the same for case-sensitive and case-insensitive `endsWith()`
 | 
						||
     */
 | 
						||
    public function providerEndsWith()
 | 
						||
    {
 | 
						||
        return [
 | 
						||
            // positive check
 | 
						||
            [true, '', ''],
 | 
						||
            [true, '', null],
 | 
						||
            [true, 'string', ''],
 | 
						||
            [true, 'string ', ' '],
 | 
						||
            [true, 'string', 'g'],
 | 
						||
            [true, 'abc', 'abc'],
 | 
						||
            [true, 'Bürger', 'Bürger'],
 | 
						||
            [true, 'Я multibyte строка我!', ' строка我!'],
 | 
						||
            [true, '+!?', "\x21\x3F"],
 | 
						||
            [true, "+\x21?", "!\x3F"],
 | 
						||
            [true, 'נטשופ צרכנות', 'ת'],
 | 
						||
            // false-positive check
 | 
						||
            [false, '', ' '],
 | 
						||
            [false, ' ', '  '],
 | 
						||
            [false, 'aaa', 'aaaa'],
 | 
						||
            [false, 'abc', 'abe'],
 | 
						||
            [false, 'abc', 'a'],
 | 
						||
            [false, 'abc', 'b'],
 | 
						||
        ];
 | 
						||
    }
 | 
						||
 | 
						||
    public function testEndsWithCaseSensitive()
 | 
						||
    {
 | 
						||
        $this->assertFalse(StringHelper::endsWith('string', 'G'));
 | 
						||
        $this->assertFalse(StringHelper::endsWith('multibyte строка', 'А'));
 | 
						||
    }
 | 
						||
 | 
						||
    public function testEndsWithCaseInsensitive()
 | 
						||
    {
 | 
						||
        $this->assertTrue(StringHelper::endsWith('sTrInG', 'StRiNg', false));
 | 
						||
        $this->assertTrue(StringHelper::endsWith('string', 'nG', false));
 | 
						||
        $this->assertTrue(StringHelper::endsWith('BüЯйΨ', 'ÜяЙΨ', false));
 | 
						||
    }
 | 
						||
}
 |