Merge pull request #385 from kijin/pr/more-framework-classes

Rhymix Framework 각종 기능 추가
This commit is contained in:
Kijin Sung 2016-03-20 00:06:01 +09:00
commit 321015e050
269 changed files with 38164 additions and 616 deletions

View file

@ -0,0 +1,52 @@
<?php
class CalendarTest extends \Codeception\TestCase\Test
{
public function testGetMonthName()
{
$this->assertEquals('January', Rhymix\Framework\Calendar::getMonthName('01'));
$this->assertEquals('October', Rhymix\Framework\Calendar::getMonthName('10'));
$this->assertEquals('Nov', Rhymix\Framework\Calendar::getMonthName(11, false));
$this->assertEquals('Dec', Rhymix\Framework\Calendar::getMonthName(12, false));
}
public function testGetMonthStartDayOfWeek()
{
$this->assertEquals(5, Rhymix\Framework\Calendar::getMonthStartDayOfWeek(1, 2016));
$this->assertEquals(1, Rhymix\Framework\Calendar::getMonthStartDayOfWeek(2, 2016));
$this->assertEquals(2, Rhymix\Framework\Calendar::getMonthStartDayOfWeek(3, 2016));
$this->assertEquals(5, Rhymix\Framework\Calendar::getMonthStartDayOfWeek(4, 2016));
}
public function testGetMonthDays()
{
$this->assertEquals(30, Rhymix\Framework\Calendar::getMonthDays(11, 2015));
$this->assertEquals(31, Rhymix\Framework\Calendar::getMonthDays(12, 2015));
$this->assertEquals(31, Rhymix\Framework\Calendar::getMonthDays(1, 2016));
$this->assertEquals(29, Rhymix\Framework\Calendar::getMonthDays(2, 2016));
}
public function testGetMonthCalendar()
{
$target_201508 = array(
array(null, null, null, null, null, null, 1),
array(2, 3, 4, 5, 6, 7, 8),
array(9, 10, 11, 12, 13, 14, 15),
array(16, 17, 18, 19, 20, 21, 22),
array(23, 24, 25, 26, 27, 28, 29),
array(30, 31, null, null, null, null, null),
);
$target_201603 = array(
array(null, null, 1, 2, 3, 4, 5),
array(6, 7, 8, 9, 10, 11, 12),
array(13, 14, 15, 16, 17, 18, 19),
array(20, 21, 22, 23, 24, 25, 26),
array(27, 28, 29, 30, 31, null, null),
array(null, null, null, null, null, null, null),
);
$this->assertEquals($target_201508, Rhymix\Framework\Calendar::getMonthCalendar(8, 2015));
$this->assertEquals($target_201603, Rhymix\Framework\Calendar::getMonthCalendar(3, 2016));
}
}

View file

@ -0,0 +1,134 @@
<?php
class FormatterTest extends \Codeception\TestCase\Test
{
public function testText2HTML()
{
$text = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/text2html.source.txt');
$html1 = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/text2html.target1.html');
$html2 = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/text2html.target2.html');
$html3 = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/text2html.target3.html');
$this->assertEquals($html1, Rhymix\Framework\Formatter::text2html($text));
$this->assertEquals($html2, Rhymix\Framework\Formatter::text2html($text, Rhymix\Framework\Formatter::TEXT_NEWLINE_AS_P));
$this->assertEquals($html3, Rhymix\Framework\Formatter::text2html($text, Rhymix\Framework\Formatter::TEXT_DOUBLE_NEWLINE_AS_P));
}
public function testHTML2Text()
{
$html = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/html2text.source.html');
$text = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/html2text.target.txt');
$this->assertEquals($text, Rhymix\Framework\Formatter::html2text($html));
}
public function testMarkdown2HTML()
{
$markdown = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/markdown2html.source.md');
$html1 = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/markdown2html.target1.html');
$html2 = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/markdown2html.target2.html');
$html3 = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/markdown2html.target3.html');
$this->assertEquals($html1, Rhymix\Framework\Formatter::markdown2html($markdown));
$this->assertEquals($html2, Rhymix\Framework\Formatter::markdown2html($markdown, Rhymix\Framework\Formatter::MD_NEWLINE_AS_BR));
$this->assertEquals($html3, Rhymix\Framework\Formatter::markdown2html($markdown, Rhymix\Framework\Formatter::MD_NEWLINE_AS_BR | Rhymix\Framework\Formatter::MD_ENABLE_EXTRA));
}
public function testHTML2Markdown()
{
$html = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/html2markdown.source.html');
$markdown = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/html2markdown.target.md');
$this->assertEquals($markdown, Rhymix\Framework\Formatter::html2markdown($html));
}
public function testBBCode()
{
$bbcode = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/bbcode.source.txt');
$html = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/bbcode.target.html');
$this->assertEquals($html, Rhymix\Framework\Formatter::bbcode($bbcode));
}
public function testApplySmartQuotes()
{
$before = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/smartypants.source.html');
$after = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/smartypants.target.html');
$this->assertEquals($after, Rhymix\Framework\Formatter::applySmartQuotes($before));
}
public function testCompileLESS()
{
$sources = array(
\RX_BASEDIR . 'tests/_data/formatter/less.source1.less',
\RX_BASEDIR . 'tests/_data/formatter/less.source2.less',
);
$variables = array(
'foo' => '#123456',
'bar' => '320px',
);
$real_target1 = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/less.target1.css');
$real_target2 = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/less.target2.css');
$test_target1 = \RX_BASEDIR . 'tests/_output/less.target1.css';
$test_target2 = \RX_BASEDIR . 'tests/_output/less.target2.css';
$this->assertTrue(Rhymix\Framework\Formatter::compileLESS($sources, $test_target1, $variables));
$this->assertEquals($real_target1, file_get_contents($test_target1));
$this->assertTrue(Rhymix\Framework\Formatter::compileLESS($sources, $test_target2, $variables, true));
$this->assertEquals($real_target2, file_get_contents($test_target2));
unlink($test_target1);
unlink($test_target2);
}
public function testCompileSCSS()
{
$sources = array(
\RX_BASEDIR . 'tests/_data/formatter/scss.source1.scss',
\RX_BASEDIR . 'tests/_data/formatter/scss.source2.scss',
);
$variables = array(
'foo' => '#123456',
'bar' => '320px',
);
$real_target1 = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/scss.target1.css');
$real_target2 = file_get_contents(\RX_BASEDIR . 'tests/_data/formatter/scss.target2.css');
$test_target1 = \RX_BASEDIR . 'tests/_output/scss.target1.css';
$test_target2 = \RX_BASEDIR . 'tests/_output/scss.target2.css';
$this->assertTrue(Rhymix\Framework\Formatter::compileSCSS($sources, $test_target1, $variables));
$this->assertEquals($real_target1, file_get_contents($test_target1));
$this->assertTrue(Rhymix\Framework\Formatter::compileSCSS($sources, $test_target2, $variables, true));
$this->assertEquals($real_target2, file_get_contents($test_target2));
unlink($test_target1);
unlink($test_target2);
}
public function testMinifyCSS()
{
$source = \RX_BASEDIR . 'tests/_data/formatter/minify.source.css';
$real_target = \RX_BASEDIR . 'tests/_data/formatter/minify.target.css';
$test_target = \RX_BASEDIR . 'tests/_output/minify.target.css';
$this->assertTrue(Rhymix\Framework\Formatter::minifyCSS($source, $test_target));
$this->assertEquals(file_get_contents($real_target), file_get_contents($test_target));
unlink($test_target);
}
public function testMinifyJS()
{
$source = \RX_BASEDIR . 'tests/_data/formatter/minify.source.js';
$real_target = \RX_BASEDIR . 'tests/_data/formatter/minify.target.js';
$test_target = \RX_BASEDIR . 'tests/_output/minify.target.js';
$this->assertTrue(Rhymix\Framework\Formatter::minifyJS($source, $test_target));
$this->assertEquals(file_get_contents($real_target), file_get_contents($test_target));
unlink($test_target);
}
}

View file

@ -0,0 +1,107 @@
<?php
class KoreaTest extends \Codeception\TestCase\Test
{
public function testFormatPhoneNumber()
{
$this->assertEquals('1588-0000', Rhymix\Framework\Korea::formatPhoneNumber('1588-0000'));
$this->assertEquals('02-345-6789', Rhymix\Framework\Korea::formatPhoneNumber('+82 23456789'));
$this->assertEquals('02-3000-5000', Rhymix\Framework\Korea::formatPhoneNumber('0230005000'));
$this->assertEquals('031-222-3333', Rhymix\Framework\Korea::formatPhoneNumber('82-0312-2233-33'));
$this->assertEquals('031-2222-3333', Rhymix\Framework\Korea::formatPhoneNumber('03122223333'));
$this->assertEquals('011-444-5555', Rhymix\Framework\Korea::formatPhoneNumber('011 444 5555'));
$this->assertEquals('010-6666-7777', Rhymix\Framework\Korea::formatPhoneNumber('82+1066667777'));
$this->assertEquals('0303-456-7890', Rhymix\Framework\Korea::formatPhoneNumber('03034567890'));
$this->assertEquals('0505-987-6543', Rhymix\Framework\Korea::formatPhoneNumber('050-5987-6543'));
$this->assertEquals('070-7432-1000', Rhymix\Framework\Korea::formatPhoneNumber('0707-432-1000'));
}
public function testIsValidPhoneNumber()
{
$this->assertTrue(Rhymix\Framework\Korea::isValidPhoneNumber('1588-0000'));
$this->assertTrue(Rhymix\Framework\Korea::isValidPhoneNumber('02-345-6789'));
$this->assertTrue(Rhymix\Framework\Korea::isValidPhoneNumber('+82-2-345-6789'));
$this->assertTrue(Rhymix\Framework\Korea::isValidPhoneNumber('+82-02-2345-6789'));
$this->assertTrue(Rhymix\Framework\Korea::isValidPhoneNumber('053-444-5555'));
$this->assertTrue(Rhymix\Framework\Korea::isValidPhoneNumber('053-4444-5555'));
$this->assertTrue(Rhymix\Framework\Korea::isValidPhoneNumber('011-444-5555'));
$this->assertTrue(Rhymix\Framework\Korea::isValidPhoneNumber('010-4444-5555'));
$this->assertFalse(Rhymix\Framework\Korea::isValidPhoneNumber('010-4444-55555'));
$this->assertFalse(Rhymix\Framework\Korea::isValidPhoneNumber('010-1234-5678'));
$this->assertFalse(Rhymix\Framework\Korea::isValidPhoneNumber('02-123-4567'));
$this->assertFalse(Rhymix\Framework\Korea::isValidPhoneNumber('02-123456'));
$this->assertFalse(Rhymix\Framework\Korea::isValidPhoneNumber('03-456-7890'));
$this->assertFalse(Rhymix\Framework\Korea::isValidPhoneNumber('090-9876-5432'));
}
public function testIsValidMobilePhoneNumber()
{
$this->assertTrue(Rhymix\Framework\Korea::isValidMobilePhoneNumber('011-345-6789'));
$this->assertTrue(Rhymix\Framework\Korea::isValidMobilePhoneNumber('010-2345-6789'));
$this->assertTrue(Rhymix\Framework\Korea::isValidMobilePhoneNumber('+82-11-345-6789'));
$this->assertTrue(Rhymix\Framework\Korea::isValidMobilePhoneNumber('82 010-2345-6789'));
$this->assertFalse(Rhymix\Framework\Korea::isValidMobilePhoneNumber('010-1111-1111'));
$this->assertFalse(Rhymix\Framework\Korea::isValidMobilePhoneNumber('02-345-6789'));
$this->assertFalse(Rhymix\Framework\Korea::isValidMobilePhoneNumber('063-9876-5432'));
$this->assertFalse(Rhymix\Framework\Korea::isValidMobilePhoneNumber('070-7654-3210'));
}
public function testIsValidJuminNumber()
{
// These numbers are fake.
$this->assertTrue(Rhymix\Framework\Korea::isValidJuminNumber('123456-3456787'));
$this->assertFalse(Rhymix\Framework\Korea::isValidJuminNumber('123456-3456788'));
}
public function testIsValidCorporationNumber()
{
// These numbers are fake.
$this->assertTrue(Rhymix\Framework\Korea::isValidCorporationNumber('123456-0123453'));
$this->assertFalse(Rhymix\Framework\Korea::isValidCorporationNumber('123456-0123454'));
}
public function testIsValidBusinessNumber()
{
// These numbers are fake.
$this->assertTrue(Rhymix\Framework\Korea::isValidBusinessNumber('123-45-67891'));
$this->assertFalse(Rhymix\Framework\Korea::isValidBusinessNumber('123-45-67892'));
}
public function testIsKoreanIP()
{
// Private IP ranges.
$this->assertTrue(Rhymix\Framework\Korea::isKoreanIP('10.12.34.210'));
$this->assertTrue(Rhymix\Framework\Korea::isKoreanIP('127.0.123.45'));
$this->assertTrue(Rhymix\Framework\Korea::isKoreanIP('192.168.10.1'));
$this->assertTrue(Rhymix\Framework\Korea::isKoreanIP('::1'));
// Korean IP ranges.
$this->assertTrue(Rhymix\Framework\Korea::isKoreanIP('115.71.233.0'));
$this->assertTrue(Rhymix\Framework\Korea::isKoreanIP('114.207.12.3'));
$this->assertTrue(Rhymix\Framework\Korea::isKoreanIP('2001:0320::1'));
$this->assertTrue(Rhymix\Framework\Korea::isKoreanIP('2407:B800::F'));
// Foreign IP ranges.
$this->assertFalse(Rhymix\Framework\Korea::isKoreanIP('216.58.197.0'));
$this->assertFalse(Rhymix\Framework\Korea::isKoreanIP('170.14.168.0'));
$this->assertFalse(Rhymix\Framework\Korea::isKoreanIP('2001:41d0:8:e8ad::1'));
$this->assertFalse(Rhymix\Framework\Korea::isKoreanIP('2404:6800:4005:802::200e'));
}
public function testIsKoreanEmailAddress()
{
// Test Korean portals.
$this->assertTrue(Rhymix\Framework\Korea::isKoreanEmailAddress('test@naver.com'));
$this->assertTrue(Rhymix\Framework\Korea::isKoreanEmailAddress('test@hanmail.net'));
$this->assertTrue(Rhymix\Framework\Korea::isKoreanEmailAddress('test@worksmobile.com'));
// Test foreign portals.
$this->assertFalse(Rhymix\Framework\Korea::isKoreanEmailAddress('test@gmail.com'));
$this->assertFalse(Rhymix\Framework\Korea::isKoreanEmailAddress('test@hotmail.com'));
$this->assertFalse(Rhymix\Framework\Korea::isKoreanEmailAddress('test@yahoo.com'));
// Test third-party MX services.
$this->assertTrue(Rhymix\Framework\Korea::isKoreanEmailAddress('test@woorimail.com'));
$this->assertFalse(Rhymix\Framework\Korea::isKoreanEmailAddress('test@rhymix.org'));
}
}

View file

@ -0,0 +1,22 @@
<?php
class MIMETest extends \Codeception\TestCase\Test
{
public function testMIME()
{
$this->assertEquals('audio/ogg', Rhymix\Framework\MIME::getTypeByExtension('ogg'));
$this->assertEquals('image/gif', Rhymix\Framework\MIME::getTypeByExtension('gif'));
$this->assertEquals('text/html', Rhymix\Framework\MIME::getTypeByExtension('htm'));
$this->assertEquals('application/msword', Rhymix\Framework\MIME::getTypeByFilename('attachment.doc'));
$this->assertEquals('application/pdf', Rhymix\Framework\MIME::getTypeByFilename('라이믹스.pdf'));
$this->assertEquals('application/postscript', Rhymix\Framework\MIME::getTypeByFilename('MyGraphics.v2.eps'));
$this->assertEquals('application/vnd.ms-excel', Mail::returnMIMEType('MySpreadsheet.xls'));
$this->assertEquals('application/octet-stream', Mail::returnMIMEType('Untitled File'));
$this->assertEquals('odt', Rhymix\Framework\MIME::getExtensionByType('application/vnd.oasis.opendocument.text'));
$this->assertEquals('jpg', Rhymix\Framework\MIME::getExtensionByType('image/jpeg'));
$this->assertEquals('mpeg', Rhymix\Framework\MIME::getExtensionByType('video/mpeg'));
$this->assertFalse(Rhymix\Framework\MIME::getExtensionByType('application/octet-stream'));
}
}

View file

@ -0,0 +1,48 @@
<?php
class PaginationTest extends \Codeception\TestCase\Test
{
public function testCountPages()
{
$this->assertEquals(1, Rhymix\Framework\Pagination::countPages(0, 20));
$this->assertEquals(1, Rhymix\Framework\Pagination::countPages(10, 20));
$this->assertEquals(1, Rhymix\Framework\Pagination::countPages(20, 20));
$this->assertEquals(2, Rhymix\Framework\Pagination::countPages(21, 20));
}
public function testCreateLinks()
{
$links = Rhymix\Framework\Pagination::createLinks('index.php?page=', 27, 3);
$this->assertContains('<div class="pagination">', $links);
$this->assertContains('<a href="index.php?page=3">', $links);
$this->assertContains('<span class="page_number">1</span>', $links);
$this->assertContains('<span class="page_number">10</span>', $links);
$links = Rhymix\Framework\Pagination::createLinks('/foo/bar/page/', 27, 13);
$this->assertContains('<div class="pagination">', $links);
$this->assertContains('<a href="/foo/bar/page/13">', $links);
$this->assertContains('<span class="page_number">11</span>', $links);
$this->assertContains('<span class="page_number">20</span>', $links);
$links = Rhymix\Framework\Pagination::createLinks('/rhymix?page=$PAGE&foo=bar', 27, 25);
$this->assertContains('<div class="pagination">', $links);
$this->assertContains('<a href="/rhymix?page=27&amp;foo=bar">', $links);
$this->assertContains('<span class="page_number">21</span>', $links);
$this->assertContains('<span class="page_number">27</span>', $links);
$links = Rhymix\Framework\Pagination::createLinks('p', 27, 3, 10, Rhymix\Framework\Pagination::COUNT_STYLE_CONTINUOUS);
$this->assertContains('<div class="pagination">', $links);
$this->assertContains('<span class="page_number">1</span>', $links);
$this->assertContains('<span class="page_number">10</span>', $links);
$links = Rhymix\Framework\Pagination::createLinks('p', 27, 13, 10, Rhymix\Framework\Pagination::COUNT_STYLE_CONTINUOUS);
$this->assertContains('<div class="pagination">', $links);
$this->assertContains('<span class="page_number">9</span>', $links);
$this->assertContains('<span class="page_number">18</span>', $links);
$links = Rhymix\Framework\Pagination::createLinks('p', 27, 25, 10, Rhymix\Framework\Pagination::COUNT_STYLE_CONTINUOUS);
$this->assertContains('<div class="pagination">', $links);
$this->assertContains('<span class="page_number">18</span>', $links);
$this->assertContains('<span class="page_number">27</span>', $links);
}
}

View file

@ -0,0 +1,260 @@
<?php
class StorageTest extends \Codeception\TestCase\Test
{
public function _before()
{
Rhymix\Framework\Storage::deleteDirectory(\RX_BASEDIR . 'tests/_output', false);
}
public function _after()
{
Rhymix\Framework\Storage::deleteDirectory(\RX_BASEDIR . 'tests/_output', false);
}
public function _failed()
{
Rhymix\Framework\Storage::deleteDirectory(\RX_BASEDIR . 'tests/_output', false);
}
public function testExists()
{
$this->assertTrue(Rhymix\Framework\Storage::exists(__FILE__));
$this->assertTrue(Rhymix\Framework\Storage::exists(__DIR__));
$this->assertFalse(Rhymix\Framework\Storage::exists(__FILE__ . '.nonexistent.suffix'));
$this->assertFalse(Rhymix\Framework\Storage::exists(__DIR__ . '/nonexistent.subdirectory'));
}
public function testIsFile()
{
$this->assertTrue(Rhymix\Framework\Storage::isFile(__FILE__));
$this->assertFalse(Rhymix\Framework\Storage::isFile(__DIR__));
$this->assertFalse(Rhymix\Framework\Storage::isFile(__FILE__ . '.nonexistent.suffix'));
$this->assertFalse(Rhymix\Framework\Storage::isFile(__DIR__ . '/nonexistent.subdirectory'));
}
public function testIsEmptyFile()
{
$emptyfile = \RX_BASEDIR . 'tests/_output/emptyfile.txt';
file_put_contents($emptyfile, '');
$this->assertTrue(Rhymix\Framework\Storage::isEmptyFile($emptyfile));
$this->assertFalse(Rhymix\Framework\Storage::isEmptyFile($emptyfile . '.nonexistent.suffix'));
$this->assertFalse(Rhymix\Framework\Storage::isEmptyFile(__FILE__));
$this->assertFalse(Rhymix\Framework\Storage::isEmptyFile(__DIR__));
}
public function testIsDirectory()
{
$this->assertTrue(Rhymix\Framework\Storage::isDirectory(__DIR__));
$this->assertFalse(Rhymix\Framework\Storage::isDirectory(__FILE__));
$this->assertFalse(Rhymix\Framework\Storage::isDirectory(__FILE__ . '.nonexistent.suffix'));
$this->assertFalse(Rhymix\Framework\Storage::isDirectory(__DIR__ . '/nonexistent.subdirectory'));
}
public function testIsEmptyDirectory()
{
$emptydir = \RX_BASEDIR . 'tests/_output/emptydir';
mkdir($emptydir);
$this->assertTrue(Rhymix\Framework\Storage::isEmptyDirectory($emptydir));
$this->assertFalse(Rhymix\Framework\Storage::isEmptyDirectory($emptydir . '/nonexistent.subdirectory'));
$this->assertFalse(Rhymix\Framework\Storage::isEmptyDirectory(__FILE__));
$this->assertFalse(Rhymix\Framework\Storage::isEmptyDirectory(__DIR__));
}
public function testIsSymlink()
{
if (strncasecmp(\PHP_OS, 'Win', 3) === 0)
{
return;
}
$symlink_source = \RX_BASEDIR . 'tests/_output/link.source.txt';
$symlink_target = \RX_BASEDIR . 'tests/_output/link.target.txt';
file_put_contents($symlink_target, 'foobar');
symlink($symlink_target, $symlink_source);
$this->assertTrue(Rhymix\Framework\Storage::isSymlink($symlink_source));
$this->assertFalse(Rhymix\Framework\Storage::isSymlink($symlink_target));
unlink($symlink_target);
$this->assertTrue(Rhymix\Framework\Storage::isSymlink($symlink_source));
$this->assertFalse(Rhymix\Framework\Storage::isValidSymlink($symlink_source));
$this->assertFalse(Rhymix\Framework\Storage::isSymlink($symlink_target));
$this->assertFalse(Rhymix\Framework\Storage::isValidSymlink($symlink_target));
}
public function testIsReadable()
{
$this->assertTrue(Rhymix\Framework\Storage::isReadable(__FILE__));
$this->assertTrue(Rhymix\Framework\Storage::isReadable(__DIR__));
$this->assertFalse(Rhymix\Framework\Storage::isReadable(__FILE__ . '.nonexistent.suffix'));
$this->assertFalse(Rhymix\Framework\Storage::isReadable('/dev/nonexistent'));
}
public function testIsWritable()
{
$testfile = \RX_BASEDIR . 'tests/_output/testfile.txt';
file_put_contents($testfile, 'foobar');
$this->assertTrue(Rhymix\Framework\Storage::isWritable(__FILE__));
$this->assertTrue(Rhymix\Framework\Storage::isWritable(__DIR__));
$this->assertTrue(Rhymix\Framework\Storage::isWritable($testfile));
$this->assertTrue(Rhymix\Framework\Storage::isWritable(dirname($testfile)));
$this->assertFalse(Rhymix\Framework\Storage::isWritable($testfile . '.nonexistent.suffix'));
$this->assertFalse(Rhymix\Framework\Storage::isWritable('/dev/nonexistent'));
}
public function testGetSize()
{
$this->assertEquals(filesize(__FILE__), Rhymix\Framework\Storage::getSize(__FILE__));
$this->assertFalse(Rhymix\Framework\Storage::getSize(__DIR__));
$this->assertFalse(Rhymix\Framework\Storage::getSize(__FILE__ . '.nonexistent.suffix'));
$this->assertFalse(Rhymix\Framework\Storage::getSize('/dev/nonexistent'));
}
public function testRead()
{
$this->assertEquals(file_get_contents(__FILE__), Rhymix\Framework\Storage::read(__FILE__));
$this->assertFalse(Rhymix\Framework\Storage::read(__FILE__ . '.nonexistent.suffix'));
$this->assertFalse(Rhymix\Framework\Storage::read(__DIR__));
$this->assertFalse(Rhymix\Framework\Storage::read('/dev/nonexistent'));
}
public function testWrite()
{
$testfile = \RX_BASEDIR . 'tests/_output/subdirectory/testfile.txt';
$this->assertFalse(file_exists($testfile));
$this->assertTrue(Rhymix\Framework\Storage::write($testfile, 'foobarbazzjazz'));
$this->assertTrue(file_exists($testfile));
$this->assertEquals('foobarbazzjazz', file_get_contents($testfile));
}
public function testCopy()
{
$source = \RX_BASEDIR . 'tests/_output/copy.source.txt';
$target = \RX_BASEDIR . 'tests/_output/copy.target.txt';
file_put_contents($source, 'foobarbaz');
chmod($source, 0646);
$this->assertTrue(Rhymix\Framework\Storage::copy($source, $target));
$this->assertTrue(file_exists($target));
$this->assertTrue(file_get_contents($target) === 'foobarbaz');
if (strncasecmp(\PHP_OS, 'Win', 3) !== 0)
{
$this->assertEquals(0646, fileperms($target) & 0777);
$this->assertTrue(Rhymix\Framework\Storage::copy($source, $target, 0755));
$this->assertEquals(0755, fileperms($target) & 0777);
}
}
public function testMove()
{
$source = \RX_BASEDIR . 'tests/_output/move.source.txt';
$target = \RX_BASEDIR . 'tests/_output/move.target.txt';
file_put_contents($source, 'foobarbaz');
$this->assertTrue(Rhymix\Framework\Storage::move($source, $target));
$this->assertTrue(file_exists($target));
$this->assertTrue(file_get_contents($target) === 'foobarbaz');
$this->assertFalse(file_exists($source));
}
public function testDelete()
{
$testfile = \RX_BASEDIR . 'tests/_output/testfile.txt';
file_put_contents($testfile, 'foobar');
$this->assertTrue(Rhymix\Framework\Storage::delete($testfile));
$this->assertFalse(file_exists($testfile));
}
public function testCreateDirectory()
{
$emptydir = \RX_BASEDIR . 'tests/_output/emptydir';
$this->assertTrue(Rhymix\Framework\Storage::createDirectory($emptydir));
$this->assertTrue(file_exists($emptydir) && is_dir($emptydir));
}
public function testReadDirectory()
{
$testdir = \RX_BASEDIR . 'tests/_output/testdir';
mkdir($testdir);
mkdir($testdir . '/subdir');
file_put_contents($testdir . '/.dotfile', '');
file_put_contents($testdir . '/foo', 'foo');
file_put_contents($testdir . '/bar', 'bar');
file_put_contents($testdir . '/baz', 'baz');
$this->assertEquals(array($testdir . '/bar', $testdir . '/baz', $testdir . '/foo'), Rhymix\Framework\Storage::readDirectory($testdir));
$this->assertEquals(array('bar', 'baz', 'foo'), Rhymix\Framework\Storage::readDirectory($testdir, false));
$this->assertEquals(array('bar', 'baz', 'foo', 'subdir'), Rhymix\Framework\Storage::readDirectory($testdir, false, true, false));
$this->assertEquals(array('.dotfile', 'bar', 'baz', 'foo'), Rhymix\Framework\Storage::readDirectory($testdir, false, false, true));
$this->assertEquals(array('.dotfile', 'bar', 'baz', 'foo', 'subdir'), Rhymix\Framework\Storage::readDirectory($testdir, false, false, false));
$this->assertFalse(Rhymix\Framework\Storage::readDirectory('/opt/nonexistent.foobar'));
}
public function testCopyDirectory()
{
$sourcedir = \RX_BASEDIR . 'tests/_output/sourcedir';
mkdir($sourcedir);
mkdir($sourcedir . '/subdir');
file_put_contents($sourcedir . '/bar', 'bar');
file_put_contents($sourcedir . '/subdir/baz', 'baz');
$targetdir = \RX_BASEDIR . 'tests/_output/targetdir';
$this->assertTrue(Rhymix\Framework\Storage::copyDirectory($sourcedir, $targetdir));
$this->assertTrue(file_exists($targetdir . '/bar'));
$this->assertTrue(file_exists($targetdir . '/subdir/baz'));
$this->assertFalse(Rhymix\Framework\Storage::copyDirectory($sourcedir, '/opt/nonexistent.foobar'));
}
public function testMoveDirectory()
{
$sourcedir = \RX_BASEDIR . 'tests/_output/sourcedir';
mkdir($sourcedir);
mkdir($sourcedir . '/subdir');
file_put_contents($sourcedir . '/bar', 'bar');
file_put_contents($sourcedir . '/subdir/baz', 'baz');
$targetdir = \RX_BASEDIR . 'tests/_output/targetdir';
$this->assertTrue(Rhymix\Framework\Storage::moveDirectory($sourcedir, $targetdir));
$this->assertTrue(file_exists($targetdir . '/bar'));
$this->assertTrue(file_exists($targetdir . '/subdir/baz'));
$this->assertFalse(file_exists($sourcedir));
}
public function testDeleteDirectory()
{
$sourcedir = \RX_BASEDIR . 'tests/_output/sourcedir';
mkdir($sourcedir);
mkdir($sourcedir . '/subdir');
file_put_contents($sourcedir . '/bar', 'bar');
file_put_contents($sourcedir . '/subdir/baz', 'baz');
$nonexistent = \RX_BASEDIR . 'tests/_output/targetdir';
$this->assertTrue(Rhymix\Framework\Storage::deleteDirectory($sourcedir));
$this->assertFalse(file_exists($sourcedir . '/subdir/baz'));
$this->assertFalse(file_exists($sourcedir));
$this->assertFalse(Rhymix\Framework\Storage::deleteDirectory($nonexistent));
}
public function testDeleteDirectoryKeepRoot()
{
$sourcedir = \RX_BASEDIR . 'tests/_output/sourcedir';
mkdir($sourcedir);
mkdir($sourcedir . '/subdir');
file_put_contents($sourcedir . '/bar', 'bar');
file_put_contents($sourcedir . '/subdir/baz', 'baz');
$nonexistent = \RX_BASEDIR . 'tests/_output/targetdir';
$this->assertTrue(Rhymix\Framework\Storage::deleteDirectory($sourcedir, false));
$this->assertFalse(file_exists($sourcedir . '/subdir/baz'));
$this->assertTrue(file_exists($sourcedir));
$this->assertFalse(Rhymix\Framework\Storage::deleteDirectory($nonexistent));
}
}

View file

@ -0,0 +1,71 @@
<?php
class TimerTest extends \Codeception\TestCase\Test
{
function testStartStop()
{
$t1 = microtime(true);
usleep(1000);
$started = Rhymix\Framework\Timer::start();
usleep(1000);
$t2 = microtime(true);
usleep(1000);
$elapsed = Rhymix\Framework\Timer::stop();
usleep(1000);
$t3 = microtime(true);
$this->assertGreaterThanOrEqual($t1, $started);
$this->assertLessThanOrEqual($t2, $started);
$this->assertGreaterThanOrEqual($t2 - $started, $elapsed);
$this->assertLessThanOrEqual($t3 - $t1, $elapsed);
$this->assertGreaterThan(0, $elapsed);
}
function testNestedTimers()
{
$t1 = Rhymix\Framework\Timer::start();
usleep(1000);
$t2 = Rhymix\Framework\Timer::start();
usleep(1000);
$t3 = Rhymix\Framework\Timer::stop();
usleep(1000);
$t4 = Rhymix\Framework\Timer::stop();
$this->assertGreaterThanOrEqual($t1, $t2);
$this->assertGreaterThan($t3, $t4);
}
function testMultipleTimers()
{
$t1 = Rhymix\Framework\Timer::start('timer1');
usleep(5000);
$t2 = Rhymix\Framework\Timer::start('timer2');
usleep(1000);
$t3 = Rhymix\Framework\Timer::stop('timer1');
usleep(2000);
$t4 = Rhymix\Framework\Timer::stop('timer2');
$this->assertGreaterThanOrEqual($t1, $t2);
$this->assertGreaterThanOrEqual($t4, $t3);
}
function testTimerFormat()
{
$t1 = Rhymix\Framework\Timer::start();
usleep(1000);
$t2 = Rhymix\Framework\Timer::stopFormat();
$this->assertRegexp('/^[0-9\.,]+ms$/', $t2);
}
function testTimerSinceStartup()
{
$t1 = Rhymix\Framework\Timer::sinceStartup();
$t2 = Rhymix\Framework\Timer::sinceStartup();
$this->assertGreaterThanOrEqual($t1, $t2);
$t3 = Rhymix\Framework\Timer::sinceStartupFormat();
$this->assertRegexp('/^[0-9\.,]+ms$/', $t3);
}
}

View file

@ -0,0 +1,104 @@
<?php
class UATest extends \Codeception\TestCase\Test
{
public function testIsMobile()
{
// Phones
$this->assertTrue(Rhymix\Framework\UA::isMobile('Mozilla/5.0 (Linux; Android 5.0; Nexus 5 Build/LPX13D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36'));
$this->assertTrue(Rhymix\Framework\UA::isMobile('Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25'));
// Tablets
$this->assertTrue(Rhymix\Framework\UA::isMobile('Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25'));
$this->assertTrue(Rhymix\Framework\UA::isMobile('Mozilla/5.0 (Linux; Android 4.4.2; SM-T530 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Safari/537.36'));
// Not mobile
$this->assertFalse(Rhymix\Framework\UA::isMobile('Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko'));
$this->assertFalse(Rhymix\Framework\UA::isMobile('Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'));
$this->assertFalse(Rhymix\Framework\UA::isMobile('Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'));
$this->assertFalse(Rhymix\Framework\UA::isMobile('Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16'));
}
public function testIsTablet()
{
// Phones
$this->assertFalse(Rhymix\Framework\UA::isTablet('Mozilla/5.0 (Linux; Android 5.0; Nexus 5 Build/LPX13D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36'));
$this->assertFalse(Rhymix\Framework\UA::isTablet('Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25'));
// Tablets
$this->assertTrue(Rhymix\Framework\UA::isTablet('Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25'));
$this->assertTrue(Rhymix\Framework\UA::isTablet('Mozilla/5.0 (Linux; Android 4.4.2; SM-T530 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Safari/537.36'));
// Not mobile
$this->assertFalse(Rhymix\Framework\UA::isTablet('Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko'));
$this->assertFalse(Rhymix\Framework\UA::isTablet('Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'));
}
public function testIsRobot()
{
// Robot
$this->assertTrue(Rhymix\Framework\UA::isRobot('Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)'));
$this->assertTrue(Rhymix\Framework\UA::isRobot('Googlebot/2.1 (+http://www.googlebot.com/bot.html)'));
$this->assertTrue(Rhymix\Framework\UA::isRobot('Yeti/1.0 (NHN Corp.; http://help.naver.com/robots/)'));
// Not robot
$this->assertFalse(Rhymix\Framework\UA::isRobot('Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25'));
$this->assertFalse(Rhymix\Framework\UA::isRobot('Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25'));
$this->assertFalse(Rhymix\Framework\UA::isRobot('Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko'));
}
public function testGetBrowserInfo()
{
// Android default browser
$browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (Linux; U; Android 4.0.3; Device Name) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30');
$this->assertEquals('Android', $browser->browser);
$this->assertEquals('4.0', $browser->version);
$this->assertEquals('Android', $browser->os);
$this->assertTrue($browser->is_mobile);
$this->assertTrue($browser->is_tablet);
// Mobile Chrome
$browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (Linux; Android 5.0; Nexus 5 Build/LPX13D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36');
$this->assertEquals('Chrome', $browser->browser);
$this->assertEquals('38.0', $browser->version);
$this->assertEquals('Android', $browser->os);
$this->assertTrue($browser->is_mobile);
$this->assertFalse($browser->is_tablet);
// Edge
$browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136');
$this->assertEquals('Edge', $browser->browser);
$this->assertEquals('12.0', $browser->version);
$this->assertEquals('Windows', $browser->os);
$this->assertFalse($browser->is_mobile);
$this->assertFalse($browser->is_tablet);
// IE 11
$browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko');
$this->assertEquals('IE', $browser->browser);
$this->assertEquals('11.0', $browser->version);
$this->assertEquals('Windows', $browser->os);
// IE 10 in compatibility mode
$browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/4.0 (Compatible; MSIE 8.0; Windows NT 5.2; Trident/6.0)');
$this->assertEquals('IE', $browser->browser);
$this->assertEquals('10.0', $browser->version);
// IE 8 in compatibility mode
$browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0)');
$this->assertEquals('IE', $browser->browser);
$this->assertEquals('8.0', $browser->version);
// Linux Chrome
$browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36');
$this->assertEquals('Chrome', $browser->browser);
$this->assertEquals('41.0', $browser->version);
$this->assertEquals('Linux', $browser->os);
// OS X Firefox
$browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10; rv:33.0) Gecko/20100101 Firefox/33.0');
$this->assertEquals('Firefox', $browser->browser);
$this->assertEquals('33.0', $browser->version);
$this->assertEquals('OS X', $browser->os);
}
}

View file

@ -0,0 +1,41 @@
<?php
class i18nTest extends \Codeception\TestCase\Test
{
public function testListCountries()
{
$sort_code_2 = Rhymix\Framework\i18n::listCountries(Rhymix\Framework\i18n::SORT_CODE_2);
$this->assertEquals('AD', array_first($sort_code_2)->iso_3166_1_alpha2);
$this->assertEquals('AND', array_first_key($sort_code_2));
$sort_code_3 = Rhymix\Framework\i18n::listCountries(Rhymix\Framework\i18n::SORT_CODE_3);
$this->assertEquals('ABW', array_first($sort_code_3)->iso_3166_1_alpha3);
$this->assertEquals('ABW', array_first_key($sort_code_3));
$sort_code_n = Rhymix\Framework\i18n::listCountries(Rhymix\Framework\i18n::SORT_CODE_NUMERIC);
$this->assertEquals('004', array_first($sort_code_n)->iso_3166_1_numeric);
$this->assertEquals('AFG', array_first_key($sort_code_n));
$sort_cctld = Rhymix\Framework\i18n::listCountries(Rhymix\Framework\i18n::SORT_CCTLD);
$this->assertEquals('zw', array_last($sort_cctld)->cctld);
$this->assertEquals('ZWE', array_last_key($sort_cctld));
$sort_english = Rhymix\Framework\i18n::listCountries(Rhymix\Framework\i18n::SORT_NAME_ENGLISH);
$this->assertEquals('Afghanistan', array_first($sort_english)->name_english);
$this->assertEquals('AFG', array_first_key($sort_english));
$this->assertEquals('Åland Islands', array_last($sort_english)->name_english);
$this->assertEquals('ALA', array_last_key($sort_english));
$sort_korean = Rhymix\Framework\i18n::listCountries(Rhymix\Framework\i18n::SORT_NAME_KOREAN);
$this->assertEquals('가나', array_first($sort_korean)->name_korean);
$this->assertEquals('GHA', array_first_key($sort_korean));
$this->assertEquals('홍콩', array_last($sort_korean)->name_korean);
$this->assertEquals('HKG', array_last_key($sort_korean));
$sort_native = Rhymix\Framework\i18n::listCountries(Rhymix\Framework\i18n::SORT_NAME_NATIVE);
$this->assertEquals('Amerika Sāmoa', array_first($sort_native)->name_native);
$this->assertEquals('대한민국', $sort_native['KOR']->name_korean);
$this->assertEquals('United States of America', $sort_native['USA']->name_english);
$this->assertEquals('nz', $sort_native['NZL']->cctld);
}
}