9 Commits

21 changed files with 262 additions and 30 deletions

View File

@@ -7,9 +7,9 @@ Common and useful classes, methods, exceptions etc.
Run [Composer](https://getcomposer.org) to install this package in your project: Run [Composer](https://getcomposer.org) to install this package in your project:
```bash ```bash
$ composer require meritoo/common-library $ composer require meritoo/common-library
``` ```
> How to install Composer: https://getcomposer.org/download > How to install Composer: https://getcomposer.org/download

View File

@@ -2,7 +2,7 @@
"name": "meritoo/common-library", "name": "meritoo/common-library",
"description": "Useful classes, methods, extensions etc.", "description": "Useful classes, methods, extensions etc.",
"license": "MIT", "license": "MIT",
"version": "0.0.8", "version": "0.0.11",
"authors": [ "authors": [
{ {
"name": "Meritoo.pl", "name": "Meritoo.pl",

View File

@@ -0,0 +1,31 @@
<?php
/**
* (c) Meritoo.pl, http://www.meritoo.pl
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Meritoo\Common\Exception\File;
/**
* An exception used while file with given path is empty (has no content)
*
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
* @copyright Meritoo.pl
*/
class EmptyFileException extends \Exception
{
/**
* Class constructor
*
* @param string $emptyFilePath Path of the empty file
*/
public function __construct($emptyFilePath)
{
$template = 'File with path \'%s\' is empty (has no content). Did you provide path of proper file?';
$message = sprintf($template, $emptyFilePath);
parent::__construct($message);
}
}

View File

@@ -0,0 +1,26 @@
<?php
/**
* (c) Meritoo.pl, http://www.meritoo.pl
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Meritoo\Common\Exception\File;
/**
* An exception used while path of given file is empty
*
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
* @copyright Meritoo.pl
*/
class EmptyFilePathException extends \Exception
{
/**
* Class constructor
*/
public function __construct()
{
parent::__construct('Path of the file is empty. Did you provide path of proper file?');
}
}

View File

@@ -0,0 +1,31 @@
<?php
/**
* (c) Meritoo.pl, http://www.meritoo.pl
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Meritoo\Common\Exception\File;
/**
* An exception used while file with given path does not exist
*
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
* @copyright Meritoo.pl
*/
class NotExistingFileException extends \Exception
{
/**
* Class constructor
*
* @param string $notExistingFilePath Path of not existing (or not readable) file
*/
public function __construct($notExistingFilePath)
{
$template = 'File with path \'%s\' does not exist (or is not readable). Did you provide proper path of file?';
$message = sprintf($template, $notExistingFilePath);
parent::__construct($message);
}
}

View File

@@ -12,6 +12,7 @@ use DateTime;
use Generator; use Generator;
use Meritoo\Common\Exception\Type\UnknownOopVisibilityTypeException; use Meritoo\Common\Exception\Type\UnknownOopVisibilityTypeException;
use Meritoo\Common\Type\OopVisibilityType; use Meritoo\Common\Type\OopVisibilityType;
use Meritoo\Common\Utilities\Miscellaneous;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use ReflectionClass; use ReflectionClass;
use ReflectionMethod; use ReflectionMethod;
@@ -105,11 +106,16 @@ abstract class BaseTestCase extends TestCase
*/ */
public function getFilePathToTests($fileName, $directoryPath = '') public function getFilePathToTests($fileName, $directoryPath = '')
{ {
if (!empty($directoryPath)) { $rootPath = Miscellaneous::getProjectRootPath();
$directoryPath = '/' . $directoryPath;
}
return sprintf('%s/../../../../../data/tests/%s%s', __DIR__, $fileName, $directoryPath); $paths = [
$rootPath,
'data/tests',
$directoryPath,
$fileName,
];
return Miscellaneous::concatenatePaths($paths);
} }
/** /**
@@ -129,7 +135,7 @@ abstract class BaseTestCase extends TestCase
* - string - name of the method * - string - name of the method
* - instance of ReflectionMethod - just the method (provided by ReflectionClass::getMethod() method) * - instance of ReflectionMethod - just the method (provided by ReflectionClass::getMethod() method)
*/ */
protected function verifyMethodVisibilityAndArguments( protected static function assertMethodVisibilityAndArguments(
$classNamespace, $classNamespace,
$method, $method,
$visibilityType, $visibilityType,
@@ -174,7 +180,7 @@ abstract class BaseTestCase extends TestCase
/** /**
* Verifies visibility and arguments of class constructor * Verifies visibility and arguments of class constructor
* *
* @param string $classNamespace Namespace of class that contains method to verify * @param string $classNamespace Namespace of class that contains constructor to verify
* @param string $visibilityType Expected visibility of verified method. One of OopVisibilityType class * @param string $visibilityType Expected visibility of verified method. One of OopVisibilityType class
* constants. * constants.
* @param int $argumentsCount (optional) Expected count/amount of arguments of the verified method * @param int $argumentsCount (optional) Expected count/amount of arguments of the verified method
@@ -182,7 +188,7 @@ abstract class BaseTestCase extends TestCase
* method * method
* @throws UnknownOopVisibilityTypeException * @throws UnknownOopVisibilityTypeException
*/ */
protected function verifyConstructorVisibilityAndArguments( protected static function assertConstructorVisibilityAndArguments(
$classNamespace, $classNamespace,
$visibilityType, $visibilityType,
$argumentsCount = 0, $argumentsCount = 0,
@@ -194,6 +200,22 @@ abstract class BaseTestCase extends TestCase
$reflection = new ReflectionClass($classNamespace); $reflection = new ReflectionClass($classNamespace);
$method = $reflection->getConstructor(); $method = $reflection->getConstructor();
return $this->verifyMethodVisibilityAndArguments($classNamespace, $method, $visibilityType, $argumentsCount, $requiredArgumentsCount); return static::assertMethodVisibilityAndArguments($classNamespace, $method, $visibilityType, $argumentsCount, $requiredArgumentsCount);
}
/**
* Asserts that class with given namespace has no constructor
*
* @param string $classNamespace Namespace of class that contains constructor to verify
*/
protected static function assertHasNoConstructor($classNamespace)
{
/*
* Let's grab the constructor
*/
$reflection = new ReflectionClass($classNamespace);
$constructor = $reflection->getConstructor();
static::assertNull($constructor);
} }
} }

View File

@@ -1032,6 +1032,8 @@ class Miscellaneous
$separator = DIRECTORY_SEPARATOR; $separator = DIRECTORY_SEPARATOR;
foreach ($paths as $path) { foreach ($paths as $path) {
$path = trim($path);
/* /*
* Empty paths are useless * Empty paths are useless
*/ */
@@ -1471,4 +1473,37 @@ class Miscellaneous
return $invertedColor; return $invertedColor;
} }
/**
* Returns project's root path.
* Looks for directory that contains composer.json.
*
* @return string
*/
public static function getProjectRootPath()
{
$projectRootPath = '';
$fileName = 'composer.json';
$directoryPath = __DIR__;
/*
* Path of directory it's not the path of last directory?
*/
while (DIRECTORY_SEPARATOR !== $directoryPath) {
$filePath = static::concatenatePaths($directoryPath, $fileName);
/*
* Is here file we are looking for?
* Maybe it's a project's root path
*/
if (file_exists($filePath)) {
$projectRootPath = $directoryPath;
}
$directoryPath = dirname($directoryPath);
}
return $projectRootPath;
}
} }

View File

@@ -306,7 +306,7 @@ class CollectionTest extends BaseTestCase
public function testExistsVisibilityAndArguments() public function testExistsVisibilityAndArguments()
{ {
$this->verifyMethodVisibilityAndArguments(Collection::class, 'exists', OopVisibilityType::IS_PRIVATE, 1, 1); static::assertMethodVisibilityAndArguments(Collection::class, 'exists', OopVisibilityType::IS_PRIVATE, 1, 1);
} }
/** /**

View File

@@ -8,8 +8,8 @@
namespace Meritoo\Common\Test\Utilities; namespace Meritoo\Common\Test\Utilities;
use Meritoo\Common\Test\Base\BaseTestCase;
use Meritoo\Common\Utilities\Arrays; use Meritoo\Common\Utilities\Arrays;
use PHPUnit\Framework\TestCase;
/** /**
* Tests of the useful arrays methods * Tests of the useful arrays methods
@@ -17,7 +17,7 @@ use PHPUnit\Framework\TestCase;
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo.pl
*/ */
class ArraysTest extends TestCase class ArraysTest extends BaseTestCase
{ {
private $simpleArray; private $simpleArray;
private $simpleArrayWithKeys; private $simpleArrayWithKeys;
@@ -25,6 +25,11 @@ class ArraysTest extends TestCase
private $complexArray; private $complexArray;
private $superComplexArray; private $superComplexArray;
public function verifyConstructor()
{
static::assertHasNoConstructor(Arrays::class);
}
public function testValues2string() public function testValues2string()
{ {
/* /*

View File

@@ -8,8 +8,8 @@
namespace Meritoo\Common\Test\Utilities; namespace Meritoo\Common\Test\Utilities;
use Meritoo\Common\Test\Base\BaseTestCase;
use Meritoo\Common\Utilities\Bundle; use Meritoo\Common\Utilities\Bundle;
use PHPUnit\Framework\TestCase;
/** /**
* Tests of the useful methods for bundle * Tests of the useful methods for bundle
@@ -17,8 +17,13 @@ use PHPUnit\Framework\TestCase;
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo.pl
*/ */
class BundleTest extends TestCase class BundleTest extends BaseTestCase
{ {
public function verifyConstructor()
{
static::assertHasNoConstructor(Bundle::class);
}
public function testGetBundleViewPathEmptyPathAndBundle() public function testGetBundleViewPathEmptyPathAndBundle()
{ {
self::assertNull(Bundle::getBundleViewPath('', '')); self::assertNull(Bundle::getBundleViewPath('', ''));

View File

@@ -27,6 +27,11 @@ class ComposerTest extends BaseTestCase
*/ */
private $composerJsonPath; private $composerJsonPath;
public function verifyConstructor()
{
static::assertHasNoConstructor(Composer::class);
}
/** /**
* @param string $composerJsonPath Empty value, e.g. "" * @param string $composerJsonPath Empty value, e.g. ""
* @dataProvider provideEmptyValue * @dataProvider provideEmptyValue

View File

@@ -24,7 +24,7 @@ class DatePeriodTest extends BaseTestCase
{ {
public function testConstructorVisibilityAndArguments() public function testConstructorVisibilityAndArguments()
{ {
$this->verifyConstructorVisibilityAndArguments(DatePeriod::class, OopVisibilityType::IS_PUBLIC, 2, 0); static::assertConstructorVisibilityAndArguments(DatePeriod::class, OopVisibilityType::IS_PUBLIC, 2, 0);
} }
/** /**

View File

@@ -23,6 +23,11 @@ use Meritoo\Common\Utilities\Date;
*/ */
class DateTest extends BaseTestCase class DateTest extends BaseTestCase
{ {
public function verifyConstructor()
{
static::assertHasNoConstructor(Date::class);
}
/** /**
* @param mixed $value Empty value, e.g. "" * @param mixed $value Empty value, e.g. ""
* @dataProvider provideEmptyValue * @dataProvider provideEmptyValue

View File

@@ -19,6 +19,11 @@ use Meritoo\Common\Utilities\GeneratorUtility;
*/ */
class GeneratorUtilityTest extends BaseTestCase class GeneratorUtilityTest extends BaseTestCase
{ {
public function verifyConstructor()
{
static::assertHasNoConstructor(GeneratorUtility::class);
}
public function testGetGeneratorElements() public function testGetGeneratorElements()
{ {
/* /*

View File

@@ -20,6 +20,11 @@ use Meritoo\Common\Utilities\Locale;
*/ */
class LocaleTest extends BaseTestCase class LocaleTest extends BaseTestCase
{ {
public function verifyConstructor()
{
static::assertHasNoConstructor(Locale::class);
}
/** /**
* @param mixed $languageCode Empty value, e.g. "" * @param mixed $languageCode Empty value, e.g. ""
* @dataProvider provideEmptyValue * @dataProvider provideEmptyValue

View File

@@ -20,6 +20,11 @@ use Meritoo\Common\Utilities\MimeTypes;
*/ */
class MimeTypesTest extends BaseTestCase class MimeTypesTest extends BaseTestCase
{ {
public function verifyConstructor()
{
static::assertHasNoConstructor(MimeTypes::class);
}
/** /**
* @param mixed $mimeType Empty value, e.g. "" * @param mixed $mimeType Empty value, e.g. ""
* @dataProvider provideEmptyValue * @dataProvider provideEmptyValue

View File

@@ -28,6 +28,11 @@ class MiscellaneousTest extends BaseTestCase
private $stringCommaSeparated; private $stringCommaSeparated;
private $stringDotSeparated; private $stringDotSeparated;
public function verifyConstructor()
{
static::assertHasNoConstructor(Miscellaneous::class);
}
public function testGetDirectoryContent() public function testGetDirectoryContent()
{ {
$directoryPath = __DIR__ . '/../'; $directoryPath = __DIR__ . '/../';
@@ -503,16 +508,35 @@ class MiscellaneousTest extends BaseTestCase
self::assertEquals('lorem ipsum', Miscellaneous::trimSmart(' lorem ipsum ')); self::assertEquals('lorem ipsum', Miscellaneous::trimSmart(' lorem ipsum '));
} }
public function testConcatenatePaths() /**
* @param mixed $emptyPaths Empty paths co concatenate
* @dataProvider provideEmptyValue
*/
public function testConcatenatePathsWithEmptyPaths($emptyPaths)
{
self::assertEquals('', Miscellaneous::concatenatePaths($emptyPaths));
}
public function testConcatenatePathsWithOneEmptyPath()
{
$paths = [
'first/directory',
'second/one',
'',
'and/the/third',
];
$concatenated = Miscellaneous::concatenatePaths($paths);
unset($paths[2]);
$imploded = implode('/', $paths);
self::assertEquals('/' . $imploded, $concatenated);
}
public function testConcatenatePathsInNixOs()
{ {
/* /*
* Common cases * For *nix operating system
*/
self::assertEquals('', Miscellaneous::concatenatePaths(null));
self::assertEquals('', Miscellaneous::concatenatePaths([]));
/*
* *nix operating system
*/ */
$paths1 = [ $paths1 = [
'first/directory', 'first/directory',
@@ -522,7 +546,10 @@ class MiscellaneousTest extends BaseTestCase
self::assertEquals('/' . implode('/', $paths1), Miscellaneous::concatenatePaths($paths1)); self::assertEquals('/' . implode('/', $paths1), Miscellaneous::concatenatePaths($paths1));
self::assertEquals('/' . implode('/', $paths1), Miscellaneous::concatenatePaths($paths1[0], $paths1[1], $paths1[2])); self::assertEquals('/' . implode('/', $paths1), Miscellaneous::concatenatePaths($paths1[0], $paths1[1], $paths1[2]));
}
public function testConcatenatePathsInWindowsOs()
{
/* /*
* For Windows operating system * For Windows operating system
*/ */
@@ -720,6 +747,11 @@ class MiscellaneousTest extends BaseTestCase
self::assertSame($expected, Miscellaneous::fillMissingZeros($number, $length, $before)); self::assertSame($expected, Miscellaneous::fillMissingZeros($number, $length, $before));
} }
public function testGetProjectRootPath()
{
self::assertNotEmpty(Miscellaneous::getProjectRootPath());
}
/** /**
* Provides string to convert characters to latin characters and not lower cased and not human-readable * Provides string to convert characters to latin characters and not lower cased and not human-readable
* *

View File

@@ -29,6 +29,11 @@ use Meritoo\Common\Utilities\Reflection;
*/ */
class ReflectionTest extends BaseTestCase class ReflectionTest extends BaseTestCase
{ {
public function verifyConstructor()
{
static::assertHasNoConstructor(Reflection::class);
}
/** /**
* @param mixed $invalidClass Empty value, e.g. "" * @param mixed $invalidClass Empty value, e.g. ""
* @dataProvider provideEmptyValue * @dataProvider provideEmptyValue

View File

@@ -8,7 +8,7 @@
namespace Meritoo\Common\Utilities; namespace Meritoo\Common\Utilities;
use PHPUnit\Framework\TestCase; use Meritoo\Common\Test\Base\BaseTestCase;
/** /**
* Tests of the useful regular expressions methods * Tests of the useful regular expressions methods
@@ -16,11 +16,16 @@ use PHPUnit\Framework\TestCase;
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo.pl
*/ */
class RegexTest extends TestCase class RegexTest extends BaseTestCase
{ {
private $simpleText; private $simpleText;
private $camelCaseText; private $camelCaseText;
public function verifyConstructor()
{
static::assertHasNoConstructor(Regex::class);
}
public function testGetCamelCaseParts() public function testGetCamelCaseParts()
{ {
$parts = []; $parts = [];

View File

@@ -19,6 +19,11 @@ use Meritoo\Common\Utilities\Uri;
*/ */
class UriTest extends BaseTestCase class UriTest extends BaseTestCase
{ {
public function verifyConstructor()
{
static::assertHasNoConstructor(Uri::class);
}
public function testAddProtocolToUrl() public function testAddProtocolToUrl()
{ {
$http = 'http'; $http = 'http';

View File

@@ -8,8 +8,8 @@
namespace Meritoo\Common\Test\Utilities; namespace Meritoo\Common\Test\Utilities;
use Meritoo\Common\Test\Base\BaseTestCase;
use Meritoo\Common\Utilities\Xml; use Meritoo\Common\Utilities\Xml;
use PHPUnit\Framework\TestCase;
use SimpleXMLElement; use SimpleXMLElement;
/** /**
@@ -18,11 +18,16 @@ use SimpleXMLElement;
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl> * @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
* @copyright Meritoo.pl * @copyright Meritoo.pl
*/ */
class XmlTest extends TestCase class XmlTest extends BaseTestCase
{ {
private $simpleXml; private $simpleXml;
private $advancedXml; private $advancedXml;
public function verifyConstructor()
{
static::assertHasNoConstructor(Xml::class);
}
public function testMergeNodes() public function testMergeNodes()
{ {
/* /*