From 51ff110101fce1f9c4f9085de3e3083a8bdf4034 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Sun, 26 Aug 2018 15:25:09 +0200 Subject: [PATCH 01/41] Phing > update configuration --- CHANGELOG.md | 4 + VERSION | 2 +- build.xml | 20 +-- phing/app.xml | 173 +++++++++++++++++++++----- phing/filesets.xml | 35 ++++++ phing/properties.dist | 54 ++++---- phing/tests.xml | 6 +- tests/Resources/var/cache/.gitkeep | 0 tests/Resources/var/log/.gitkeep | 0 tests/Resources/var/sessions/.gitkeep | 0 10 files changed, 208 insertions(+), 86 deletions(-) create mode 100644 phing/filesets.xml create mode 100644 tests/Resources/var/cache/.gitkeep create mode 100644 tests/Resources/var/log/.gitkeep create mode 100644 tests/Resources/var/sessions/.gitkeep diff --git a/CHANGELOG.md b/CHANGELOG.md index 65d5b3c..3d3daf2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ Common and useful classes, methods, exceptions etc. +# 0.1.4 + +1. Phing > update configuration + # 0.1.3 1. Tests > refactoring & minor improvements diff --git a/VERSION b/VERSION index b1e80bb..845639e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.3 +0.1.4 diff --git a/build.xml b/build.xml index d65367b..a4a2a95 100644 --- a/build.xml +++ b/build.xml @@ -14,7 +14,7 @@ + description="Builds everything and runs all tests"/> @@ -24,23 +24,5 @@ - - diff --git a/phing/app.xml b/phing/app.xml index 23852ba..464a2f1 100644 --- a/phing/app.xml +++ b/phing/app.xml @@ -1,5 +1,5 @@ - + @@ -11,50 +11,119 @@ + + + + description="Builds the application"/> + depends="app:clean, app:composer, app:vendors, app:composer-validate, app:checkout" + description="Prepares app to build."/> - - - + + + - + - + - + - + - + - + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -63,36 +132,76 @@ - - - - - - + + + + + + + + + + - + - - - - - + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - + + + diff --git a/phing/filesets.xml b/phing/filesets.xml new file mode 100644 index 0000000..13dcb7f --- /dev/null +++ b/phing/filesets.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/phing/properties.dist b/phing/properties.dist index dc0463c..5d0307e 100644 --- a/phing/properties.dist +++ b/phing/properties.dist @@ -9,7 +9,7 @@ # not special chars. This way you can create pseudo-namespaces # # You can refer to values of other properties by enclosing their keys in "${}". -# Example: dir.js = ${dir.web}/js +# Example: dir.js = ${dir.public}/js # # Everything behind the equal sign is the value, you do # not have to enclose strings: text=This is some text, Your OS is ${php.os} @@ -22,10 +22,6 @@ # env = dev -# Install assets using symlinks -# -assets.installWithSymlink = true - # Clear cache with the "warmup" option # # The cache:clear command should always be called with the --no-warmup option. Warmup should be done via the cache:warmup command. @@ -45,7 +41,6 @@ composer.download_command = php -r "eval('?>'.file_get_contents('https://getcomp # Path to composer executable or composer.phar file # composer.path = composer.phar -#composer.path = /usr/local/bin/composer # Path to php executable used by composer # @@ -55,52 +50,49 @@ composer.php = php # composer.self-update = false -# Validate the composer.json file -# -composer.validate = false - # -------------------------------------------------------------------------------- # Directories # -------------------------------------------------------------------------------- # System directories # -dir.data = ${project.basedir}/data dir.src = ${project.basedir}/src +dir.var = ${project.basedir}/tests/Resources/var +dir.cache = ${dir.var}/cache +dir.logs = ${dir.var}/log +dir.sessions = ${dir.var}/sessions +dir.data = ${project.basedir}/data dir.tests = ${project.basedir}/tests -# -------------------------------------------------------------------------------- # Build directories -# -------------------------------------------------------------------------------- - +# dir.build = ${project.basedir}/build dir.reports = ${dir.build}/logs dir.reports.pdepend = ${dir.reports}/pdepend -dir.reports.coverage = ${dir.reports}/phpunit_coverage -# -# Disabled, because unnecessary right now -# phpdocumentor/phpdocumentor cannot be installed via Composer -# -# Meritoo -# 2017-02-22 -# -#dir.docs = ${dir.build}/docs -#dir.docs.phpdoc2 = ${dir.docs}/phpdoc2 -# -------------------------------------------------------------------------------- # Data directories -# -------------------------------------------------------------------------------- - +# +dir.data.tests = ${dir.data}/tests dir.data.temporary = ${dir.data}/tmp +# Docker directories +# +dir.docker = ${project.basedir}/docker +dir.docker.data = ${dir.docker}/data/db +dir.docker.logs = ${dir.docker}/logs/nginx + # -------------------------------------------------------------------------------- # Testing # -------------------------------------------------------------------------------- +# Path of the PHP Coding Standards Fixer (http://cs.sensiolabs.org) +# +tests.cs_fixer.path = ./vendor/bin/php-cs-fixer + +# Test database path +# +tests.database = ${dir.data.temporary}/database.sqlite + # Path of the framework used to run unit tests # tests.framework.path = ./vendor/bin/phpunit --verbose --no-coverage --testdox - -# Path of the PHP Coding Standards Fixer (http://cs.sensiolabs.org) -# -phpCsFixer.path = ./vendor/bin/php-cs-fixer diff --git a/phing/tests.xml b/phing/tests.xml index edd288b..6eba11b 100644 --- a/phing/tests.xml +++ b/phing/tests.xml @@ -62,8 +62,8 @@ --> @@ -212,7 +212,7 @@ - + diff --git a/tests/Resources/var/cache/.gitkeep b/tests/Resources/var/cache/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/Resources/var/log/.gitkeep b/tests/Resources/var/log/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/Resources/var/sessions/.gitkeep b/tests/Resources/var/sessions/.gitkeep new file mode 100644 index 0000000..e69de29 From 35b70f53e7208070506c7f67b5db1db44c2ac0cf Mon Sep 17 00:00:00 2001 From: Meritoo Date: Sun, 26 Aug 2018 16:39:45 +0200 Subject: [PATCH 02/41] BaseType > minor refactoring --- src/Exception/Base/UnknownTypeException.php | 6 +++--- src/Type/Base/BaseType.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Exception/Base/UnknownTypeException.php b/src/Exception/Base/UnknownTypeException.php index ea860ca..8377059 100644 --- a/src/Exception/Base/UnknownTypeException.php +++ b/src/Exception/Base/UnknownTypeException.php @@ -23,9 +23,9 @@ abstract class UnknownTypeException extends Exception /** * Creates exception * - * @param string|int $unknownType The unknown type of something (value of constant) - * @param BaseType $typeInstance An instance of class that contains type of the something - * @param string $typeName Name of the something + * @param mixed $unknownType The unknown type of something (value of constant) + * @param BaseType $typeInstance An instance of class that contains type of the something + * @param string $typeName Name of the something * @return UnknownTypeException */ public static function create($unknownType, BaseType $typeInstance, $typeName) diff --git a/src/Type/Base/BaseType.php b/src/Type/Base/BaseType.php index 73ec524..ec8dafa 100644 --- a/src/Type/Base/BaseType.php +++ b/src/Type/Base/BaseType.php @@ -43,7 +43,7 @@ abstract class BaseType /** * Returns information if given type is correct * - * @param string $type The type to check + * @param mixed $type The type to check * @return bool */ public function isCorrectType($type) From 575bb344cde0ce55f4e3a19c375509f02301be35 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Mon, 27 Aug 2018 22:04:35 +0200 Subject: [PATCH 03/41] BaseTestCaseTrait > minor refactoring --- src/Traits/Test/Base/BaseTestCaseTrait.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Traits/Test/Base/BaseTestCaseTrait.php b/src/Traits/Test/Base/BaseTestCaseTrait.php index 2ca9539..7c4caea 100644 --- a/src/Traits/Test/Base/BaseTestCaseTrait.php +++ b/src/Traits/Test/Base/BaseTestCaseTrait.php @@ -19,8 +19,7 @@ use ReflectionMethod; use stdClass; /** - * BaseTestCaseTrait - * Created on 2017-11-02 + * Trait for the base test case * * @author Meritoo * @copyright Meritoo From 5d6b559108c4697d936a2411848e5604cbf26968 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Fri, 7 Sep 2018 13:48:44 +0200 Subject: [PATCH 04/41] Phing > tests > missing path of directory with code coverage report --- phing/properties.dist | 1 + 1 file changed, 1 insertion(+) diff --git a/phing/properties.dist b/phing/properties.dist index 5d0307e..aaeaf35 100644 --- a/phing/properties.dist +++ b/phing/properties.dist @@ -69,6 +69,7 @@ dir.tests = ${project.basedir}/tests dir.build = ${project.basedir}/build dir.reports = ${dir.build}/logs dir.reports.pdepend = ${dir.reports}/pdepend +dir.reports.coverage = ${dir.reports}/phpunit_coverage # Data directories # From 4db631223fa4ab0da5b928d83cf19347b526068b Mon Sep 17 00:00:00 2001 From: Meritoo Date: Sat, 8 Sep 2018 08:21:50 +0200 Subject: [PATCH 05/41] Phing > tests > PHPUnit > do not use dox format (for output results) --- phing/properties.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phing/properties.dist b/phing/properties.dist index aaeaf35..9d5cf43 100644 --- a/phing/properties.dist +++ b/phing/properties.dist @@ -96,4 +96,4 @@ tests.database = ${dir.data.temporary}/database.sqlite # Path of the framework used to run unit tests # -tests.framework.path = ./vendor/bin/phpunit --verbose --no-coverage --testdox +tests.framework.path = ./vendor/bin/phpunit --verbose --no-coverage From 26b136d676abb878a2c024cd3e1d55dab7233691 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Wed, 19 Sep 2018 23:21:40 +0200 Subject: [PATCH 06/41] Tests > increase code coverage --- src/Utilities/Repository.php | 9 +- tests/Utilities/RepositoryTest.php | 242 ++++++++++++++++++++++++++++- 2 files changed, 243 insertions(+), 8 deletions(-) diff --git a/src/Utilities/Repository.php b/src/Utilities/Repository.php index fbc8d12..32dc95c 100644 --- a/src/Utilities/Repository.php +++ b/src/Utilities/Repository.php @@ -177,10 +177,13 @@ class Repository $direction = 'ASC' ) { $alias = 'qb'; + $queryBuilder = $repository->createQueryBuilder($alias); - return $repository - ->createQueryBuilder($alias) - ->orderBy(sprintf('%s.%s', $alias, $property), $direction); + if (empty($property)) { + return $queryBuilder; + } + + return $queryBuilder->orderBy(sprintf('%s.%s', $alias, $property), $direction); } /** diff --git a/tests/Utilities/RepositoryTest.php b/tests/Utilities/RepositoryTest.php index aafeadb..0ccedd4 100644 --- a/tests/Utilities/RepositoryTest.php +++ b/tests/Utilities/RepositoryTest.php @@ -8,6 +8,10 @@ namespace Meritoo\Common\Test\Utilities; +use Doctrine\ORM\EntityManagerInterface; +use Doctrine\ORM\EntityRepository; +use Doctrine\ORM\Query\Expr\OrderBy; +use Doctrine\ORM\QueryBuilder; use Generator; use Meritoo\Common\Test\Base\BaseTestCase; use Meritoo\Common\Test\Utilities\Repository\Sortable; @@ -160,7 +164,7 @@ class RepositoryTest extends BaseTestCase /** * @param array $items Objects who have "getPosition()" and "setPosition()" methods or arrays - * @param bool $max (optional) If is set to true, maximum value is returned. Otherwise - minimum. + * @param bool $max If is set to true, maximum value is returned. Otherwise - minimum. * @param int $expected Extreme position (max or min) of given items * * @dataProvider provideArraysWithoutExtremePositionToGetExtremePosition @@ -170,12 +174,122 @@ class RepositoryTest extends BaseTestCase static::assertEquals($expected, Repository::getExtremePosition($items, $max)); } - public function testGetExtremePositionUsingObjects() + /** + * @param array $items Objects who have "getPosition()" and "setPosition()" methods or arrays + * @param bool $max If is set to true, maximum value is returned. Otherwise - minimum. + * @param int $expected Extreme position (max or min) of given items + * + * @dataProvider provideArraysWithExtremePositionToGetExtremePosition + */ + public function testGetExtremePositionUsingArraysWithExtremePosition(array $items, $max, $expected) { + static::assertEquals($expected, Repository::getExtremePosition($items, $max)); } - public function testGetEntityOrderedQueryBuilder() + /** + * @param array $items Objects who have "getPosition()" and "setPosition()" methods or arrays + * @param bool $max If is set to true, maximum value is returned. Otherwise - minimum. + * @param int $expected Extreme position (max or min) of given items + * + * @dataProvider provideObjectsWithoutExtremePositionToGetExtremePosition + */ + public function testGetExtremePositionUsingObjectsWithoutExtremePosition(array $items, $max, $expected) { + static::assertEquals($expected, Repository::getExtremePosition($items, $max)); + } + + /** + * @param array $items Objects who have "getPosition()" and "setPosition()" methods or arrays + * @param bool $max If is set to true, maximum value is returned. Otherwise - minimum. + * @param int $expected Extreme position (max or min) of given items + * + * @dataProvider provideObjectsWithExtremePositionToGetExtremePosition + */ + public function testGetExtremePositionUsingObjectsWithExtremePosition(array $items, $max, $expected) + { + static::assertEquals($expected, Repository::getExtremePosition($items, $max)); + } + + public function testGetEntityOrderedQueryBuilderUsingDefaults() + { + $entityManager = $this->getMock(EntityManagerInterface::class); + + $entityRepository = $this + ->getMockBuilder(EntityRepository::class) + ->disableOriginalConstructor() + ->setMethods([ + 'createQueryBuilder', + ]) + ->getMock(); + + $expectedQueryBuilder = new QueryBuilder($entityManager); + $expectedQueryBuilder->from('any_table_name', 'qb'); + + $entityRepository + ->expects(static::once()) + ->method('createQueryBuilder') + ->willReturn($expectedQueryBuilder); + + $queryBuilder = Repository::getEntityOrderedQueryBuilder($entityRepository); + $selectDQLPart = $queryBuilder->getDQLPart('select'); + $whereDQLPart = $queryBuilder->getDQLPart('where'); + $orderDQLPart = $queryBuilder->getDQLPart('orderBy'); + + /* @var OrderBy $orderBy */ + $orderBy = $orderDQLPart[0]; + + static::assertInstanceOf(QueryBuilder::class, $queryBuilder); + static::assertArraySubset(['qb'], $queryBuilder->getRootAliases()); + static::assertSame([], $selectDQLPart); + static::assertNull($whereDQLPart); + static::assertSame(['qb.name ASC'], $orderBy->getParts()); + } + + /** + * @param string $property Name of property used by the ORDER BY clause + * @param string $direction Direction used by the ORDER BY clause ("ASC" or "DESC") + * @param string $expectedOrderBy Expected ORDER BY clause + * + * @dataProvider providePropertyAndDirectionToGetEntityOrderedQueryBuilder + */ + public function testGetEntityOrderedQueryBuilder($property, $direction, $expectedOrderBy) + { + $entityManager = $this->getMock(EntityManagerInterface::class); + + $entityRepository = $this + ->getMockBuilder(EntityRepository::class) + ->disableOriginalConstructor() + ->setMethods([ + 'createQueryBuilder', + ]) + ->getMock(); + + $expectedQueryBuilder = new QueryBuilder($entityManager); + $expectedQueryBuilder->from('any_table_name', 'qb'); + + $entityRepository + ->expects(static::once()) + ->method('createQueryBuilder') + ->willReturn($expectedQueryBuilder); + + $queryBuilder = Repository::getEntityOrderedQueryBuilder($entityRepository, $property, $direction); + $selectDQLPart = $queryBuilder->getDQLPart('select'); + $whereDQLPart = $queryBuilder->getDQLPart('where'); + $orderDQLPart = $queryBuilder->getDQLPart('orderBy'); + + static::assertInstanceOf(QueryBuilder::class, $queryBuilder); + static::assertArraySubset(['qb'], $queryBuilder->getRootAliases()); + static::assertSame([], $selectDQLPart); + static::assertNull($whereDQLPart); + + if (empty($property)) { + static::assertSame([], $orderDQLPart); + } else { + /* @var OrderBy $orderBy */ + $orderBy = $orderDQLPart[0]; + + static::assertSame([$expectedOrderBy], $orderBy->getParts()); + } } /** @@ -581,7 +695,7 @@ class RepositoryTest extends BaseTestCase [], ], true, - 1, + 2, ]; yield[ @@ -596,7 +710,125 @@ class RepositoryTest extends BaseTestCase [], ], false, - 2, + 1, + ]; + } + + /** + * Provides objects without extreme position used to get extreme position + * + * @return Generator + */ + public function provideObjectsWithoutExtremePositionToGetExtremePosition() + { + yield[ + [], + false, + null, + ]; + + yield[ + [], + true, + null, + ]; + + yield[ + [ + new Sortable(), + new Sortable(), + new Sortable(), + ], + true, + null, + ]; + + yield[ + [ + new Sortable(), + new Sortable(), + new Sortable(), + ], + false, + null, + ]; + } + + /** + * Provides objects with extreme position used to get extreme position + * + * @return Generator + */ + public function provideObjectsWithExtremePositionToGetExtremePosition() + { + yield[ + [ + new Sortable(1), + new Sortable(2), + new Sortable(3), + ], + true, + 3, + ]; + + yield[ + [ + new Sortable(1), + new Sortable(2), + new Sortable(3), + ], + false, + 1, + ]; + } + + /** + * Provide name of property, direction and expected ORDER BY clause used to get query builder + * + * @return Generator + */ + public function providePropertyAndDirectionToGetEntityOrderedQueryBuilder() + { + yield[ + null, + null, + '', + ]; + + yield[ + '', + '', + '', + ]; + + yield[ + 'first_name', + '', + 'qb.first_name ASC', + ]; + + yield[ + 'first_name', + 'asc', + 'qb.first_name asc', + ]; + + yield[ + 'first_name', + 'ASC', + 'qb.first_name ASC', + ]; + + yield[ + 'first_name', + 'desc', + 'qb.first_name desc', + ]; + + yield[ + 'first_name', + 'DESC', + 'qb.first_name DESC', ]; } } From 97c61129197e841a3e3f90b1ec271622c042138e Mon Sep 17 00:00:00 2001 From: Meritoo Date: Thu, 20 Sep 2018 20:41:48 +0200 Subject: [PATCH 07/41] TravisCI > fix indentation --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index eff6130..f1bd310 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,7 @@ before_install: - composer global require hirak/prestissimo install: -- travis_wait 30 composer install + - travis_wait 30 composer install -v script: - php ./vendor/bin/phpunit From ca9c3bd8f12d58be863278679493ea259eb7a39a Mon Sep 17 00:00:00 2001 From: Meritoo Date: Fri, 19 Oct 2018 22:54:11 +0200 Subject: [PATCH 08/41] Utilities > Date > update descriptions of methods --- CHANGELOG.md | 1 + src/Utilities/Date.php | 15 +++++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d3daf2..9484473 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Common and useful classes, methods, exceptions etc. # 0.1.4 1. Phing > update configuration +2. Utilities > Date > update descriptions of methods # 0.1.3 diff --git a/src/Utilities/Date.php b/src/Utilities/Date.php index 40b76db..3b296b7 100644 --- a/src/Utilities/Date.php +++ b/src/Utilities/Date.php @@ -64,8 +64,7 @@ class Date const DATE_DIFFERENCE_UNIT_YEARS = 'years'; /** - * Returns start and end date for given period. - * The dates are returned in an array with indexes 'start' and 'end'. + * Returns date's period (that contains start and end date) for given period * * @param int $period The period, type of period. One of DatePeriod class constants, e.g. DatePeriod::LAST_WEEK. * @throws Exception @@ -531,11 +530,15 @@ class Date /** * Returns random date based on given start date * - * @param DateTime $startDate The start date. Start of the random date. - * @param int $start (optional) Start of random partition - * @param int $end (optional) End of random partition + * @param DateTime $startDate (optional) Beginning of the random date. If not provided, current date will + * be used (default behaviour). + * @param int $start (optional) Start of random partition. If not provided, 1 will be used + * (default behaviour). + * @param int $end (optional) End of random partition. If not provided, 100 will be used + * (default behaviour). * @param string $intervalTemplate (optional) Template used to build date interval. The placeholder is replaced - * with next, iterated value. + * with next, iterated value. If not provided, "P%sD" will be used (default + * behaviour). * @throws Exception * @return DateTime */ From 38c68b0952ce51c6168111f1c783e1200163f7b0 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Fri, 19 Oct 2018 22:54:26 +0200 Subject: [PATCH 09/41] Readme > add badge with required PHP version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 94a0f44..bcc9fc0 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Common and useful classes, methods, exceptions etc. -[![Travis](https://img.shields.io/travis/rust-lang/rust.svg?style=flat-square)](https://travis-ci.org/meritoo/common-library) [![Packagist](https://img.shields.io/packagist/v/meritoo/common-library.svg?style=flat-square)](https://packagist.org/packages/meritoo/common-library) [![license](https://img.shields.io/github/license/meritoo/common-library.svg?style=flat-square)](https://github.com/meritoo/common-library) [![GitHub commits](https://img.shields.io/github/commits-since/meritoo/common-library/0.0.1.svg?style=flat-square)](https://github.com/meritoo/common-library) [![Coverage Status](https://coveralls.io/repos/github/meritoo/common-library/badge.svg?branch=master)](https://coveralls.io/github/meritoo/common-library?branch=master) +[![PHP Version](https://img.shields.io/badge/php-%3E%3D5.6-blue.svg)](https://img.shields.io/badge/php-%3E%3D5.6-blue.svg) [![Travis](https://img.shields.io/travis/rust-lang/rust.svg?style=flat-square)](https://travis-ci.org/meritoo/common-library) [![Packagist](https://img.shields.io/packagist/v/meritoo/common-library.svg?style=flat-square)](https://packagist.org/packages/meritoo/common-library) [![license](https://img.shields.io/github/license/meritoo/common-library.svg?style=flat-square)](https://github.com/meritoo/common-library) [![GitHub commits](https://img.shields.io/github/commits-since/meritoo/common-library/0.0.1.svg?style=flat-square)](https://github.com/meritoo/common-library) [![Coverage Status](https://coveralls.io/repos/github/meritoo/common-library/badge.svg?branch=master)](https://coveralls.io/github/meritoo/common-library?branch=master) # Installation From 7e4b14a92fe847e6bd8877695d52728016603185 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Thu, 25 Oct 2018 10:27:48 +0200 Subject: [PATCH 10/41] Phing > update configuration --- build.xml | 20 ++-- phing/app.xml | 101 +++++++---------- phing/composer-install.sh | 20 ++++ phing/filesets.xml | 1 + phing/properties.dist | 41 +++---- phing/tests.xml | 226 +++++++++++--------------------------- 6 files changed, 150 insertions(+), 259 deletions(-) create mode 100644 phing/composer-install.sh diff --git a/build.xml b/build.xml index a4a2a95..594cf4b 100644 --- a/build.xml +++ b/build.xml @@ -1,28 +1,30 @@ + - + - + - + + depends="build:app, + build:tests" + /> - - + + - - + + diff --git a/phing/app.xml b/phing/app.xml index 464a2f1..5688569 100644 --- a/phing/app.xml +++ b/phing/app.xml @@ -1,107 +1,104 @@ + - + - + - + - + + /> + depends="app:clean, + app:composer:self-update, + app:composer:install, + app:composer:validate, + app:checkout" + /> - - - + - + + + - - - - + - + - + + + - - - - - - + + + + + - - + - + - - - - - + - + - - + - + @@ -121,40 +118,24 @@ - - - - - - - - - - - + + - - + - - - + - - - - @@ -164,9 +145,7 @@ - - - + @@ -174,16 +153,14 @@ - - - + - + diff --git a/phing/composer-install.sh b/phing/composer-install.sh new file mode 100644 index 0000000..1a951a2 --- /dev/null +++ b/phing/composer-install.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +EXPECTED_SIGNATURE="$(curl -L https://composer.github.io/installer.sig)" +# Original line (with wget): +# EXPECTED_SIGNATURE="$(wget -q -O - https://composer.github.io/installer.sig)" + +php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" +ACTUAL_SIGNATURE="$(php -r "echo hash_file('SHA384', 'composer-setup.php');")" + +if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ] +then + >&2 echo 'ERROR: Invalid installer signature' + rm composer-setup.php + exit 1 +fi + +php composer-setup.php --quiet +RESULT=$? +rm composer-setup.php +exit $RESULT diff --git a/phing/filesets.xml b/phing/filesets.xml index 13dcb7f..c3aea0c 100644 --- a/phing/filesets.xml +++ b/phing/filesets.xml @@ -1,4 +1,5 @@ + diff --git a/phing/properties.dist b/phing/properties.dist index 9d5cf43..5c2c662 100644 --- a/phing/properties.dist +++ b/phing/properties.dist @@ -1,19 +1,3 @@ -# -------------------------------------------------------------------------------- -# Information -# -------------------------------------------------------------------------------- - -# Property files contain key/value pairs -# key = value -# -# Property keys may contain alphanumeric chars and colons, but -# not special chars. This way you can create pseudo-namespaces -# -# You can refer to values of other properties by enclosing their keys in "${}". -# Example: dir.js = ${dir.public}/js -# -# Everything behind the equal sign is the value, you do -# not have to enclose strings: text=This is some text, Your OS is ${php.os} - # -------------------------------------------------------------------------------- # Common, e.g. default environment # -------------------------------------------------------------------------------- @@ -36,20 +20,18 @@ cache.clearWithWarmup = false # Composer # -------------------------------------------------------------------------------- -composer.download_command = php -r "eval('?>'.file_get_contents('https://getcomposer.org/installer'));" - -# Path to composer executable or composer.phar file +# Command used to download Composer # -composer.path = composer.phar +composer.download_command = bash ${project.basedir}/phing/composer-install.sh + +# Path to composer executable or downloaded composer.phar file +# +composer.path = ${project.basedir}/composer.phar # Path to php executable used by composer # composer.php = php -# Self update of the composer -# -composer.self-update = false - # -------------------------------------------------------------------------------- # Directories # -------------------------------------------------------------------------------- @@ -67,7 +49,7 @@ dir.tests = ${project.basedir}/tests # Build directories # dir.build = ${project.basedir}/build -dir.reports = ${dir.build}/logs +dir.reports = ${dir.build}/reports dir.reports.pdepend = ${dir.reports}/pdepend dir.reports.coverage = ${dir.reports}/phpunit_coverage @@ -88,12 +70,15 @@ dir.docker.logs = ${dir.docker}/logs/nginx # Path of the PHP Coding Standards Fixer (http://cs.sensiolabs.org) # -tests.cs_fixer.path = ./vendor/bin/php-cs-fixer +tests.cs_fixer.command = ./vendor/bin/php-cs-fixer fix --verbose # Test database path # tests.database = ${dir.data.temporary}/database.sqlite -# Path of the framework used to run unit tests +# Paths of frameworks used to run tests: +# - PHPUnit (unit tests) +# - Infection (mutation tests) # -tests.framework.path = ./vendor/bin/phpunit --verbose --no-coverage +tests.phpunit.command = ./vendor/bin/phpunit --verbose --no-coverage +tests.mutation.command = ./vendor/bin/infection --threads=5 diff --git a/phing/tests.xml b/phing/tests.xml index 6eba11b..39de5a6 100644 --- a/phing/tests.xml +++ b/phing/tests.xml @@ -1,230 +1,136 @@ - - - + + - + - + - + - - - - - - + + + + + + - + - + depends="build:fix-coding-standards, + build:clean, + build:prepare, + build:check, + build:test, + app:checkout" + /> - - - - - - + + - - - - - - + depends="check:cs, + check:md, + check:cpd, + check:depend, + check:loc" + /> + depends="test:phpunit, + test:infection" + /> - - - - + + - - - - - - + + + - - - - - - + - - - - + + + + - - + - - + + - - - - + - - - + + + - - + - - - - + + + + - - + - + - - - - - - + + + + + + + + - + - - - + + + From 971224b2e66aa10ee27ddbadb918e2a0e574e5bd Mon Sep 17 00:00:00 2001 From: Meritoo Date: Thu, 25 Oct 2018 10:28:00 +0200 Subject: [PATCH 11/41] PHPUnit > update configuration --- phpunit.xml.dist | 33 +++++---------------------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/phpunit.xml.dist b/phpunit.xml.dist index b6d38e5..f54393f 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,28 +1,11 @@ + @@ -31,23 +14,17 @@ - ./tests/ + tests/ - ./src/ + src/ - - - performance - - - - + From 1f5106bcf0dcb155dd1b041dbc1b1a2099817aa7 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Thu, 25 Oct 2018 10:31:21 +0200 Subject: [PATCH 12/41] Docker > improve performance > fix indentations --- docker-compose.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index e13bca3..701c8b2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,12 +9,12 @@ services: build: context: ./docker/config args: - - TIMEZONE=${TIMEZONE} + - TIMEZONE=${TIMEZONE} volumes: - - .:/project:cached + - .:/project:cached composer: image: ${DOCKER_CONTAINER_OWNER}/${DOCKER_CONTAINER_PROJECT}-php container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-composer entrypoint: composer volumes: - - .:/project:cached + - .:/project:cached From 61676a445ee0bf3b7b3e0901467d7acece4459e5 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Thu, 25 Oct 2018 10:31:44 +0200 Subject: [PATCH 13/41] Docker > update docker-compose.yml > composer > fix "allowed memory size of 1610612736 bytes exhausted" bug --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 701c8b2..b4c7404 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,6 +15,6 @@ services: composer: image: ${DOCKER_CONTAINER_OWNER}/${DOCKER_CONTAINER_PROJECT}-php container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-composer - entrypoint: composer + entrypoint: php -d memory_limit=-1 /usr/local/bin/composer volumes: - .:/project:cached From ff416fda695cbfabc4190a08db1b683e0f46b377 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Thu, 25 Oct 2018 10:59:24 +0200 Subject: [PATCH 14/41] Phing > update configuration --- phing/tests.xml | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/phing/tests.xml b/phing/tests.xml index 39de5a6..3797ae5 100644 --- a/phing/tests.xml +++ b/phing/tests.xml @@ -30,8 +30,6 @@ - - - - - - - - - - - - - + @@ -80,7 +66,7 @@ - + @@ -88,7 +74,7 @@ - + @@ -97,7 +83,7 @@ - + @@ -107,22 +93,39 @@ - + - + - + + + + + + + + + + + + + + + + + + From 870bfe48a234855700e97e7866e23daf110b1f68 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Sun, 28 Oct 2018 00:03:35 +0200 Subject: [PATCH 15/41] Docker > Dockerfile > fix installation of Composer --- docker/config/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/config/Dockerfile b/docker/config/Dockerfile index df4b0f8..277e672 100644 --- a/docker/config/Dockerfile +++ b/docker/config/Dockerfile @@ -98,7 +98,7 @@ ENV COMPOSER_ALLOW_SUPERUSER 1 # RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \ && php -r "if (hash_file('SHA384', 'composer-setup.php') === \ - '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo \ + '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo \ 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" \ && php composer-setup.php --install-dir=/usr/local/bin --filename=composer \ && php -r "unlink('composer-setup.php');" \ From 822dbf68307698fdae1310de98cf2c5e5e41130a Mon Sep 17 00:00:00 2001 From: Meritoo Date: Sun, 28 Oct 2018 00:06:52 +0200 Subject: [PATCH 16/41] Phing > tests > remove mutation tests (because Infection requires PHP 7.1+) --- phing/properties.dist | 2 -- phing/tests.xml | 8 +------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/phing/properties.dist b/phing/properties.dist index 5c2c662..624b5fc 100644 --- a/phing/properties.dist +++ b/phing/properties.dist @@ -78,7 +78,5 @@ tests.database = ${dir.data.temporary}/database.sqlite # Paths of frameworks used to run tests: # - PHPUnit (unit tests) -# - Infection (mutation tests) # tests.phpunit.command = ./vendor/bin/phpunit --verbose --no-coverage -tests.mutation.command = ./vendor/bin/infection --threads=5 diff --git a/phing/tests.xml b/phing/tests.xml index 3797ae5..92f6190 100644 --- a/phing/tests.xml +++ b/phing/tests.xml @@ -51,8 +51,7 @@ @@ -104,11 +103,6 @@ - - - - - From 61209e3f6734b024b2aa6993545adc45e3444a5a Mon Sep 17 00:00:00 2001 From: Meritoo Date: Sun, 28 Oct 2018 00:09:29 +0200 Subject: [PATCH 17/41] Documentation > Development > add commands based on Phing & update whole document --- docs/Development.md | 64 ++++++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/docs/Development.md b/docs/Development.md index f8165a8..7f60fb0 100644 --- a/docs/Development.md +++ b/docs/Development.md @@ -15,11 +15,11 @@ Development-related information docker-compose up -d ``` -2. Install packages by running command: +2. Rebuild project by running command (installs packages, prepares required directories and runs tests): - ```bash - docker-compose run composer install - ``` + ```bash + docker-compose exec php phing + ``` > [What is Docker?](https://www.docker.com/what-docker) @@ -28,7 +28,7 @@ Development-related information Available as `composer` service. You can run any Composer's command using the `composer` service: ```bash -docker-compose run composer +docker-compose run --rm composer [command] ``` Examples below. @@ -36,25 +36,25 @@ Examples below. ##### Install packages ```bash -docker-compose run composer install +docker-compose run --rm composer install ``` ##### Update packages ```bash -docker-compose run composer update +docker-compose run --rm composer update ``` ##### Add package ```bash -docker-compose run composer require / +docker-compose run --rm composer require [vendor]/[package] ``` ##### Remove package ```bash -docker-compose run composer remove / +docker-compose run --rm composer remove [vendor]/[package] ``` # Coding Standards Fixer @@ -65,6 +65,12 @@ Fix coding standard by running command: docker-compose exec php php-cs-fixer fix ``` +or + +```bash +docker-compose exec php phing -f phing/tests.xml build:fix-coding-standards +``` + Omit cache and run the Fixer from scratch by running command: ```bash @@ -77,37 +83,35 @@ docker-compose exec php rm .php_cs.cache && docker-compose exec php php-cs-fixer ### Prerequisites -Install required packages by running command: `docker-compose run composer install`. +Install required packages by running command: `docker-compose run --rm composer install`. -### Running tests +### Running [PHPUnit](https://phpunit.de) tests -#### Simply & quick, without code coverage - -Tests are running using Docker and `php` service defined in `docker-compose.yml`. Example: +##### Easy (with code coverage) ```bash -docker-compose exec php phpunit --no-coverage +docker-compose run --rm phpunit --verbose ``` -You can also run them in container. In this case you have to run 2 commands: -1. Enter container: - - ```bash - docker-compose exec php bash - ``` - -2. Run tests: - - ```bash - phpunit --no-coverage - ``` - -#### With code coverage +or ```bash -docker-compose exec php phpunit +docker-compose exec php phing -f phing/tests.xml test:phpunit ``` +##### Quick (without code coverage) + +```bash +docker-compose run --rm phpunit --verbose --no-coverage +``` + +# Versions of packages + +### squizlabs/php_codesniffer + +I have to use [squizlabs/php_codesniffer](https://packagist.org/packages/squizlabs/php_codesniffer) `^2.9` instead of +`^3.3`, because [Phing doesn't support 3.x PHP_CodeSniffer](https://github.com/phingofficial/phing/issues/716). + # Other Rebuild project and run tests by running command: From 3c3d1b997ee0011e043c9b4469f9afaea31a612a Mon Sep 17 00:00:00 2001 From: Meritoo Date: Sun, 28 Oct 2018 00:10:42 +0200 Subject: [PATCH 18/41] Docker > docker-compose.yml > add "phpunit" service > used to run PHPUnit's tests --- CHANGELOG.md | 1 + docker-compose.yml | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9484473..55f381d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Common and useful classes, methods, exceptions etc. 1. Phing > update configuration 2. Utilities > Date > update descriptions of methods +3. Docker > docker-compose.yml > add "phpunit" service > used to run PHPUnit's tests # 0.1.3 diff --git a/docker-compose.yml b/docker-compose.yml index b4c7404..6224f02 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,9 @@ version: '3' services: + # + # Required to run project + # php: image: ${DOCKER_CONTAINER_OWNER}/${DOCKER_CONTAINER_PROJECT}-php container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-php @@ -18,3 +21,13 @@ services: entrypoint: php -d memory_limit=-1 /usr/local/bin/composer volumes: - .:/project:cached + # + # Required to run PHPUnit's tests + # + phpunit: + image: ${DOCKER_CONTAINER_OWNER}/${DOCKER_CONTAINER_PROJECT}-php + container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-phpunit + entrypoint: ./vendor/bin/phpunit + command: --version + volumes: + - .:/project:cached From c8fc0b14ff7d76014e7364f093108845f7ca3a16 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Sun, 28 Oct 2018 00:12:18 +0200 Subject: [PATCH 19/41] Exceptions > UnknownTypeException > remove duplicated and unnecessary sprintf() call > sprintf(sprintf()) --- src/Exception/Base/UnknownTypeException.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Exception/Base/UnknownTypeException.php b/src/Exception/Base/UnknownTypeException.php index 8377059..43abda2 100644 --- a/src/Exception/Base/UnknownTypeException.php +++ b/src/Exception/Base/UnknownTypeException.php @@ -35,7 +35,7 @@ abstract class UnknownTypeException extends Exception $allTypes = $typeInstance->getAll(); $types = Arrays::values2string($allTypes, '', ', '); - $message = sprintf(sprintf($template, $unknownType, $typeName, $types)); + $message = sprintf($template, $unknownType, $typeName, $types); return new static($message); } From c82f53219eefa2e1c9df2a8558eb1748913afe91 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Mon, 29 Oct 2018 08:31:38 +0100 Subject: [PATCH 20/41] Phing > PHPUnit > run with code coverage (to get all reports) --- phing/properties.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phing/properties.dist b/phing/properties.dist index 624b5fc..bcb2fb5 100644 --- a/phing/properties.dist +++ b/phing/properties.dist @@ -79,4 +79,4 @@ tests.database = ${dir.data.temporary}/database.sqlite # Paths of frameworks used to run tests: # - PHPUnit (unit tests) # -tests.phpunit.command = ./vendor/bin/phpunit --verbose --no-coverage +tests.phpunit.command = ./vendor/bin/phpunit --verbose From b4ccbbac11194053140fc1c0a091e511a0547038 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Sat, 3 Nov 2018 08:10:03 +0100 Subject: [PATCH 21/41] Utilities > Date > update descriptions of methods --- src/Utilities/Date.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Utilities/Date.php b/src/Utilities/Date.php index 3b296b7..99293eb 100644 --- a/src/Utilities/Date.php +++ b/src/Utilities/Date.php @@ -572,10 +572,11 @@ class Date * @param mixed $value The value which maybe is a date * @param bool $allowCompoundFormats (optional) If is set to true, the compound formats used to create an * instance of DateTime class are allowed (e.g. "now", "last day of next - * month", "yyyy"). Otherwise - not and every incorrect value is refused. + * month", "yyyy"). Otherwise - not and every incorrect value is refused + * (default behaviour). * @param string $dateFormat (optional) Format of date used to verify if given value is actually a date. * It should be format matched to the given value, e.g. "Y-m-d H:i" for - * "2015-01-01 10:00" value. + * "2015-01-01 10:00" value. Default: "Y-m-d". * @return DateTime|bool */ public static function getDateTime($value, $allowCompoundFormats = false, $dateFormat = 'Y-m-d') From 4e600ec599509a105687a3b55f84f31027436248 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Sat, 3 Nov 2018 08:16:49 +0100 Subject: [PATCH 22/41] Utilities > Reflection > setPropertyValue() method > fix description and test --- src/Utilities/Reflection.php | 2 +- tests/Utilities/ReflectionTest.php | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Utilities/Reflection.php b/src/Utilities/Reflection.php index b03a0bd..e45ad09 100644 --- a/src/Utilities/Reflection.php +++ b/src/Utilities/Reflection.php @@ -662,7 +662,7 @@ class Reflection } /** - * Sets value of given property + * Sets value of given property in given object * * @param mixed $object Object that should contains given property * @param string $property Name of the property diff --git a/tests/Utilities/ReflectionTest.php b/tests/Utilities/ReflectionTest.php index 69ce170..3a178a6 100644 --- a/tests/Utilities/ReflectionTest.php +++ b/tests/Utilities/ReflectionTest.php @@ -484,9 +484,7 @@ class ReflectionTest extends BaseTestCase public function testSetPropertyValueUsingNotExistingProperty($object, $property) { $this->setExpectedException(NotExistingPropertyException::class); - - $object = new \stdClass(); - Reflection::setPropertyValue($object, 'test', 'test test test'); + Reflection::setPropertyValue($object, $property, 'test test test'); } /** From 06fbf63e09cce61a4af3721766503926e0ddf8ba Mon Sep 17 00:00:00 2001 From: Meritoo Date: Sat, 3 Nov 2018 08:19:57 +0100 Subject: [PATCH 23/41] Tests > refactoring --- src/Traits/Test/Base/BaseTestCaseTrait.php | 13 ++++--- tests/Utilities/ReflectionTest.php | 43 ++++++++++++++++------ 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/Traits/Test/Base/BaseTestCaseTrait.php b/src/Traits/Test/Base/BaseTestCaseTrait.php index 7c4caea..74eea20 100644 --- a/src/Traits/Test/Base/BaseTestCaseTrait.php +++ b/src/Traits/Test/Base/BaseTestCaseTrait.php @@ -14,7 +14,6 @@ use Meritoo\Common\Exception\Type\UnknownOopVisibilityTypeException; use Meritoo\Common\Type\OopVisibilityType; use Meritoo\Common\Utilities\Miscellaneous; use ReflectionClass; -use ReflectionException; use ReflectionMethod; use stdClass; @@ -172,7 +171,6 @@ trait BaseTestCaseTrait * @param int $requiredArgumentsCount (optional) Expected count/amount of required arguments * of the verified method * @throws UnknownOopVisibilityTypeException - * @throws ReflectionException * * Attention. 2nd argument, the $method, may be: * - string - name of the method @@ -229,8 +227,6 @@ trait BaseTestCaseTrait * @param int $argumentsCount (optional) Expected count/amount of arguments of the verified method * @param int $requiredArgumentsCount (optional) Expected count/amount of required arguments of the verified * method - * @throws ReflectionException - * @throws UnknownOopVisibilityTypeException */ protected static function assertConstructorVisibilityAndArguments( $classNamespace, @@ -244,14 +240,19 @@ trait BaseTestCaseTrait $reflection = new ReflectionClass($classNamespace); $method = $reflection->getConstructor(); - static::assertMethodVisibilityAndArguments($classNamespace, $method, $visibilityType, $argumentsCount, $requiredArgumentsCount); + 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 - * @throws ReflectionException */ protected static function assertHasNoConstructor($classNamespace) { diff --git a/tests/Utilities/ReflectionTest.php b/tests/Utilities/ReflectionTest.php index 3a178a6..660da65 100644 --- a/tests/Utilities/ReflectionTest.php +++ b/tests/Utilities/ReflectionTest.php @@ -82,8 +82,15 @@ class ReflectionTest extends BaseTestCase * Class with namespace containing name of class (duplicated string) */ if (class_exists('Symfony\Bundle\SecurityBundle\SecurityBundle')) { - self::assertEquals('Symfony\Bundle\SecurityBundle\SecurityBundle', Reflection::getClassName('Symfony\Bundle\SecurityBundle\SecurityBundle')); - self::assertEquals('SecurityBundle', Reflection::getClassName('Symfony\Bundle\SecurityBundle\SecurityBundle', true)); + self::assertEquals( + 'Symfony\Bundle\SecurityBundle\SecurityBundle', + Reflection::getClassName('Symfony\Bundle\SecurityBundle\SecurityBundle') + ); + + self::assertEquals( + 'SecurityBundle', + Reflection::getClassName('Symfony\Bundle\SecurityBundle\SecurityBundle', true) + ); } } @@ -115,7 +122,10 @@ class ReflectionTest extends BaseTestCase * Class with namespace containing name of class (duplicated string) */ if (class_exists('Symfony\Bundle\SecurityBundle\SecurityBundle')) { - self::assertEquals('Symfony\Bundle\SecurityBundle', Reflection::getClassNamespace('Symfony\Bundle\SecurityBundle\SecurityBundle')); + self::assertEquals( + 'Symfony\Bundle\SecurityBundle', + Reflection::getClassNamespace('Symfony\Bundle\SecurityBundle\SecurityBundle') + ); } } @@ -183,11 +193,11 @@ class ReflectionTest extends BaseTestCase public function testGetMethods() { - self::assertEquals(1, count(Reflection::getMethods(B::class, true))); - self::assertEquals(3, count(Reflection::getMethods(B::class))); - self::assertEquals(2, count(Reflection::getMethods(A::class))); - self::assertEquals(2, count(Reflection::getMethods(C::class, true))); - self::assertEquals(5, count(Reflection::getMethods(C::class))); + self::assertCount(1, Reflection::getMethods(B::class, true)); + self::assertCount(3, Reflection::getMethods(B::class)); + self::assertCount(2, Reflection::getMethods(A::class)); + self::assertCount(2, Reflection::getMethods(C::class, true)); + self::assertCount(5, Reflection::getMethods(C::class)); } /** @@ -235,9 +245,20 @@ class ReflectionTest extends BaseTestCase public function testGetPropertiesUsingFilter() { - self::assertCount(1, Reflection::getProperties(B::class, ReflectionProperty::IS_PROTECTED)); - self::assertCount(0, Reflection::getProperties(B::class, ReflectionProperty::IS_PRIVATE)); - self::assertCount(1, Reflection::getProperties(B::class, ReflectionProperty::IS_PRIVATE, true)); + self::assertCount( + 1, + Reflection::getProperties(B::class, ReflectionProperty::IS_PROTECTED) + ); + + self::assertCount( + 0, + Reflection::getProperties(B::class, ReflectionProperty::IS_PRIVATE) + ); + + self::assertCount( + 1, + Reflection::getProperties(B::class, ReflectionProperty::IS_PRIVATE, true) + ); } public function testGetPropertiesWithParents() From 8e9dcb32069583a5f5f43de80433947835ba8368 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Sat, 3 Nov 2018 08:51:22 +0100 Subject: [PATCH 24/41] Reflection > setPropertiesValues() method > sets values of properties in given object --- src/Utilities/Reflection.php | 21 +++++ tests/Utilities/ReflectionTest.php | 137 +++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+) diff --git a/src/Utilities/Reflection.php b/src/Utilities/Reflection.php index e45ad09..c3fbafe 100644 --- a/src/Utilities/Reflection.php +++ b/src/Utilities/Reflection.php @@ -692,4 +692,25 @@ class Reflection $reflectionProperty->setAccessible(false); } } + + /** + * Sets values of properties in given object + * + * @param mixed $object Object that should contains given property + * @param array $propertiesValues Key-value pairs, where key - name of the property, value - value of the property + */ + public static function setPropertiesValues($object, array $propertiesValues) + { + /* + * No properties? + * Nothing to do + */ + if (empty($propertiesValues)) { + return; + } + + foreach ($propertiesValues as $property => $value) { + static::setPropertyValue($object, $property, $value); + } + } } diff --git a/tests/Utilities/ReflectionTest.php b/tests/Utilities/ReflectionTest.php index 660da65..8763716 100644 --- a/tests/Utilities/ReflectionTest.php +++ b/tests/Utilities/ReflectionTest.php @@ -525,6 +525,43 @@ class ReflectionTest extends BaseTestCase static::assertSame($newValue, $value); } + public function testSetPropertiesValuesWithoutProperties() + { + $object = new G(); + Reflection::setPropertiesValues($object, []); + + static::assertSame($object->getFirstName(), 'John'); + static::assertSame($object->getLastName(), 'Scott'); + } + + /** + * @param mixed $object Object that should contains given property + * @param array $propertiesValues Key-value pairs, where key - name of the property, value - value of the property + * + * @dataProvider provideObjectAndNotExistingProperties + */ + public function testSetPropertiesValuesUsingNotExistingProperties($object, array $propertiesValues) + { + $this->setExpectedException(NotExistingPropertyException::class); + Reflection::setPropertiesValues($object, $propertiesValues); + } + + /** + * @param mixed $object Object that should contains given property + * @param array $propertiesValues Key-value pairs, where key - name of the property, value - value of the property + * + * @dataProvider provideObjectAndPropertiesValues + */ + public function testSetPropertiesValues($object, array $propertiesValues) + { + Reflection::setPropertiesValues($object, $propertiesValues); + + foreach ($propertiesValues as $property => $value) { + $realValue = Reflection::getPropertyValue($object, $property); + static::assertSame($value, $realValue); + } + } + /** * Provides invalid class and trait * @@ -607,4 +644,104 @@ class ReflectionTest extends BaseTestCase 'Smith', ]; } + + /** + * Provides object and not existing properties + * + * @return Generator + */ + public function provideObjectAndNotExistingProperties() + { + yield[ + new \stdClass(), + [ + 'test' => 1, + ], + ]; + + yield[ + new A(), + [ + 'test' => 2, + ], + ]; + + yield[ + new B(), + [ + 'firstName' => '', + ], + ]; + } + + /** + * Provides object and its new values of properties + * + * @return Generator + */ + public function provideObjectAndPropertiesValues() + { + yield[ + new A(), + [ + 'count' => 123, + ], + ]; + + yield[ + new B(), + [ + 'name' => 'test test', + ], + ]; + + yield[ + new G(), + [ + 'firstName' => 'Jane', + ], + ]; + + yield[ + new G(), + [ + 'lastName' => 'Smith', + ], + ]; + + yield[ + new G(), + [ + 'firstName' => 'Jane', + 'lastName' => 'Brown', + ], + ]; + + yield[ + new F( + 123, + 'New York', + 'USA', + 'UnKnown' + ), + [ + 'gInstance' => new G(), + ], + ]; + + yield[ + new F( + 123, + 'New York', + 'USA', + 'UnKnown', + 'Mary', + 'Brown' + ), + [ + 'country' => 'Canada', + 'accountBalance' => 456, + ], + ]; + } } From ec5129ad6bb17b83ce4db9195d039b2af6875f08 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Fri, 9 Nov 2018 21:32:38 +0100 Subject: [PATCH 25/41] Tests > Date > more test cases --- CHANGELOG.md | 4 + VERSION | 2 +- tests/Utilities/DateTest.php | 154 +++++++++++++++++++++++++++++++++++ 3 files changed, 159 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7dca1b4..b7444e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ Common and useful classes, methods, exceptions etc. +# 0.1.5 + +1. Tests > Date > one more test case + # 0.1.4 1. Phing > update configuration diff --git a/VERSION b/VERSION index 845639e..9faa1b7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.4 +0.1.5 diff --git a/tests/Utilities/DateTest.php b/tests/Utilities/DateTest.php index bcf9cd6..94a7813 100644 --- a/tests/Utilities/DateTest.php +++ b/tests/Utilities/DateTest.php @@ -279,9 +279,18 @@ class DateTest extends BaseTestCase self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_YEARS)); self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_YEARS)); + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MONTHS)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MONTHS)); + self::assertEquals(1, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_DAYS)); self::assertEquals(1, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_DAYS)); + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_HOURS)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_HOURS)); + + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MINUTES)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MINUTES)); + /* * Difference of 1 day (using the relative date format) */ @@ -294,8 +303,10 @@ class DateTest extends BaseTestCase ]; self::assertEquals($effect, Date::getDateDifference(new DateTime('yesterday'), new DateTime('midnight'))); + self::assertEquals(0, Date::getDateDifference(new DateTime('yesterday'), new DateTime('midnight'), Date::DATE_DIFFERENCE_UNIT_MONTHS)); self::assertEquals(1, Date::getDateDifference(new DateTime('yesterday'), new DateTime('midnight'), Date::DATE_DIFFERENCE_UNIT_DAYS)); self::assertEquals(0, Date::getDateDifference(new DateTime('yesterday'), new DateTime('midnight'), Date::DATE_DIFFERENCE_UNIT_HOURS)); + self::assertEquals(0, Date::getDateDifference(new DateTime('yesterday'), new DateTime('midnight'), Date::DATE_DIFFERENCE_UNIT_MINUTES)); } public function testGetDateDifferenceOneDayTwoHours() @@ -320,6 +331,12 @@ class DateTest extends BaseTestCase self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_YEARS)); self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_YEARS)); + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MONTHS)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MONTHS)); + + self::assertEquals(1, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_DAYS)); + self::assertEquals(1, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_DAYS)); + self::assertEquals(2, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_HOURS)); self::assertEquals(2, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_HOURS)); @@ -355,10 +372,141 @@ class DateTest extends BaseTestCase self::assertEquals(41, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_DAYS)); self::assertEquals(41, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_DAYS)); + self::assertEquals(4, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_HOURS)); + self::assertEquals(4, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_HOURS)); + self::assertEquals(30, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MINUTES)); self::assertEquals(30, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MINUTES)); } + public function testGetDateDifferenceNewYear() + { + $dateStart = '2017-12-31 23:59'; + $dateEnd = '2018-01-01 00:00'; + + $effect = [ + Date::DATE_DIFFERENCE_UNIT_YEARS => 0, + Date::DATE_DIFFERENCE_UNIT_MONTHS => 0, + Date::DATE_DIFFERENCE_UNIT_DAYS => 0, + Date::DATE_DIFFERENCE_UNIT_HOURS => 0, + Date::DATE_DIFFERENCE_UNIT_MINUTES => 1, + ]; + + self::assertEquals($effect, Date::getDateDifference($dateStart, $dateEnd)); + self::assertEquals($effect, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd))); + + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_YEARS)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_YEARS)); + + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MONTHS)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MONTHS)); + + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_DAYS)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_DAYS)); + + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_HOURS)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_HOURS)); + + self::assertEquals(1, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MINUTES)); + self::assertEquals(1, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MINUTES)); + } + + public function testGetDateDifferenceLessThan24Hours() + { + $dateStart = '2017-01-01 16:00'; + $dateEnd = '2017-01-02 10:00'; + + $effect = [ + Date::DATE_DIFFERENCE_UNIT_YEARS => 0, + Date::DATE_DIFFERENCE_UNIT_MONTHS => 0, + Date::DATE_DIFFERENCE_UNIT_DAYS => 0, + Date::DATE_DIFFERENCE_UNIT_HOURS => 18, + Date::DATE_DIFFERENCE_UNIT_MINUTES => 0, + ]; + + self::assertEquals($effect, Date::getDateDifference($dateStart, $dateEnd)); + self::assertEquals($effect, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd))); + + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_YEARS)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_YEARS)); + + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MONTHS)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MONTHS)); + + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_DAYS)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_DAYS)); + + self::assertEquals(18, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_HOURS)); + self::assertEquals(18, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_HOURS)); + + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MINUTES)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MINUTES)); + } + + public function testGetDateDifferenceEqual24Hours() + { + $dateStart = '2017-01-01 00:00'; + $dateEnd = '2017-01-02 00:00'; + + $effect = [ + Date::DATE_DIFFERENCE_UNIT_YEARS => 0, + Date::DATE_DIFFERENCE_UNIT_MONTHS => 0, + Date::DATE_DIFFERENCE_UNIT_DAYS => 1, + Date::DATE_DIFFERENCE_UNIT_HOURS => 0, + Date::DATE_DIFFERENCE_UNIT_MINUTES => 0, + ]; + + self::assertEquals($effect, Date::getDateDifference($dateStart, $dateEnd)); + self::assertEquals($effect, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd))); + + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_YEARS)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_YEARS)); + + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MONTHS)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MONTHS)); + + self::assertEquals(1, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_DAYS)); + self::assertEquals(1, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_DAYS)); + + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_HOURS)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_HOURS)); + + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MINUTES)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MINUTES)); + } + + public function testGetDateDifferenceInvertedDates() + { + $dateStart = '2017-01-02 10:00'; + $dateEnd = '2017-01-01 16:00'; + + $effect = [ + Date::DATE_DIFFERENCE_UNIT_YEARS => 0, + Date::DATE_DIFFERENCE_UNIT_MONTHS => 0, + Date::DATE_DIFFERENCE_UNIT_DAYS => -1, + Date::DATE_DIFFERENCE_UNIT_HOURS => 6, + Date::DATE_DIFFERENCE_UNIT_MINUTES => 0, + ]; + + self::assertEquals($effect, Date::getDateDifference($dateStart, $dateEnd)); + self::assertEquals($effect, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd))); + + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_YEARS)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_YEARS)); + + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MONTHS)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MONTHS)); + + self::assertEquals(-1, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_DAYS)); + self::assertEquals(-1, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_DAYS)); + + self::assertEquals(6, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_HOURS)); + self::assertEquals(6, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_HOURS)); + + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MINUTES)); + self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MINUTES)); + } + public function testGetDateDifferenceNoDifference() { /* @@ -384,6 +532,12 @@ class DateTest extends BaseTestCase self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MONTHS)); self::assertEquals(0, Date::getDateDifference(new DateTime(), new DateTime(), Date::DATE_DIFFERENCE_UNIT_MONTHS)); + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_DAYS)); + self::assertEquals(0, Date::getDateDifference(new DateTime(), new DateTime(), Date::DATE_DIFFERENCE_UNIT_DAYS)); + + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_HOURS)); + self::assertEquals(0, Date::getDateDifference(new DateTime(), new DateTime(), Date::DATE_DIFFERENCE_UNIT_HOURS)); + self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MINUTES)); self::assertEquals(0, Date::getDateDifference(new DateTime(), new DateTime(), Date::DATE_DIFFERENCE_UNIT_MINUTES)); } From 7233fdac52a648ddf6ad00e7340fa2f2c0aa47dc Mon Sep 17 00:00:00 2001 From: Meritoo Date: Sun, 27 Jan 2019 14:54:02 +0100 Subject: [PATCH 26/41] Phing > update configuration --- phing/composer-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phing/composer-install.sh b/phing/composer-install.sh index 1a951a2..1d8d259 100644 --- a/phing/composer-install.sh +++ b/phing/composer-install.sh @@ -7,7 +7,7 @@ EXPECTED_SIGNATURE="$(curl -L https://composer.github.io/installer.sig)" php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" ACTUAL_SIGNATURE="$(php -r "echo hash_file('SHA384', 'composer-setup.php');")" -if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ] +if [[ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ]] then >&2 echo 'ERROR: Invalid installer signature' rm composer-setup.php @@ -17,4 +17,4 @@ fi php composer-setup.php --quiet RESULT=$? rm composer-setup.php -exit $RESULT +exit ${RESULT} From b879dbd8039daaf901cb05b020c021a209be614d Mon Sep 17 00:00:00 2001 From: Meritoo Date: Sun, 27 Jan 2019 14:54:20 +0100 Subject: [PATCH 27/41] .gitignore > minor update --- .gitignore | 48 +++++++++++++++--------------------------------- 1 file changed, 15 insertions(+), 33 deletions(-) diff --git a/.gitignore b/.gitignore index 8f1b748..cb92a06 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ # ------------------------------------------------------------------------------ -# Environment-related parameters +### Environment-related parameters # ------------------------------------------------------------------------------ .env @@ -51,42 +51,15 @@ # ------------------------------------------------------------------------------ -### Compiled source -# ------------------------------------------------------------------------------ -*.com -*.class -*.dll -*.exe -*.o -*.so - - -# ------------------------------------------------------------------------------ -### Shell scripts -# ------------------------------------------------------------------------------ -/*.sh - - -# ------------------------------------------------------------------------------ -### JetBrains +### JetBrains template # ------------------------------------------------------------------------------ /.idea # ------------------------------------------------------------------------------ -### NetBeans template -# ------------------------------------------------------------------------------ -nbproject/private/ -nbbuild/ -dist/ -nbdist/ -nbactions.xml -.nb-gradle/ - - -# ------------------------------------------------------------------------------ -### OSX template +### macOS template # ------------------------------------------------------------------------------ +# General .DS_Store .AppleDouble .LSOverride @@ -104,6 +77,7 @@ Icon .TemporaryItems .Trashes .VolumeIcon.icns +.com.apple.timemachine.donotpresent # Directories potentially created on remote AFP share .AppleDB @@ -127,16 +101,23 @@ Temporary Items # Linux trash folder which might appear on any partition or disk .Trash-* +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + # ------------------------------------------------------------------------------ ### Windows template # ------------------------------------------------------------------------------ -# Windows image file caches +# Windows thumbnail cache files Thumbs.db ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump # Folder config file -Desktop.ini +[Dd]esktop.ini # Recycle Bin used on file shares $RECYCLE.BIN/ @@ -144,6 +125,7 @@ $RECYCLE.BIN/ # Windows Installer files *.cab *.msi +*.msix *.msm *.msp From 4391baed3dbae0afacbe0c75f20b61ff541da085 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Mon, 4 Feb 2019 22:43:07 +0100 Subject: [PATCH 28/41] Fix "Argument 3 of Meritoo\Common\Utilities\Date::getDateDifference expects int|null, string(days) provided" bug --- src/Utilities/Date.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Utilities/Date.php b/src/Utilities/Date.php index 99293eb..a9b00c9 100644 --- a/src/Utilities/Date.php +++ b/src/Utilities/Date.php @@ -349,7 +349,7 @@ class Date * * @param string|DateTime $dateStart The start date * @param string|DateTime $dateEnd The end date - * @param int $differenceUnit (optional) Unit of date difference. One of this class + * @param string $differenceUnit (optional) Unit of date difference. One of this class * DATE_DIFFERENCE_UNIT_* constants. If is set to null all units are * returned in the array. * @return array|int From aa93cd8e251e18d653bbac5b0a6cb92edaad6213 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Thu, 21 Feb 2019 16:50:20 +0100 Subject: [PATCH 29/41] Tests > Regex > remove unnecessary @throws tags --- tests/Utilities/RegexTest.php | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/tests/Utilities/RegexTest.php b/tests/Utilities/RegexTest.php index 8ecea57..de38372 100644 --- a/tests/Utilities/RegexTest.php +++ b/tests/Utilities/RegexTest.php @@ -12,7 +12,6 @@ use Generator; use Meritoo\Common\Exception\Regex\IncorrectColorHexLengthException; use Meritoo\Common\Exception\Regex\InvalidColorHexValueException; use Meritoo\Common\Test\Base\BaseTestCase; -use ReflectionException; /** * Test case of the useful regular expressions methods @@ -25,9 +24,6 @@ class RegexTest extends BaseTestCase private $simpleText; private $camelCaseText; - /** - * @throws ReflectionException - */ public function testConstructor() { static::assertHasNoConstructor(Regex::class); @@ -553,10 +549,6 @@ class RegexTest extends BaseTestCase /** * @param mixed $nonScalarValue Non scalar value, e.g. [] or null - * - * @throws IncorrectColorHexLengthException - * @throws InvalidColorHexValueException - * * @dataProvider provideNonScalarValue */ public function testGetValidColorHexValueUsingNonScalarValue($nonScalarValue) @@ -566,10 +558,6 @@ class RegexTest extends BaseTestCase /** * @param mixed $emptyValue Empty value, e.g. "" - * - * @throws IncorrectColorHexLengthException - * @throws InvalidColorHexValueException - * * @dataProvider provideColorEmptyValue */ public function testGetValidColorHexValueUsingEmptyValueWithoutException($emptyValue) @@ -579,10 +567,6 @@ class RegexTest extends BaseTestCase /** * @param mixed $emptyValue Empty value, e.g. "" - * - * @throws IncorrectColorHexLengthException - * @throws InvalidColorHexValueException - * * @dataProvider provideColorEmptyValue */ public function testGetValidColorHexValueUsingEmptyValue($emptyValue) @@ -593,10 +577,6 @@ class RegexTest extends BaseTestCase /** * @param string $incorrectColor Incorrect value of color - * - * @throws IncorrectColorHexLengthException - * @throws InvalidColorHexValueException - * * @dataProvider provideColorIncorrectLength */ public function testGetValidColorHexValueUsingIncorrectValueWithoutException($incorrectColor) @@ -606,10 +586,6 @@ class RegexTest extends BaseTestCase /** * @param string $incorrectColor Incorrect value of color - * - * @throws IncorrectColorHexLengthException - * @throws InvalidColorHexValueException - * * @dataProvider provideColorIncorrectLength */ public function testGetValidColorHexValueUsingIncorrectValue($incorrectColor) @@ -620,10 +596,6 @@ class RegexTest extends BaseTestCase /** * @param string $invalidColor Invalid value of color - * - * @throws IncorrectColorHexLengthException - * @throws InvalidColorHexValueException - * * @dataProvider provideColorInvalidValue */ public function testGetValidColorHexValueUsingInvalidValueWithoutException($invalidColor) @@ -633,10 +605,6 @@ class RegexTest extends BaseTestCase /** * @param string $invalidColor Invalid value of color - * - * @throws IncorrectColorHexLengthException - * @throws InvalidColorHexValueException - * * @dataProvider provideColorInvalidValue */ public function testGetValidColorHexValueUsingInvalidValue($invalidColor) @@ -649,9 +617,6 @@ class RegexTest extends BaseTestCase * @param string $color Color to verify * @param string $expected Expected value of color * - * @throws IncorrectColorHexLengthException - * @throws InvalidColorHexValueException - * * @dataProvider provideColor */ public function testGetValidColorHexValue($color, $expected) From 22c96f0a18603fbc80a55ee74e993e150a61a138 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Thu, 21 Feb 2019 16:51:18 +0100 Subject: [PATCH 30/41] Tests > Regex > fix "The mode is not binary-safe ('b' is missing)" bug --- tests/Utilities/RegexTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Utilities/RegexTest.php b/tests/Utilities/RegexTest.php index de38372..efaa3e7 100644 --- a/tests/Utilities/RegexTest.php +++ b/tests/Utilities/RegexTest.php @@ -799,12 +799,12 @@ class RegexTest extends BaseTestCase ]; yield[ - fread(fopen($file1Path, 'r'), 1), + fread(fopen($file1Path, 'rb'), 1), false, ]; yield[ - fread(fopen($file2Path, 'r'), 1), + fread(fopen($file2Path, 'rb'), 1), true, ]; } From 8c3c85608a26e1717e53558bbf231a04030ed95f Mon Sep 17 00:00:00 2001 From: Meritoo Date: Thu, 21 Feb 2019 16:54:06 +0100 Subject: [PATCH 31/41] Tests > Regex > minor update --- tests/Utilities/RegexTest.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/Utilities/RegexTest.php b/tests/Utilities/RegexTest.php index efaa3e7..a672d83 100644 --- a/tests/Utilities/RegexTest.php +++ b/tests/Utilities/RegexTest.php @@ -1702,7 +1702,8 @@ class RegexTest extends BaseTestCase parent::setUp(); $this->simpleText = 'lorem ipsum dolor sit'; - $this->camelCaseText = str_replace(' ', '', lcfirst(ucwords($this->simpleText))); // 'loremIpsumDolorSit' + $simpleUppercase = ucwords($this->simpleText); + $this->camelCaseText = str_replace(' ', '', lcfirst($simpleUppercase)); // 'loremIpsumDolorSit' } /** @@ -1711,8 +1712,6 @@ class RegexTest extends BaseTestCase protected function tearDown() { parent::tearDown(); - - unset($this->simpleText); - unset($this->camelCaseText); + unset($this->simpleText, $this->camelCaseText); } } From 651c4f2259b65d13d58448ef08f919555b3990b4 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Thu, 21 Feb 2019 21:27:50 +0100 Subject: [PATCH 32/41] Minor refactoring --- composer.json | 4 + src/Collection/Collection.php | 7 +- .../Method/DisabledMethodException.php | 6 +- src/Utilities/Arrays.php | 172 +++++++++--------- src/Utilities/Date.php | 12 +- src/Utilities/Locale.php | 2 +- src/Utilities/MimeTypes.php | 4 +- src/Utilities/QueryBuilderUtility.php | 10 +- src/Utilities/Regex.php | 35 ++-- src/Utilities/Uri.php | 2 +- src/Utilities/Xml.php | 2 +- 11 files changed, 126 insertions(+), 130 deletions(-) diff --git a/composer.json b/composer.json index 64b256f..1206a5a 100644 --- a/composer.json +++ b/composer.json @@ -10,6 +10,10 @@ } ], "require": { + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-json": "*", + "ext-simplexml": "*", "php": ">=5.6", "ext-intl": "*", "ext-pcre": "*", diff --git a/src/Collection/Collection.php b/src/Collection/Collection.php index ed27103..ebc3f42 100644 --- a/src/Collection/Collection.php +++ b/src/Collection/Collection.php @@ -130,11 +130,12 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate { if (!empty($elements)) { foreach ($elements as $index => $element) { - if (!$useIndexes) { - $index = null; + if ($useIndexes) { + $this->add($element, $index); + continue; } - $this->add($element, $index); + $this->add($element); } } diff --git a/src/Exception/Method/DisabledMethodException.php b/src/Exception/Method/DisabledMethodException.php index fd0ac7b..dc06e44 100644 --- a/src/Exception/Method/DisabledMethodException.php +++ b/src/Exception/Method/DisabledMethodException.php @@ -28,13 +28,13 @@ class DisabledMethodException extends Exception public static function create($disabledMethod, $alternativeMethod = '') { $template = 'Method %s() cannot be called, because is disabled.'; + $message = sprintf($template, $disabledMethod); if (!empty($alternativeMethod)) { - $template .= ' Use %s() instead.'; + $template = '%s Use %s() instead.'; + $message = sprintf($template, $message, $alternativeMethod); } - $message = sprintf($template, $disabledMethod, $alternativeMethod); - return new static($message); } } diff --git a/src/Utilities/Arrays.php b/src/Utilities/Arrays.php index dca7434..3df6daa 100644 --- a/src/Utilities/Arrays.php +++ b/src/Utilities/Arrays.php @@ -48,12 +48,10 @@ class Arrays if (is_array($value)) { $effect .= self::values2string($value, $arrayColumnKey, $separator); - } else { - if (empty($arrayColumnKey)) { - $effect .= $value; - } elseif ($key === $arrayColumnKey) { - $effect .= $array[$arrayColumnKey]; - } + } elseif (empty($arrayColumnKey)) { + $effect .= $value; + } elseif ($key === $arrayColumnKey) { + $effect .= $array[$arrayColumnKey]; } } } @@ -111,8 +109,8 @@ class Arrays */ if (is_array($row) && !empty($row)) { - foreach ($row as &$value) { - $value = html_entity_decode($value); + foreach ($row as $key => $value) { + $row[$key] = html_entity_decode($value); } $rows[] = implode($separator, $row); @@ -363,7 +361,7 @@ class Arrays * Name of the variable was not provided and it's a multi dimensional array? * Let's create the name, because variable is required for later usage (related to multi dimensional array) */ - if (self::isMultiDimensional($array) && empty($jsVariableName)) { + if (empty($jsVariableName) && $isMultiDimensional) { $jsVariableName = 'autoGeneratedVariable'; } @@ -384,13 +382,13 @@ class Arrays if (is_array($value)) { $variable = $index; - if (is_integer($index)) { + if (is_int($index)) { $variable = 'value_' . $variable; } $value = self::array2JavaScript($value, $variable, $preserveIndexes); - if (!empty($value)) { + if (null !== $value && '' !== $value) { /* * Add an empty line for the 1st iteration only. Required to avoid missing empty line after * declaration of variable: @@ -409,21 +407,19 @@ class Arrays $effect .= "\n"; } } - } else { - if ($preserveIndexes) { - if (!empty($jsVariableName)) { - $index = Miscellaneous::quoteValue($index); - $effect .= sprintf("\n%s[%s] = %s;", $jsVariableName, $index, $value); - } - } else { - $format = '%s'; - - if ($counter < $arrayCount) { - $format .= ', '; - } - - $effect .= sprintf($format, $value); + } elseif ($preserveIndexes) { + if (!empty($jsVariableName)) { + $index = Miscellaneous::quoteValue($index); + $effect .= sprintf("\n%s[%s] = %s;", $jsVariableName, $index, $value); } + } else { + $format = '%s'; + + if ($counter < $arrayCount) { + $format .= ', '; + } + + $effect .= sprintf($format, $value); } } @@ -474,7 +470,7 @@ class Arrays { if (is_string($item)) { if ($last) { - $item = substr($item, 0, strlen($item) - 1); + $item = substr($item, 0, -1); } else { $item = substr($item, 1); } @@ -517,7 +513,7 @@ class Arrays * No elements or the element does not exist? * Nothing to do */ - if (empty($array) || !in_array($item, $array)) { + if (empty($array) || !in_array($item, $array, true)) { return false; } @@ -556,19 +552,18 @@ class Arrays foreach ($array as $key => &$value) { $remove = false; + $isArray = is_array($value); - if (is_array($value)) { + if ($isArray) { self::removeElements($value, $needle, $before); - if (is_array($value) && empty($value)) { + if ($isArray && empty($value)) { $remove = true; } + } elseif ($value === $needle) { + break; } else { - if ($value === $needle) { - break; - } else { - $remove = true; - } + $remove = true; } if ($remove) { @@ -749,7 +744,7 @@ class Arrays foreach ($exploded as $item) { $exploded2 = explode($valuesKeysSeparator, $item); - if (2 == count($exploded2)) { + if (2 === count($exploded2)) { $key = trim($exploded2[0]); $value = trim($exploded2[1]); @@ -781,19 +776,17 @@ class Arrays if ($firstKey) { $effect = $exists; $firstKey = false; + } elseif ($explicit) { + $effect = $effect && $exists; + + if (!$effect) { + break; + } } else { - if ($explicit) { - $effect = $effect && $exists; + $effect = $effect || $exists; - if (!$effect) { - break; - } - } else { - $effect = $effect || $exists; - - if ($effect) { - break; - } + if ($effect) { + break; } } } @@ -839,6 +832,7 @@ class Arrays foreach ($array as $key => $value) { $path = $key; $stopRecursion = false; + $valueIsArray = is_array($value); /* * If the path of parent element is delivered, @@ -871,7 +865,7 @@ class Arrays * or * - the process is stopped, recursive is not used */ - if (!is_array($value) || (is_array($value) && empty($value)) || $stopRecursion) { + if (!$valueIsArray || ($valueIsArray && empty($value)) || $stopRecursion) { $paths[$path] = $value; continue; } @@ -879,7 +873,7 @@ class Arrays /* * Let's iterate through the next level, using recursive */ - if (is_array($value)) { + if ($valueIsArray) { $recursivePaths = self::getLastElementsPaths($value, $separator, $path, $stopIfMatchedBy); $paths += $recursivePaths; } @@ -1100,7 +1094,8 @@ class Arrays $recursiveValues = self::getAllValuesOfKey($value, $key); if (!empty($recursiveValues)) { - $values = array_merge($values, $recursiveValues); + $merged = array_merge($values, $recursiveValues); + $values = $merged; } } } @@ -1282,7 +1277,7 @@ class Arrays } if (Regex::endsWith($element, $separator)) { - $element = substr($element, 0, strlen($element) - 1); + $element = substr($element, 0, -1); } } @@ -1354,7 +1349,7 @@ class Arrays * Values should be compared only and both arrays are one-dimensional? * Let's find difference by using simple function */ - if ($valuesOnly && 1 == self::getDimensionsCount($array1) && 1 == self::getDimensionsCount($array2)) { + if ($valuesOnly && 1 === self::getDimensionsCount($array1) && 1 === self::getDimensionsCount($array2)) { return array_diff($array1, $array2); } @@ -1371,58 +1366,55 @@ class Arrays if ($array2HasKey && is_array($array2[$key])) { $difference = self::arrayDiffRecursive($value, $array2[$key], $valuesOnly); } - } else { + } elseif (!$array2HasKey || ($array2HasKey && $value !== $array2[$key])) { /* - * 2nd array hasn't key from 1st array? + * We are here, because: + * a) 2nd array hasn't key from 1st array * OR - * Key exists in both, 1st and 2nd array, but values are different? + * b) key exists in both, 1st and 2nd array, but values are different */ - if (!$array2HasKey || ($array2HasKey && $value != $array2[$key])) { - $difference = $value; - } + $difference = $value; } if (null !== $difference) { $effect[] = $difference; } - } else { + /* - * The key exists in 2nd array? - */ - if ($array2HasKey) { - /* - * The value it's an array (it's a nested array)? - */ - if (is_array($value)) { - $diff = []; + * The key exists in 2nd array? + */ + } elseif ($array2HasKey) { + /* + * The value it's an array (it's a nested array)? + */ + if (is_array($value)) { + $diff = []; - if (is_array($array2[$key])) { - /* - * Let's verify the nested array - */ - $diff = self::arrayDiffRecursive($value, $array2[$key], $valuesOnly); - } - - if (empty($diff)) { - continue; - } - - $effect[$key] = $diff; - } else { + if (is_array($array2[$key])) { /* - * Value is different than in 2nd array? - * OKay, I've got difference + * Let's verify the nested array */ - if ($value != $array2[$key]) { - $effect[$key] = $value; - } + $diff = self::arrayDiffRecursive($value, $array2[$key], $valuesOnly); } - } else { + + if (empty($diff)) { + continue; + } + + $effect[$key] = $diff; + /* + * Value is different than in 2nd array? * OKay, I've got difference */ + } elseif ($value !== $array2[$key]) { $effect[$key] = $value; } + } else { + /* + * OKay, I've got difference + */ + $effect[$key] = $value; } } @@ -1595,17 +1587,17 @@ class Arrays $noPrevious = !$next && self::isFirstElement($array, $element); /* - * No elements? - * OR - * Given element does not exist in given array? + * Previous neighbour should be returned and given element is first? * OR * Next neighbour should be returned and given element is last? * OR - * Previous neighbour should be returned and given element is first? + * No elements? + * OR + * Given element does not exist in given array? * * Nothing to do */ - if (empty($array) || !in_array($element, $array) || $noNext || $noPrevious) { + if ($noPrevious || $noNext || empty($array) || !in_array($element, $array, true)) { return null; } diff --git a/src/Utilities/Date.php b/src/Utilities/Date.php index a9b00c9..b6f33c4 100644 --- a/src/Utilities/Date.php +++ b/src/Utilities/Date.php @@ -140,7 +140,12 @@ class Date $dateStart = new DateTime(); $dateEnd = new DateTime(); - if (DatePeriod::LAST_YEAR === $period || DatePeriod::NEXT_YEAR === $period) { + $yearPeriod = [ + DatePeriod::LAST_YEAR, + DatePeriod::NEXT_YEAR, + ]; + + if (in_array($period, $yearPeriod, true)) { $yearDifference = 1; if (DatePeriod::LAST_YEAR === $period) { @@ -167,7 +172,7 @@ class Date return null; } - $dateStart->setTime(0, 0, 0); + $dateStart->setTime(0, 0); $dateEnd->setTime(23, 59, 59); return new DatePeriod($dateStart, $dateEnd); @@ -217,7 +222,8 @@ class Date return $dateTime ->setTime($hour, $minute, $second) - ->format($format); + ->format($format) + ; } /** diff --git a/src/Utilities/Locale.php b/src/Utilities/Locale.php index ae7abc6..770c01b 100644 --- a/src/Utilities/Locale.php +++ b/src/Utilities/Locale.php @@ -52,7 +52,7 @@ class Locale LC_MESSAGES, ]; - if (empty($languageCode) || !in_array($category, $availableCategories)) { + if (empty($languageCode) || !in_array($category, $availableCategories, true)) { return false; } diff --git a/src/Utilities/MimeTypes.php b/src/Utilities/MimeTypes.php index f046012..2c02b10 100644 --- a/src/Utilities/MimeTypes.php +++ b/src/Utilities/MimeTypes.php @@ -733,7 +733,7 @@ class MimeTypes */ public static function getExtension($mimeType) { - if (is_string($mimeType) && in_array($mimeType, self::$mimeTypes)) { + if (is_string($mimeType) && in_array($mimeType, self::$mimeTypes, true)) { $data = Arrays::setKeysAsValues(self::$mimeTypes, false); return $data[$mimeType]; @@ -806,7 +806,7 @@ class MimeTypes */ public static function isImage($mimeType) { - if (in_array($mimeType, self::$mimeTypes)) { + if (in_array($mimeType, self::$mimeTypes, true)) { return (bool)preg_match('|^image/.+$|', $mimeType); } diff --git a/src/Utilities/QueryBuilderUtility.php b/src/Utilities/QueryBuilderUtility.php index fd912aa..0e87ed1 100644 --- a/src/Utilities/QueryBuilderUtility.php +++ b/src/Utilities/QueryBuilderUtility.php @@ -10,7 +10,6 @@ namespace Meritoo\Common\Utilities; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\EntityManager; -use Doctrine\ORM\OptimisticLockException; use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\Query\Parameter; use Doctrine\ORM\QueryBuilder; @@ -91,7 +90,7 @@ class QueryBuilderUtility * @param array $criteria (optional) The criteria used in WHERE clause. It may simple array with pairs * key-value or an array of arrays where second element of sub-array is the * comparison operator. Example below. - * @param string $alias (optional) Alias used in the query + * @param string|null $alias (optional) Alias used in the query * @return QueryBuilder * * Example of the $criteria argument: @@ -107,7 +106,7 @@ class QueryBuilderUtility * 'position' => 5, * ] */ - public static function setCriteria(QueryBuilder $queryBuilder, array $criteria = [], $alias = '') + public static function setCriteria(QueryBuilder $queryBuilder, array $criteria = [], $alias = null) { /* * No criteria used in WHERE clause? @@ -121,7 +120,7 @@ class QueryBuilderUtility * No alias provided? * Let's use root alias */ - if (empty($alias)) { + if (null === $alias || '' === $alias) { $alias = self::getRootAlias($queryBuilder); } @@ -129,7 +128,7 @@ class QueryBuilderUtility $compareOperator = '='; if (is_array($value) && !empty($value)) { - if (2 == count($value)) { + if (2 === count($value)) { $compareOperator = $value[1]; } @@ -158,7 +157,6 @@ class QueryBuilderUtility * @param array|ArrayCollection $entities The entities to delete * @param bool $flushDeleted (optional) If is set to true, flushes the deleted objects (default * behaviour). Otherwise - not. - * @throws OptimisticLockException * @return bool */ public static function deleteEntities(EntityManager $entityManager, $entities, $flushDeleted = true) diff --git a/src/Utilities/Regex.php b/src/Utilities/Regex.php index 20841bc..f2eac7e 100644 --- a/src/Utilities/Regex.php +++ b/src/Utilities/Regex.php @@ -102,7 +102,7 @@ class Regex * Tax ID is not 10 characters length OR is not numeric? * Nothing to do */ - if (10 !== strlen($taxId) || !is_numeric($taxId)) { + if (!is_numeric($taxId) || 10 !== strlen($taxId)) { return false; } @@ -125,14 +125,11 @@ class Regex } /* - * Last number it's not a remainder from dividing per 11? - * Nothing to do + * Last number it's a remainder from dividing per 11? + * Tax ID is valid */ - if ($sum % 11 == $taxId[9]) { - return true; - } - return false; + return $sum % 11 === (int)$taxId[9]; } /** @@ -248,7 +245,7 @@ class Regex if ($itsRegularExpression) { $matchesCount = preg_match($filterExpression, $value); - $remove = 0 == $matchesCount; + $remove = 0 === $matchesCount; } else { if (is_string($value)) { $value = sprintf('\'%s\'', $value); @@ -306,11 +303,9 @@ class Regex if ($mustAllMatch) { $effect = $effect && $matched; - } else { - if ($matched) { - $effect = $matched; - break; - } + } elseif ($matched) { + $effect = $matched; + break; } } @@ -501,7 +496,7 @@ class Regex public static function startsWith($string, $beginning) { if (!empty($string) && !empty($beginning)) { - if (1 == strlen($beginning) && !self::isLetterOrDigit($beginning)) { + if (1 === strlen($beginning) && !self::isLetterOrDigit($beginning)) { $beginning = '\\' . $beginning; } @@ -522,7 +517,7 @@ class Regex */ public static function endsWith($string, $ending) { - if (1 == strlen($ending) && !self::isLetterOrDigit($ending)) { + if (1 === strlen($ending) && !self::isLetterOrDigit($ending)) { $ending = '\\' . $ending; } @@ -607,7 +602,7 @@ class Regex */ public static function contains($haystack, $needle) { - if (1 == strlen($needle) && !self::isLetterOrDigit($needle)) { + if (1 === strlen($needle) && !self::isLetterOrDigit($needle)) { $needle = '\\' . $needle; } @@ -694,14 +689,14 @@ class Regex */ public static function isValidNip($nip) { - $nip = preg_replace('/[^0-9]/', '', $nip); + $nip = preg_replace('/[\D]/', '', $nip); $invalidNips = [ '1234567890', '0000000000', ]; - if (!preg_match('/^[0-9]{10}$/', $nip) || in_array($nip, $invalidNips)) { + if (!preg_match('/^[\d]{10}$/', $nip) || in_array($nip, $invalidNips, true)) { return false; } @@ -723,9 +718,9 @@ class Regex } $modulo = $sum % 11; - $numberControl = (10 == $modulo) ? 0 : $modulo; + $numberControl = (10 === $modulo) ? 0 : $modulo; - return $numberControl == $nip[9]; + return $numberControl === (int)$nip[9]; } /** diff --git a/src/Utilities/Uri.php b/src/Utilities/Uri.php index bc1ec19..ebc1142 100644 --- a/src/Utilities/Uri.php +++ b/src/Utilities/Uri.php @@ -93,7 +93,7 @@ class Uri /* * Oops, cannot match protocol */ - if (0 == $matchCount) { + if (0 === $matchCount) { return ''; } diff --git a/src/Utilities/Xml.php b/src/Utilities/Xml.php index a6878cd..366b86c 100644 --- a/src/Utilities/Xml.php +++ b/src/Utilities/Xml.php @@ -40,7 +40,7 @@ class Xml $query = $path->query('/*/*'); $nodesCount = $query->length; - if (0 == $nodesCount) { + if (0 === $nodesCount) { return $element1; } From d46548d102cafa129c4497f4dc4c35238399c653 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Thu, 21 Feb 2019 23:10:15 +0100 Subject: [PATCH 33/41] Miscellaneous > variableDump() method > remove, because unnecessary --- src/Utilities/Miscellaneous.php | 28 --------------------------- tests/Utilities/MiscellaneousTest.php | 27 -------------------------- 2 files changed, 55 deletions(-) diff --git a/src/Utilities/Miscellaneous.php b/src/Utilities/Miscellaneous.php index 57ae076..283e929 100644 --- a/src/Utilities/Miscellaneous.php +++ b/src/Utilities/Miscellaneous.php @@ -296,34 +296,6 @@ class Miscellaneous return $effect; } - /** - * Displays variable content as preformatted text (fixed-width font and preserves both spaces and line breaks) - * - * If xdebug php module is loaded, displays variable using var_dump(), otherwise
var_dump()
. - * You can pass as many variables as you wish. - * - * Pass each variable as argument of this function. Amount unlimited. Variables are loaded using the - * func_get_args() function (@see http://pl1.php.net/manual/en/function.func-get-args.php). - */ - public static function variableDump() - { - $xdebugLoaded = self::isPhpModuleLoaded('xdebug'); - - if (!$xdebugLoaded) { - echo '
';
-        }
-
-        $arguments = func_get_args();
-
-        foreach ($arguments as $argument) {
-            var_dump($argument);
-        }
-
-        if (!$xdebugLoaded) {
-            echo '
'; - } - } - /** * Returns information if given PHP module is compiled and loaded * diff --git a/tests/Utilities/MiscellaneousTest.php b/tests/Utilities/MiscellaneousTest.php index aa54c6a..c5cfed2 100644 --- a/tests/Utilities/MiscellaneousTest.php +++ b/tests/Utilities/MiscellaneousTest.php @@ -156,33 +156,6 @@ class MiscellaneousTest extends BaseTestCase self::assertFalse(Miscellaneous::isPhpModuleLoaded('xyz123')); } - public function testVariableDump() - { - $xdebugLoaded = Miscellaneous::isPhpModuleLoaded('xdebug'); - - $variable = 123; - $expected = "int(123)\n"; - - if ($xdebugLoaded) { - $libraryPath = realpath(sprintf('%s%s', __DIR__, '/../..')); - $filePath = sprintf('%s%s', $libraryPath, '/src/Utilities/Miscellaneous.php:'); - - /* - * Attention. I have to use "\d+" at the end of $filePath, because number of line may be different if new - * method / function will be created. - */ - $filePathQuoted = sprintf('%s\d+\:', preg_quote($filePath, '/')); - - $expectedPattern = sprintf("/%s\n%s/", $filePathQuoted, preg_quote($expected, '/')); - $this->expectOutputRegex($expectedPattern); - } else { - $expected = sprintf('
%s
', $expected); - $this->expectOutputString($expected); - } - - Miscellaneous::variableDump($variable); - } - /** * @param mixed $string Empty value, e.g. "" * @dataProvider provideEmptyValue From 79c09a26a6c4d20538aff648a2f3a31540e543ec Mon Sep 17 00:00:00 2001 From: Meritoo Date: Thu, 21 Feb 2019 23:10:53 +0100 Subject: [PATCH 34/41] Regex > createSlug() method > returns slug for given value --- README.md | 1 + docs/Base-test-case.md | 1 + docs/Collection-of-elements.md | 1 + docs/Exceptions.md | 1 + docs/Static-methods.md | 1 + docs/Static-methods/Regex.md | 44 ++++++++++++++++ docs/Value-Objects.md | 1 + src/Utilities/Regex.php | 35 ++++++++++++- tests/Utilities/RegexTest.php | 94 ++++++++++++++++++++++++++++++++++ 9 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 docs/Static-methods/Regex.md diff --git a/README.md b/README.md index bcc9fc0..ed6c735 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ composer require meritoo/common-library 2. [Collection of elements](docs/Collection-of-elements.md) 3. [Exceptions](docs/Static-methods.md) 4. [Static methods](docs/Static-methods.md) + 1. [Regex](docs/Static-methods/Regex.md) 5. [Value Objects](docs/Value-Objects.md) # Development diff --git a/docs/Base-test-case.md b/docs/Base-test-case.md index b0a038b..aad3b0d 100644 --- a/docs/Base-test-case.md +++ b/docs/Base-test-case.md @@ -48,6 +48,7 @@ class MimeTypesTest extends BaseTestCase 2. [Collection of elements](Collection-of-elements.md) 3. [Exceptions](Exceptions.md) 4. [Static methods](Static-methods.md) + 1. [Regex](Static-methods/Regex.md) 5. [Value Objects](Value-Objects.md) [‹ Back to `Readme`](../README.md) diff --git a/docs/Collection-of-elements.md b/docs/Collection-of-elements.md index 67fde9f..40e366f 100644 --- a/docs/Collection-of-elements.md +++ b/docs/Collection-of-elements.md @@ -46,6 +46,7 @@ var_dump($simpleCollection->has('dolor')); // bool(true) 2. [**Collection of elements**](Collection-of-elements.md) 3. [Exceptions](Exceptions.md) 4. [Static methods](Static-methods.md) + 1. [Regex](Static-methods/Regex.md) 5. [Value Objects](Value-Objects.md) [‹ Back to `Readme`](../README.md) diff --git a/docs/Exceptions.md b/docs/Exceptions.md index 87b12c1..29709c3 100644 --- a/docs/Exceptions.md +++ b/docs/Exceptions.md @@ -57,6 +57,7 @@ class UnknownSimpleTypeException extends UnknownTypeException 2. [Collection of elements](Collection-of-elements.md) 3. [**Exceptions**](Exceptions.md) 4. [Static methods](Static-methods.md) + 1. [Regex](Static-methods/Regex.md) 5. [Value Objects](Value-Objects.md) [‹ Back to `Readme`](../README.md) diff --git a/docs/Static-methods.md b/docs/Static-methods.md index e503fe9..29fb42c 100644 --- a/docs/Static-methods.md +++ b/docs/Static-methods.md @@ -19,6 +19,7 @@ var_dump($firstElement); // string(5) "lorem" 2. [Collection of elements](Collection-of-elements.md) 3. [Exceptions](Exceptions.md) 4. [**Static methods**](Static-methods.md) + 1. [Regex](Static-methods/Regex.md) 5. [Value Objects](Value-Objects.md) [‹ Back to `Readme`](../README.md) diff --git a/docs/Static-methods/Regex.md b/docs/Static-methods/Regex.md new file mode 100644 index 0000000..8358534 --- /dev/null +++ b/docs/Static-methods/Regex.md @@ -0,0 +1,44 @@ +# Meritoo Common Library + +Common and useful classes, methods, exceptions etc. + +# Regex + +*Useful methods related to regular expressions* + +Class: `Meritoo\Common\Utilities\Regex` +File: `src/Utilities/Regex.php` + +### createSlug($value) + +*Returns slug for given value* + +##### Arguments + +- `string $value` - Value that should be transformed to slug + +##### Example 1 + +- value: non-scalar or `null` +- result: `false` + +##### Example 2 + +- value: `""` (an empty string) +- result: `""` (an empty string) + +##### Example 3 + +- value: `"Lorem ipsum. Dolor sit 12.34 amet."` +- result: `"lorem-ipsum-dolor-sit-1234-amet"` + +# More + +1. [Base test case (with common methods and data providers)](../Base-test-case.md) +2. [Collection of elements](../Collection-of-elements.md) +3. [Exceptions](../Exceptions.md) +4. [Static methods](../Static-methods.md) + 1. [**Regex**](../Static-methods/Regex.md) +5. [Value Objects](../Value-Objects.md) + +[‹ Back to `Readme`](../../README.md) diff --git a/docs/Value-Objects.md b/docs/Value-Objects.md index d26a0ae..9aa0325 100644 --- a/docs/Value-Objects.md +++ b/docs/Value-Objects.md @@ -48,6 +48,7 @@ New instance can be created using: 2. [Collection of elements](Collection-of-elements.md) 3. [Exceptions](Exceptions.md) 4. [Static methods](Static-methods.md) + 1. [Regex](Static-methods/Regex.md) 5. [**Value Objects**](Value-Objects.md) [‹ Back to `Readme`](../README.md) diff --git a/src/Utilities/Regex.php b/src/Utilities/Regex.php index f2eac7e..46d5b37 100644 --- a/src/Utilities/Regex.php +++ b/src/Utilities/Regex.php @@ -12,7 +12,7 @@ use Meritoo\Common\Exception\Regex\IncorrectColorHexLengthException; use Meritoo\Common\Exception\Regex\InvalidColorHexValueException; /** - * Useful regular expressions methods + * Useful methods related to regular expressions * * @author Meritoo * @copyright Meritoo @@ -919,4 +919,37 @@ class Regex return (bool)preg_match($pattern, $value); } + + /** + * Returns slug for given value + * + * @param string $value Value that should be transformed to slug + * @return string|bool + */ + public static function createSlug($value) + { + /* + * Not a scalar value? + * Nothing to do + */ + if (!is_scalar($value)) { + return false; + } + + /* + * It's an empty string? + * Nothing to do + */ + if ('' === $value) { + return ''; + } + + $id = 'Latin-ASCII; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove; Lower();'; + $transliterator = \Transliterator::create($id); + + $cleanValue = trim($value); + $result = $transliterator->transliterate($cleanValue); + + return preg_replace('/[-\s]+/', '-', $result); + } } diff --git a/tests/Utilities/RegexTest.php b/tests/Utilities/RegexTest.php index a672d83..be0b29e 100644 --- a/tests/Utilities/RegexTest.php +++ b/tests/Utilities/RegexTest.php @@ -624,6 +624,17 @@ class RegexTest extends BaseTestCase self::assertEquals($expected, Regex::getValidColorHexValue($color)); } + /** + * @param string $value Value that should be transformed to slug + * @param string $expected Expected slug + * + * @dataProvider provideValueSlug + */ + public function testCreateSlug($value, $expected) + { + self::assertSame($expected, Regex::createSlug($value)); + } + /** * Provides name of bundle and information if it's valid name * @@ -1694,6 +1705,89 @@ class RegexTest extends BaseTestCase ]; } + /** + * Provide value to create slug + * + * @return Generator + */ + public function provideValueSlug() + { + yield[ + [], + false, + ]; + + yield[ + null, + false, + ]; + + yield[ + '', + '', + ]; + + yield[ + 1234, + '1234', + ]; + + yield[ + '1234', + '1234', + ]; + + yield[ + '1/2/3/4', + '1234', + ]; + + yield[ + '1 / 2 / 3 / 4', + '1-2-3-4', + ]; + + yield[ + 'test', + 'test', + ]; + + yield[ + 'test test', + 'test-test', + ]; + + yield[ + 'lorem ipsum dolor sit', + 'lorem-ipsum-dolor-sit', + ]; + + yield[ + 'Lorem ipsum. Dolor sit 12.34 amet.', + 'lorem-ipsum-dolor-sit-1234-amet', + ]; + + yield[ + 'Was sind Löwen, Bären, Vögel und Käfer (für die Prüfung)?', + 'was-sind-lowen-baren-vogel-und-kafer-fur-die-prufung', + ]; + + yield[ + 'äöü (ÄÖÜ)', + 'aou-aou', + ]; + + yield[ + 'Półka dębowa. Kolor: żółędziowy. Wymiary: 80 x 30 cm.', + 'polka-debowa-kolor-zoledziowy-wymiary-80-x-30-cm', + ]; + + yield[ + 'ąęółńśżźć (ĄĘÓŁŃŚŻŹĆ)', + 'aeolnszzc-aeolnszzc', + ]; + } + /** * {@inheritdoc} */ From 292c5e6d4f028263946b00caf312efb8bf739fed Mon Sep 17 00:00:00 2001 From: Meritoo Date: Fri, 22 Feb 2019 12:49:12 +0100 Subject: [PATCH 35/41] Arrays > getNonEmptyValues() method > returns non-empty values, e.g. without "" (empty string), null or [] Arrays > getNonEmptyValuesAsString() method > returns non-empty values concatenated by given separator --- README.md | 3 +- docs/Base-test-case.md | 3 +- docs/Collection-of-elements.md | 3 +- docs/Exceptions.md | 3 +- docs/Static-methods.md | 3 +- docs/Static-methods/Arrays.md | 78 ++++++ docs/Static-methods/Regex.md | 7 +- docs/Value-Objects.md | 3 +- src/Utilities/Arrays.php | 48 +++- tests/Utilities/Arrays/SimpleToString.php | 44 ++++ tests/Utilities/ArraysTest.php | 296 ++++++++++++++++++++++ 11 files changed, 481 insertions(+), 10 deletions(-) create mode 100644 docs/Static-methods/Arrays.md create mode 100644 tests/Utilities/Arrays/SimpleToString.php diff --git a/README.md b/README.md index ed6c735..b6dd475 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,8 @@ composer require meritoo/common-library 2. [Collection of elements](docs/Collection-of-elements.md) 3. [Exceptions](docs/Static-methods.md) 4. [Static methods](docs/Static-methods.md) - 1. [Regex](docs/Static-methods/Regex.md) + 1. [Arrays](docs/Static-methods/Arrays.md) + 2. [Regex](docs/Static-methods/Regex.md) 5. [Value Objects](docs/Value-Objects.md) # Development diff --git a/docs/Base-test-case.md b/docs/Base-test-case.md index aad3b0d..b35c744 100644 --- a/docs/Base-test-case.md +++ b/docs/Base-test-case.md @@ -48,7 +48,8 @@ class MimeTypesTest extends BaseTestCase 2. [Collection of elements](Collection-of-elements.md) 3. [Exceptions](Exceptions.md) 4. [Static methods](Static-methods.md) - 1. [Regex](Static-methods/Regex.md) + 1. [Arrays](Static-methods/Arrays.md) + 2. [Regex](Static-methods/Regex.md) 5. [Value Objects](Value-Objects.md) [‹ Back to `Readme`](../README.md) diff --git a/docs/Collection-of-elements.md b/docs/Collection-of-elements.md index 40e366f..2493afc 100644 --- a/docs/Collection-of-elements.md +++ b/docs/Collection-of-elements.md @@ -46,7 +46,8 @@ var_dump($simpleCollection->has('dolor')); // bool(true) 2. [**Collection of elements**](Collection-of-elements.md) 3. [Exceptions](Exceptions.md) 4. [Static methods](Static-methods.md) - 1. [Regex](Static-methods/Regex.md) + 1. [Arrays](Static-methods/Arrays.md) + 2. [Regex](Static-methods/Regex.md) 5. [Value Objects](Value-Objects.md) [‹ Back to `Readme`](../README.md) diff --git a/docs/Exceptions.md b/docs/Exceptions.md index 29709c3..14d7021 100644 --- a/docs/Exceptions.md +++ b/docs/Exceptions.md @@ -57,7 +57,8 @@ class UnknownSimpleTypeException extends UnknownTypeException 2. [Collection of elements](Collection-of-elements.md) 3. [**Exceptions**](Exceptions.md) 4. [Static methods](Static-methods.md) - 1. [Regex](Static-methods/Regex.md) + 1. [Arrays](Static-methods/Arrays.md) + 2. [Regex](Static-methods/Regex.md) 5. [Value Objects](Value-Objects.md) [‹ Back to `Readme`](../README.md) diff --git a/docs/Static-methods.md b/docs/Static-methods.md index 29fb42c..d1d2227 100644 --- a/docs/Static-methods.md +++ b/docs/Static-methods.md @@ -19,7 +19,8 @@ var_dump($firstElement); // string(5) "lorem" 2. [Collection of elements](Collection-of-elements.md) 3. [Exceptions](Exceptions.md) 4. [**Static methods**](Static-methods.md) - 1. [Regex](Static-methods/Regex.md) + 1. [Arrays](Static-methods/Arrays.md) + 2. [Regex](Static-methods/Regex.md) 5. [Value Objects](Value-Objects.md) [‹ Back to `Readme`](../README.md) diff --git a/docs/Static-methods/Arrays.md b/docs/Static-methods/Arrays.md new file mode 100644 index 0000000..b798505 --- /dev/null +++ b/docs/Static-methods/Arrays.md @@ -0,0 +1,78 @@ +# Meritoo Common Library + +Common and useful classes, methods, exceptions etc. + +# Arrays + +> Useful methods related to arrays + +Class: `Meritoo\Common\Utilities\Arrays` +File: `src/Utilities/Arrays.php` + +### getNonEmptyValues(array $values) + +> Returns non-empty values, e.g. without "" (empty string), null or [] + +##### Arguments + +- `array $values` - The values to filter + +##### Example 1 + +- values: `[]` (no values) +- result: `[]` (an empty array) + +##### Example 2 + +- values: `[null, ""]` (all empty values) +- result: `[]` (an empty array) + +##### Example 3 + +- values: `["test 1", "", 123, null, 0]` +- result: `["test 1", 123, 0]` + +### getNonEmptyValuesAsString(array $values, $separator = ', ') + +> Returns non-empty values concatenated by given separator + +##### Arguments + +- `array $values` - The values to filter +- `[string $separator]` - (optional) Separator used to implode the values. Default: ", ". + +##### Example 1 + +- values: `[]` (no values) +- separator: default or any other string +- result: `""` (an empty string) + +##### Example 2 + +- values: `[null, ""]` (all empty values) +- separator: default or any other string +- result: `""` (an empty string) + +##### Example 3 + +- values: `["test 1", "", 123, null, 0]` +- separator: `", "` (default) +- result: `"test 1, 123, 0"` + +##### Example 4 + +- values: `["test 1", "", 123, null, 0]` +- separator: `" | "` +- result: `"test 1 | 123 | 0"` + +# More + +1. [Base test case (with common methods and data providers)](../Base-test-case.md) +2. [Collection of elements](../Collection-of-elements.md) +3. [Exceptions](../Exceptions.md) +4. [Static methods](../Static-methods.md) + 1. [**Arrays**](Arrays.md) + 2. [Regex](Regex.md) +5. [Value Objects](../Value-Objects.md) + +[‹ Back to `Readme`](../../README.md) diff --git a/docs/Static-methods/Regex.md b/docs/Static-methods/Regex.md index 8358534..e4ec57c 100644 --- a/docs/Static-methods/Regex.md +++ b/docs/Static-methods/Regex.md @@ -4,14 +4,14 @@ Common and useful classes, methods, exceptions etc. # Regex -*Useful methods related to regular expressions* +> Useful methods related to regular expressions Class: `Meritoo\Common\Utilities\Regex` File: `src/Utilities/Regex.php` ### createSlug($value) -*Returns slug for given value* +> Returns slug for given value ##### Arguments @@ -38,7 +38,8 @@ File: `src/Utilities/Regex.php` 2. [Collection of elements](../Collection-of-elements.md) 3. [Exceptions](../Exceptions.md) 4. [Static methods](../Static-methods.md) - 1. [**Regex**](../Static-methods/Regex.md) + 1. [Arrays](../Static-methods/Arrays.md) + 2. [**Regex**](Regex.md) 5. [Value Objects](../Value-Objects.md) [‹ Back to `Readme`](../../README.md) diff --git a/docs/Value-Objects.md b/docs/Value-Objects.md index 9aa0325..8497655 100644 --- a/docs/Value-Objects.md +++ b/docs/Value-Objects.md @@ -48,7 +48,8 @@ New instance can be created using: 2. [Collection of elements](Collection-of-elements.md) 3. [Exceptions](Exceptions.md) 4. [Static methods](Static-methods.md) - 1. [Regex](Static-methods/Regex.md) + 1. [Arrays](Static-methods/Arrays.md) + 2. [Regex](Static-methods/Regex.md) 5. [**Value Objects**](Value-Objects.md) [‹ Back to `Readme`](../README.md) diff --git a/src/Utilities/Arrays.php b/src/Utilities/Arrays.php index 3df6daa..7bce3f2 100644 --- a/src/Utilities/Arrays.php +++ b/src/Utilities/Arrays.php @@ -9,7 +9,7 @@ namespace Meritoo\Common\Utilities; /** - * Useful arrays methods + * Useful methods related to arrays * * @author Meritoo * @copyright Meritoo @@ -1573,6 +1573,52 @@ class Arrays return $dimensionsCount; } + /** + * Returns non-empty values, e.g. without "" (empty string), null or [] + * + * @param array $values The values to filter + * @return array + */ + public static function getNonEmptyValues(array $values) + { + /* + * No values? + * Nothing to do + */ + if (empty($values)) { + return []; + } + + return array_filter($values, function ($value) { + $nonEmptyScalar = is_scalar($value) && '' !== $value; + $nonEmptyArray = is_array($value) && !empty($value); + + return $nonEmptyScalar || $nonEmptyArray || is_object($value); + }); + } + + /** + * Returns non-empty values concatenated by given separator + * + * @param array $values The values to filter + * @param string $separator (optional) Separator used to implode the values. Default: ", ". + * @return string + */ + public static function getNonEmptyValuesAsString(array $values, $separator = ', ') + { + $nonEmpty = self::getNonEmptyValues($values); + + /* + * No values? + * Nothing to do + */ + if (empty($nonEmpty)) { + return ''; + } + + return implode($separator, $nonEmpty); + } + /** * Returns neighbour (next or previous element) for given element * diff --git a/tests/Utilities/Arrays/SimpleToString.php b/tests/Utilities/Arrays/SimpleToString.php new file mode 100644 index 0000000..04bec45 --- /dev/null +++ b/tests/Utilities/Arrays/SimpleToString.php @@ -0,0 +1,44 @@ + + * @copyright Meritoo + */ +class SimpleToString +{ + /** + * Identifier + * + * @var string + */ + private $id; + + /** + * Class constructor + * + * @param string $id Identifier + */ + public function __construct($id) + { + $this->id = $id; + } + + /** + * {@inheritdoc} + */ + public function __toString() + { + return sprintf('Instance with ID: %s', $this->id); + } +} diff --git a/tests/Utilities/ArraysTest.php b/tests/Utilities/ArraysTest.php index d43da0d..71d9583 100644 --- a/tests/Utilities/ArraysTest.php +++ b/tests/Utilities/ArraysTest.php @@ -9,6 +9,7 @@ namespace Meritoo\Common\Test\Utilities; use Meritoo\Common\Test\Base\BaseTestCase; +use Meritoo\Common\Test\Utilities\Arrays\SimpleToString; use Meritoo\Common\Utilities\Arrays; /** @@ -1486,6 +1487,43 @@ letsTest[2] = value_2;'; self::assertTrue(Arrays::isMultiDimensional($this->complexArray)); } + /** + * @param string $description Description of test case + * @param array $values The values to filter + * @param array $expected Expected non-empty values + * + * @dataProvider provideValuesToFilterNonEmpty + */ + public function testGetNonEmptyValues($description, array $values, array $expected) + { + self::assertSame($expected, Arrays::getNonEmptyValues($values), $description); + } + + /** + * @param string $description Description of test case + * @param array $values The values to filter + * @param string $expected Expected non-empty values (as string) + * + * @dataProvider provideValuesToFilterNonEmptyAsStringUsingDefaultSeparator + */ + public function testGetNonEmptyValuesAsStringUsingDefaultSeparator($description, array $values, $expected) + { + self::assertSame($expected, Arrays::getNonEmptyValuesAsString($values), $description); + } + + /** + * @param string $description Description of test case + * @param array $values The values to filter + * @param string $separator Separator used to implode the values + * @param string $expected Expected non-empty values (as string) + * + * @dataProvider provideValuesToFilterNonEmptyAsString + */ + public function testGetNonEmptyValuesAsString($description, array $values, $separator, $expected) + { + self::assertSame($expected, Arrays::getNonEmptyValuesAsString($values, $separator), $description); + } + /** * Provides simple array to set/replace values with keys * @@ -1807,6 +1845,264 @@ letsTest[2] = value_2;'; ]; } + /** + * Provide values to filter and get non-empty values + * + * @return \Generator + */ + public function provideValuesToFilterNonEmpty() + { + $simpleObject = new SimpleToString('1234'); + + yield[ + 'An empty array (no values to filter)', + [], + [], + ]; + + yield[ + 'All values are empty', + [ + '', + null, + [], + ], + [], + ]; + + yield[ + '5 values with 2 empty strings', + [ + 'test 1', + '', + 'test 2', + 'test 3', + '', + ], + [ + 0 => 'test 1', + 2 => 'test 2', + 3 => 'test 3', + ], + ]; + + yield[ + '"0" shouldn\'t be treated like an empty value', + [ + 123, + 0, + 456, + ], + [ + 123, + 0, + 456, + ], + ]; + + yield[ + 'Object shouldn\'t be treated like an empty value', + [ + 'test 1', + $simpleObject, + 'test 2', + null, + 'test 3', + ], + [ + 0 => 'test 1', + 1 => $simpleObject, + 2 => 'test 2', + 4 => 'test 3', + ], + ]; + + yield[ + 'Mixed values (non-empty, empty, strings, integers, objects)', + [ + 'test 1', + '', + 123, + null, + 'test 2', + 'test 3', + 0, + $simpleObject, + 456, + [], + $simpleObject, + ], + [ + 0 => 'test 1', + 2 => 123, + 4 => 'test 2', + 5 => 'test 3', + 6 => 0, + 7 => $simpleObject, + 8 => 456, + 10 => $simpleObject, + ], + ]; + } + + /** + * Provide values to filter and get non-empty values concatenated by default separator + * + * @return \Generator + */ + public function provideValuesToFilterNonEmptyAsStringUsingDefaultSeparator() + { + yield[ + 'An empty array (no values to filter)', + [], + '', + ]; + + yield[ + 'All values are empty', + [ + '', + null, + [], + ], + '', + ]; + + yield[ + '5 values with 2 empty strings', + [ + 'test 1', + '', + 'test 2', + 'test 3', + '', + ], + 'test 1, test 2, test 3', + ]; + + yield[ + 'Numbers with "0" that shouldn\'t be treated like an empty value', + [ + 123, + 0, + 456, + ], + '123, 0, 456', + ]; + + yield[ + 'Object shouldn\'t be treated like an empty value', + [ + 'test 1', + new SimpleToString('1234'), + 'test 2', + null, + 'test 3', + ], + 'test 1, Instance with ID: 1234, test 2, test 3', + ]; + + yield[ + 'Mixed values (non-empty, empty, strings, integers, objects)', + [ + 'test 1', + '', + 123, + null, + 'test 2', + 'test 3', + 0, + new SimpleToString('A1XC90Z'), + 456, + [], + new SimpleToString('FF-45-0Z'), + ], + 'test 1, 123, test 2, test 3, 0, Instance with ID: A1XC90Z, 456, Instance with ID: FF-45-0Z', + ]; + } + + /** + * Provide values to filter and get non-empty values concatenated by given separator + * + * @return \Generator + */ + public function provideValuesToFilterNonEmptyAsString() + { + yield[ + 'An empty array (no values to filter)', + [], + ' | ', + '', + ]; + + yield[ + 'All values are empty', + [ + '', + null, + [], + ], + ' | ', + '', + ]; + + yield[ + '5 values with 2 empty strings', + [ + 'test 1', + '', + 'test 2', + 'test 3', + '', + ], + ' | ', + 'test 1 | test 2 | test 3', + ]; + + yield[ + 'Numbers with "0" that shouldn\'t be treated like an empty value', + [ + 123, + 0, + 456, + ], + ' <-> ', + '123 <-> 0 <-> 456', + ]; + + yield[ + 'Object shouldn\'t be treated like an empty value', + [ + 'test 1', + new SimpleToString('1234'), + 'test 2', + null, + 'test 3', + ], + ' | ', + 'test 1 | Instance with ID: 1234 | test 2 | test 3', + ]; + + yield[ + 'Mixed values (non-empty, empty, strings, integers, objects)', + [ + 'test 1', + '', + 123, + null, + 'test 2', + 'test 3', + 0, + new SimpleToString('A1XC90Z'), + 456, + [], + new SimpleToString('FF-45-0Z'), + ], + ';', + 'test 1;123;test 2;test 3;0;Instance with ID: A1XC90Z;456;Instance with ID: FF-45-0Z', + ]; + } + /** * {@inheritdoc} */ From 421d33649867ec07c863a58617f03c75b88cfe51 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Fri, 22 Feb 2019 14:19:32 +0100 Subject: [PATCH 36/41] Tests > ValueObject > Version > fix namespace --- tests/ValueObject/VersionTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ValueObject/VersionTest.php b/tests/ValueObject/VersionTest.php index fb0e783..7876798 100644 --- a/tests/ValueObject/VersionTest.php +++ b/tests/ValueObject/VersionTest.php @@ -6,7 +6,7 @@ * file that was distributed with this source code. */ -namespace Meritoo\Test\Common\ValueObject; +namespace Meritoo\Common\Test\ValueObject; use Generator; use Meritoo\Common\Test\Base\BaseTestCase; From 0c7e27b8849c36ee29965cb62a70086cba4fefdc Mon Sep 17 00:00:00 2001 From: Meritoo Date: Fri, 22 Feb 2019 20:35:43 +0100 Subject: [PATCH 37/41] ValueObject > Address > represents address of company, institution, user etc. --- docs/Value-Objects.md | 55 ++++++++++- src/ValueObject/Address.php | 159 ++++++++++++++++++++++++++++++ tests/ValueObject/AddressTest.php | 105 ++++++++++++++++++++ 3 files changed, 317 insertions(+), 2 deletions(-) create mode 100644 src/ValueObject/Address.php create mode 100644 tests/ValueObject/AddressTest.php diff --git a/docs/Value-Objects.md b/docs/Value-Objects.md index 8497655..ce58bd0 100644 --- a/docs/Value-Objects.md +++ b/docs/Value-Objects.md @@ -4,7 +4,58 @@ Common and useful classes, methods, exceptions etc. # Value Objects -Located in `Meritoo\Common\ValueObject` namespace. +Located in `Meritoo\Common\ValueObject` namespace and in `src/ValueObject/` directory. + +### Address + +##### Namespace + +`Meritoo\Common\ValueObject\Address` + +##### Info + +Represents address of company, institution, user etc. Contains properties: +1. `$street` - the street +2. `$buildingNumber` - the number of building +3. `$flatNumber` - the number of flat +4. `$zipCode` - the zip code +5. `$city` - the city, location + +##### New instance + +New instance can be created using constructor + +```php +new Address('New York', '00123', '4th Avenue', '10', '200'); +``` + +##### Methods + +Has getters for each property, e.g. `getFlatNumber()` or `getZipCode()`, and 1 extra method: + +```php +getFullStreet() +``` + +that returns name of street with related numbers (building & flat number). + +Example: + +```php +$address = new Address('New York', '00123', '4th Avenue', '10', '200'); +$fullStreet = $address->getFullStreet(); // "4th Avenue 10/200" +``` + +##### Conversion to string (the `__toString()` method) + +Instance of `Address` may be represented as string that contains all non-empty properties separated by `, `. + +Example: + +```php +$address = new Address('New York', '00123', '4th Avenue', '10', '200'); +$asString = (string)$address; // "4th Avenue 10/200, 00123, New York" +``` ### Version @@ -14,7 +65,7 @@ Located in `Meritoo\Common\ValueObject` namespace. ##### Info -Represents version of software. Contains 3 properties: +Represents version of software. Contains properties: 1. `$majorPart` - the "major" part of version 2. `$minorPart` - the "minor" part of version 3. `$patchPart` - the "patch" part of version diff --git a/src/ValueObject/Address.php b/src/ValueObject/Address.php new file mode 100644 index 0000000..337f7ca --- /dev/null +++ b/src/ValueObject/Address.php @@ -0,0 +1,159 @@ + + * @copyright Meritoo + */ +class Address +{ + /** + * The street + * + * @var string + */ + protected $street; + + /** + * The number of building + * + * @var string + */ + protected $buildingNumber; + + /** + * The number of flat + * + * @var string + */ + protected $flatNumber; + + /** + * The zip code + * + * @var string + */ + protected $zipCode; + + /** + * The city, location + * + * @var string + */ + protected $city; + + /** + * Class constructor + * + * @param string $city City, location + * @param string $zipCode The zip code + * @param string $street The street + * @param string $buildingNumber The number of building + * @param string $flatNumber (optional) The number of flat. Default: "". + */ + public function __construct($city, $zipCode, $street, $buildingNumber, $flatNumber = '') + { + $this->city = $city; + $this->zipCode = $zipCode; + $this->street = $street; + $this->buildingNumber = $buildingNumber; + $this->flatNumber = $flatNumber; + } + + /** + * Returns representation of object as string + * + * @return string + */ + public function __toString() + { + $values = [ + $this->getFullStreet(), + $this->zipCode, + $this->city, + ]; + + return Arrays::getNonEmptyValuesAsString($values); + } + + /** + * Returns street + * + * @return string + */ + public function getStreet() + { + return $this->street; + } + + /** + * Returns full street (name + building & flat number) + * + * @return string + */ + public function getFullStreet() + { + if (empty($this->street)) { + return ''; + } + + $numbers = $this->buildingNumber; + + if (!empty($numbers) && !empty($this->flatNumber)) { + $numbers = sprintf('%s/%s', $numbers, $this->flatNumber); + } + + return sprintf('%s %s', $this->street, $numbers); + } + + /** + * Returns number of building + * + * @return string + */ + public function getBuildingNumber() + { + return $this->buildingNumber; + } + + /** + * Returns number of flat + * + * @return string + */ + public function getFlatNumber() + { + return $this->flatNumber; + } + + /** + * Returns zip code + * + * @return string + */ + public function getZipCode() + { + return $this->zipCode; + } + + /** + * Returns city, location + * + * @return string + */ + public function getCity() + { + return $this->city; + } +} diff --git a/tests/ValueObject/AddressTest.php b/tests/ValueObject/AddressTest.php new file mode 100644 index 0000000..e07db25 --- /dev/null +++ b/tests/ValueObject/AddressTest.php @@ -0,0 +1,105 @@ + + * @copyright Meritoo + */ +class AddressTest extends BaseTestCase +{ + /** + * @var Address + */ + private $address; + + /** + * @var Address + */ + private $addressWithoutFlat; + + /** + * @var Address + */ + private $addressWithoutStreet; + + public function testConstructor() + { + static::assertConstructorVisibilityAndArguments( + Address::class, + OopVisibilityType::IS_PUBLIC, + 5, + 4 + ); + } + + public function testGetFlatNumber() + { + static::assertSame('200', $this->address->getFlatNumber()); + static::assertSame('', $this->addressWithoutFlat->getFlatNumber()); + static::assertSame('300', $this->addressWithoutStreet->getFlatNumber()); + } + + public function testGetBuildingNumber() + { + static::assertSame('10', $this->address->getBuildingNumber()); + static::assertSame('22', $this->addressWithoutFlat->getBuildingNumber()); + static::assertSame('1', $this->addressWithoutStreet->getBuildingNumber()); + } + + public function testGetStreet() + { + static::assertSame('4th Avenue', $this->address->getStreet()); + static::assertSame('Green Street', $this->addressWithoutFlat->getStreet()); + static::assertSame('', $this->addressWithoutStreet->getStreet()); + } + + public function testGetFullStreet() + { + static::assertSame('4th Avenue 10/200', $this->address->getFullStreet()); + static::assertSame('Green Street 22', $this->addressWithoutFlat->getFullStreet()); + static::assertSame('', $this->addressWithoutStreet->getFullStreet()); + } + + public function testGetCity() + { + static::assertSame('New York', $this->address->getCity()); + static::assertSame('San Francisco', $this->addressWithoutFlat->getCity()); + static::assertSame('Saint Louis', $this->addressWithoutStreet->getCity()); + } + + public function testGetZipCode() + { + static::assertSame('00123', $this->address->getZipCode()); + static::assertSame('00456', $this->addressWithoutFlat->getZipCode()); + static::assertSame('00111', $this->addressWithoutStreet->getZipCode()); + } + + public function testToString() + { + static::assertSame('4th Avenue 10/200, 00123, New York', (string)$this->address); + static::assertSame('Green Street 22, 00456, San Francisco', (string)$this->addressWithoutFlat); + static::assertSame('00111, Saint Louis', (string)$this->addressWithoutStreet); + } + + protected function setUp() + { + parent::setUp(); + + $this->address = new Address('New York', '00123', '4th Avenue', '10', '200'); + $this->addressWithoutFlat = new Address('San Francisco', '00456', 'Green Street', '22'); + $this->addressWithoutStreet = new Address('Saint Louis', '00111', '', '1', '300'); + } +} From 07a04d86f018807ff7ec749b09e6d75284b0e18e Mon Sep 17 00:00:00 2001 From: Meritoo Date: Fri, 22 Feb 2019 20:37:16 +0100 Subject: [PATCH 38/41] ValueObject > BankAccount > represents bank account --- docs/Value-Objects.md | 35 ++++++++++++ src/ValueObject/BankAccount.php | 81 +++++++++++++++++++++++++++ tests/ValueObject/BankAccountTest.php | 71 +++++++++++++++++++++++ 3 files changed, 187 insertions(+) create mode 100644 src/ValueObject/BankAccount.php create mode 100644 tests/ValueObject/BankAccountTest.php diff --git a/docs/Value-Objects.md b/docs/Value-Objects.md index ce58bd0..68b2261 100644 --- a/docs/Value-Objects.md +++ b/docs/Value-Objects.md @@ -57,6 +57,41 @@ $address = new Address('New York', '00123', '4th Avenue', '10', '200'); $asString = (string)$address; // "4th Avenue 10/200, 00123, New York" ``` +### BankAccount + +##### Namespace + +`Meritoo\Common\ValueObject\BankAccount` + +##### Info + +Represents bank account. Contains properties: +1. `$bankName` - name of bank +2. $accountNumber` - number of bank's account + +##### New instance + +New instance can be created using constructor + +```php +new BankAccount('Bank of America', '1234567890') +``` + +##### Methods + +Has getters for each property `getBankName()` and `getAccountNumber()`. + +##### Conversion to string (the `__toString()` method) + +Instance of `BankAccount` may be represented as string that contains all non-empty properties separated by `, `. + +Example: + +```php +$bank = new BankAccount('Bank of America', '1234567890'); +$asString = (string)$bank; // "Bank of America, 1234567890" +``` + ### Version ##### Namespace diff --git a/src/ValueObject/BankAccount.php b/src/ValueObject/BankAccount.php new file mode 100644 index 0000000..0b2c83f --- /dev/null +++ b/src/ValueObject/BankAccount.php @@ -0,0 +1,81 @@ + + * @copyright Meritoo + */ +class BankAccount +{ + /** + * Name of bank + * + * @var string + */ + protected $bankName; + + /** + * Number of bank's account + * + * @var string + */ + protected $accountNumber; + + /** + * Class constructor + * + * @param string $bankName Name of bank + * @param string $accountNumber Number of bank's account + */ + public function __construct($bankName, $accountNumber) + { + $this->bankName = $bankName; + $this->accountNumber = $accountNumber; + } + + /** + * Returns representation of object as string + * + * @return string + */ + public function __toString() + { + $values = [ + $this->bankName, + $this->accountNumber, + ]; + + return Arrays::getNonEmptyValuesAsString($values); + } + + /** + * Returns name of bank + * + * @return string + */ + public function getBankName() + { + return $this->bankName; + } + + /** + * Returns number of bank's account + * + * @return string + */ + public function getAccountNumber() + { + return $this->accountNumber; + } +} diff --git a/tests/ValueObject/BankAccountTest.php b/tests/ValueObject/BankAccountTest.php new file mode 100644 index 0000000..9dc6ab4 --- /dev/null +++ b/tests/ValueObject/BankAccountTest.php @@ -0,0 +1,71 @@ + + * @copyright Meritoo + */ +class BankAccountTest extends BaseTestCase +{ + /** + * @var BankAccount + */ + private $emptyBankAccount; + + /** + * @var BankAccount + */ + private $bankAccount; + + public function testConstructor() + { + static::assertConstructorVisibilityAndArguments( + BankAccount::class, + OopVisibilityType::IS_PUBLIC, + 2, + 2 + ); + } + + public function testGetAccountNumber() + { + self::assertSame('', $this->emptyBankAccount->getAccountNumber()); + self::assertSame('1234567890', $this->bankAccount->getAccountNumber()); + } + + public function testGetBankName() + { + self::assertSame('', $this->emptyBankAccount->getBankName()); + self::assertSame('Bank of America', $this->bankAccount->getBankName()); + } + + public function testToString() + { + static::assertSame('', (string)$this->emptyBankAccount); + static::assertSame('Bank of America, 1234567890', (string)$this->bankAccount); + } + + /** + * {@inheritdoc} + */ + protected function setUp() + { + parent::setUp(); + + $this->emptyBankAccount = new BankAccount('', ''); + $this->bankAccount = new BankAccount('Bank of America', '1234567890'); + } +} From 3a38c09ce24f1bfc46a1e3e9cc15efbe4cd2ae50 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Fri, 22 Feb 2019 20:38:13 +0100 Subject: [PATCH 39/41] ValueObject > Company > represents a company --- docs/Value-Objects.md | 45 +++++++++++++ src/ValueObject/Company.php | 101 ++++++++++++++++++++++++++++++ tests/ValueObject/CompanyTest.php | 98 +++++++++++++++++++++++++++++ 3 files changed, 244 insertions(+) create mode 100644 src/ValueObject/Company.php create mode 100644 tests/ValueObject/CompanyTest.php diff --git a/docs/Value-Objects.md b/docs/Value-Objects.md index 68b2261..90b41e4 100644 --- a/docs/Value-Objects.md +++ b/docs/Value-Objects.md @@ -92,6 +92,51 @@ $bank = new BankAccount('Bank of America', '1234567890'); $asString = (string)$bank; // "Bank of America, 1234567890" ``` +### Company + +##### Namespace + +`Meritoo\Common\ValueObject\Company` + +##### Info + +Represents a company. Contains properties: +1. `$name` - name of company +2. `$address` - address of company +3. `$bankAccount` - bank account of company + +##### New instance + +New instance can be created using constructor: + +```php +new Company( + 'Test 1', + new Address('New York', '00123', '4th Avenue', '10', '200'), + new BankAccount('Bank 1', '12345') +); +``` + +##### Methods + +Has getters for each property `getName()`, `getAddress()` and `getBankAccount()`. + +##### Conversion to string (the `__toString()` method) + +Instance of `Company` may be represented as string that contains all non-empty properties separated by `, `. + +Example: + +```php +$company = new Company( + 'Test 1', + new Address('New York', '00123', '4th Avenue', '10', '200'), + new BankAccount('Bank 1', '12345') +); + +$asString = (string)$company; // "Test 1, 4th Avenue 10/200, 00123, New York, Bank 1, 12345" +``` + ### Version ##### Namespace diff --git a/src/ValueObject/Company.php b/src/ValueObject/Company.php new file mode 100644 index 0000000..05facea --- /dev/null +++ b/src/ValueObject/Company.php @@ -0,0 +1,101 @@ + + * @copyright Meritoo + */ +class Company +{ + /** + * Name of company + * + * @var string + */ + protected $name; + + /** + * Address of company + * + * @var Address + */ + protected $address; + + /** + * Bank account of company + * + * @var BankAccount + */ + protected $bankAccount; + + /** + * Class constructor + * + * @param string $name Name of company + * @param Address $address Address of company + * @param BankAccount|null $bankAccount (optional) Bank account of company + */ + public function __construct($name, Address $address, BankAccount $bankAccount = null) + { + $this->name = $name; + $this->address = $address; + $this->bankAccount = $bankAccount; + } + + /** + * Returns representation of object as string + * + * @return string + */ + public function __toString() + { + $values = [ + $this->name, + $this->address, + $this->bankAccount, + ]; + + return Arrays::getNonEmptyValuesAsString($values); + } + + /** + * Returns name of company + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Returns address of company + * + * @return Address + */ + public function getAddress() + { + return $this->address; + } + + /** + * Returns bank account of company + * + * @return BankAccount|null + */ + public function getBankAccount() + { + return $this->bankAccount; + } +} diff --git a/tests/ValueObject/CompanyTest.php b/tests/ValueObject/CompanyTest.php new file mode 100644 index 0000000..d6da00b --- /dev/null +++ b/tests/ValueObject/CompanyTest.php @@ -0,0 +1,98 @@ + + * @copyright Meritoo + */ +class CompanyTest extends BaseTestCase +{ + /** + * @var Company + */ + private $company; + + /** + * @var Company + */ + private $companyWithoutBankAccount; + + public function testConstructor() + { + static::assertConstructorVisibilityAndArguments( + Company::class, + OopVisibilityType::IS_PUBLIC, + 3, + 2 + ); + } + + public function testGetName() + { + static::assertSame('Test 1', $this->company->getName()); + static::assertSame('Test 2', $this->companyWithoutBankAccount->getName()); + } + + public function testGetAddress() + { + static::assertEquals( + new Address('New York', '00123', '4th Avenue', '10', '200'), + $this->company->getAddress() + ); + + static::assertEquals( + new Address('San Francisco', '00456', 'Green Street', '22'), + $this->companyWithoutBankAccount->getAddress() + ); + } + + public function testGetBankAccount() + { + static::assertEquals( + new BankAccount('Bank 1', '12345'), + $this->company->getBankAccount() + ); + + static::assertNull($this->companyWithoutBankAccount->getBankAccount()); + } + + public function testToString() + { + static::assertSame('Test 1, 4th Avenue 10/200, 00123, New York, Bank 1, 12345', (string)$this->company); + static::assertSame('Test 2, Green Street 22, 00456, San Francisco', (string)$this->companyWithoutBankAccount); + } + + /** + * {@inheritdoc} + */ + protected function setUp() + { + parent::setUp(); + + $this->company = new Company( + 'Test 1', + new Address('New York', '00123', '4th Avenue', '10', '200'), + new BankAccount('Bank 1', '12345') + ); + + $this->companyWithoutBankAccount = new Company( + 'Test 2', + new Address('San Francisco', '00456', 'Green Street', '22') + ); + } +} From fad0aa607aea63c551758e8791a3d4319a54f736 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Sat, 23 Feb 2019 11:58:13 +0100 Subject: [PATCH 40/41] Changelog > update > enter latest modifications --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b7444e4..7f231fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,14 @@ Common and useful classes, methods, exceptions etc. 2. Utilities > Date > update descriptions of methods 3. Docker > docker-compose.yml > add "phpunit" service > used to run PHPUnit's tests 4. Reflection > setPropertiesValues() method > sets values of properties in given object +5. Phing > update configuration +6. Miscellaneous > variableDump() method > remove, because unnecessary +7. Regex > createSlug() method > returns slug for given value +8. Arrays > getNonEmptyValues() method > returns non-empty values, e.g. without "" (empty string), null or [] +9. Arrays > getNonEmptyValuesAsString() method > returns non-empty values concatenated by given separator +10. ValueObject > Company > represents a company +11. ValueObject > BankAccount > represents bank account +12. ValueObject > Address > represents address of company, institution, user etc. # 0.1.3 From ede9a182b4c71dbed85526a0790cf0510ce32934 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Sat, 23 Feb 2019 12:47:10 +0100 Subject: [PATCH 41/41] Changelog > update > enter latest modifications --- CHANGELOG.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f231fe..5a7bf20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ Common and useful classes, methods, exceptions etc. # 0.1.5 1. Tests > Date > one more test case +2. Phing > update configuration +3. Miscellaneous > variableDump() method > remove, because unnecessary +4. Regex > createSlug() method > returns slug for given value +5. Arrays > getNonEmptyValues() method > returns non-empty values, e.g. without "" (empty string), null or [] +6. Arrays > getNonEmptyValuesAsString() method > returns non-empty values concatenated by given separator +7. ValueObject > Company > represents a company +8. ValueObject > BankAccount > represents bank account +9. ValueObject > Address > represents address of company, institution, user etc. # 0.1.4 @@ -12,14 +20,6 @@ Common and useful classes, methods, exceptions etc. 2. Utilities > Date > update descriptions of methods 3. Docker > docker-compose.yml > add "phpunit" service > used to run PHPUnit's tests 4. Reflection > setPropertiesValues() method > sets values of properties in given object -5. Phing > update configuration -6. Miscellaneous > variableDump() method > remove, because unnecessary -7. Regex > createSlug() method > returns slug for given value -8. Arrays > getNonEmptyValues() method > returns non-empty values, e.g. without "" (empty string), null or [] -9. Arrays > getNonEmptyValuesAsString() method > returns non-empty values concatenated by given separator -10. ValueObject > Company > represents a company -11. ValueObject > BankAccount > represents bank account -12. ValueObject > Address > represents address of company, institution, user etc. # 0.1.3