mirror of
https://github.com/wiosna-dev/common-library.git
synced 2026-03-12 09:31:51 +01:00
Compare commits
101 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
55dde2e898 | ||
|
|
a32e0c4cca | ||
|
|
834b24f348 | ||
|
|
9342f0e87e | ||
|
|
72fd87e165 | ||
|
|
64499b49d3 | ||
|
|
848adef015 | ||
|
|
1431fd9935 | ||
|
|
3bb7a182c2 | ||
|
|
5c9436e4e2 | ||
|
|
1a649d35e1 | ||
|
|
107480d01b | ||
|
|
f4c12661b4 | ||
|
|
fc7df571e2 | ||
|
|
0f37edfc9b | ||
|
|
ae3e82e233 | ||
|
|
c99a099c31 | ||
|
|
c443ef22d7 | ||
|
|
be8b4a3498 | ||
|
|
b1ddc6d561 | ||
|
|
ffe34eb9cf | ||
|
|
155c091a3e | ||
|
|
0a3955026b | ||
|
|
f9fa5f5915 | ||
|
|
43945a8721 | ||
|
|
e9da0cf351 | ||
|
|
4c534394d9 | ||
|
|
3726a26e47 | ||
|
|
fb24bc2ff1 | ||
|
|
57a78d1299 | ||
|
|
696cff023c | ||
|
|
9197682cd2 | ||
|
|
49638ff1c3 | ||
|
|
abf0ebf7ec | ||
|
|
2e60176d95 | ||
|
|
c351ce887a | ||
|
|
8a6262a8c3 | ||
|
|
3c83a8800e | ||
|
|
233473d915 | ||
|
|
7382bce842 | ||
|
|
c5b42017d2 | ||
|
|
bc54f734e2 | ||
|
|
0eb5343df0 | ||
|
|
52e74c8b48 | ||
|
|
96bdb6eb60 | ||
|
|
5be449a83d | ||
|
|
132a0a00e7 | ||
|
|
6fd18111b4 | ||
|
|
26c63ecb5c | ||
|
|
bedb6333b9 | ||
|
|
ec2b5742ec | ||
|
|
ec2f3c6ead | ||
|
|
834c12f280 | ||
|
|
122ff41dad | ||
|
|
180a8b8b5d | ||
|
|
499c603d54 | ||
|
|
1cbc87222f | ||
|
|
129b75ea93 | ||
|
|
aae7609c8c | ||
|
|
5578b051a7 | ||
|
|
f111174ed2 | ||
|
|
ddbff1b557 | ||
|
|
8d1df9ced8 | ||
|
|
b7d0b61094 | ||
|
|
ad64d2e02a | ||
|
|
470b8244ec | ||
|
|
af38c35a1b | ||
|
|
1e3e1d454e | ||
|
|
57b411b59f | ||
|
|
8a4860088f | ||
|
|
e9b8fb8852 | ||
|
|
780d4df17e | ||
|
|
d801e675fc | ||
|
|
6753076937 | ||
|
|
7f713e0c6e | ||
|
|
ebbed4825c | ||
|
|
7d23ff59d1 | ||
|
|
0e4c33241e | ||
|
|
66aefa2446 | ||
|
|
5aaf7cde72 | ||
|
|
8bb529b88d | ||
|
|
3588c00009 | ||
|
|
78480ac853 | ||
|
|
8bcf006e02 | ||
|
|
edc51aeee1 | ||
|
|
6d4e422165 | ||
|
|
6f441bb9ea | ||
|
|
73030d703b | ||
|
|
36ddb326b9 | ||
|
|
452a4ec458 | ||
|
|
325fe6b141 | ||
|
|
a1c26b3812 | ||
|
|
67d93036cf | ||
|
|
9368616dfe | ||
|
|
5ab68d3667 | ||
|
|
4613a63f02 | ||
|
|
9dac5bd11c | ||
|
|
12100db058 | ||
|
|
f9ab0a6194 | ||
|
|
b824808cd4 | ||
|
|
71e1eeb81b |
15
.env.dist
Normal file
15
.env.dist
Normal file
@@ -0,0 +1,15 @@
|
||||
# -----------------------------------------------------------------------------
|
||||
### Docker
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
#
|
||||
# All containers
|
||||
#
|
||||
DOCKER_CONTAINER_OWNER=meritoo
|
||||
DOCKER_CONTAINER_PROJECT=common-library
|
||||
|
||||
#
|
||||
# PHP configuration:
|
||||
# - timezone
|
||||
#
|
||||
TIMEZONE=Europe/Warsaw
|
||||
66
.gitignore
vendored
66
.gitignore
vendored
@@ -1,51 +1,58 @@
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
# Environment-related parameters
|
||||
# ------------------------------------------------------------------------------
|
||||
.env
|
||||
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
### Vendors
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
/vendor/
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
### Composer
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
/composer.lock
|
||||
/composer.phar
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
### Phing
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
/phing/properties
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
### PHPUnit
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
/phpunit.xml
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
### PHP Coding Standards Fixer generated files
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
### PHP Coding Standards Fixer
|
||||
# ------------------------------------------------------------------------------
|
||||
/.php_cs
|
||||
/.php_cs.cache
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# -----------------------------------------------------------------------------
|
||||
### Build files
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# -----------------------------------------------------------------------------
|
||||
/build/
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
### Generated databases
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
/data/tmp
|
||||
*.sql
|
||||
*.sqlite
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
### Compiled source
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
*.com
|
||||
*.class
|
||||
*.dll
|
||||
@@ -54,23 +61,22 @@
|
||||
*.so
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
### Shell scripts
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
/*.sh
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
### JetBrains
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
/.idea
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
### NetBeans template
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
nbproject/private/
|
||||
build/
|
||||
nbbuild/
|
||||
dist/
|
||||
nbdist/
|
||||
@@ -78,9 +84,9 @@ nbactions.xml
|
||||
.nb-gradle/
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
### OSX template
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
@@ -107,9 +113,9 @@ Temporary Items
|
||||
.apdisk
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
### Linux template
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
*~
|
||||
|
||||
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||
@@ -122,9 +128,9 @@ Temporary Items
|
||||
.Trash-*
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
### Windows template
|
||||
# ----------------------------------------------------------------------------------------------------------------------
|
||||
# ------------------------------------------------------------------------------
|
||||
# Windows image file caches
|
||||
Thumbs.db
|
||||
ehthumbs.db
|
||||
|
||||
25
.php_cs.dist
25
.php_cs.dist
@@ -1,13 +1,6 @@
|
||||
<?php
|
||||
|
||||
$finder = PhpCsFixer\Finder::create()
|
||||
/*
|
||||
* Do not verify:
|
||||
* - all DependencyInjection/Configuration classes: the Configuration.php files
|
||||
* - autoloader from /app directory: autoload.php
|
||||
*/
|
||||
->notPath('/DependencyInjection\/Configuration\.php/')
|
||||
->notPath('/autoload\.php/')
|
||||
->in([
|
||||
__DIR__ . '/src',
|
||||
__DIR__ . '/tests',
|
||||
@@ -15,16 +8,20 @@ $finder = PhpCsFixer\Finder::create()
|
||||
|
||||
return PhpCsFixer\Config::create()
|
||||
->setRules([
|
||||
'@Symfony' => true,
|
||||
'phpdoc_summary' => false,
|
||||
'phpdoc_separation' => false,
|
||||
'phpdoc_align' => false,
|
||||
'cast_spaces' => false,
|
||||
'binary_operator_spaces' => [
|
||||
'@Symfony' => true,
|
||||
'binary_operator_spaces' => [
|
||||
'align_double_arrow' => true,
|
||||
],
|
||||
'concat_space' => [
|
||||
'blank_line_before_return' => false,
|
||||
'cast_spaces' => false,
|
||||
'concat_space' => [
|
||||
'spacing' => 'one',
|
||||
],
|
||||
'phpdoc_add_missing_param_annotation' => true,
|
||||
'phpdoc_align' => false,
|
||||
'phpdoc_order' => true,
|
||||
'phpdoc_separation' => false,
|
||||
'phpdoc_summary' => false,
|
||||
'trim_array_spaces' => false,
|
||||
])
|
||||
->setFinder($finder);
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
preset: symfony
|
||||
|
||||
disabled:
|
||||
- phpdoc_annotation_without_dot
|
||||
- cast_spaces
|
||||
- concat_without_spaces
|
||||
- blank_line_before_return
|
||||
- trim_array_spaces
|
||||
@@ -5,8 +5,12 @@ php:
|
||||
- 7.0
|
||||
- 7.1
|
||||
|
||||
before_install:
|
||||
- sudo locale-gen de_DE.UTF-8 es_ES.UTF-8 en_GB.UTF-8 en_US.UTF-8 fr_FR.UTF-8 it_IT.UTF-8 pl_PL.UTF-8 ru_RU.UTF-8
|
||||
- composer global require hirak/prestissimo
|
||||
|
||||
install:
|
||||
- composer install
|
||||
- travis_wait 30 composer install -vvv
|
||||
|
||||
script:
|
||||
- php ./vendor/bin/phpunit
|
||||
|
||||
31
CHANGELOG.md
Normal file
31
CHANGELOG.md
Normal file
@@ -0,0 +1,31 @@
|
||||
# Meritoo Common Library
|
||||
|
||||
Common and useful classes, methods, exceptions etc.
|
||||
|
||||
# 0.1.0
|
||||
|
||||
1. Composer > support/require PHP 5.6+ (instead of 5.5.9+)
|
||||
2. Docker > rename `php-cli` service to `php`
|
||||
3. Exceptions > create instance of exception using static `create()` method (instead of constructor)
|
||||
4. Documentation > Exceptions
|
||||
|
||||
# 0.0.21
|
||||
|
||||
1. Composer > require ext-pcre
|
||||
2. Arrays > minor refactoring
|
||||
3. Update @author and @copyright in classes' descriptions
|
||||
|
||||
# 0.0.20
|
||||
|
||||
1. Collection > add() method > treat empty string as not provided index (same as null)
|
||||
|
||||
# 0.0.19
|
||||
|
||||
1. Add this changelog
|
||||
2. Reorganize documentation & update [Readme](README.md)
|
||||
3. Docker: use project-related binaries globally
|
||||
4. StyleCI & PHP Coding Standards Fixer: update configuration
|
||||
5. Documentation > Docker > add paragraph for PHP Coding Standards Fixer
|
||||
6. Coding standard > fix automatically
|
||||
7. StyleCI configuration > fix bug "The provided fixer 'binary_operator_spaces' cannot be enabled again because it was already enabled"
|
||||
8. StyleCI > disable & remove
|
||||
101
README.md
101
README.md
@@ -1,105 +1,28 @@
|
||||
# Meritoo Common Library
|
||||
|
||||
Common and useful classes, methods, exceptions etc.
|
||||
|
||||
[](https://travis-ci.org/meritoo/common-library) [](https://packagist.org/packages/meritoo/common-library) [](https://styleci.io/repos/101790028) [](https://github.com/meritoo/common-library) [](https://github.com/meritoo/common-library) [](https://coveralls.io/github/meritoo/common-library?branch=master)
|
||||
[](https://travis-ci.org/meritoo/common-library) [](https://packagist.org/packages/meritoo/common-library) [](https://github.com/meritoo/common-library) [](https://github.com/meritoo/common-library) [](https://coveralls.io/github/meritoo/common-library?branch=master)
|
||||
|
||||
## Installation
|
||||
# Installation
|
||||
|
||||
Run [Composer](https://getcomposer.org) to install this package in your project:
|
||||
|
||||
```bash
|
||||
$ composer require meritoo/common-library
|
||||
composer require meritoo/common-library
|
||||
```
|
||||
|
||||
> How to install Composer: https://getcomposer.org/download
|
||||
> [How to install Composer?](https://getcomposer.org/download)
|
||||
|
||||
## Static methods
|
||||
# Usage
|
||||
|
||||
This package contains a lot of class with static methods, so usage is not so complicated. Just run the static method who would you like to use. Example:
|
||||
1. [Base test case (with common methods and data providers)](docs/Base-test-case.md)
|
||||
2. [Collection of elements](docs/Collection-of-elements.md)
|
||||
3. [Exceptions](docs/Static-methods.md)
|
||||
4. [Static methods](docs/Static-methods.md)
|
||||
|
||||
```php
|
||||
use Meritoo\Common\Utilities\Arrays;
|
||||
# Development
|
||||
|
||||
$firstElement = Arrays::getFirstElement(['lorem', 'ipsum']);
|
||||
var_dump($firstElement); // string(5) "lorem"
|
||||
```
|
||||
|
||||
## Base test case with common methods and data providers
|
||||
|
||||
Located here: `Meritoo\Common\Test\Base\BaseTestCase`. Just extend the `BaseTestCase` class and use it like in `Meritoo\Common\Test\Utilities\DateTest` class:
|
||||
|
||||
```php
|
||||
class DateTest extends BaseTestCase
|
||||
{
|
||||
/**
|
||||
* @param mixed $value Empty value, e.g. ""
|
||||
* @dataProvider provideEmptyValue
|
||||
*/
|
||||
public function testGetDateTimeEmptyValue($value)
|
||||
{
|
||||
self::assertFalse(Date::getDateTime($value));
|
||||
}
|
||||
|
||||
(...)
|
||||
}
|
||||
```
|
||||
|
||||
or in `Meritoo\Common\Test\Utilities\MimeTypesTest` class:
|
||||
|
||||
```php
|
||||
class MimeTypesTest extends BaseTestCase
|
||||
{
|
||||
(...)
|
||||
|
||||
/**
|
||||
* @param bool $mimeType The mime type, e.g. "video/mpeg"
|
||||
* @dataProvider provideBooleanValue
|
||||
*/
|
||||
public function testGetExtensionBooleanMimeType($mimeType)
|
||||
{
|
||||
self::assertEquals('', MimeTypes::getExtension($mimeType));
|
||||
}
|
||||
|
||||
(...)
|
||||
}
|
||||
```
|
||||
|
||||
## Collection of elements
|
||||
|
||||
Located here: `Meritoo\Common\Collection\Collection`. It's a set of some elements, e.g. objects. It's iterable and countable. Provides very useful methods. Some of them:
|
||||
- `getFirst()` - returns the first element in the collection
|
||||
- `getLast()` - returns the last element in the collection
|
||||
- `isEmpty()` - returns information if collection is empty
|
||||
- `add($element, $index = null)` - adds given element (at the end of collection)
|
||||
- `addMultiple($elements, $useIndexes = false)` - adds given elements (at the end of collection)
|
||||
- `prepend($element)` - prepends given element (adds given element at the beginning of collection)
|
||||
- `remove($element)` - removes given element
|
||||
|
||||
Examples of usage below.
|
||||
|
||||
#### An empty collection
|
||||
|
||||
```php
|
||||
use Meritoo\Common\Collection\Collection;
|
||||
|
||||
$emptyCollection = new Collection();
|
||||
var_dump($emptyCollection->isEmpty()); // bool(true)
|
||||
```
|
||||
|
||||
#### Simple collection
|
||||
|
||||
```php
|
||||
use Meritoo\Common\Collection\Collection;
|
||||
|
||||
$elements = [
|
||||
'lorem',
|
||||
'ipsum',
|
||||
123 => 'dolor',
|
||||
345 => 'sit',
|
||||
];
|
||||
|
||||
$simpleCollection = new Collection($elements);
|
||||
var_dump($simpleCollection->has('dolor')); // bool(true)
|
||||
```
|
||||
More information [you can find here](docs/Development.md)
|
||||
|
||||
Enjoy!
|
||||
|
||||
10
build.xml
10
build.xml
@@ -4,10 +4,10 @@
|
||||
<if>
|
||||
<available file="phing/properties" property="custom.properties.available"/>
|
||||
<then>
|
||||
<property file="phing/properties" />
|
||||
<property file="phing/properties"/>
|
||||
</then>
|
||||
<else>
|
||||
<property file="phing/properties.dist" />
|
||||
<property file="phing/properties.dist"/>
|
||||
</else>
|
||||
</if>
|
||||
|
||||
@@ -18,18 +18,18 @@
|
||||
|
||||
<!-- Build app -->
|
||||
<target name="build:app" description="Prepares app to build and tests">
|
||||
<phing phingfile="phing/app.xml" haltonfailure="true" />
|
||||
<phing phingfile="phing/app.xml" haltonfailure="true"/>
|
||||
</target>
|
||||
|
||||
<!-- Build tests -->
|
||||
<target name="build:tests" description="Runs all tests, checks and creates docs">
|
||||
<phing phingfile="phing/tests.xml" haltonfailure="true" />
|
||||
<phing phingfile="phing/tests.xml" haltonfailure="true"/>
|
||||
|
||||
<!--
|
||||
Conditional running of tests.
|
||||
Disabled, because not required.
|
||||
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
Meritoo <github@meritoo.pl>
|
||||
2017-02-22
|
||||
|
||||
<if>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "meritoo/common-library",
|
||||
"description": "Useful classes, methods, extensions etc.",
|
||||
"license": "MIT",
|
||||
"version": "0.0.14",
|
||||
"version": "0.1.0",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Meritoo.pl",
|
||||
@@ -11,18 +11,18 @@
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.6.0",
|
||||
"php": ">=5.6",
|
||||
"ext-pcre": "*",
|
||||
"doctrine/orm": "^2.5",
|
||||
"gedmo/doctrine-extensions": "^2.4",
|
||||
"symfony/http-foundation": "^3.3"
|
||||
"gedmo/doctrine-extensions": "^2.4"
|
||||
},
|
||||
"require-dev": {
|
||||
"friendsofphp/php-cs-fixer": "^2.6",
|
||||
"friendsofphp/php-cs-fixer": "^2.2",
|
||||
"pdepend/pdepend": "^2.5",
|
||||
"phploc/phploc": "^4.0",
|
||||
"phploc/phploc": "^2.1",
|
||||
"phpmd/phpmd": "^2.6",
|
||||
"phpunit/phpunit": "^5.7",
|
||||
"sebastian/phpcpd": "^3.0",
|
||||
"phpunit/phpunit": "^4.8",
|
||||
"sebastian/phpcpd": "^2.0",
|
||||
"squizlabs/php_codesniffer": "^2.9"
|
||||
},
|
||||
"autoload": {
|
||||
@@ -34,5 +34,8 @@
|
||||
"psr-4": {
|
||||
"Meritoo\\Common\\Test\\": "tests/"
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
"sort-packages": true
|
||||
}
|
||||
}
|
||||
|
||||
20
docker-compose.yml
Normal file
20
docker-compose.yml
Normal file
@@ -0,0 +1,20 @@
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
php:
|
||||
image: ${DOCKER_CONTAINER_OWNER}/${DOCKER_CONTAINER_PROJECT}-php
|
||||
container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-php
|
||||
entrypoint: php
|
||||
command: -S 0.0.0.0:9999
|
||||
build:
|
||||
context: ./docker/config
|
||||
args:
|
||||
- TIMEZONE=$TIMEZONE
|
||||
volumes:
|
||||
- .:/project
|
||||
composer:
|
||||
image: ${DOCKER_CONTAINER_OWNER}/${DOCKER_CONTAINER_PROJECT}-php
|
||||
container_name: ${DOCKER_CONTAINER_OWNER}-${DOCKER_CONTAINER_PROJECT}-composer
|
||||
entrypoint: composer
|
||||
volumes:
|
||||
- .:/project
|
||||
131
docker/config/Dockerfile
Normal file
131
docker/config/Dockerfile
Normal file
@@ -0,0 +1,131 @@
|
||||
FROM php:5.6-cli
|
||||
MAINTAINER Meritoo <github@meritoo.pl>
|
||||
|
||||
#
|
||||
# Tools & libraries
|
||||
#
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
vim \
|
||||
git \
|
||||
unzip \
|
||||
libicu-dev \
|
||||
locales \
|
||||
&& apt-get clean \
|
||||
&& rm -rf \
|
||||
/var/lib/apt/lists/* \
|
||||
/tmp/* \
|
||||
/var/tmp/*
|
||||
|
||||
#
|
||||
# Generating locales:
|
||||
# - de_DE
|
||||
# - es_ES
|
||||
# - en_GB
|
||||
# - en_US
|
||||
# - fr_FR
|
||||
# - it_IT
|
||||
# - pl_PL
|
||||
# - ru_RU
|
||||
#
|
||||
RUN sed -i 's/^# de_DE/de_DE/g; \
|
||||
s/^# es_ES/es_ES/g; \
|
||||
s/^# en_GB/en_GB/g; \
|
||||
s/^# en_US/en_US/g; \
|
||||
s/^# fr_FR/fr_FR/g; \
|
||||
s/^# it_IT/it_IT/g; \
|
||||
s/^# pl_PL/pl_PL/g; \
|
||||
s/^# ru_RU/ru_RU/g;' /etc/locale.gen \
|
||||
&& locale-gen
|
||||
|
||||
#
|
||||
# Set default language
|
||||
#
|
||||
# Required to avoid problem with using strange language by error messages.
|
||||
# Example: "chmod(): Aucun fichier ou dossier de ce type"
|
||||
#
|
||||
ENV LANGUAGE=en_US.UTF-8
|
||||
|
||||
#
|
||||
# PHP extensions
|
||||
#
|
||||
RUN docker-php-ext-install \
|
||||
intl \
|
||||
mbstring
|
||||
|
||||
#
|
||||
# PHP extensions (PECL):
|
||||
# - Xdebug
|
||||
#
|
||||
RUN pecl install \
|
||||
xdebug-2.5.5 \
|
||||
&& docker-php-ext-enable \
|
||||
xdebug
|
||||
|
||||
COPY xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
|
||||
|
||||
#
|
||||
# PHP configuration:
|
||||
# - default configuration
|
||||
# - timezone
|
||||
#
|
||||
COPY php.ini /usr/local/etc/php/php.ini
|
||||
ARG TIMEZONE
|
||||
RUN ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
|
||||
&& echo ${TIMEZONE} > /etc/timezone \
|
||||
&& printf '[PHP]\ndate.timezone = "%s"\n' ${TIMEZONE} > /usr/local/etc/php/conf.d/tzone.ini \
|
||||
&& "date"
|
||||
#RUN echo "\n""date.timezone = $TIMEZONE""\n" >> /usr/local/etc/php/php.ini
|
||||
|
||||
#
|
||||
# Phing
|
||||
#
|
||||
RUN pear channel-discover pear.phing.info \
|
||||
&& pear install [--alldeps] phing/phing
|
||||
|
||||
#
|
||||
# Composer - environment variables:
|
||||
# - disable warning about running commands as root/super user
|
||||
# - disable automatic clearing of sudo sessions
|
||||
#
|
||||
# More:
|
||||
# https://getcomposer.org/doc/03-cli.md#composer-allow-superuser
|
||||
#
|
||||
ENV COMPOSER_ALLOW_SUPERUSER 1
|
||||
|
||||
#
|
||||
# Composer + https://packagist.org/packages/hirak/prestissimo package
|
||||
#
|
||||
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
|
||||
&& php -r "if (hash_file('SHA384', 'composer-setup.php') === \
|
||||
'544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { 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');" \
|
||||
&& composer global require \
|
||||
--no-plugins \
|
||||
--no-scripts \
|
||||
--no-progress \
|
||||
--no-suggest \
|
||||
--no-interaction \
|
||||
--prefer-dist \
|
||||
--optimize-autoloader \
|
||||
--classmap-authoritative \
|
||||
hirak/prestissimo \
|
||||
&& rm -rf ~/.composer/cache/* \
|
||||
&& composer clear-cache \
|
||||
&& composer --version
|
||||
|
||||
#
|
||||
# Bash
|
||||
#
|
||||
RUN sed -i 's/^# export/export/g; \
|
||||
s/^# alias/alias/g;' ~/.bashrc \
|
||||
&& echo 'COLUMNS=200'"\n" >> ~/.bashrc
|
||||
|
||||
#
|
||||
# Use project-related binaries globally
|
||||
#
|
||||
ENV PATH="/project/vendor/bin:${PATH}"
|
||||
|
||||
WORKDIR /project
|
||||
3
docker/config/php.ini
Normal file
3
docker/config/php.ini
Normal file
@@ -0,0 +1,3 @@
|
||||
display_errors = On
|
||||
display_startup_errors = On
|
||||
error_reporting = E_ALL
|
||||
6
docker/config/xdebug.ini
Normal file
6
docker/config/xdebug.ini
Normal file
@@ -0,0 +1,6 @@
|
||||
[xdebug]
|
||||
zend_extension=xdebug.so
|
||||
|
||||
xdebug.remote_enable=1
|
||||
xdebug.remote_port=9001
|
||||
xdebug.remote_host=10.254.254.254
|
||||
52
docs/Base-test-case.md
Normal file
52
docs/Base-test-case.md
Normal file
@@ -0,0 +1,52 @@
|
||||
# Meritoo Common Library
|
||||
|
||||
Common and useful classes, methods, exceptions etc.
|
||||
|
||||
# Base test case (with common methods and data providers)
|
||||
|
||||
Located here: `Meritoo\Common\Test\Base\BaseTestCase`. Just extend the `BaseTestCase` class and use it like in `Meritoo\Common\Test\Utilities\DateTest` class:
|
||||
|
||||
```php
|
||||
class DateTest extends BaseTestCase
|
||||
{
|
||||
/**
|
||||
* @param mixed $value Empty value, e.g. ""
|
||||
* @dataProvider provideEmptyValue
|
||||
*/
|
||||
public function testGetDateTimeEmptyValue($value)
|
||||
{
|
||||
self::assertFalse(Date::getDateTime($value));
|
||||
}
|
||||
|
||||
(...)
|
||||
}
|
||||
```
|
||||
|
||||
or in `Meritoo\Common\Test\Utilities\MimeTypesTest` class:
|
||||
|
||||
```php
|
||||
class MimeTypesTest extends BaseTestCase
|
||||
{
|
||||
(...)
|
||||
|
||||
/**
|
||||
* @param bool $mimeType The mime type, e.g. "video/mpeg"
|
||||
* @dataProvider provideBooleanValue
|
||||
*/
|
||||
public function testGetExtensionBooleanMimeType($mimeType)
|
||||
{
|
||||
self::assertEquals('', MimeTypes::getExtension($mimeType));
|
||||
}
|
||||
|
||||
(...)
|
||||
}
|
||||
```
|
||||
|
||||
# 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)
|
||||
|
||||
[‹ Back to `Readme`](../README.md)
|
||||
50
docs/Collection-of-elements.md
Normal file
50
docs/Collection-of-elements.md
Normal file
@@ -0,0 +1,50 @@
|
||||
# Meritoo Common Library
|
||||
|
||||
Common and useful classes, methods, exceptions etc.
|
||||
|
||||
# Collection of elements
|
||||
|
||||
Located here: `Meritoo\Common\Collection\Collection`. It's a set of some elements, e.g. objects. It's iterable and countable. Provides very useful methods. Some of them:
|
||||
- `getFirst()` - returns the first element in the collection
|
||||
- `getLast()` - returns the last element in the collection
|
||||
- `isEmpty()` - returns information if collection is empty
|
||||
- `add($element, $index = null)` - adds given element (at the end of collection)
|
||||
- `addMultiple($elements, $useIndexes = false)` - adds given elements (at the end of collection)
|
||||
- `prepend($element)` - prepends given element (adds given element at the beginning of collection)
|
||||
- `remove($element)` - removes given element
|
||||
|
||||
Examples of usage below.
|
||||
|
||||
### An empty collection
|
||||
|
||||
```php
|
||||
use Meritoo\Common\Collection\Collection;
|
||||
|
||||
$emptyCollection = new Collection();
|
||||
var_dump($emptyCollection->isEmpty()); // bool(true)
|
||||
```
|
||||
|
||||
### Simple collection
|
||||
|
||||
```php
|
||||
use Meritoo\Common\Collection\Collection;
|
||||
|
||||
$elements = [
|
||||
'lorem',
|
||||
'ipsum',
|
||||
123 => 'dolor',
|
||||
345 => 'sit',
|
||||
];
|
||||
|
||||
$simpleCollection = new Collection($elements);
|
||||
var_dump($simpleCollection->has('dolor')); // bool(true)
|
||||
```
|
||||
|
||||
# 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)
|
||||
|
||||
[‹ Back to `Readme`](../README.md)
|
||||
119
docs/Development.md
Normal file
119
docs/Development.md
Normal file
@@ -0,0 +1,119 @@
|
||||
# Meritoo Common Library
|
||||
|
||||
Development-related information
|
||||
|
||||
# Requirements
|
||||
|
||||
* [Docker](https://www.docker.com)
|
||||
* Your favourite IDE :)
|
||||
|
||||
# Getting started
|
||||
|
||||
1. Build, create and start Docker's containers by running command:
|
||||
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
2. Install packages by running command:
|
||||
|
||||
```bash
|
||||
docker-compose run composer install
|
||||
```
|
||||
|
||||
> [What is Docker?](https://www.docker.com/what-docker)
|
||||
|
||||
# Composer
|
||||
|
||||
Available as `composer` service. You can run any Composer's command using the `composer` service:
|
||||
|
||||
```bash
|
||||
docker-compose run composer <command>
|
||||
```
|
||||
|
||||
Examples below.
|
||||
|
||||
##### Install packages
|
||||
|
||||
```bash
|
||||
docker-compose run composer install
|
||||
```
|
||||
|
||||
##### Update packages
|
||||
|
||||
```bash
|
||||
docker-compose run composer update
|
||||
```
|
||||
|
||||
##### Add package
|
||||
|
||||
```bash
|
||||
docker-compose run composer require <vendor>/<package>
|
||||
```
|
||||
|
||||
##### Remove package
|
||||
|
||||
```bash
|
||||
docker-compose run composer remove <vendor>/<package>
|
||||
```
|
||||
|
||||
# Coding Standards Fixer
|
||||
|
||||
Fix coding standard by running command:
|
||||
|
||||
```bash
|
||||
docker-compose exec php php-cs-fixer fix
|
||||
```
|
||||
|
||||
Omit cache and run the Fixer from scratch by running command:
|
||||
|
||||
```bash
|
||||
docker-compose exec php rm .php_cs.cache && docker-compose exec php php-cs-fixer fix
|
||||
```
|
||||
|
||||
> [Want more?](https://cs.sensiolabs.org)
|
||||
|
||||
# Tests
|
||||
|
||||
### Prerequisites
|
||||
|
||||
Install required packages by running command: `docker-compose run composer install`.
|
||||
|
||||
### Running tests
|
||||
|
||||
#### Simply & quick, without code coverage
|
||||
|
||||
Tests are running using Docker and `php` service defined in `docker-compose.yml`. Example:
|
||||
|
||||
```bash
|
||||
docker-compose exec php phpunit --no-coverage
|
||||
```
|
||||
|
||||
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
|
||||
|
||||
```bash
|
||||
docker-compose exec php phpunit
|
||||
```
|
||||
|
||||
# Other
|
||||
|
||||
Rebuild project and run tests by running command:
|
||||
|
||||
```bash
|
||||
docker-compose exec php phing
|
||||
```
|
||||
|
||||
[‹ Back to `Readme`](../README.md)
|
||||
61
docs/Exceptions.md
Normal file
61
docs/Exceptions.md
Normal file
@@ -0,0 +1,61 @@
|
||||
# Meritoo Common Library
|
||||
|
||||
Common and useful classes, methods, exceptions etc.
|
||||
|
||||
# Exceptions
|
||||
|
||||
### Create instance of exception
|
||||
|
||||
This package contains a lot of exceptions. Each of them contains static method `create()` with proper arguments that is used to create instance of the exception. Example:
|
||||
|
||||
```php
|
||||
use Meritoo\Common\Exception\Bundle\IncorrectBundleNameException;
|
||||
throw IncorrectBundleNameException::create('RisusIpsum');
|
||||
```
|
||||
|
||||
### Base exception for unknown type of something
|
||||
|
||||
##### Short description
|
||||
|
||||
It's a `Meritoo\Common\Exception\Base\UnknownTypeException` class. Related to `Meritoo\Common\Type\Base\BaseType` class that represents type of something, e.g. type of button, order.
|
||||
|
||||
##### Usage
|
||||
|
||||
You can extend `Meritoo\Common\Exception\Base\UnknownTypeException` class and create your own static method, e.g. `createException()`, which will be used create instance of the exception. Inside the `createException()` method you can call `parent::create()` method.
|
||||
|
||||
##### Example
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
namespace Your\Package\Exception\Type;
|
||||
|
||||
use Meritoo\Common\Exception\Base\UnknownTypeException;
|
||||
use Your\Package\Type\SimpleType;
|
||||
|
||||
class UnknownSimpleTypeException extends UnknownTypeException
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $unknownType Unknown and simple type
|
||||
* @return UnknownSimpleTypeException
|
||||
*/
|
||||
public static function createException($unknownType)
|
||||
{
|
||||
/* @var UnknownSimpleTypeException $exception */
|
||||
$exception = parent::create($unknownType, new SimpleType(), 'my simple type of something');
|
||||
|
||||
return $exception;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
# 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)
|
||||
|
||||
[‹ Back to `Readme`](../README.md)
|
||||
23
docs/Static-methods.md
Normal file
23
docs/Static-methods.md
Normal file
@@ -0,0 +1,23 @@
|
||||
# Meritoo Common Library
|
||||
|
||||
Common and useful classes, methods, exceptions etc.
|
||||
|
||||
# Static methods
|
||||
|
||||
This package contains a lot of class with static methods, so usage is not so complicated. Just run the static method who would you like to use. Example:
|
||||
|
||||
```php
|
||||
use Meritoo\Common\Utilities\Arrays;
|
||||
|
||||
$firstElement = Arrays::getFirstElement(['lorem', 'ipsum']);
|
||||
var_dump($firstElement); // string(5) "lorem"
|
||||
```
|
||||
|
||||
# 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)
|
||||
|
||||
[‹ Back to `Readme`](../README.md)
|
||||
@@ -4,10 +4,10 @@
|
||||
<if>
|
||||
<available file="phing/properties" property="custom.properties.available"/>
|
||||
<then>
|
||||
<property file="phing/properties" />
|
||||
<property file="phing/properties"/>
|
||||
</then>
|
||||
<else>
|
||||
<property file="phing/properties.dist" />
|
||||
<property file="phing/properties.dist"/>
|
||||
</else>
|
||||
</if>
|
||||
|
||||
@@ -21,9 +21,9 @@
|
||||
depends="app:composer, app:vendors, app:checkout"
|
||||
description="Prepares app to build." />
|
||||
|
||||
<!-- Check / update composer -->
|
||||
<target name="app:composer" description="Checks / updates composer">
|
||||
<echo msg="Checking / updating composer..." />
|
||||
<!-- Updates Composer and validates composer.* files -->
|
||||
<target name="app:composer" description="Updates Composer and validates composer.* files">
|
||||
<echo msg="Updating Composer and validating composer.* files..." />
|
||||
|
||||
<if>
|
||||
<available file="composer.phar" />
|
||||
@@ -42,7 +42,14 @@
|
||||
</if>
|
||||
</else>
|
||||
</if>
|
||||
|
||||
<!-- Update Composer -->
|
||||
<composer command="selfupdate" />
|
||||
|
||||
<!-- Validate Composer -->
|
||||
<composer command="validate">
|
||||
<arg line="--no-check-all --strict" />
|
||||
</composer>
|
||||
</target>
|
||||
|
||||
<!-- Project Install/update vendors -->
|
||||
@@ -68,6 +75,8 @@
|
||||
<then>
|
||||
<composer php="${composer.php}" composer="${composer.path}" command="install">
|
||||
<arg value="--optimize-autoloader" />
|
||||
<arg value="--prefer-dist" />
|
||||
<arg value="--classmap-authoritative" />
|
||||
</composer>
|
||||
</then>
|
||||
<else>
|
||||
|
||||
@@ -28,7 +28,13 @@ assets.installWithSymlink = true
|
||||
|
||||
# Clear cache with the "warmup" option
|
||||
#
|
||||
cache.clearWithWarmup = true
|
||||
# The cache:clear command should always be called with the --no-warmup option. Warmup should be done via the cache:warmup command.
|
||||
# https://github.com/symfony/symfony/blob/master/UPGRADE-3.3.md#frameworkbundle
|
||||
#
|
||||
# Meritoo <github@meritoo.pl>
|
||||
# 2017-06-06
|
||||
#
|
||||
cache.clearWithWarmup = false
|
||||
|
||||
# --------------------------------------------------------------------------------
|
||||
# Composer
|
||||
@@ -75,7 +81,7 @@ dir.reports.coverage = ${dir.reports}/phpunit_coverage
|
||||
# Disabled, because unnecessary right now
|
||||
# phpdocumentor/phpdocumentor cannot be installed via Composer
|
||||
#
|
||||
# Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
# Meritoo <github@meritoo.pl>
|
||||
# 2017-02-22
|
||||
#
|
||||
#dir.docs = ${dir.build}/docs
|
||||
@@ -85,40 +91,15 @@ dir.reports.coverage = ${dir.reports}/phpunit_coverage
|
||||
# Data directories
|
||||
# --------------------------------------------------------------------------------
|
||||
|
||||
dir.data.tests = ${dir.data}/tests
|
||||
dir.data.temporary = ${dir.data}/tmp
|
||||
|
||||
# --------------------------------------------------------------------------------
|
||||
# Testing
|
||||
# --------------------------------------------------------------------------------
|
||||
|
||||
# Test database path
|
||||
# Path of the framework used to run unit tests
|
||||
#
|
||||
tests.database = ${dir.data.temporary}/database.sqlite
|
||||
|
||||
#
|
||||
# Disabled, because unnecessary right now
|
||||
# PHPUnit is installed and loaded by Composer
|
||||
#
|
||||
# Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
# 2017-02-22
|
||||
#
|
||||
# Run PHPUnit using exec task instead of phpunitTask
|
||||
#phpunit.useExec = false
|
||||
|
||||
#
|
||||
# Disabled, because unnecessary right now
|
||||
# We want generate code coverage always
|
||||
#
|
||||
# Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
# 2017-02-22
|
||||
#
|
||||
# Collect coverage data during tests
|
||||
#phpunit.withCoverage = true
|
||||
|
||||
# Path of the PHPUnit (https://phpunit.de)
|
||||
#
|
||||
phpUnit.path = ./vendor/bin/phpunit
|
||||
tests.framework.path = ./vendor/bin/phpunit --verbose --no-coverage --testdox
|
||||
|
||||
# Path of the PHP Coding Standards Fixer (http://cs.sensiolabs.org)
|
||||
#
|
||||
|
||||
111
phing/tests.xml
111
phing/tests.xml
@@ -4,7 +4,7 @@
|
||||
The AutoloaderTask is required to load binaries installed by Composer.
|
||||
The "autoloaderpath" attribute of this task is not required, because it's default value is: vendor/autoload.php.
|
||||
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
Meritoo <github@meritoo.pl>
|
||||
2017-02-23
|
||||
-->
|
||||
<autoloader />
|
||||
@@ -13,10 +13,10 @@
|
||||
<if>
|
||||
<available file="phing/properties" property="custom.properties.available"/>
|
||||
<then>
|
||||
<property file="phing/properties" />
|
||||
<property file="phing/properties"/>
|
||||
</then>
|
||||
<else>
|
||||
<property file="phing/properties.dist" />
|
||||
<property file="phing/properties.dist"/>
|
||||
</else>
|
||||
</if>
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
a) phpdocumentor/phpdocumentor v2.9.0 requires symfony/validator ~2.2
|
||||
b) symfony/validator ~2.2 causes to remove symfony/symfony 3.*
|
||||
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
Meritoo <github@meritoo.pl>
|
||||
2017-02-22
|
||||
-->
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
a) phpdocumentor/phpdocumentor v2.9.0 requires symfony/validator ~2.2
|
||||
b) symfony/validator ~2.2 causes to remove symfony/symfony 3.*
|
||||
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
Meritoo <github@meritoo.pl>
|
||||
2017-02-22
|
||||
-->
|
||||
<!--<target name="build:doc"-->
|
||||
@@ -87,7 +87,7 @@
|
||||
|
||||
<!-- Test target -->
|
||||
<target name="build:test"
|
||||
depends="test:phpunit"
|
||||
depends="test:unit"
|
||||
description="Executes all tests" />
|
||||
|
||||
<!-- Project build clean -->
|
||||
@@ -103,8 +103,8 @@
|
||||
<!--<mkdir dir="${dir.docs}" />-->
|
||||
<!--<mkdir dir="${dir.docs.phpdoc2}" />-->
|
||||
<mkdir dir="${dir.reports}" />
|
||||
<mkdir dir="${dir.reports.coverage}" />
|
||||
<mkdir dir="${dir.reports.pdepend}" />
|
||||
<mkdir dir="${dir.reports.coverage}"/>
|
||||
</target>
|
||||
|
||||
<!-- PHPDocumentor2 API documentation target -->
|
||||
@@ -113,7 +113,7 @@
|
||||
a) phpdocumentor/phpdocumentor v2.9.0 requires symfony/validator ~2.2
|
||||
b) symfony/validator ~2.2 causes to remove symfony/symfony 3.*
|
||||
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
Meritoo <github@meritoo.pl>
|
||||
2017-02-22
|
||||
|
||||
<target name="doc:phpdoc2" description="Generates API documentations">
|
||||
@@ -142,7 +142,7 @@
|
||||
via Composer the Symfony2 standard is not included / available in this package. In this case the PHP Coding
|
||||
Standards Fixer (http://cs.sensiolabs.org) is used.
|
||||
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
Meritoo <github@meritoo.pl>
|
||||
2017-02-22
|
||||
-->
|
||||
<target name="check:cs" description="Checks coding standard">
|
||||
@@ -166,7 +166,7 @@
|
||||
<!--
|
||||
Previous / old version
|
||||
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
Meritoo <github@meritoo.pl>
|
||||
2017-02-22
|
||||
|
||||
<exec command="phpcpd \-\-log-pmd=${dir.reports}/pmd-cpd.xml ${dir.src}" />
|
||||
@@ -204,7 +204,7 @@
|
||||
<!--
|
||||
Previous / old version
|
||||
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
Meritoo <github@meritoo.pl>
|
||||
2017-02-22
|
||||
|
||||
<exec command="phploc \-\-log-csv=${dir.reports}/phploc.csv ${dir.src}" />
|
||||
@@ -212,94 +212,9 @@
|
||||
</target>
|
||||
|
||||
<!-- Unit tests -->
|
||||
<target name="test:phpunit" description="Executes PHPUnit tests">
|
||||
<!-- Check test database -->
|
||||
<if>
|
||||
<not>
|
||||
<available file="${dir.data.tests}" type="dir" property="dir.data.tests.available" />
|
||||
</not>
|
||||
<then>
|
||||
<mkdir dir="${dir.data.tests}" />
|
||||
</then>
|
||||
</if>
|
||||
<if>
|
||||
<not>
|
||||
<available file="${tests.database}" property="tests.database.available" />
|
||||
</not>
|
||||
<then>
|
||||
<touch file="${tests.database}" />
|
||||
</then>
|
||||
</if>
|
||||
<target name="test:unit" description="Executes unit tests">
|
||||
<echo msg="Running unit tests..." />
|
||||
<coverage-setup database="${dir.reports.coverage}/coverage.db">
|
||||
<fileset refid="sourcecode" />
|
||||
</coverage-setup>
|
||||
<exec command="${phpUnit.path} --verbose --configuration ${project.basedir}/phpunit.xml.dist" passthru="true" />
|
||||
<!--
|
||||
I have to use ExecTask to run PHPUnit instead of PHPUnitTask, because tests are not running if PHPUnitTask is
|
||||
used (don't know why):
|
||||
Total tests run: 0, Failures: 0, Errors: 0, Incomplete: 0, Skipped: 0
|
||||
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
2017-02-23
|
||||
|
||||
<phpunit configuration="${project.basedir}/phpunit.xml.dist" printsummary="true">
|
||||
<formatter type="xml" todir="${dir.reports}" outfile="phpunit.xml" />
|
||||
<formatter type="plain" todir="${dir.reports}" outfile="phpunit.txt" />
|
||||
<formatter type="clover" todir="${dir.reports.coverage}" />
|
||||
<formatter type="summary" todir="${dir.reports}" outfile="phpunit_summary.txt" />
|
||||
</phpunit>
|
||||
-->
|
||||
|
||||
<!--
|
||||
Previous / old version
|
||||
|
||||
Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
2017-02-22
|
||||
|
||||
<if>
|
||||
<istrue value="${phpunit.useExec}" />
|
||||
<then>
|
||||
<if>
|
||||
<istrue value="${phpunit.withCoverage}" />
|
||||
<then>
|
||||
<echo message="Running tests with code coverage..." />
|
||||
<exec command="phpunit \-\-log-junit ${dir.reports}/phpunit.xml \-\-coverage-clover ${dir.reports.coverage}/clover-coverage.xml \-\-coverage-crap4j ${dir.reports.coverage}/crap4j-coverage.xml \-\-coverage-html ${dir.reports.coverage}/ -c ${project.basedir} \-\-colors" passthru="true" checkreturn="true" />
|
||||
</then>
|
||||
<else>
|
||||
<echo message="Running tests without code coverage..." />
|
||||
<exec command="phpunit \-\-log-junit ${dir.reports}/phpunit.xml -c ${project.basedir} \-\-colors" passthru="true" checkreturn="true" />
|
||||
</else>
|
||||
</if>
|
||||
</then>
|
||||
<else>
|
||||
<if>
|
||||
<istrue value="${phpunit.withCoverage}" />
|
||||
<then>
|
||||
<echo message="Running tests with code coverage..." />
|
||||
<coverage-setup database="${dir.reports.coverage}/coverage.db">
|
||||
<fileset refid="sourcecode" />
|
||||
</coverage-setup>
|
||||
<phpunit printsummary="true" codecoverage="true">
|
||||
<formatter type="xml" todir="${dir.reports}" outfile="phpunit.xml" />
|
||||
<formatter type="plain" todir="${dir.reports}" outfile="phpunit.txt" />
|
||||
<formatter type="clover" todir="${dir.reports.coverage}" />
|
||||
<formatter type="summary" todir="${dir.reports}" outfile="phpunit_summary.txt" />
|
||||
</phpunit>
|
||||
</then>
|
||||
<else>
|
||||
<echo message="Running tests without code coverage..." />
|
||||
<phpunit printsummary="true">
|
||||
<formatter todir="${dir.reports}" type="xml" outfile="phpunit.xml" />
|
||||
<batchtest>
|
||||
<fileset refid="tests" />
|
||||
</batchtest>
|
||||
</phpunit>
|
||||
</else>
|
||||
</if>
|
||||
</else>
|
||||
</if>
|
||||
-->
|
||||
<exec command="${tests.framework.path}" passthru="true"/>
|
||||
</target>
|
||||
|
||||
<!-- Checkout and finalization -->
|
||||
|
||||
@@ -1,16 +1,34 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<phpunit backupGlobals="false"
|
||||
backupStaticAttributes="false"
|
||||
colors="true"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
processIsolation="false"
|
||||
stopOnFailure="false"
|
||||
syntaxCheck="true"
|
||||
bootstrap="./vendor/autoload.php"
|
||||
<phpunit
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/4.8/phpunit.xsd"
|
||||
backupGlobals="true"
|
||||
backupStaticAttributes="false"
|
||||
bootstrap="./vendor/autoload.php"
|
||||
cacheTokens="false"
|
||||
colors="true"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
forceCoversAnnotation="false"
|
||||
mapTestClassNameToCoveredClassName="false"
|
||||
processIsolation="false"
|
||||
stopOnError="false"
|
||||
stopOnFailure="false"
|
||||
stopOnIncomplete="false"
|
||||
stopOnSkipped="false"
|
||||
stopOnRisky="false"
|
||||
testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader"
|
||||
timeoutForSmallTests="1"
|
||||
timeoutForMediumTests="10"
|
||||
timeoutForLargeTests="60"
|
||||
verbose="true"
|
||||
>
|
||||
<php>
|
||||
<ini name="error_reporting" value="-1"/>
|
||||
</php>
|
||||
|
||||
<testsuites>
|
||||
<testsuite name="Meritoo Package - Main Test Suite">
|
||||
<directory>./tests/</directory>
|
||||
@@ -30,6 +48,6 @@
|
||||
</groups>
|
||||
|
||||
<logging>
|
||||
<log type="coverage-html" target="./build/logs/phpunit_coverage/html" />
|
||||
<log type="coverage-html" target="./build/logs/phpunit_coverage/html"/>
|
||||
</logging>
|
||||
</phpunit>
|
||||
|
||||
@@ -18,8 +18,8 @@ use Meritoo\Common\Utilities\Arrays;
|
||||
* Collection of elements.
|
||||
* It's a set of some elements, e.g. objects.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
{
|
||||
@@ -109,7 +109,7 @@ class Collection implements Countable, ArrayAccess, IteratorAggregate
|
||||
*/
|
||||
public function add($element, $index = null)
|
||||
{
|
||||
if (null === $index) {
|
||||
if (null === $index || '' === $index) {
|
||||
$this->elements[] = $element;
|
||||
} else {
|
||||
$this->elements[$index] = $element;
|
||||
|
||||
@@ -15,27 +15,28 @@ use Meritoo\Common\Utilities\Arrays;
|
||||
/**
|
||||
* An exception used while type of something is unknown
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
abstract class UnknownTypeException extends Exception
|
||||
{
|
||||
/**
|
||||
* Class constructor
|
||||
* 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
|
||||
* @return UnknownTypeException
|
||||
*/
|
||||
public function __construct($unknownType, BaseType $typeInstance, $typeName)
|
||||
public static function create($unknownType, BaseType $typeInstance, $typeName)
|
||||
{
|
||||
$allTypes = $typeInstance->getAll();
|
||||
$types = Arrays::values2string($allTypes, '', ', ');
|
||||
|
||||
$template = 'The \'%s\' type of %s is unknown. Probably doesn\'t exist or there is a typo. You should use one'
|
||||
. ' of these types: %s.';
|
||||
|
||||
$allTypes = $typeInstance->getAll();
|
||||
$types = Arrays::values2string($allTypes, '', ', ');
|
||||
$message = sprintf(sprintf($template, $unknownType, $typeName, $types));
|
||||
parent::__construct($message);
|
||||
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
|
||||
36
src/Exception/Bundle/IncorrectBundleNameException.php
Normal file
36
src/Exception/Bundle/IncorrectBundleNameException.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Exception\Bundle;
|
||||
|
||||
use Exception;
|
||||
|
||||
/**
|
||||
* An exception used while name of bundle is incorrect
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class IncorrectBundleNameException extends Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $bundleName Incorrect name of bundle
|
||||
* @return IncorrectBundleNameException
|
||||
*/
|
||||
public static function create($bundleName)
|
||||
{
|
||||
$template = 'Name of bundle \'%s\' is incorrect. It should start with big letter and end with "Bundle". Is'
|
||||
. ' there everything ok?';
|
||||
|
||||
$message = sprintf($template, $bundleName);
|
||||
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Exception\Date;
|
||||
|
||||
use Meritoo\Common\Exception\Base\UnknownTypeException;
|
||||
use Meritoo\Common\Type\DatePartType;
|
||||
|
||||
/**
|
||||
* An exception used while type of date part, e.g. "year", is unknown
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
*/
|
||||
class UnknownDatePartTypeException extends UnknownTypeException
|
||||
{
|
||||
/**
|
||||
* Class constructor
|
||||
*
|
||||
* @param string $unknownDatePart Type of date part, e.g. "year". One of DatePartType class constants.
|
||||
* @param string $value Incorrect value
|
||||
*/
|
||||
public function __construct($unknownDatePart, $value)
|
||||
{
|
||||
parent::__construct($unknownDatePart, new DatePartType(), sprintf('date part (with value %s)', $value));
|
||||
}
|
||||
}
|
||||
@@ -11,21 +11,22 @@ namespace Meritoo\Common\Exception\File;
|
||||
/**
|
||||
* An exception used while file with given path is empty (has no content)
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class EmptyFileException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Class constructor
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $emptyFilePath Path of the empty file
|
||||
* @return EmptyFileException
|
||||
*/
|
||||
public function __construct($emptyFilePath)
|
||||
public static function create($emptyFilePath)
|
||||
{
|
||||
$template = 'File with path \'%s\' is empty (has no content). Did you provide path of proper file?';
|
||||
$message = sprintf($template, $emptyFilePath);
|
||||
|
||||
parent::__construct($message);
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,16 +11,16 @@ namespace Meritoo\Common\Exception\File;
|
||||
/**
|
||||
* An exception used while path of given file is empty
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class EmptyFilePathException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Class constructor
|
||||
* Creates exception
|
||||
*/
|
||||
public function __construct()
|
||||
public static function create()
|
||||
{
|
||||
parent::__construct('Path of the file is empty. Did you provide path of proper file?');
|
||||
return new static('Path of the file is empty. Did you provide path of proper file?');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,21 +11,22 @@ namespace Meritoo\Common\Exception\File;
|
||||
/**
|
||||
* An exception used while file with given path does not exist
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class NotExistingFileException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Class constructor
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $notExistingFilePath Path of not existing (or not readable) file
|
||||
* @return NotExistingFileException
|
||||
*/
|
||||
public function __construct($notExistingFilePath)
|
||||
public static function create($notExistingFilePath)
|
||||
{
|
||||
$template = 'File with path \'%s\' does not exist (or is not readable). Did you provide path of proper file?';
|
||||
$message = sprintf($template, $notExistingFilePath);
|
||||
|
||||
parent::__construct($message);
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,18 +13,19 @@ use Exception;
|
||||
/**
|
||||
* An exception used while method cannot be called, because is disabled
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class DisabledMethodException extends Exception
|
||||
{
|
||||
/**
|
||||
* Class constructor
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $disabledMethod Name of the disabled method
|
||||
* @param string $alternativeMethod (optional) Name of the alternative method
|
||||
* @return DisabledMethodException
|
||||
*/
|
||||
public function __construct($disabledMethod, $alternativeMethod = '')
|
||||
public static function create($disabledMethod, $alternativeMethod = '')
|
||||
{
|
||||
$template = 'Method %s() cannot be called, because is disabled.';
|
||||
|
||||
@@ -33,6 +34,7 @@ class DisabledMethodException extends Exception
|
||||
}
|
||||
|
||||
$message = sprintf($template, $disabledMethod, $alternativeMethod);
|
||||
parent::__construct($message);
|
||||
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,20 +13,21 @@ use Exception;
|
||||
/**
|
||||
* An exception used while name of class or trait cannot be resolved
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class CannotResolveClassNameException extends Exception
|
||||
{
|
||||
/**
|
||||
* Class constructor
|
||||
* Creates exception
|
||||
*
|
||||
* @param array|object|string $source Source of the class's / trait's name. It can be an array of objects,
|
||||
* namespaces, object or namespace.
|
||||
* @param bool $forClass (optional) If is set to true, message of this exception for class is
|
||||
* prepared. Otherwise - for trait.
|
||||
* @return CannotResolveClassNameException
|
||||
*/
|
||||
public function __construct($source, $forClass = true)
|
||||
public static function create($source, $forClass = true)
|
||||
{
|
||||
$forWho = 'trait';
|
||||
$value = '';
|
||||
@@ -42,6 +43,6 @@ class CannotResolveClassNameException extends Exception
|
||||
$template = 'Name of %s from given \'%s\'%s cannot be resolved. Is there everything ok?';
|
||||
$message = sprintf($template, $forWho, gettype($source), $value);
|
||||
|
||||
parent::__construct($message);
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,18 +14,19 @@ use Meritoo\Common\Utilities\Reflection;
|
||||
/**
|
||||
* An exception used while given class has no child classes
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class MissingChildClassesException extends Exception
|
||||
{
|
||||
/**
|
||||
* Class constructor
|
||||
* Creates exception
|
||||
*
|
||||
* @param array|object|string $parentClass Class that hasn't child classes, but it should. An array of objects,
|
||||
* strings, object or string.
|
||||
* @return MissingChildClassesException
|
||||
*/
|
||||
public function __construct($parentClass)
|
||||
public static function create($parentClass)
|
||||
{
|
||||
$template = 'The \'%s\' class requires one child class at least who will extend her (maybe is an abstract'
|
||||
. ' class), but the child classes are missing. Did you forget to extend this class?';
|
||||
@@ -33,6 +34,6 @@ class MissingChildClassesException extends Exception
|
||||
$parentClassName = Reflection::getClassName($parentClass);
|
||||
$message = sprintf($template, $parentClassName);
|
||||
|
||||
parent::__construct($message);
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,19 +14,20 @@ use Meritoo\Common\Utilities\Reflection;
|
||||
/**
|
||||
* An exception used while given class has more than one child class
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class TooManyChildClassesException extends Exception
|
||||
{
|
||||
/**
|
||||
* Class constructor
|
||||
* Creates exception
|
||||
*
|
||||
* @param array|object|string $parentClass Class that has more than one child class, but it shouldn't. An array
|
||||
* of objects, strings, object or string.
|
||||
* @param array $childClasses Child classes
|
||||
* @return TooManyChildClassesException
|
||||
*/
|
||||
public function __construct($parentClass, array $childClasses)
|
||||
public static function create($parentClass, array $childClasses)
|
||||
{
|
||||
$template = "The '%s' class requires one child class at most who will extend her, but more than one child"
|
||||
. " class was found:\n- %s\n\nWhy did you create more than one classes that extend '%s' class?";
|
||||
@@ -34,6 +35,6 @@ class TooManyChildClassesException extends Exception
|
||||
$parentClassName = Reflection::getClassName($parentClass);
|
||||
$message = sprintf($template, $parentClassName, implode("\n- ", $childClasses), $parentClassName);
|
||||
|
||||
parent::__construct($message);
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,22 +11,24 @@ namespace Meritoo\Common\Exception\Regex;
|
||||
/**
|
||||
* An exception used while length of given hexadecimal value of color is incorrect
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class IncorrectColorHexLengthException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Class constructor
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $color Incorrect hexadecimal value of color
|
||||
* @return IncorrectColorHexLengthException
|
||||
*/
|
||||
public function __construct($color)
|
||||
public static function create($color)
|
||||
{
|
||||
$template = 'Length of hexadecimal value of color \'%s\' is incorrect. It\'s %d, but it should be 3 or 6.'
|
||||
. ' Is there everything ok?';
|
||||
|
||||
$message = sprintf($template, $color, strlen($color));
|
||||
parent::__construct($message);
|
||||
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,19 +11,21 @@ namespace Meritoo\Common\Exception\Regex;
|
||||
/**
|
||||
* An exception used while given hexadecimal value of color is invalid
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class InvalidColorHexValueException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Class constructor
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $color Invalid hexadecimal value of color
|
||||
* @return InvalidColorHexValueException
|
||||
*/
|
||||
public function __construct($color)
|
||||
public static function create($color)
|
||||
{
|
||||
$message = sprintf('Hexadecimal value of color \'%s\' is invalid. Is there everything ok?', $color);
|
||||
parent::__construct($message);
|
||||
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
|
||||
31
src/Exception/Regex/InvalidHtmlAttributesException.php
Normal file
31
src/Exception/Regex/InvalidHtmlAttributesException.php
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Exception\Regex;
|
||||
|
||||
/**
|
||||
* An exception used while html attributes are invalid
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class InvalidHtmlAttributesException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $htmlAttributes Invalid html attributes
|
||||
* @return InvalidHtmlAttributesException
|
||||
*/
|
||||
public static function create($htmlAttributes)
|
||||
{
|
||||
$message = sprintf('HTML attributes \'%s\' are invalid. Is there everything ok?', $htmlAttributes);
|
||||
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
@@ -1,23 +1,31 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Exception\Regex;
|
||||
|
||||
/**
|
||||
* An exception used while url is invalid
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class InvalidUrlException extends \Exception
|
||||
{
|
||||
/**
|
||||
* Class constructor
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $url Invalid url
|
||||
* @return InvalidUrlException
|
||||
*/
|
||||
public function __construct($url)
|
||||
public static function create($url)
|
||||
{
|
||||
$message = sprintf('Url \'%s\' is invalid. Is there everything ok?', $url);
|
||||
parent::__construct($message);
|
||||
|
||||
return new static($message);
|
||||
}
|
||||
}
|
||||
|
||||
36
src/Exception/Type/UnknownDatePartTypeException.php
Normal file
36
src/Exception/Type/UnknownDatePartTypeException.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Exception\Type;
|
||||
|
||||
use Meritoo\Common\Exception\Base\UnknownTypeException;
|
||||
use Meritoo\Common\Type\DatePartType;
|
||||
|
||||
/**
|
||||
* An exception used while type of date part, e.g. "year", is unknown
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class UnknownDatePartTypeException extends UnknownTypeException
|
||||
{
|
||||
/**
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $unknownDatePart Unknown type of date part
|
||||
* @param string $value Incorrect value
|
||||
* @return UnknownDatePartTypeException
|
||||
*/
|
||||
public static function createException($unknownDatePart, $value)
|
||||
{
|
||||
/* @var UnknownDatePartTypeException $exception */
|
||||
$exception = parent::create($unknownDatePart, new DatePartType(), sprintf('date part (with value %s)', $value));
|
||||
|
||||
return $exception;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,11 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Exception\Type;
|
||||
|
||||
use Meritoo\Common\Exception\Base\UnknownTypeException;
|
||||
@@ -8,16 +14,22 @@ use Meritoo\Common\Type\OopVisibilityType;
|
||||
/**
|
||||
* An exception used while the visibility of a property, a method or (as of PHP 7.1.0) a constant is unknown
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class UnknownOopVisibilityTypeException extends UnknownTypeException
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* Creates exception
|
||||
*
|
||||
* @param string $unknownType Unknown visibility of a property, a method or (as of PHP 7.1.0) a constant
|
||||
* @return UnknownOopVisibilityTypeException
|
||||
*/
|
||||
public function __construct($unknownType)
|
||||
public static function createException($unknownType)
|
||||
{
|
||||
parent::__construct($unknownType, new OopVisibilityType(), 'OOP-related visibility');
|
||||
/* @var UnknownOopVisibilityTypeException $exception */
|
||||
$exception = parent::create($unknownType, new OopVisibilityType(), 'OOP-related visibility');
|
||||
|
||||
return $exception;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,214 +8,16 @@
|
||||
|
||||
namespace Meritoo\Common\Test\Base;
|
||||
|
||||
use DateTime;
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Type\UnknownOopVisibilityTypeException;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
use Meritoo\Common\Utilities\Miscellaneous;
|
||||
use Meritoo\Common\Traits\Test\Base\BaseTestCaseTrait;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use ReflectionClass;
|
||||
use ReflectionMethod;
|
||||
|
||||
/**
|
||||
* Base test case with common methods and data providers
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
abstract class BaseTestCase extends TestCase
|
||||
{
|
||||
/**
|
||||
* Provides an empty value
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideEmptyValue()
|
||||
{
|
||||
yield[''];
|
||||
yield[' '];
|
||||
yield[null];
|
||||
yield[0];
|
||||
yield[false];
|
||||
yield[[]];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides boolean value
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideBooleanValue()
|
||||
{
|
||||
yield[false];
|
||||
yield[true];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides instance of DateTime class
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideDateTimeInstance()
|
||||
{
|
||||
yield[new DateTime()];
|
||||
yield[new DateTime('yesterday')];
|
||||
yield[new DateTime('now')];
|
||||
yield[new DateTime('tomorrow')];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides relative / compound format of DateTime
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideDateTimeRelativeFormat()
|
||||
{
|
||||
yield['now'];
|
||||
yield['yesterday'];
|
||||
yield['tomorrow'];
|
||||
yield['back of 10'];
|
||||
yield['front of 10'];
|
||||
yield['last day of February'];
|
||||
yield['first day of next month'];
|
||||
yield['last day of previous month'];
|
||||
yield['last day of next month'];
|
||||
yield['Y-m-d'];
|
||||
yield['Y-m-d 10:00'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides path of not existing file, e.g. "lorem/ipsum.jpg"
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideNotExistingFilePath()
|
||||
{
|
||||
yield['lets-test.doc'];
|
||||
yield['lorem/ipsum.jpg'];
|
||||
yield['surprise/me/one/more/time.txt'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns path of file used by tests.
|
||||
* It should be placed in /data/tests directory of this project.
|
||||
*
|
||||
* @param string $fileName Name of file
|
||||
* @param string $directoryPath (optional) Path of directory containing the file
|
||||
* @return string
|
||||
*/
|
||||
public function getFilePathToTests($fileName, $directoryPath = '')
|
||||
{
|
||||
$rootPath = Miscellaneous::getProjectRootPath();
|
||||
|
||||
$paths = [
|
||||
$rootPath,
|
||||
'data/tests',
|
||||
$directoryPath,
|
||||
$fileName,
|
||||
];
|
||||
|
||||
return Miscellaneous::concatenatePaths($paths);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies visibility and arguments of method
|
||||
*
|
||||
* @param string $classNamespace Namespace of class that contains method to verify
|
||||
* @param string|ReflectionMethod $method Name of method or just the method to verify
|
||||
* @param string $visibilityType Expected visibility of verified method. One of
|
||||
* OopVisibilityType class constants.
|
||||
* @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 UnknownOopVisibilityTypeException
|
||||
*
|
||||
* Attention. 2nd argument, the $method, may be:
|
||||
* - string - name of the method
|
||||
* - instance of ReflectionMethod - just the method (provided by ReflectionClass::getMethod() method)
|
||||
*/
|
||||
protected static function assertMethodVisibilityAndArguments(
|
||||
$classNamespace,
|
||||
$method,
|
||||
$visibilityType,
|
||||
$argumentsCount = 0,
|
||||
$requiredArgumentsCount = 0
|
||||
) {
|
||||
/*
|
||||
* Type of visibility is correct?
|
||||
*/
|
||||
if (!(new OopVisibilityType())->isCorrectType($visibilityType)) {
|
||||
throw new UnknownOopVisibilityTypeException($visibilityType);
|
||||
}
|
||||
|
||||
$reflection = new ReflectionClass($classNamespace);
|
||||
|
||||
/*
|
||||
* Name of method provided only?
|
||||
* Let's find instance of the method (based on reflection)
|
||||
*/
|
||||
if (!$method instanceof ReflectionMethod) {
|
||||
$method = $reflection->getMethod($method);
|
||||
}
|
||||
|
||||
switch ($visibilityType) {
|
||||
case OopVisibilityType::IS_PUBLIC:
|
||||
static::assertTrue($method->isPublic());
|
||||
break;
|
||||
|
||||
case OopVisibilityType::IS_PROTECTED:
|
||||
static::assertTrue($method->isProtected());
|
||||
break;
|
||||
|
||||
case OopVisibilityType::IS_PRIVATE:
|
||||
static::assertTrue($method->isPrivate());
|
||||
break;
|
||||
}
|
||||
|
||||
static::assertEquals($argumentsCount, $method->getNumberOfParameters());
|
||||
static::assertEquals($requiredArgumentsCount, $method->getNumberOfRequiredParameters());
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies visibility and arguments of class constructor
|
||||
*
|
||||
* @param string $classNamespace Namespace of class that contains constructor to verify
|
||||
* @param string $visibilityType Expected visibility of verified method. One of OopVisibilityType class
|
||||
* constants.
|
||||
* @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 UnknownOopVisibilityTypeException
|
||||
*/
|
||||
protected static function assertConstructorVisibilityAndArguments(
|
||||
$classNamespace,
|
||||
$visibilityType,
|
||||
$argumentsCount = 0,
|
||||
$requiredArgumentsCount = 0
|
||||
) {
|
||||
/*
|
||||
* Let's grab the constructor
|
||||
*/
|
||||
$reflection = new ReflectionClass($classNamespace);
|
||||
$method = $reflection->getConstructor();
|
||||
|
||||
return static::assertMethodVisibilityAndArguments($classNamespace, $method, $visibilityType, $argumentsCount, $requiredArgumentsCount);
|
||||
}
|
||||
|
||||
/**
|
||||
* Asserts that class with given namespace has no constructor
|
||||
*
|
||||
* @param string $classNamespace Namespace of class that contains constructor to verify
|
||||
*/
|
||||
protected static function assertHasNoConstructor($classNamespace)
|
||||
{
|
||||
/*
|
||||
* Let's grab the constructor
|
||||
*/
|
||||
$reflection = new ReflectionClass($classNamespace);
|
||||
$constructor = $reflection->getConstructor();
|
||||
|
||||
static::assertNull($constructor);
|
||||
}
|
||||
use BaseTestCaseTrait;
|
||||
}
|
||||
|
||||
@@ -1,60 +1,22 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Base;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Type\Base\BaseType;
|
||||
use Meritoo\Common\Traits\Test\Base\BaseTypeTestCaseTrait;
|
||||
|
||||
/**
|
||||
* Base test case for the type of something
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
abstract class BaseTypeTestCase extends BaseTestCase
|
||||
{
|
||||
/**
|
||||
* Verifies availability of all types
|
||||
*/
|
||||
public function testAvailabilityOfAllTypes()
|
||||
{
|
||||
$available = $this->getTestedTypeInstance()->getAll();
|
||||
$all = $this->getAllExpectedTypes();
|
||||
|
||||
static::assertEquals($all, $available);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies whether given type is correct or not
|
||||
*
|
||||
* @param string $type Type to verify
|
||||
* @param bool $expected Information if given type is correct or not
|
||||
*
|
||||
* @dataProvider provideTypeToVerify
|
||||
*/
|
||||
public function testIfGivenTypeIsCorrect($type, $expected)
|
||||
{
|
||||
static::assertEquals($expected, $this->getTestedTypeInstance()->isCorrectType($type));
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides type to verify and information if it's correct
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
abstract public function provideTypeToVerify();
|
||||
|
||||
/**
|
||||
* Returns instance of the tested type
|
||||
*
|
||||
* @return BaseType
|
||||
*/
|
||||
abstract protected function getTestedTypeInstance();
|
||||
|
||||
/**
|
||||
* Returns all expected types of the tested type
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
abstract protected function getAllExpectedTypes();
|
||||
use BaseTypeTestCaseTrait;
|
||||
}
|
||||
|
||||
263
src/Traits/Test/Base/BaseTestCaseTrait.php
Normal file
263
src/Traits/Test/Base/BaseTestCaseTrait.php
Normal file
@@ -0,0 +1,263 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Traits\Test\Base;
|
||||
|
||||
use DateTime;
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Type\UnknownOopVisibilityTypeException;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
use Meritoo\Common\Utilities\Miscellaneous;
|
||||
use ReflectionClass;
|
||||
use ReflectionException;
|
||||
use ReflectionMethod;
|
||||
use stdClass;
|
||||
|
||||
/**
|
||||
* BaseTestCaseTrait
|
||||
* Created on 2017-11-02
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
trait BaseTestCaseTrait
|
||||
{
|
||||
/**
|
||||
* Path of directory with data used by test cases
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private static $testsDataDirPath = 'data/tests';
|
||||
|
||||
/**
|
||||
* Provides an empty value
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideEmptyValue()
|
||||
{
|
||||
yield[''];
|
||||
yield[' '];
|
||||
yield[null];
|
||||
yield[0];
|
||||
yield[false];
|
||||
yield[[]];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides boolean value
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideBooleanValue()
|
||||
{
|
||||
yield[false];
|
||||
yield[true];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides instance of DateTime class
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideDateTimeInstance()
|
||||
{
|
||||
yield[new DateTime()];
|
||||
yield[new DateTime('yesterday')];
|
||||
yield[new DateTime('now')];
|
||||
yield[new DateTime('tomorrow')];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides relative / compound format of DateTime
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideDateTimeRelativeFormat()
|
||||
{
|
||||
yield['now'];
|
||||
yield['yesterday'];
|
||||
yield['tomorrow'];
|
||||
yield['back of 10'];
|
||||
yield['front of 10'];
|
||||
yield['last day of February'];
|
||||
yield['first day of next month'];
|
||||
yield['last day of previous month'];
|
||||
yield['last day of next month'];
|
||||
yield['Y-m-d'];
|
||||
yield['Y-m-d 10:00'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides path of not existing file, e.g. "lorem/ipsum.jpg"
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideNotExistingFilePath()
|
||||
{
|
||||
yield['lets-test.doc'];
|
||||
yield['lorem/ipsum.jpg'];
|
||||
yield['surprise/me/one/more/time.txt'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides non scalar value, e.g. [] or null
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideNonScalarValue()
|
||||
{
|
||||
yield[
|
||||
[],
|
||||
];
|
||||
|
||||
yield[
|
||||
null,
|
||||
];
|
||||
|
||||
yield[
|
||||
new stdClass(),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns path of file used by tests.
|
||||
* It should be placed in /data/tests directory of this project.
|
||||
*
|
||||
* @param string $fileName Name of file
|
||||
* @param string $directoryPath (optional) Path of directory containing the file
|
||||
* @return string
|
||||
*/
|
||||
public function getFilePathForTesting($fileName, $directoryPath = '')
|
||||
{
|
||||
$rootPath = Miscellaneous::getProjectRootPath();
|
||||
|
||||
$paths = [
|
||||
$rootPath,
|
||||
self::$testsDataDirPath,
|
||||
$directoryPath,
|
||||
$fileName,
|
||||
];
|
||||
|
||||
return Miscellaneous::concatenatePaths($paths);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies visibility and arguments of method
|
||||
*
|
||||
* @param string $classNamespace Namespace of class that contains method to verify
|
||||
* @param string|ReflectionMethod $method Name of method or just the method to verify
|
||||
* @param string $visibilityType Expected visibility of verified method. One of
|
||||
* OopVisibilityType class constants.
|
||||
* @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 UnknownOopVisibilityTypeException
|
||||
* @throws ReflectionException
|
||||
*
|
||||
* Attention. 2nd argument, the $method, may be:
|
||||
* - string - name of the method
|
||||
* - instance of ReflectionMethod - just the method (provided by ReflectionClass::getMethod() method)
|
||||
*/
|
||||
protected static function assertMethodVisibilityAndArguments(
|
||||
$classNamespace,
|
||||
$method,
|
||||
$visibilityType,
|
||||
$argumentsCount = 0,
|
||||
$requiredArgumentsCount = 0
|
||||
) {
|
||||
/*
|
||||
* Type of visibility is correct?
|
||||
*/
|
||||
if (!(new OopVisibilityType())->isCorrectType($visibilityType)) {
|
||||
throw new UnknownOopVisibilityTypeException($visibilityType);
|
||||
}
|
||||
|
||||
$reflection = new ReflectionClass($classNamespace);
|
||||
|
||||
/*
|
||||
* Name of method provided only?
|
||||
* Let's find instance of the method (based on reflection)
|
||||
*/
|
||||
if (!$method instanceof ReflectionMethod) {
|
||||
$method = $reflection->getMethod($method);
|
||||
}
|
||||
|
||||
switch ($visibilityType) {
|
||||
case OopVisibilityType::IS_PUBLIC:
|
||||
static::assertTrue($method->isPublic());
|
||||
break;
|
||||
|
||||
case OopVisibilityType::IS_PROTECTED:
|
||||
static::assertTrue($method->isProtected());
|
||||
break;
|
||||
|
||||
case OopVisibilityType::IS_PRIVATE:
|
||||
static::assertTrue($method->isPrivate());
|
||||
break;
|
||||
}
|
||||
|
||||
static::assertEquals($argumentsCount, $method->getNumberOfParameters());
|
||||
static::assertEquals($requiredArgumentsCount, $method->getNumberOfRequiredParameters());
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies visibility and arguments of class constructor
|
||||
*
|
||||
* @param string $classNamespace Namespace of class that contains constructor to verify
|
||||
* @param string $visibilityType Expected visibility of verified method. One of OopVisibilityType class
|
||||
* constants.
|
||||
* @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,
|
||||
$visibilityType,
|
||||
$argumentsCount = 0,
|
||||
$requiredArgumentsCount = 0
|
||||
) {
|
||||
/*
|
||||
* Let's grab the constructor
|
||||
*/
|
||||
$reflection = new ReflectionClass($classNamespace);
|
||||
$method = $reflection->getConstructor();
|
||||
|
||||
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)
|
||||
{
|
||||
/*
|
||||
* Let's grab the constructor
|
||||
*/
|
||||
$reflection = new ReflectionClass($classNamespace);
|
||||
$constructor = $reflection->getConstructor();
|
||||
|
||||
static::assertNull($constructor);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets path of directory with data used by test cases
|
||||
*
|
||||
* @param string $testsDataDirPath Path of directory with data used by test cases
|
||||
*/
|
||||
protected static function setTestsDataDirPath($testsDataDirPath)
|
||||
{
|
||||
static::$testsDataDirPath = $testsDataDirPath;
|
||||
}
|
||||
}
|
||||
66
src/Traits/Test/Base/BaseTypeTestCaseTrait.php
Normal file
66
src/Traits/Test/Base/BaseTypeTestCaseTrait.php
Normal file
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Traits\Test\Base;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Type\Base\BaseType;
|
||||
|
||||
/**
|
||||
* Trait for the base test case for the type of something
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
trait BaseTypeTestCaseTrait
|
||||
{
|
||||
/**
|
||||
* Verifies availability of all types
|
||||
*/
|
||||
public function testAvailabilityOfAllTypes()
|
||||
{
|
||||
$available = $this->getTestedTypeInstance()->getAll();
|
||||
$all = $this->getAllExpectedTypes();
|
||||
|
||||
static::assertEquals($all, $available);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies whether given type is correct or not
|
||||
*
|
||||
* @param string $type Type to verify
|
||||
* @param bool $expected Information if given type is correct or not
|
||||
*
|
||||
* @dataProvider provideTypeToVerify
|
||||
*/
|
||||
public function testIfGivenTypeIsCorrect($type, $expected)
|
||||
{
|
||||
static::assertEquals($expected, $this->getTestedTypeInstance()->isCorrectType($type));
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides type to verify and information if it's correct
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
abstract public function provideTypeToVerify();
|
||||
|
||||
/**
|
||||
* Returns instance of the tested type
|
||||
*
|
||||
* @return BaseType
|
||||
*/
|
||||
abstract protected function getTestedTypeInstance();
|
||||
|
||||
/**
|
||||
* Returns all expected types of the tested type
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
abstract protected function getAllExpectedTypes();
|
||||
}
|
||||
@@ -14,8 +14,8 @@ use Meritoo\Common\Utilities\Reflection;
|
||||
* Base / abstract type of something, e.g. type of button, order, date etc.
|
||||
* Child class should contain constants - each of them represent one type.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
abstract class BaseType
|
||||
{
|
||||
|
||||
@@ -13,8 +13,8 @@ use Meritoo\Common\Type\Base\BaseType;
|
||||
/**
|
||||
* Type of date part, e.g. "year"
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class DatePartType extends BaseType
|
||||
{
|
||||
|
||||
@@ -6,18 +6,20 @@
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Utilities;
|
||||
namespace Meritoo\Common\Type;
|
||||
|
||||
use DateTime;
|
||||
use Meritoo\Common\Type\Base\BaseType;
|
||||
use Meritoo\Common\Utilities\Date;
|
||||
|
||||
/**
|
||||
* A date's period.
|
||||
* Contains start and end date of the period.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class DatePeriod
|
||||
class DatePeriod extends BaseType
|
||||
{
|
||||
/**
|
||||
* The period constant: last month
|
||||
@@ -108,17 +110,6 @@ class DatePeriod
|
||||
$this->endDate = $endDate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given period is correct
|
||||
*
|
||||
* @param int $period The period to verify
|
||||
* @return bool
|
||||
*/
|
||||
public static function isCorrectPeriod($period)
|
||||
{
|
||||
return in_array($period, Reflection::getConstants(__CLASS__));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns formatted one of the period's date: start date or end date
|
||||
*
|
||||
@@ -7,8 +7,8 @@ use Meritoo\Common\Type\Base\BaseType;
|
||||
/**
|
||||
* The visibility of a property, a method or (as of PHP 7.1.0) a constant
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*
|
||||
* @see http://php.net/manual/en/language.oop5.visibility.php
|
||||
*/
|
||||
|
||||
@@ -11,8 +11,8 @@ namespace Meritoo\Common\Utilities;
|
||||
/**
|
||||
* Useful arrays methods
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class Arrays
|
||||
{
|
||||
@@ -48,23 +48,6 @@ class Arrays
|
||||
|
||||
if (is_array($value)) {
|
||||
$effect .= self::values2string($value, $arrayColumnKey, $separator);
|
||||
/*
|
||||
* Previous version. Doesn't work with array containing arrays, e.g.:
|
||||
* array(
|
||||
* 1 => array(
|
||||
* 'item1',
|
||||
* 'item2'
|
||||
* ),
|
||||
* 2 => array(
|
||||
* 'item3',
|
||||
* 'item4'
|
||||
* )
|
||||
* )
|
||||
*
|
||||
if(isset($value[$arrayColumnKey])){
|
||||
$effect .= $value[$arrayColumnKey];
|
||||
}
|
||||
*/
|
||||
} else {
|
||||
if (empty($arrayColumnKey)) {
|
||||
$effect .= $value;
|
||||
@@ -530,6 +513,10 @@ class Arrays
|
||||
*/
|
||||
public static function removeElement(array $array, $item)
|
||||
{
|
||||
/*
|
||||
* No elements or the element does not exist?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($array) || !in_array($item, $array)) {
|
||||
return false;
|
||||
}
|
||||
@@ -626,6 +613,10 @@ class Arrays
|
||||
*/
|
||||
public static function setKeysAsValues(array $array, $ignoreDuplicatedValues = true)
|
||||
{
|
||||
/*
|
||||
* No elements?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($array)) {
|
||||
return [];
|
||||
}
|
||||
@@ -682,7 +673,7 @@ class Arrays
|
||||
return null;
|
||||
}
|
||||
|
||||
$effect = $array;
|
||||
$effect = &$array;
|
||||
ksort($effect, $sortFlags);
|
||||
|
||||
foreach ($effect as &$value) {
|
||||
@@ -831,60 +822,66 @@ class Arrays
|
||||
*/
|
||||
public static function getLastElementsPaths(array $array, $separator = '.', $parentPath = '', $stopIfMatchedBy = '')
|
||||
{
|
||||
/*
|
||||
* No elements?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($array)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (!empty($stopIfMatchedBy)) {
|
||||
$stopIfMatchedBy = self::makeArray($stopIfMatchedBy);
|
||||
}
|
||||
|
||||
$paths = [];
|
||||
|
||||
if (!empty($array)) {
|
||||
if (!empty($stopIfMatchedBy)) {
|
||||
$stopIfMatchedBy = self::makeArray($stopIfMatchedBy);
|
||||
foreach ($array as $key => $value) {
|
||||
$path = $key;
|
||||
$stopRecursion = false;
|
||||
|
||||
/*
|
||||
* If the path of parent element is delivered,
|
||||
* I have to use it and build longer path
|
||||
*/
|
||||
if (!empty($parentPath)) {
|
||||
$pathTemplate = '%s%s%s';
|
||||
$path = sprintf($pathTemplate, $parentPath, $separator, $key);
|
||||
}
|
||||
|
||||
foreach ($array as $key => $value) {
|
||||
$path = $key;
|
||||
$stopRecursion = false;
|
||||
/*
|
||||
* Check if the key or current path matches one of patterns at which the process should be stopped,
|
||||
* the recursive not used. It means that I have to pass current value and stop processing of the
|
||||
* array (don't go to the next step).
|
||||
*/
|
||||
if (!empty($stopIfMatchedBy)) {
|
||||
foreach ($stopIfMatchedBy as $rawPattern) {
|
||||
$pattern = sprintf('|%s|', $rawPattern);
|
||||
|
||||
/*
|
||||
* If the path of parent element is delivered,
|
||||
* I have to use it and build longer path
|
||||
*/
|
||||
if (!empty($parentPath)) {
|
||||
$pathTemplate = '%s%s%s';
|
||||
$path = sprintf($pathTemplate, $parentPath, $separator, $key);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if the key or current path matches one of patterns at which the process should be stopped,
|
||||
* the recursive not used. It means that I have to pass current value and stop processing of the
|
||||
* array (don't go to the next step).
|
||||
*/
|
||||
if (!empty($stopIfMatchedBy)) {
|
||||
foreach ($stopIfMatchedBy as $rawPattern) {
|
||||
$pattern = sprintf('|%s|', $rawPattern);
|
||||
|
||||
if (preg_match($pattern, $key) || preg_match($pattern, $path)) {
|
||||
$stopRecursion = true;
|
||||
break;
|
||||
}
|
||||
if (preg_match($pattern, $key) || preg_match($pattern, $path)) {
|
||||
$stopRecursion = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* The value is passed to the returned array if:
|
||||
* - it's not an array
|
||||
* or
|
||||
* - the process is stopped, recursive is not used
|
||||
*/
|
||||
if (!is_array($value) || (is_array($value) && empty($value)) || $stopRecursion) {
|
||||
$paths[$path] = $value;
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
* The value is passed to the returned array if:
|
||||
* - it's not an array
|
||||
* or
|
||||
* - the process is stopped, recursive is not used
|
||||
*/
|
||||
if (!is_array($value) || (is_array($value) && empty($value)) || $stopRecursion) {
|
||||
$paths[$path] = $value;
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Let's iterate through the next level, using recursive
|
||||
*/
|
||||
if (is_array($value)) {
|
||||
$recursivePaths = self::getLastElementsPaths($value, $separator, $path, $stopIfMatchedBy);
|
||||
$paths += $recursivePaths;
|
||||
}
|
||||
/*
|
||||
* Let's iterate through the next level, using recursive
|
||||
*/
|
||||
if (is_array($value)) {
|
||||
$recursivePaths = self::getLastElementsPaths($value, $separator, $path, $stopIfMatchedBy);
|
||||
$paths += $recursivePaths;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1083,6 +1080,10 @@ class Arrays
|
||||
*/
|
||||
public static function getAllValuesOfKey(array $array, $key)
|
||||
{
|
||||
/*
|
||||
* No elements?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($array)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -8,20 +8,23 @@
|
||||
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
use Meritoo\Common\Exception\Bundle\IncorrectBundleNameException;
|
||||
|
||||
/**
|
||||
* Useful methods for bundle
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class Bundle
|
||||
{
|
||||
/**
|
||||
* Returns path to view / template of given bundle
|
||||
* Returns path of given bundle to view / template with given extension
|
||||
*
|
||||
* @param string $viewPath Path of the view / template, e.g. "MyDirectory/my-template"
|
||||
* @param string $bundleName Name of the bundle, e.g. "MyExtraBundle"
|
||||
* @param string $extension (optional) Extension of the view / template
|
||||
* @param string $bundleName Full name of the bundle, e.g. "MyExtraBundle"
|
||||
* @param string $extension (optional) Extension of the view / template (default: "html.twig")
|
||||
* @throws IncorrectBundleNameException
|
||||
* @return string|null
|
||||
*/
|
||||
public static function getBundleViewPath($viewPath, $bundleName, $extension = 'html.twig')
|
||||
@@ -34,6 +37,13 @@ class Bundle
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* Given name of bundle is invalid?
|
||||
*/
|
||||
if (!Regex::isValidBundleName($bundleName)) {
|
||||
throw IncorrectBundleNameException::create($bundleName);
|
||||
}
|
||||
|
||||
/*
|
||||
* Path of the view / template doesn't end with given extension?
|
||||
*/
|
||||
@@ -41,6 +51,39 @@ class Bundle
|
||||
$viewPath = sprintf('%s.%s', $viewPath, $extension);
|
||||
}
|
||||
|
||||
return sprintf('%s:%s', $bundleName, $viewPath);
|
||||
/*
|
||||
* Prepare short name of bundle and path of view / template with "/" (instead of ":")
|
||||
*/
|
||||
$shortBundleName = static::getShortBundleName($bundleName);
|
||||
$viewPath = str_replace(':', '/', $viewPath);
|
||||
|
||||
return sprintf('@%s/%s', $shortBundleName, $viewPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns short name of bundle (without "Bundle")
|
||||
*
|
||||
* @param string $fullBundleName Full name of the bundle, e.g. "MyExtraBundle"
|
||||
* @throws IncorrectBundleNameException
|
||||
* @return string|null
|
||||
*/
|
||||
public static function getShortBundleName($fullBundleName)
|
||||
{
|
||||
/*
|
||||
* Given name of bundle is invalid?
|
||||
*/
|
||||
if (!Regex::isValidBundleName($fullBundleName)) {
|
||||
if (!is_string($fullBundleName)) {
|
||||
$fullBundleName = gettype($fullBundleName);
|
||||
}
|
||||
|
||||
throw new IncorrectBundleNameException($fullBundleName);
|
||||
}
|
||||
|
||||
$matches = [];
|
||||
$pattern = Regex::getBundleNamePattern();
|
||||
preg_match($pattern, $fullBundleName, $matches);
|
||||
|
||||
return $matches[1];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,8 +13,8 @@ use stdClass;
|
||||
/**
|
||||
* Useful Composer-related methods (only static functions)
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class Composer
|
||||
{
|
||||
|
||||
@@ -10,14 +10,16 @@ namespace Meritoo\Common\Utilities;
|
||||
|
||||
use DateInterval;
|
||||
use DateTime;
|
||||
use Meritoo\Common\Exception\Date\UnknownDatePartTypeException;
|
||||
use Exception;
|
||||
use Meritoo\Common\Exception\Type\UnknownDatePartTypeException;
|
||||
use Meritoo\Common\Type\DatePartType;
|
||||
use Meritoo\Common\Type\DatePeriod;
|
||||
|
||||
/**
|
||||
* Useful date methods
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class Date
|
||||
{
|
||||
@@ -66,97 +68,106 @@ class Date
|
||||
* The dates are returned in an array with indexes 'start' and 'end'.
|
||||
*
|
||||
* @param int $period The period, type of period. One of DatePeriod class constants, e.g. DatePeriod::LAST_WEEK.
|
||||
* @return DatePeriod
|
||||
* @throws Exception
|
||||
* @return null|DatePeriod
|
||||
*/
|
||||
public static function getDatesForPeriod($period)
|
||||
{
|
||||
$datePeriod = null;
|
||||
|
||||
if (DatePeriod::isCorrectPeriod($period)) {
|
||||
$dateStart = null;
|
||||
$dateEnd = null;
|
||||
|
||||
switch ($period) {
|
||||
case DatePeriod::LAST_WEEK:
|
||||
$thisWeekStart = new DateTime('this week');
|
||||
|
||||
$dateStart = clone $thisWeekStart;
|
||||
$dateEnd = clone $thisWeekStart;
|
||||
|
||||
$dateStart->sub(new DateInterval('P7D'));
|
||||
$dateEnd->sub(new DateInterval('P1D'));
|
||||
|
||||
break;
|
||||
case DatePeriod::THIS_WEEK:
|
||||
$dateStart = new DateTime('this week');
|
||||
|
||||
$dateEnd = clone $dateStart;
|
||||
$dateEnd->add(new DateInterval('P6D'));
|
||||
|
||||
break;
|
||||
case DatePeriod::NEXT_WEEK:
|
||||
$dateStart = new DateTime('this week');
|
||||
$dateStart->add(new DateInterval('P7D'));
|
||||
|
||||
$dateEnd = clone $dateStart;
|
||||
$dateEnd->add(new DateInterval('P6D'));
|
||||
|
||||
break;
|
||||
case DatePeriod::LAST_MONTH:
|
||||
$dateStart = new DateTime('first day of last month');
|
||||
$dateEnd = new DateTime('last day of last month');
|
||||
|
||||
break;
|
||||
case DatePeriod::THIS_MONTH:
|
||||
$lastMonth = self::getDatesForPeriod(DatePeriod::LAST_MONTH);
|
||||
$nextMonth = self::getDatesForPeriod(DatePeriod::NEXT_MONTH);
|
||||
|
||||
$dateStart = $lastMonth->getEndDate();
|
||||
$dateStart->add(new DateInterval('P1D'));
|
||||
|
||||
$dateEnd = $nextMonth->getStartDate();
|
||||
$dateEnd->sub(new DateInterval('P1D'));
|
||||
|
||||
break;
|
||||
case DatePeriod::NEXT_MONTH:
|
||||
$dateStart = new DateTime('first day of next month');
|
||||
$dateEnd = new DateTime('last day of next month');
|
||||
|
||||
break;
|
||||
case DatePeriod::LAST_YEAR:
|
||||
case DatePeriod::THIS_YEAR:
|
||||
case DatePeriod::NEXT_YEAR:
|
||||
$dateStart = new DateTime();
|
||||
$dateEnd = new DateTime();
|
||||
|
||||
if (DatePeriod::LAST_YEAR == $period || DatePeriod::NEXT_YEAR == $period) {
|
||||
$yearDifference = 1;
|
||||
|
||||
if (DatePeriod::LAST_YEAR == $period) {
|
||||
$yearDifference *= -1;
|
||||
}
|
||||
|
||||
$modifyString = sprintf('%s year', $yearDifference);
|
||||
$dateStart->modify($modifyString);
|
||||
$dateEnd->modify($modifyString);
|
||||
}
|
||||
|
||||
$year = $dateStart->format('Y');
|
||||
$dateStart->setDate($year, 1, 1);
|
||||
$dateEnd->setDate($year, 12, 31);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (null !== $dateStart && null !== $dateEnd) {
|
||||
$dateStart->setTime(0, 0, 0);
|
||||
$dateEnd->setTime(23, 59, 59);
|
||||
|
||||
$datePeriod = new DatePeriod($dateStart, $dateEnd);
|
||||
}
|
||||
/*
|
||||
* Type of period is incorrect?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!(new DatePeriod())->isCorrectType($period)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $datePeriod;
|
||||
$dateStart = null;
|
||||
$dateEnd = null;
|
||||
|
||||
switch ($period) {
|
||||
case DatePeriod::LAST_WEEK:
|
||||
$thisWeekStart = new DateTime('this week');
|
||||
|
||||
$dateStart = clone $thisWeekStart;
|
||||
$dateEnd = clone $thisWeekStart;
|
||||
|
||||
$dateStart->sub(new DateInterval('P7D'));
|
||||
$dateEnd->sub(new DateInterval('P1D'));
|
||||
|
||||
break;
|
||||
case DatePeriod::THIS_WEEK:
|
||||
$dateStart = new DateTime('this week');
|
||||
|
||||
$dateEnd = clone $dateStart;
|
||||
$dateEnd->add(new DateInterval('P6D'));
|
||||
|
||||
break;
|
||||
case DatePeriod::NEXT_WEEK:
|
||||
$dateStart = new DateTime('this week');
|
||||
$dateStart->add(new DateInterval('P7D'));
|
||||
|
||||
$dateEnd = clone $dateStart;
|
||||
$dateEnd->add(new DateInterval('P6D'));
|
||||
|
||||
break;
|
||||
case DatePeriod::LAST_MONTH:
|
||||
$dateStart = new DateTime('first day of last month');
|
||||
$dateEnd = new DateTime('last day of last month');
|
||||
|
||||
break;
|
||||
case DatePeriod::THIS_MONTH:
|
||||
$lastMonth = self::getDatesForPeriod(DatePeriod::LAST_MONTH);
|
||||
$nextMonth = self::getDatesForPeriod(DatePeriod::NEXT_MONTH);
|
||||
|
||||
$dateStart = $lastMonth->getEndDate();
|
||||
$dateStart->add(new DateInterval('P1D'));
|
||||
|
||||
$dateEnd = $nextMonth->getStartDate();
|
||||
$dateEnd->sub(new DateInterval('P1D'));
|
||||
|
||||
break;
|
||||
case DatePeriod::NEXT_MONTH:
|
||||
$dateStart = new DateTime('first day of next month');
|
||||
$dateEnd = new DateTime('last day of next month');
|
||||
|
||||
break;
|
||||
case DatePeriod::LAST_YEAR:
|
||||
case DatePeriod::THIS_YEAR:
|
||||
case DatePeriod::NEXT_YEAR:
|
||||
$dateStart = new DateTime();
|
||||
$dateEnd = new DateTime();
|
||||
|
||||
if (DatePeriod::LAST_YEAR == $period || DatePeriod::NEXT_YEAR == $period) {
|
||||
$yearDifference = 1;
|
||||
|
||||
if (DatePeriod::LAST_YEAR == $period) {
|
||||
$yearDifference *= -1;
|
||||
}
|
||||
|
||||
$modifyString = sprintf('%s year', $yearDifference);
|
||||
$dateStart->modify($modifyString);
|
||||
$dateEnd->modify($modifyString);
|
||||
}
|
||||
|
||||
$year = $dateStart->format('Y');
|
||||
$dateStart->setDate($year, 1, 1);
|
||||
$dateEnd->setDate($year, 12, 31);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Start or end date is unknown?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (null === $dateStart || null === $dateEnd) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$dateStart->setTime(0, 0, 0);
|
||||
$dateEnd->setTime(23, 59, 59);
|
||||
|
||||
return new DatePeriod($dateStart, $dateEnd);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -209,6 +220,7 @@ class Date
|
||||
/**
|
||||
* Returns current day of week
|
||||
*
|
||||
* @throws UnknownDatePartTypeException
|
||||
* @return int
|
||||
*/
|
||||
public static function getCurrentDayOfWeek()
|
||||
@@ -230,8 +242,8 @@ class Date
|
||||
* @param int $month The month value
|
||||
* @param int $day The day value
|
||||
*
|
||||
* @return int
|
||||
* @throws UnknownDatePartTypeException
|
||||
* @return int
|
||||
*/
|
||||
public static function getDayOfWeek($year, $month, $day)
|
||||
{
|
||||
@@ -243,21 +255,21 @@ class Date
|
||||
* Oops, incorrect year
|
||||
*/
|
||||
if ($year <= 0) {
|
||||
throw new UnknownDatePartTypeException(DatePartType::YEAR, $year);
|
||||
throw UnknownDatePartTypeException::createException(DatePartType::YEAR, $year);
|
||||
}
|
||||
|
||||
/*
|
||||
* Oops, incorrect month
|
||||
*/
|
||||
if ($month < 1 || $month > 12) {
|
||||
throw new UnknownDatePartTypeException(DatePartType::MONTH, $month);
|
||||
throw UnknownDatePartTypeException::createException(DatePartType::MONTH, $month);
|
||||
}
|
||||
|
||||
/*
|
||||
* Oops, incorrect day
|
||||
*/
|
||||
if ($day < 1 || $day > 31) {
|
||||
throw new UnknownDatePartTypeException(DatePartType::DAY, $day);
|
||||
throw UnknownDatePartTypeException::createException(DatePartType::DAY, $day);
|
||||
}
|
||||
|
||||
if ($month < 3) {
|
||||
@@ -475,6 +487,7 @@ class Date
|
||||
* @param string $intervalTemplate (optional) Template used to build date interval. It should contain "%d" as the
|
||||
* placeholder which is replaced with a number that represents each iteration.
|
||||
* Default: interval for days.
|
||||
* @throws Exception
|
||||
* @return array
|
||||
*/
|
||||
public static function getDatesCollection(DateTime $startDate, $datesCount, $intervalTemplate = 'P%dD')
|
||||
@@ -520,6 +533,7 @@ class Date
|
||||
* @param int $end (optional) End of random partition
|
||||
* @param string $intervalTemplate (optional) Template used to build date interval. The placeholder is replaced
|
||||
* with next, iterated value.
|
||||
* @throws Exception
|
||||
* @return DateTime
|
||||
*/
|
||||
public static function getRandomDate(DateTime $startDate = null, $start = 1, $end = 100, $intervalTemplate = 'P%sD')
|
||||
|
||||
@@ -13,8 +13,8 @@ use Generator;
|
||||
/**
|
||||
* Useful methods for the Generator class (only static functions)
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class GeneratorUtility
|
||||
{
|
||||
|
||||
@@ -11,8 +11,8 @@ namespace Meritoo\Common\Utilities;
|
||||
/**
|
||||
* Useful locale methods
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class Locale
|
||||
{
|
||||
@@ -23,7 +23,7 @@ class Locale
|
||||
* setting. It's the same constant as required by setlocale() function.
|
||||
* @param string $languageCode Language code, in ISO 639-1 format. Short form of the locale, e.g. "fr".
|
||||
* @param string $countryCode (optional) Country code, in ISO 3166-1 alpha-2 format, e.g. "FR"
|
||||
* @return bool
|
||||
* @return false|string
|
||||
*
|
||||
* Available categories (values of $category argument):
|
||||
* - LC_ALL for all of the below
|
||||
@@ -57,9 +57,29 @@ class Locale
|
||||
}
|
||||
|
||||
$localeLongForm = self::getLongForm($languageCode, $countryCode);
|
||||
setlocale($category, $localeLongForm);
|
||||
|
||||
return true;
|
||||
return setlocale($category, $localeLongForm);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns locale for given category
|
||||
*
|
||||
* @param int $category Named constant specifying the category of the functions affected by the locale setting.
|
||||
* It's the same constant as required by setlocale() function.
|
||||
* @return string
|
||||
*
|
||||
* Available categories (values of $category argument):
|
||||
* - LC_ALL for all of the below
|
||||
* - LC_COLLATE for string comparison, see strcoll()
|
||||
* - LC_CTYPE for character classification and conversion, for example strtoupper()
|
||||
* - LC_MONETARY for localeconv()
|
||||
* - LC_NUMERIC for decimal separator (See also localeconv())
|
||||
* - LC_TIME for date and time formatting with strftime()
|
||||
* - LC_MESSAGES for system responses (available if PHP was compiled with libintl)
|
||||
*/
|
||||
public static function getLocale($category)
|
||||
{
|
||||
return setlocale($category, '0');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -11,8 +11,8 @@ namespace Meritoo\Common\Utilities;
|
||||
/**
|
||||
* Useful methods for mime types of files
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class MimeTypes
|
||||
{
|
||||
@@ -759,9 +759,8 @@ class MimeTypes
|
||||
* Returns mime type of given file
|
||||
*
|
||||
* @param string $filePath Path of the file to check
|
||||
* @return string
|
||||
*
|
||||
* @throws \RuntimeException
|
||||
* @return string
|
||||
*/
|
||||
public static function getMimeType($filePath)
|
||||
{
|
||||
|
||||
@@ -9,14 +9,15 @@
|
||||
namespace Meritoo\Common\Utilities;
|
||||
|
||||
use Gedmo\Sluggable\Util\Urlizer;
|
||||
use Symfony\Component\HttpFoundation\Cookie;
|
||||
use Meritoo\Common\Exception\Regex\IncorrectColorHexLengthException;
|
||||
use Meritoo\Common\Exception\Regex\InvalidColorHexValueException;
|
||||
use Transliterator;
|
||||
|
||||
/**
|
||||
* Miscellaneous methods (only static functions)
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class Miscellaneous
|
||||
{
|
||||
@@ -626,10 +627,10 @@ class Miscellaneous
|
||||
* Breaks long text
|
||||
*
|
||||
* @param string $text The text to check and break
|
||||
* @param int $perLine (optional) Characters count per line
|
||||
* @param string $separator (optional) Separator that is placed beetwen lines
|
||||
* @param string $encoding (optional) Character encoding. Used by mb_substr().
|
||||
* @param int $proportionalAberration (optional) Proportional aberration for chars (percent value)
|
||||
* @param int $perLine (optional) Characters count per line. Default: 100.
|
||||
* @param string $separator (optional) Separator that is placed between lines. Default: "<br>".
|
||||
* @param string $encoding (optional) Character encoding. Used by mb_substr(). Default: "UTF-8".
|
||||
* @param int $proportionalAberration (optional) Proportional aberration for chars (percent value). Default: 20.
|
||||
* @return string
|
||||
*/
|
||||
public static function breakLongText(
|
||||
@@ -716,15 +717,23 @@ class Miscellaneous
|
||||
*
|
||||
* @param string $directoryPath Directory path
|
||||
* @param bool $contentOnly (optional) If is set to true, only content of the directory is removed, not
|
||||
* directory. Otherwise - directory is removed too.
|
||||
* @return bool
|
||||
* directory itself. Otherwise - directory is removed too (default behaviour).
|
||||
* @return bool|null
|
||||
*/
|
||||
public static function removeDirectory($directoryPath, $contentOnly = false)
|
||||
{
|
||||
/*
|
||||
* Directory does not exist?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!file_exists($directoryPath)) {
|
||||
return true;
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* It's not a directory?
|
||||
* Let's treat it like file
|
||||
*/
|
||||
if (!is_dir($directoryPath)) {
|
||||
return unlink($directoryPath);
|
||||
}
|
||||
@@ -739,6 +748,9 @@ class Miscellaneous
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Directory should be removed too?
|
||||
*/
|
||||
if (!$contentOnly) {
|
||||
return rmdir($directoryPath);
|
||||
}
|
||||
@@ -1192,138 +1204,6 @@ class Miscellaneous
|
||||
return $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a CURL response with parsed HTTP headers as array with "headers", "cookies" and "content" keys
|
||||
*
|
||||
* The headers and cookies are parsed and returned as an array, and an array of Cookie objects. Returned array looks
|
||||
* like this example:
|
||||
* <code>
|
||||
* [
|
||||
* 'headers' => [
|
||||
* 'Content-Type' => 'text/html; charset=UTF-8',
|
||||
* ...
|
||||
* ],
|
||||
* 'cookies' => [
|
||||
* new Symfony\Component\HttpFoundation\Cookie(),
|
||||
* new Symfony\Component\HttpFoundation\Cookie(),
|
||||
* ...
|
||||
* ],
|
||||
* 'content' => '<html>...</html>'
|
||||
* ]
|
||||
* </code>
|
||||
*
|
||||
* If you want to attach HTTP headers into response content by CURL you need to set "CURLOPT_HEADER" option
|
||||
* to "true". To read exact length of HTTP headers from CURL you can use "curl_getinfo()" function
|
||||
* and read "CURLINFO_HEADER_SIZE" option.
|
||||
*
|
||||
* @param string $response the full content of response, including HTTP headers
|
||||
* @param int $headerSize The length of HTTP headers in content
|
||||
* @return array
|
||||
*/
|
||||
public static function getCurlResponseWithHeaders($response, $headerSize)
|
||||
{
|
||||
$headerContent = mb_substr($response, 0, $headerSize);
|
||||
$content = mb_substr($response, $headerSize);
|
||||
$headers = [];
|
||||
$cookies = [];
|
||||
|
||||
/*
|
||||
* Let's transform headers content into two arrays: headers and cookies
|
||||
*/
|
||||
foreach (explode("\r\n", $headerContent) as $i => $line) {
|
||||
/*
|
||||
* First line is only HTTP status and is unneeded so skip it
|
||||
*/
|
||||
if (0 === $i) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Regex::contains($line, ':')) {
|
||||
list($key, $value) = explode(': ', $line);
|
||||
|
||||
/*
|
||||
* If the header is a "set-cookie" let's save it to "cookies" array
|
||||
*/
|
||||
if ('Set-Cookie' === $key) {
|
||||
$cookieParameters = explode(';', $value);
|
||||
|
||||
$name = '';
|
||||
$value = '';
|
||||
$expire = 0;
|
||||
$path = '/';
|
||||
$domain = null;
|
||||
$secure = false;
|
||||
$httpOnly = true;
|
||||
|
||||
foreach ($cookieParameters as $j => $parameter) {
|
||||
$param = explode('=', $parameter);
|
||||
|
||||
/*
|
||||
* First parameter will be always a cookie name and it's value. It is not needed to run
|
||||
* further actions for them, so save the values and move to next parameter.
|
||||
*/
|
||||
if (0 === $j) {
|
||||
$name = trim($param[0]);
|
||||
$value = trim($param[1]);
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Now there would be the rest of cookie parameters, names of params are sent different way so
|
||||
* I need to lowercase the names and remove unneeded spaces.
|
||||
*/
|
||||
$paramName = mb_strtolower(trim($param[0]));
|
||||
$paramValue = true;
|
||||
|
||||
/*
|
||||
* Some parameters don't have value e.g. "secure", but the value for them if they're specified
|
||||
* is "true". Otherwise - just read a value for parameter if exists.
|
||||
*/
|
||||
if (array_key_exists(1, $param)) {
|
||||
$paramValue = trim($param[1]);
|
||||
}
|
||||
|
||||
switch ($paramName) {
|
||||
case 'expires':
|
||||
$expire = $paramValue;
|
||||
break;
|
||||
case 'path':
|
||||
$path = $paramValue;
|
||||
break;
|
||||
case 'domain':
|
||||
$domain = $paramValue;
|
||||
break;
|
||||
case 'secure':
|
||||
$secure = $paramValue;
|
||||
break;
|
||||
case 'httponly':
|
||||
$httpOnly = $paramValue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Create new Cookie object and add it to "cookies" array.
|
||||
* I must skip to next header as cookies shouldn't be saved in "headers" array.
|
||||
*/
|
||||
$cookies[] = new Cookie($name, $value, $expire, $path, $domain, $secure, $httpOnly);
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Save response header which is not a cookie
|
||||
*/
|
||||
$headers[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return [
|
||||
'headers' => $headers,
|
||||
'cookies' => $cookies,
|
||||
'content' => $content,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds missing the "0" characters to given number until given length is reached
|
||||
*
|
||||
@@ -1432,6 +1312,8 @@ class Miscellaneous
|
||||
* Returns inverted value of color for given color
|
||||
*
|
||||
* @param string $color Hexadecimal value of color to invert (with or without hash), e.g. "dd244c" or "#22a5fe"
|
||||
* @throws IncorrectColorHexLengthException
|
||||
* @throws InvalidColorHexValueException
|
||||
* @return string
|
||||
*/
|
||||
public static function getInvertedColor($color)
|
||||
|
||||
@@ -10,6 +10,7 @@ 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;
|
||||
@@ -17,8 +18,8 @@ use Doctrine\ORM\QueryBuilder;
|
||||
/**
|
||||
* Useful methods for query builder (the Doctrine's QueryBuilder class)
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class QueryBuilderUtility
|
||||
{
|
||||
@@ -33,6 +34,10 @@ class QueryBuilderUtility
|
||||
{
|
||||
$aliases = $queryBuilder->getRootAliases();
|
||||
|
||||
/*
|
||||
* No aliases?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($aliases)) {
|
||||
return null;
|
||||
}
|
||||
@@ -42,7 +47,8 @@ class QueryBuilderUtility
|
||||
|
||||
/**
|
||||
* Returns alias of given property joined in given query builder
|
||||
* If the join does not exist, null is returned.
|
||||
*
|
||||
* If there are no joins or the join does not exist, null is returned.
|
||||
* It's also information if given property is already joined in given query builder.
|
||||
*
|
||||
* @param QueryBuilder $queryBuilder The query builder to verify
|
||||
@@ -53,6 +59,10 @@ class QueryBuilderUtility
|
||||
{
|
||||
$joins = $queryBuilder->getDQLPart('join');
|
||||
|
||||
/*
|
||||
* No joins?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($joins)) {
|
||||
return null;
|
||||
}
|
||||
@@ -99,33 +109,43 @@ class QueryBuilderUtility
|
||||
*/
|
||||
public static function setCriteria(QueryBuilder $queryBuilder, array $criteria = [], $alias = '')
|
||||
{
|
||||
if (!empty($criteria)) {
|
||||
if (empty($alias)) {
|
||||
$alias = self::getRootAlias($queryBuilder);
|
||||
}
|
||||
/*
|
||||
* No criteria used in WHERE clause?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($criteria)) {
|
||||
return $queryBuilder;
|
||||
}
|
||||
|
||||
foreach ($criteria as $column => $value) {
|
||||
$compareOperator = '=';
|
||||
/*
|
||||
* No alias provided?
|
||||
* Let's use root alias
|
||||
*/
|
||||
if (empty($alias)) {
|
||||
$alias = self::getRootAlias($queryBuilder);
|
||||
}
|
||||
|
||||
if (is_array($value) && !empty($value)) {
|
||||
if (2 == count($value)) {
|
||||
$compareOperator = $value[1];
|
||||
}
|
||||
foreach ($criteria as $column => $value) {
|
||||
$compareOperator = '=';
|
||||
|
||||
$value = $value[0];
|
||||
if (is_array($value) && !empty($value)) {
|
||||
if (2 == count($value)) {
|
||||
$compareOperator = $value[1];
|
||||
}
|
||||
|
||||
$predicate = sprintf('%s.%s %s :%s', $alias, $column, $compareOperator, $column);
|
||||
|
||||
if (null === $value) {
|
||||
$predicate = $queryBuilder->expr()->isNull(sprintf('%s.%s', $alias, $column));
|
||||
unset($criteria[$column]);
|
||||
} else {
|
||||
$queryBuilder->setParameter($column, $value);
|
||||
}
|
||||
|
||||
$queryBuilder = $queryBuilder->andWhere($predicate);
|
||||
$value = $value[0];
|
||||
}
|
||||
|
||||
$predicate = sprintf('%s.%s %s :%s', $alias, $column, $compareOperator, $column);
|
||||
|
||||
if (null === $value) {
|
||||
$predicate = $queryBuilder->expr()->isNull(sprintf('%s.%s', $alias, $column));
|
||||
unset($criteria[$column]);
|
||||
} else {
|
||||
$queryBuilder->setParameter($column, $value);
|
||||
}
|
||||
|
||||
$queryBuilder = $queryBuilder->andWhere($predicate);
|
||||
}
|
||||
|
||||
return $queryBuilder;
|
||||
@@ -136,14 +156,15 @@ class QueryBuilderUtility
|
||||
*
|
||||
* @param EntityManager $entityManager The entity manager
|
||||
* @param array|ArrayCollection $entities The entities to delete
|
||||
* @param bool $flushDeleted (optional) If is set to true, flushes the deleted objects.
|
||||
* Otherwise - not.
|
||||
* @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)
|
||||
{
|
||||
/*
|
||||
* No entities found?
|
||||
* No entities provided?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($entities)) {
|
||||
@@ -169,24 +190,30 @@ class QueryBuilderUtility
|
||||
* Attention. Existing parameters will be overridden.
|
||||
*
|
||||
* @param QueryBuilder $queryBuilder The query builder
|
||||
* @param array|ArrayCollection $parameters Parameters to add. Collection of instances of
|
||||
* Doctrine\ORM\Query\Parameter class or an array with key-value pairs.
|
||||
* @param array|ArrayCollection $parameters Parameters to add. Collection of Doctrine\ORM\Query\Parameter
|
||||
* instances or an array with key-value pairs.
|
||||
* @return QueryBuilder
|
||||
*/
|
||||
public static function addParameters(QueryBuilder $queryBuilder, $parameters)
|
||||
{
|
||||
if (!empty($parameters)) {
|
||||
foreach ($parameters as $key => $parameter) {
|
||||
$name = $key;
|
||||
$value = $parameter;
|
||||
/*
|
||||
* No parameters?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($parameters)) {
|
||||
return $queryBuilder;
|
||||
}
|
||||
|
||||
if ($parameter instanceof Parameter) {
|
||||
$name = $parameter->getName();
|
||||
$value = $parameter->getValue();
|
||||
}
|
||||
foreach ($parameters as $key => $parameter) {
|
||||
$name = $key;
|
||||
$value = $parameter;
|
||||
|
||||
$queryBuilder->setParameter($name, $value);
|
||||
if ($parameter instanceof Parameter) {
|
||||
$name = $parameter->getName();
|
||||
$value = $parameter->getValue();
|
||||
}
|
||||
|
||||
$queryBuilder->setParameter($name, $value);
|
||||
}
|
||||
|
||||
return $queryBuilder;
|
||||
|
||||
@@ -23,8 +23,8 @@ use ReflectionProperty;
|
||||
/**
|
||||
* Useful reflection methods
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class Reflection
|
||||
{
|
||||
@@ -34,6 +34,7 @@ class Reflection
|
||||
* @param object|string $class The object or name of object's class
|
||||
* @param bool $withoutInheritance (optional) If is set to true, only methods for given class are returned.
|
||||
* Otherwise - all methods, with inherited methods too.
|
||||
* @throws ReflectionException
|
||||
* @return array
|
||||
*/
|
||||
public static function getMethods($class, $withoutInheritance = false)
|
||||
@@ -64,6 +65,7 @@ class Reflection
|
||||
* Returns constants of given class / object
|
||||
*
|
||||
* @param object|string $class The object or name of object's class
|
||||
* @throws ReflectionException
|
||||
* @return array
|
||||
*/
|
||||
public static function getConstants($class)
|
||||
@@ -74,10 +76,11 @@ class Reflection
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns maximum constant from all constants of given class / object.
|
||||
* Values of constants should be integers.
|
||||
* Returns maximum integer value of constant of given class / object.
|
||||
* Constants whose values are integers are considered only.
|
||||
*
|
||||
* @param object|string $class The object or name of object's class
|
||||
* @throws ReflectionException
|
||||
* @return int|null
|
||||
*/
|
||||
public static function getMaxNumberConstant($class)
|
||||
@@ -104,6 +107,7 @@ class Reflection
|
||||
*
|
||||
* @param object|string $class The object or name of object's class
|
||||
* @param string $method Name of the method to find
|
||||
* @throws ReflectionException
|
||||
* @return bool
|
||||
*/
|
||||
public static function hasMethod($class, $method)
|
||||
@@ -118,6 +122,7 @@ class Reflection
|
||||
*
|
||||
* @param object|string $class The object or name of object's class
|
||||
* @param string $property Name of the property to find
|
||||
* @throws ReflectionException
|
||||
* @return bool
|
||||
*/
|
||||
public static function hasProperty($class, $property)
|
||||
@@ -132,6 +137,7 @@ class Reflection
|
||||
*
|
||||
* @param object|string $class The object or name of object's class
|
||||
* @param string $constant Name of the constant to find
|
||||
* @throws ReflectionException
|
||||
* @return bool
|
||||
*/
|
||||
public static function hasConstant($class, $constant)
|
||||
@@ -146,6 +152,7 @@ class Reflection
|
||||
*
|
||||
* @param object|string $class The object or name of object's class
|
||||
* @param string $constant Name of the constant that contains a value
|
||||
* @throws ReflectionException
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getConstantValue($class, $constant)
|
||||
@@ -168,6 +175,7 @@ class Reflection
|
||||
* dot-separated, e.g. "invoice.user.email".
|
||||
* @param bool $force (optional) If is set to true, try to retrieve value even if the object doesn't have
|
||||
* property. Otherwise - not.
|
||||
* @throws ReflectionException
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getPropertyValue($object, $property, $force = false)
|
||||
@@ -198,7 +206,7 @@ class Reflection
|
||||
* while using "project.name" as property - $project has $name property ($project exists in the Deal class)
|
||||
* and the $project equals null
|
||||
*
|
||||
* Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* Meritoo <github@meritoo.pl>
|
||||
* 2016-11-07
|
||||
*/
|
||||
if (null !== $object) {
|
||||
@@ -284,6 +292,7 @@ class Reflection
|
||||
* @param string $property Name of the property that contains a value
|
||||
* @param bool $force (optional) If is set to true, try to retrieve value even if the
|
||||
* object does not have property. Otherwise - not.
|
||||
* @throws ReflectionException
|
||||
* @return array
|
||||
*/
|
||||
public static function getPropertyValues($objects, $property, $force = false)
|
||||
@@ -428,7 +437,7 @@ class Reflection
|
||||
|
||||
$parents = class_parents($childClassName);
|
||||
|
||||
if (is_array($parents)) {
|
||||
if (is_array($parents) && 0 < count($parents)) {
|
||||
return in_array($parentClassName, $parents);
|
||||
}
|
||||
|
||||
@@ -443,6 +452,7 @@ class Reflection
|
||||
* constants. By default all properties are returned.
|
||||
* @param bool $includeParents (optional) If is set to true, properties of parent classes are
|
||||
* included (recursively). Otherwise - not.
|
||||
* @throws ReflectionException
|
||||
* @return array|ReflectionProperty
|
||||
*/
|
||||
public static function getProperties($source, $filter = null, $includeParents = false)
|
||||
@@ -476,6 +486,7 @@ class Reflection
|
||||
* Returns a parent class or false if there is no parent class
|
||||
*
|
||||
* @param array|object|string $source An array of objects, namespaces, object or namespace
|
||||
* @throws ReflectionException
|
||||
* @return ReflectionClass|bool
|
||||
*/
|
||||
public static function getParentClass($source)
|
||||
@@ -492,8 +503,8 @@ class Reflection
|
||||
*
|
||||
* @param array|object|string $class Class who child classes should be returned. An array of objects, strings,
|
||||
* object or string.
|
||||
* @return array|null
|
||||
* @throws CannotResolveClassNameException
|
||||
* @return array|null
|
||||
*/
|
||||
public static function getChildClasses($class)
|
||||
{
|
||||
@@ -513,7 +524,7 @@ class Reflection
|
||||
* Oops, cannot resolve class
|
||||
*/
|
||||
if (null === $className) {
|
||||
throw new CannotResolveClassNameException($class);
|
||||
throw CannotResolveClassNameException::create($class);
|
||||
}
|
||||
|
||||
$childClasses = [];
|
||||
@@ -547,10 +558,9 @@ class Reflection
|
||||
*
|
||||
* @param array|object|string $parentClass Class who child class should be returned. An array of objects,
|
||||
* namespaces, object or namespace.
|
||||
* @return mixed
|
||||
*
|
||||
* @throws MissingChildClassesException
|
||||
* @throws TooManyChildClassesException
|
||||
* @return mixed
|
||||
*/
|
||||
public static function getOneChildClass($parentClass)
|
||||
{
|
||||
@@ -561,7 +571,7 @@ class Reflection
|
||||
* Oops, the base / parent class hasn't child class
|
||||
*/
|
||||
if (empty($childClasses)) {
|
||||
throw new MissingChildClassesException($parentClass);
|
||||
throw MissingChildClassesException::create($parentClass);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -569,7 +579,7 @@ class Reflection
|
||||
* Oops, the base / parent class has too many child classes
|
||||
*/
|
||||
if (count($childClasses) > 1) {
|
||||
throw new TooManyChildClassesException($parentClass, $childClasses);
|
||||
throw TooManyChildClassesException::create($parentClass, $childClasses);
|
||||
}
|
||||
|
||||
return trim($childClasses[0]);
|
||||
@@ -582,6 +592,7 @@ class Reflection
|
||||
* @param string $property Name of the property
|
||||
* @param int $filter (optional) Filter of properties. Uses ReflectionProperty class constants.
|
||||
* By default all properties are allowed / processed.
|
||||
* @throws ReflectionException
|
||||
* @return null|ReflectionProperty
|
||||
*/
|
||||
public static function getProperty($class, $property, $filter = null)
|
||||
@@ -608,8 +619,8 @@ class Reflection
|
||||
* @param array|string $trait An array of strings or string
|
||||
* @param bool $verifyParents If is set to true, parent classes are verified if they use given
|
||||
* trait. Otherwise - not.
|
||||
* @return bool|null
|
||||
* @throws CannotResolveClassNameException
|
||||
* @return bool|null
|
||||
*/
|
||||
public static function usesTrait($class, $trait, $verifyParents = false)
|
||||
{
|
||||
@@ -620,7 +631,7 @@ class Reflection
|
||||
* Oops, cannot resolve class
|
||||
*/
|
||||
if (empty($className)) {
|
||||
throw new CannotResolveClassNameException($class);
|
||||
throw CannotResolveClassNameException::create($class);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -651,6 +662,7 @@ class Reflection
|
||||
* If given class does not extend another, returns null.
|
||||
*
|
||||
* @param array|object|string $class An array of objects, namespaces, object or namespace
|
||||
* @throws ReflectionException
|
||||
* @return string|null
|
||||
*/
|
||||
public static function getParentClassName($class)
|
||||
|
||||
@@ -14,8 +14,8 @@ use Meritoo\Common\Exception\Regex\InvalidColorHexValueException;
|
||||
/**
|
||||
* Useful regular expressions methods
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class Regex
|
||||
{
|
||||
@@ -25,18 +25,21 @@ class Regex
|
||||
* @var array
|
||||
*/
|
||||
private static $patterns = [
|
||||
'email' => '/[\w-]{2,}@[\w-]+\.[\w]{2,}+/',
|
||||
'email' => '/^[\w-.]{2,}@[\w-]+\.[\w]{2,}+$/',
|
||||
'phone' => '/^\+?[0-9 ]+$/',
|
||||
'camelCasePart' => '/([a-z]|[A-Z]){1}[a-z]*/',
|
||||
'urlProtocol' => '/^([a-z]+:\/\/)',
|
||||
'urlDomain' => '([\da-z\.-]+)\.([a-z\.]{2,6})(\/)?([\w\.\-]*)?(\?)?([\w \.\-\/=&]*)\/?$/i',
|
||||
'letterOrDigit' => '/[a-zA-Z0-9]+/',
|
||||
'htmlEntity' => '/&[a-z0-9]+;/',
|
||||
'htmlAttribute' => '/([\w-]+)="([\w -]+)"/',
|
||||
'fileName' => '/.+\.\w+$/',
|
||||
'isQuoted' => '/^[\'"]{1}.+[\'"]{1}$/',
|
||||
'windowsBasedPath' => '/^[A-Z]{1}:\\\.*$/',
|
||||
'money' => '/^[-+]?\d+([\.,]{1}\d*)?$/',
|
||||
'color' => '/^[a-f0-9]{6}$/i',
|
||||
'bundleName' => '/^(([A-Z]{1}[a-z0-9]+)((?2))*)(Bundle)$/',
|
||||
'binaryValue' => '/[^\x20-\x7E\t\r\n]/',
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -56,43 +59,77 @@ class Regex
|
||||
*/
|
||||
public static function isValidEmail($email)
|
||||
{
|
||||
/*
|
||||
* Not a string?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($email)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$pattern = self::getEmailPattern();
|
||||
|
||||
return (bool)preg_match($pattern, $email);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given tax ID (in polish: NIP) is valid
|
||||
* Returns information if given tax ID is valid (in Poland it's named "NIP")
|
||||
*
|
||||
* @param string $taxidString Tax ID (NIP) string
|
||||
* @param string $taxIdString Tax ID (NIP) string
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValidTaxid($taxidString)
|
||||
public static function isValidTaxId($taxIdString)
|
||||
{
|
||||
if (!empty($taxidString)) {
|
||||
$weights = [
|
||||
6,
|
||||
5,
|
||||
7,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
];
|
||||
$taxid = preg_replace('/[\s-]/', '', $taxidString);
|
||||
$sum = 0;
|
||||
/*
|
||||
* Not a string?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($taxIdString)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (10 == strlen($taxid) && is_numeric($taxid)) {
|
||||
for ($x = 0; $x <= 8; ++$x) {
|
||||
$sum += $taxid[$x] * $weights[$x];
|
||||
}
|
||||
/*
|
||||
* Empty/Unknown value?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($taxIdString)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((($sum % 11) % 10) == $taxid[9]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
$taxId = preg_replace('/[\s-]/', '', $taxIdString);
|
||||
|
||||
/*
|
||||
* Tax ID is not 10 characters length OR is not numeric?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (10 !== strlen($taxId) || !is_numeric($taxId)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$weights = [
|
||||
6,
|
||||
5,
|
||||
7,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
];
|
||||
|
||||
$sum = 0;
|
||||
|
||||
for ($x = 0; $x <= 8; ++$x) {
|
||||
$sum += $taxId[$x] * $weights[$x];
|
||||
}
|
||||
|
||||
/*
|
||||
* Last number it's not a remainder from dividing per 11?
|
||||
* Nothing to do
|
||||
*/
|
||||
if ($sum % 11 == $taxId[9]) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -108,6 +145,14 @@ class Regex
|
||||
*/
|
||||
public static function isValidUrl($url, $requireProtocol = false)
|
||||
{
|
||||
/*
|
||||
* Not a string?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($url)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$pattern = self::getUrlPattern($requireProtocol);
|
||||
|
||||
return (bool)preg_match($pattern, $url);
|
||||
@@ -121,88 +166,108 @@ class Regex
|
||||
*/
|
||||
public static function isValidPhoneNumber($phoneNumber)
|
||||
{
|
||||
/*
|
||||
* Not a string?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($phoneNumber)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$pattern = self::getPhoneNumberPattern();
|
||||
|
||||
return (bool)preg_match($pattern, $phoneNumber);
|
||||
return (bool)preg_match($pattern, trim($phoneNumber));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns array values that matches given pattern (or values that keys matches)
|
||||
* Returns array values that match given pattern (or values that keys match the pattern)
|
||||
*
|
||||
* @param string $pattern Pattern to match
|
||||
* @param array $dataArray The array
|
||||
* @param bool $itsKeyPattern (optional) If is set to true, keys are checks if they match pattern. Otherwise -
|
||||
* values are checks.
|
||||
* @param array $array The array (scalar values only)
|
||||
* @param bool $itsKeyPattern (optional) If is set to true, keys will be checked if they match pattern.
|
||||
* Otherwise - values will be checked (default behaviour).
|
||||
* @return array
|
||||
*/
|
||||
public static function getArrayValuesByPattern($pattern, $dataArray, $itsKeyPattern = false)
|
||||
public static function getArrayValuesByPattern($pattern, array $array, $itsKeyPattern = false)
|
||||
{
|
||||
/*
|
||||
* No elements?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($array)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
if ($itsKeyPattern) {
|
||||
$effect = [];
|
||||
|
||||
if (!empty($dataArray)) {
|
||||
$matches = [];
|
||||
|
||||
foreach ($dataArray as $key => $value) {
|
||||
if (preg_match($pattern, $key, $matches)) {
|
||||
$effect[$key] = $value;
|
||||
}
|
||||
foreach ($array as $key => $value) {
|
||||
if ((bool)preg_match($pattern, $key)) {
|
||||
$effect[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return $effect;
|
||||
}
|
||||
|
||||
return preg_grep($pattern, $dataArray);
|
||||
return preg_grep($pattern, $array);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters array by given expression and column
|
||||
*
|
||||
* Expression can be simple compare expression, like ' == 2', or regular expression.
|
||||
* Expression can be simple compare expression, like " == 2", or regular expression.
|
||||
* Returns filtered array.
|
||||
*
|
||||
* @param array $array The array that should be filtered
|
||||
* @param array $array The 2-dimensional array that should be filtered
|
||||
* @param string $arrayColumnKey Column name
|
||||
* @param string $filterExpression Filter expression, e.g. '== 2' or '!= \'home\''
|
||||
* @param bool $itsRegularExpression (optional) If is set to true, means that filter expression is a
|
||||
* regular expression
|
||||
* @param string $filterExpression Simple filter expression (e.g. "== 2" or "!= \'home\'") or regular
|
||||
* expression (e.g. "/\d+/" or "/[a-z]+[,;]{2,}/")
|
||||
* @param bool $itsRegularExpression (optional) If is set to true, means that filter expression is a regular
|
||||
* expression. Otherwise - not (default behaviour).
|
||||
* @return array
|
||||
*/
|
||||
public static function arrayFilter($array, $arrayColumnKey, $filterExpression, $itsRegularExpression = false)
|
||||
{
|
||||
$effect = [];
|
||||
/*
|
||||
* No elements?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($array)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (!empty($array)) {
|
||||
$effect = $array;
|
||||
$effect = $array;
|
||||
|
||||
foreach ($effect as $key => &$item) {
|
||||
if (isset($item[$arrayColumnKey])) {
|
||||
$value = $item[$arrayColumnKey];
|
||||
foreach ($effect as $key => &$item) {
|
||||
if (!isset($item[$arrayColumnKey])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($itsRegularExpression) {
|
||||
$matches = [];
|
||||
$pattern = '|' . $filterExpression . '|';
|
||||
$matchesCount = preg_match($pattern, $value, $matches);
|
||||
$value = $item[$arrayColumnKey];
|
||||
|
||||
$remove = 0 == $matchesCount;
|
||||
if ($itsRegularExpression) {
|
||||
$matchesCount = preg_match($filterExpression, $value);
|
||||
$remove = 0 == $matchesCount;
|
||||
} else {
|
||||
if (is_string($value)) {
|
||||
$value = sprintf('\'%s\'', $value);
|
||||
} elseif (is_bool($value)) {
|
||||
if (true === $value) {
|
||||
$value = 'true';
|
||||
} else {
|
||||
if ('' == $value) {
|
||||
$value = '\'\'';
|
||||
} elseif (is_string($value)) {
|
||||
$value = '\'' . $value . '\'';
|
||||
}
|
||||
|
||||
eval('$isTrue = ' . $value . $filterExpression . ';');
|
||||
|
||||
/* @var bool $isTrue */
|
||||
$remove = !$isTrue;
|
||||
}
|
||||
|
||||
if ($remove) {
|
||||
unset($effect[$key]);
|
||||
$value = 'false';
|
||||
}
|
||||
}
|
||||
|
||||
eval(sprintf('$isEqual = %s%s;', $value, $filterExpression));
|
||||
|
||||
/* @var bool $isEqual */
|
||||
$remove = !$isEqual;
|
||||
}
|
||||
|
||||
if ($remove) {
|
||||
unset($effect[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -210,36 +275,41 @@ class Regex
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform regular expression match with many given patterns.
|
||||
* Performs regular expression match with many given patterns.
|
||||
* Returns information if given $subject matches one or all given $patterns.
|
||||
*
|
||||
* @param array|string $patterns The patterns to match
|
||||
* @param string $subject The string to check
|
||||
* @param bool $mustAllMatch (optional) If is set to true, $subject must match all $patterns. Otherwise -
|
||||
* not.
|
||||
* not (default behaviour).
|
||||
* @return bool
|
||||
*/
|
||||
public static function pregMultiMatch($patterns, $subject, $mustAllMatch = false)
|
||||
{
|
||||
/*
|
||||
* No patterns?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($patterns)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$effect = false;
|
||||
$patterns = Arrays::makeArray($patterns);
|
||||
|
||||
if (!empty($patterns)) {
|
||||
if ($mustAllMatch) {
|
||||
$effect = true;
|
||||
}
|
||||
|
||||
foreach ($patterns as $pattern) {
|
||||
$matched = (bool)preg_match_all($pattern, $subject);
|
||||
|
||||
if ($mustAllMatch) {
|
||||
$effect = true;
|
||||
}
|
||||
|
||||
foreach ($patterns as $pattern) {
|
||||
$matches = [];
|
||||
$matched = (bool)preg_match_all($pattern, $subject, $matches);
|
||||
|
||||
if ($mustAllMatch) {
|
||||
$effect = $effect && $matched;
|
||||
} else {
|
||||
if ($matched) {
|
||||
$effect = $matched;
|
||||
break;
|
||||
}
|
||||
$effect = $effect && $matched;
|
||||
} else {
|
||||
if ($matched) {
|
||||
$effect = $matched;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -676,6 +746,14 @@ class Regex
|
||||
*/
|
||||
public static function isValidMoneyValue($value)
|
||||
{
|
||||
/*
|
||||
* Not a scalar value?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_scalar($value)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$pattern = self::getMoneyPattern();
|
||||
|
||||
return (bool)preg_match($pattern, $value);
|
||||
@@ -688,39 +766,162 @@ class Regex
|
||||
* @param string $color Color to verify
|
||||
* @param bool $throwException (optional) If is set to true, throws an exception if given color is invalid
|
||||
* (default behaviour). Otherwise - not.
|
||||
* @return string|bool
|
||||
*
|
||||
* @throws IncorrectColorHexLengthException
|
||||
* @throws InvalidColorHexValueException
|
||||
* @return string|bool
|
||||
*/
|
||||
public static function getValidColorHexValue($color, $throwException = true)
|
||||
{
|
||||
/*
|
||||
* Not a scalar value?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_scalar($color)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$color = Miscellaneous::replace($color, '/#/', '');
|
||||
$length = strlen($color);
|
||||
|
||||
if (3 === $length) {
|
||||
$color = Miscellaneous::replace($color, '/(.)(.)(.)/', '$1$1$2$2$3$3');
|
||||
} else {
|
||||
if (6 !== $length) {
|
||||
if ($throwException) {
|
||||
throw new IncorrectColorHexLengthException($color);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
$pattern = self::$patterns['color'];
|
||||
$match = (bool)preg_match($pattern, $color);
|
||||
|
||||
if (!$match) {
|
||||
/*
|
||||
* Color is not 3 or 6 characters long?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (3 !== $length && 6 !== $length) {
|
||||
if ($throwException) {
|
||||
throw new InvalidColorHexValueException($color);
|
||||
throw new IncorrectColorHexLengthException($color);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return strtolower($color);
|
||||
/*
|
||||
* Color is 3 characters long?
|
||||
* Let's make it 6 characters long
|
||||
*/
|
||||
if (3 === $length) {
|
||||
$color = Miscellaneous::replace($color, '/(.)(.)(.)/', '$1$1$2$2$3$3');
|
||||
}
|
||||
|
||||
$pattern = self::$patterns['color'];
|
||||
$match = (bool)preg_match($pattern, $color);
|
||||
|
||||
/*
|
||||
* It's valid color
|
||||
* Nothing to do more
|
||||
*/
|
||||
if ($match) {
|
||||
return strtolower($color);
|
||||
}
|
||||
|
||||
if ($throwException) {
|
||||
throw new InvalidColorHexValueException($color);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given name of bundle is valid
|
||||
*
|
||||
* @param string $bundleName Full name of bundle to verify, e.g. "MyExtraBundle"
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValidBundleName($bundleName)
|
||||
{
|
||||
/*
|
||||
* Not a string?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($bundleName)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$pattern = self::getBundleNamePattern();
|
||||
|
||||
return (bool)preg_match($pattern, $bundleName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns pattern used to validate / verify name of bundle
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getBundleNamePattern()
|
||||
{
|
||||
return self::$patterns['bundleName'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns pattern used to validate / verify html attribute
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getHtmlAttributePattern()
|
||||
{
|
||||
return self::$patterns['htmlAttribute'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given html attribute is valid
|
||||
*
|
||||
* @param string $htmlAttribute The html attribute to verify
|
||||
* @return bool
|
||||
*/
|
||||
public static function isValidHtmlAttribute($htmlAttribute)
|
||||
{
|
||||
/*
|
||||
* Not a string?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($htmlAttribute)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$pattern = self::getHtmlAttributePattern();
|
||||
|
||||
return (bool)preg_match($pattern, $htmlAttribute);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given html attributes are valid
|
||||
*
|
||||
* @param string $htmlAttributes The html attributes to verify
|
||||
* @return bool
|
||||
*/
|
||||
public static function areValidHtmlAttributes($htmlAttributes)
|
||||
{
|
||||
/*
|
||||
* Not a string?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($htmlAttributes)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$pattern = self::getHtmlAttributePattern();
|
||||
|
||||
return (bool)preg_match_all($pattern, $htmlAttributes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given value is a binary value
|
||||
*
|
||||
* @param string $value Value to verify
|
||||
* @return bool
|
||||
*/
|
||||
public static function isBinaryValue($value)
|
||||
{
|
||||
/*
|
||||
* Not a string?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (!is_string($value)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$pattern = self::$patterns['binaryValue'];
|
||||
|
||||
return (bool)preg_match($pattern, $value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,72 +14,148 @@ use Doctrine\ORM\QueryBuilder;
|
||||
/**
|
||||
* Useful methods for repository
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class Repository
|
||||
{
|
||||
/**
|
||||
* Name of key responsible for sorting/position of an item in array
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
const POSITION_KEY = 'position';
|
||||
|
||||
/**
|
||||
* Replenishes positions of given items
|
||||
*
|
||||
* @param array $items The items
|
||||
* @param bool $asLast (optional) If is set to true, items are placed at the end. Otherwise - at the top.
|
||||
* @param array $items Objects who have "getPosition()" and "setPosition()" methods or arrays
|
||||
* @param bool $asLast (optional) If is set to true, items are placed at the end (default behaviour). Otherwise -
|
||||
* at top.
|
||||
* @param bool $force (optional) If is set to true, positions are set even there is no extreme position.
|
||||
* Otherwise - if extreme position is not found (is null) replenishment is stopped / skipped.
|
||||
* Otherwise - if extreme position is unknown (is null) replenishment is stopped / skipped
|
||||
* (default behaviour).
|
||||
*/
|
||||
public static function replenishPositions($items, $asLast = true, $force = false)
|
||||
public static function replenishPositions(array &$items, $asLast = true, $force = false)
|
||||
{
|
||||
$position = self::getExtremePosition($items, $asLast);
|
||||
|
||||
/*
|
||||
* Extreme position is unknown, but it's required?
|
||||
* Use 0 as default/start value
|
||||
*/
|
||||
if (null === $position && $force) {
|
||||
$position = 0;
|
||||
}
|
||||
|
||||
if (null !== $position && !empty($items)) {
|
||||
foreach ($items as $item) {
|
||||
if (method_exists($item, 'getPosition')) {
|
||||
if (null === $item->getPosition()) {
|
||||
if ($asLast) {
|
||||
++$position;
|
||||
} else {
|
||||
--$position;
|
||||
}
|
||||
/*
|
||||
* Extreme position is unknown or there are no items to sort?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (null === $position || empty($items)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (method_exists($item, 'setPosition')) {
|
||||
$item->setPosition($position);
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($items as &$item) {
|
||||
/*
|
||||
* The item is not sortable?
|
||||
*/
|
||||
if (!self::isSortable($item)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Position has been set?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (self::isSorted($item)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate position
|
||||
*/
|
||||
if ($asLast) {
|
||||
++$position;
|
||||
} else {
|
||||
--$position;
|
||||
}
|
||||
|
||||
/*
|
||||
* It's an object?
|
||||
* Use proper method to set position
|
||||
*/
|
||||
if (is_object($item)) {
|
||||
$item->setPosition($position);
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* It's an array
|
||||
* Use proper key to set position
|
||||
*/
|
||||
$item[static::POSITION_KEY] = $position;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns extreme position (max or min) of given items
|
||||
*
|
||||
* @param array $items The items
|
||||
* @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.
|
||||
* @return int
|
||||
*/
|
||||
public static function getExtremePosition($items, $max = true)
|
||||
public static function getExtremePosition(array $items, $max = true)
|
||||
{
|
||||
/*
|
||||
* No items?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($items)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$extreme = null;
|
||||
|
||||
if (!empty($items)) {
|
||||
foreach ($items as $item) {
|
||||
if (Reflection::hasMethod($item, 'getPosition')) {
|
||||
$position = $item->getPosition();
|
||||
foreach ($items as $item) {
|
||||
/*
|
||||
* The item is not sortable?
|
||||
*/
|
||||
if (!self::isSortable($item)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($max) {
|
||||
if ($position > $extreme) {
|
||||
$extreme = $position;
|
||||
}
|
||||
} else {
|
||||
if ($position < $extreme) {
|
||||
$extreme = $position;
|
||||
}
|
||||
}
|
||||
$position = null;
|
||||
|
||||
/*
|
||||
* Let's grab the position
|
||||
*/
|
||||
if (is_object($item)) {
|
||||
$position = $item->getPosition();
|
||||
} elseif (array_key_exists(static::POSITION_KEY, $item)) {
|
||||
$position = $item[static::POSITION_KEY];
|
||||
}
|
||||
|
||||
/*
|
||||
* Maximum value is expected?
|
||||
*/
|
||||
if ($max) {
|
||||
/*
|
||||
* Position was found and it's larger than previously found position (the extreme position)?
|
||||
*/
|
||||
if (null === $extreme || (null !== $position && $position > $extreme)) {
|
||||
$extreme = $position;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Minimum value is expected here.
|
||||
* Position was found and it's smaller than previously found position (the extreme position)?
|
||||
*/
|
||||
if (null === $extreme || (null !== $position && $position < $extreme)) {
|
||||
$extreme = $position;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -106,4 +182,54 @@ class Repository
|
||||
->createQueryBuilder($alias)
|
||||
->orderBy(sprintf('%s.%s', $alias, $property), $direction);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given item is sortable
|
||||
*
|
||||
* Sortable means it's an:
|
||||
* - array
|
||||
* or
|
||||
* - object and has getPosition() and setPosition()
|
||||
*
|
||||
* @param mixed $item An item to verify (object who has "getPosition()" and "setPosition()" methods or an array)
|
||||
* @return bool
|
||||
*/
|
||||
private static function isSortable($item)
|
||||
{
|
||||
return is_array($item)
|
||||
||
|
||||
(
|
||||
is_object($item)
|
||||
&&
|
||||
Reflection::hasMethod($item, 'getPosition')
|
||||
&&
|
||||
Reflection::hasMethod($item, 'setPosition')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns information if given item is sorted (position has been set)
|
||||
*
|
||||
* @param mixed $item An item to verify (object who has "getPosition()" and "setPosition()" methods or an array)
|
||||
* @return bool
|
||||
*/
|
||||
private static function isSorted($item)
|
||||
{
|
||||
/*
|
||||
* Given item is not sortable?
|
||||
*/
|
||||
if (!self::isSortable($item)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* It's an object or it's an array
|
||||
* and position has been set?
|
||||
*/
|
||||
|
||||
return
|
||||
(is_object($item) && null !== $item->getPosition())
|
||||
||
|
||||
(is_array($item) && isset($item[static::POSITION_KEY]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,8 +11,8 @@ namespace Meritoo\Common\Utilities;
|
||||
/**
|
||||
* Useful uri methods (only static functions)
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class Uri
|
||||
{
|
||||
@@ -24,13 +24,25 @@ class Uri
|
||||
*/
|
||||
public static function getFullUri($withoutHost = false)
|
||||
{
|
||||
$effect = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'REQUEST_URI');
|
||||
$requestedUrl = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'REQUEST_URI');
|
||||
|
||||
if ($withoutHost) {
|
||||
return $effect;
|
||||
/*
|
||||
* Unknown requested url?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($requestedUrl)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return self::getServerNameOrIp(true) . $effect;
|
||||
/*
|
||||
* Without host / server name?
|
||||
* All is done
|
||||
*/
|
||||
if ($withoutHost) {
|
||||
return $requestedUrl;
|
||||
}
|
||||
|
||||
return self::getServerNameOrIp(true) . $requestedUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -41,13 +53,25 @@ class Uri
|
||||
*/
|
||||
public static function getServerNameOrIp($withProtocol = false)
|
||||
{
|
||||
$protocol = '';
|
||||
$host = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'HTTP_HOST');
|
||||
|
||||
if ($withProtocol) {
|
||||
$protocol .= self::getProtocolName() . '://';
|
||||
/*
|
||||
* Unknown host / server?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($host)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return $protocol . Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'HTTP_HOST');
|
||||
/*
|
||||
* With protocol?
|
||||
* Let's include the protocol
|
||||
*/
|
||||
if ($withProtocol) {
|
||||
return sprintf('%s://%s', self::getProtocolName(), $host);
|
||||
}
|
||||
|
||||
return $host;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -57,8 +81,6 @@ class Uri
|
||||
*/
|
||||
public static function getProtocolName()
|
||||
{
|
||||
$effect = '';
|
||||
|
||||
$matches = [];
|
||||
$protocolData = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'SERVER_PROTOCOL'); // e.g. HTTP/1.1
|
||||
$matchCount = preg_match('|(.+)\/(.+)|', $protocolData, $matches);
|
||||
@@ -68,11 +90,14 @@ class Uri
|
||||
* $matches[2] - protocol version, e.g. 1.1
|
||||
*/
|
||||
|
||||
if ($matchCount > 0) {
|
||||
$effect = strtolower($matches[1]);
|
||||
/*
|
||||
* Oops, cannot match protocol
|
||||
*/
|
||||
if (0 == $matchCount) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return $effect;
|
||||
return strtolower($matches[1]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -82,13 +107,7 @@ class Uri
|
||||
*/
|
||||
public static function getRefererUri()
|
||||
{
|
||||
$effect = '';
|
||||
|
||||
if (filter_has_var(INPUT_SERVER, 'HTTP_REFERER')) {
|
||||
$effect = Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'HTTP_REFERER');
|
||||
}
|
||||
|
||||
return $effect;
|
||||
return Miscellaneous::getSafelyGlobalVariable(INPUT_SERVER, 'HTTP_REFERER');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -214,10 +233,35 @@ class Uri
|
||||
*/
|
||||
public static function isExternalUrl($url)
|
||||
{
|
||||
/*
|
||||
* Unknown url or it's just slash?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($url) || '/' === $url) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$currentUrl = self::getServerNameOrIp(true);
|
||||
$url = self::replenishProtocol($url);
|
||||
|
||||
return !Regex::contains($currentUrl, $url);
|
||||
/*
|
||||
* Let's prepare pattern of current url
|
||||
*/
|
||||
$search = [
|
||||
':',
|
||||
'/',
|
||||
'.',
|
||||
];
|
||||
|
||||
$replace = [
|
||||
'\:',
|
||||
'\/',
|
||||
'\.',
|
||||
];
|
||||
|
||||
$currentUrlPattern = str_replace($search, $replace, $currentUrl);
|
||||
|
||||
return !Regex::contains($url, $currentUrlPattern);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -273,6 +317,14 @@ class Uri
|
||||
*/
|
||||
public static function getSecuredUrl($url, $user = '', $password = '')
|
||||
{
|
||||
/*
|
||||
* Url is not provided?
|
||||
* Nothing to do
|
||||
*/
|
||||
if (empty($url)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$protocol = self::getProtocolName();
|
||||
$host = self::getServerNameOrIp();
|
||||
|
||||
|
||||
@@ -15,8 +15,8 @@ use SimpleXMLElement;
|
||||
/**
|
||||
* Useful XML-related methods (only static functions)
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class Xml
|
||||
{
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
namespace Meritoo\Common\Test\Collection;
|
||||
|
||||
use ArrayIterator;
|
||||
use Generator;
|
||||
use Meritoo\Common\Collection\Collection;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
@@ -16,8 +17,8 @@ use Meritoo\Common\Type\OopVisibilityType;
|
||||
/**
|
||||
* Test case of the collection of elements
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class CollectionTest extends BaseTestCase
|
||||
{
|
||||
@@ -129,22 +130,39 @@ class CollectionTest extends BaseTestCase
|
||||
static::assertInstanceOf(ArrayIterator::class, $this->simpleCollection->getIterator());
|
||||
}
|
||||
|
||||
public function testAdd()
|
||||
/**
|
||||
* @param mixed $element The element to add
|
||||
* @param int $expectedCount Expected count of elements in collection
|
||||
* @param int $expectedIndex Expected index of added element in collection
|
||||
* @param Collection $collection The collection
|
||||
*
|
||||
* @dataProvider provideElementToAdd
|
||||
*/
|
||||
public function testAddWithoutIndex($element, $expectedCount, $expectedIndex, Collection $collection)
|
||||
{
|
||||
$this->emptyCollection->add('test1');
|
||||
$collection->add($element);
|
||||
|
||||
static::assertTrue($this->emptyCollection->has('test1'));
|
||||
static::assertEquals(1, $this->emptyCollection->count());
|
||||
static::assertEquals('test1', $this->emptyCollection[0]);
|
||||
static::assertTrue($collection->has($element));
|
||||
static::assertEquals($expectedCount, $collection->count());
|
||||
static::assertEquals($element, $collection[$expectedIndex]);
|
||||
}
|
||||
|
||||
public function testAddWithIndex()
|
||||
/**
|
||||
* @param mixed $element The element to add
|
||||
* @param mixed $index Index of element to add
|
||||
* @param int $expectedCount Expected count of elements in collection
|
||||
* @param int $expectedIndex Expected index of added element in collection
|
||||
* @param Collection $collection The collection
|
||||
*
|
||||
* @dataProvider provideElementToAddWithIndex
|
||||
*/
|
||||
public function testAddWithIndex($element, $index, $expectedCount, $expectedIndex, Collection $collection)
|
||||
{
|
||||
$this->emptyCollection->add('test2', 1234);
|
||||
$collection->add($element, $index);
|
||||
|
||||
static::assertTrue($this->emptyCollection->has('test2'));
|
||||
static::assertEquals(1, $this->emptyCollection->count());
|
||||
static::assertEquals('test2', $this->emptyCollection[1234]);
|
||||
static::assertTrue($collection->has($element));
|
||||
static::assertEquals($expectedCount, $collection->count());
|
||||
static::assertEquals($element, $collection[$expectedIndex]);
|
||||
}
|
||||
|
||||
public function testAddMultipleUsingEmptyArray()
|
||||
@@ -309,6 +327,87 @@ class CollectionTest extends BaseTestCase
|
||||
static::assertMethodVisibilityAndArguments(Collection::class, 'exists', OopVisibilityType::IS_PRIVATE, 1, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides element to add to collection
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideElementToAdd()
|
||||
{
|
||||
$collection = new Collection();
|
||||
|
||||
yield[
|
||||
'test1',
|
||||
1,
|
||||
0,
|
||||
$collection,
|
||||
];
|
||||
|
||||
yield[
|
||||
'test2',
|
||||
2,
|
||||
1,
|
||||
$collection,
|
||||
];
|
||||
|
||||
yield[
|
||||
'test3',
|
||||
3,
|
||||
2,
|
||||
$collection,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides element with index to add to collection
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideElementToAddWithIndex()
|
||||
{
|
||||
$collection = new Collection();
|
||||
|
||||
yield[
|
||||
'test1',
|
||||
'aa',
|
||||
1,
|
||||
'aa',
|
||||
$collection,
|
||||
];
|
||||
|
||||
yield[
|
||||
'test2',
|
||||
'oo',
|
||||
2,
|
||||
'oo',
|
||||
$collection,
|
||||
];
|
||||
|
||||
yield[
|
||||
'test3',
|
||||
null,
|
||||
3,
|
||||
0,
|
||||
$collection,
|
||||
];
|
||||
|
||||
yield[
|
||||
'test4',
|
||||
'',
|
||||
4,
|
||||
1,
|
||||
$collection,
|
||||
];
|
||||
|
||||
yield[
|
||||
'test5',
|
||||
'vv',
|
||||
5,
|
||||
'vv',
|
||||
$collection,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
||||
@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
|
||||
/**
|
||||
* Test case of the exception used while type of something is unknown
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class UnknownTypeExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(UnknownTestTypeException::class, OopVisibilityType::IS_PUBLIC, 1, 1);
|
||||
static::assertConstructorVisibilityAndArguments(UnknownTestTypeException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
public function testWithoutException()
|
||||
@@ -33,7 +33,7 @@ class UnknownTypeExceptionTest extends BaseTestCase
|
||||
|
||||
public function testTheException()
|
||||
{
|
||||
$this->expectException(UnknownTestTypeException::class);
|
||||
$this->setExpectedException(UnknownTestTypeException::class);
|
||||
self::assertEmpty((new TestService())->getTranslatedType('test_3'));
|
||||
}
|
||||
}
|
||||
@@ -41,8 +41,8 @@ class UnknownTypeExceptionTest extends BaseTestCase
|
||||
/**
|
||||
* Type of something (for testing purposes)
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class TestType extends BaseType
|
||||
{
|
||||
@@ -54,27 +54,31 @@ class TestType extends BaseType
|
||||
/**
|
||||
* An exception used while type of something is unknown (for testing purposes)
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class UnknownTestTypeException extends UnknownTypeException
|
||||
{
|
||||
/**
|
||||
* Class constructor
|
||||
* Creates exception
|
||||
*
|
||||
* @param int|string $unknownType The unknown type of something (for testing purposes)
|
||||
* @param string $unknownType The unknown type of something (for testing purposes)
|
||||
* @return UnknownTestTypeException
|
||||
*/
|
||||
public function __construct($unknownType)
|
||||
public static function createException($unknownType)
|
||||
{
|
||||
parent::__construct($unknownType, new TestType(), 'type of something used for testing');
|
||||
/* @var UnknownTestTypeException $exception */
|
||||
$exception = parent::create($unknownType, new TestType(), 'type of something used for testing');
|
||||
|
||||
return $exception;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Service used together with type of something (for testing purposes)
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class TestService
|
||||
{
|
||||
@@ -82,9 +86,8 @@ class TestService
|
||||
* Returns translated type (for testing purposes)
|
||||
*
|
||||
* @param string $type Type of something (for testing purposes)
|
||||
* @return string
|
||||
*
|
||||
* @throws UnknownTestTypeException
|
||||
* @return string
|
||||
*/
|
||||
public function getTranslatedType($type)
|
||||
{
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
namespace Meritoo\Common\Test\Exception\Date;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Date\UnknownDatePartTypeException;
|
||||
use Meritoo\Common\Exception\Type\UnknownDatePartTypeException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\DatePartType;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
@@ -17,14 +17,14 @@ use Meritoo\Common\Type\OopVisibilityType;
|
||||
/**
|
||||
* Test case of an exception used while type of date part, e.g. "year", is unknown
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class UnknownDatePartTypeExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(UnknownDatePartTypeException::class, OopVisibilityType::IS_PUBLIC, 2, 2);
|
||||
static::assertConstructorVisibilityAndArguments(UnknownDatePartTypeException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -34,9 +34,9 @@ class UnknownDatePartTypeExceptionTest extends BaseTestCase
|
||||
*
|
||||
* @dataProvider provideDatePartAndValue
|
||||
*/
|
||||
public function testConstructorMessage($unknownDatePart, $value, $expectedMessage)
|
||||
public function testMessage($unknownDatePart, $value, $expectedMessage)
|
||||
{
|
||||
$exception = new UnknownDatePartTypeException($unknownDatePart, $value);
|
||||
$exception = UnknownDatePartTypeException::createException($unknownDatePart, $value);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
|
||||
@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
|
||||
/**
|
||||
* Test case of an exception used while file with given path is empty (has no content)
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class EmptyFileExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(EmptyFileException::class, OopVisibilityType::IS_PUBLIC, 1, 1);
|
||||
static::assertConstructorVisibilityAndArguments(EmptyFileException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -32,9 +32,9 @@ class EmptyFileExceptionTest extends BaseTestCase
|
||||
*
|
||||
* @dataProvider providePathOfFile
|
||||
*/
|
||||
public function testConstructorMessage($emptyFilePath, $expectedMessage)
|
||||
public function testMessage($emptyFilePath, $expectedMessage)
|
||||
{
|
||||
$exception = new EmptyFileException($emptyFilePath);
|
||||
$exception = EmptyFileException::create($emptyFilePath);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
|
||||
@@ -15,19 +15,19 @@ use Meritoo\Common\Type\OopVisibilityType;
|
||||
/**
|
||||
* Test case of an exception used while path of given file is empty
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class EmptyFilePathExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(EmptyFilePathException::class, OopVisibilityType::IS_PUBLIC);
|
||||
static::assertConstructorVisibilityAndArguments(EmptyFilePathException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
public function testConstructorMessage()
|
||||
{
|
||||
$exception = new EmptyFilePathException();
|
||||
$exception = EmptyFilePathException::create();
|
||||
static::assertEquals('Path of the file is empty. Did you provide path of proper file?', $exception->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
|
||||
/**
|
||||
* Test case of an exception used while file with given path does not exist
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class NotExistingFileExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(NotExistingFileException::class, OopVisibilityType::IS_PUBLIC, 1, 1);
|
||||
static::assertConstructorVisibilityAndArguments(NotExistingFileException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -34,7 +34,7 @@ class NotExistingFileExceptionTest extends BaseTestCase
|
||||
*/
|
||||
public function testConstructorMessage($notExistingFilePath, $expectedMessage)
|
||||
{
|
||||
$exception = new NotExistingFileException($notExistingFilePath);
|
||||
$exception = NotExistingFileException::create($notExistingFilePath);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
|
||||
@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
|
||||
/**
|
||||
* Test case of an exception used while method cannot be called, because is disabled
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class DisabledMethodExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(DisabledMethodException::class, OopVisibilityType::IS_PUBLIC, 2, 1);
|
||||
static::assertConstructorVisibilityAndArguments(DisabledMethodException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -36,7 +36,7 @@ class DisabledMethodExceptionTest extends BaseTestCase
|
||||
*/
|
||||
public function testConstructorMessage($disabledMethod, $alternativeMethod, $expectedMessage)
|
||||
{
|
||||
$exception = new DisabledMethodException($disabledMethod, $alternativeMethod);
|
||||
$exception = DisabledMethodException::create($disabledMethod, $alternativeMethod);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
|
||||
@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
|
||||
/**
|
||||
* Test case of an exception used while name of class or trait cannot be resolved
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class CannotResolveClassNameExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(CannotResolveClassNameException::class, OopVisibilityType::IS_PUBLIC, 2, 1);
|
||||
static::assertConstructorVisibilityAndArguments(CannotResolveClassNameException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -37,7 +37,7 @@ class CannotResolveClassNameExceptionTest extends BaseTestCase
|
||||
*/
|
||||
public function testConstructorMessage($source, $forClass, $expectedMessage)
|
||||
{
|
||||
$exception = new CannotResolveClassNameException($source, $forClass);
|
||||
$exception = CannotResolveClassNameException::create($source, $forClass);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
|
||||
@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
|
||||
/**
|
||||
* Test case of an exception used while given class has no child classes
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class MissingChildClassesExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(MissingChildClassesException::class, OopVisibilityType::IS_PUBLIC, 1, 1);
|
||||
static::assertConstructorVisibilityAndArguments(MissingChildClassesException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -35,7 +35,7 @@ class MissingChildClassesExceptionTest extends BaseTestCase
|
||||
*/
|
||||
public function testConstructorMessage($parentClass, $expectedMessage)
|
||||
{
|
||||
$exception = new MissingChildClassesException($parentClass);
|
||||
$exception = MissingChildClassesException::create($parentClass);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
|
||||
@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
|
||||
/**
|
||||
* Test case of an exception used while given class has more than one child class
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class TooManyChildClassesExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(TooManyChildClassesException::class, OopVisibilityType::IS_PUBLIC, 2, 2);
|
||||
static::assertConstructorVisibilityAndArguments(TooManyChildClassesException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -36,7 +36,7 @@ class TooManyChildClassesExceptionTest extends BaseTestCase
|
||||
*/
|
||||
public function testConstructorMessage($parentClass, array $childClasses, $expectedMessage)
|
||||
{
|
||||
$exception = new TooManyChildClassesException($parentClass, $childClasses);
|
||||
$exception = TooManyChildClassesException::create($parentClass, $childClasses);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
|
||||
@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
|
||||
/**
|
||||
* Test case of an exception used while length of given hexadecimal value of color is incorrect
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class IncorrectColorHexLengthExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(IncorrectColorHexLengthException::class, OopVisibilityType::IS_PUBLIC, 1, 1);
|
||||
static::assertConstructorVisibilityAndArguments(IncorrectColorHexLengthException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -34,7 +34,7 @@ class IncorrectColorHexLengthExceptionTest extends BaseTestCase
|
||||
*/
|
||||
public function testConstructorMessage($color, $expectedMessage)
|
||||
{
|
||||
$exception = new IncorrectColorHexLengthException($color);
|
||||
$exception = IncorrectColorHexLengthException::create($color);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
|
||||
@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
|
||||
/**
|
||||
* Test case of an exception used while given hexadecimal value of color is invalid
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class InvalidColorHexValueExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(InvalidColorHexValueException::class, OopVisibilityType::IS_PUBLIC, 1, 1);
|
||||
static::assertConstructorVisibilityAndArguments(InvalidColorHexValueException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -34,7 +34,7 @@ class InvalidColorHexValueExceptionTest extends BaseTestCase
|
||||
*/
|
||||
public function testConstructorMessage($color, $expectedMessage)
|
||||
{
|
||||
$exception = new InvalidColorHexValueException($color);
|
||||
$exception = InvalidColorHexValueException::create($color);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
|
||||
65
tests/Exception/Regex/InvalidHtmlAttributesExceptionTest.php
Normal file
65
tests/Exception/Regex/InvalidHtmlAttributesExceptionTest.php
Normal file
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Exception\Regex;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Regex\InvalidHtmlAttributesException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
|
||||
/**
|
||||
* Test case of an exception used while html attributes are invalid
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class InvalidHtmlAttributesExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(InvalidHtmlAttributesException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $htmlAttributes Invalid html attributes
|
||||
* @param string $expectedMessage Expected exception's message
|
||||
*
|
||||
* @dataProvider provideHtmlAttributes
|
||||
*/
|
||||
public function testConstructorMessage($htmlAttributes, $expectedMessage)
|
||||
{
|
||||
$exception = InvalidHtmlAttributesException::create($htmlAttributes);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides html attributes
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideHtmlAttributes()
|
||||
{
|
||||
$template = 'HTML attributes \'%s\' are invalid. Is there everything ok?';
|
||||
|
||||
yield[
|
||||
'abc = def',
|
||||
sprintf($template, 'abc = def'),
|
||||
];
|
||||
|
||||
yield[
|
||||
'abc = def ghi = jkl',
|
||||
sprintf($template, 'abc = def ghi = jkl'),
|
||||
];
|
||||
|
||||
yield[
|
||||
'abc=def ghi=jkl',
|
||||
sprintf($template, 'abc=def ghi=jkl'),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -16,14 +16,14 @@ use Meritoo\Common\Type\OopVisibilityType;
|
||||
/**
|
||||
* Test case of an exception used while url is invalid
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class InvalidUrlExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(InvalidUrlException::class, OopVisibilityType::IS_PUBLIC, 1, 1);
|
||||
static::assertConstructorVisibilityAndArguments(InvalidUrlException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -34,7 +34,7 @@ class InvalidUrlExceptionTest extends BaseTestCase
|
||||
*/
|
||||
public function testConstructorMessage($url, $expectedMessage)
|
||||
{
|
||||
$exception = new InvalidUrlException($url);
|
||||
$exception = InvalidUrlException::create($url);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
|
||||
@@ -17,14 +17,14 @@ use Meritoo\Common\Type\OopVisibilityType;
|
||||
* Test case of an exception used while the visibility of a property, a method or (as of PHP 7.1.0) a constant is
|
||||
* unknown
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class UnknownOopVisibilityTypeExceptionTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(UnknownOopVisibilityTypeException::class, OopVisibilityType::IS_PUBLIC, 1, 1);
|
||||
static::assertConstructorVisibilityAndArguments(UnknownOopVisibilityTypeException::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -35,7 +35,7 @@ class UnknownOopVisibilityTypeExceptionTest extends BaseTestCase
|
||||
*/
|
||||
public function testConstructorMessage($unknownType, $expectedMessage)
|
||||
{
|
||||
$exception = new UnknownOopVisibilityTypeException($unknownType);
|
||||
$exception = UnknownOopVisibilityTypeException::createException($unknownType);
|
||||
static::assertEquals($expectedMessage, $exception->getMessage());
|
||||
}
|
||||
|
||||
|
||||
176
tests/Test/Base/BaseTestCaseTest.php
Normal file
176
tests/Test/Base/BaseTestCaseTest.php
Normal file
@@ -0,0 +1,176 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Test\Base;
|
||||
|
||||
use DateTime;
|
||||
use Generator;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
use Meritoo\Common\Utilities\GeneratorUtility;
|
||||
|
||||
/**
|
||||
* Test case of the base test case with common methods and data providers
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class BaseTestCaseTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructor()
|
||||
{
|
||||
static::assertConstructorVisibilityAndArguments(BaseTestCase::class, OopVisibilityType::IS_PUBLIC, 3);
|
||||
}
|
||||
|
||||
public function testProvideEmptyValue()
|
||||
{
|
||||
$elements = [
|
||||
[''],
|
||||
[' '],
|
||||
[null],
|
||||
[0],
|
||||
[false],
|
||||
[[]],
|
||||
];
|
||||
|
||||
$generator = (new SimpleTestCase())->provideEmptyValue();
|
||||
self::assertEquals($elements, GeneratorUtility::getGeneratorElements($generator));
|
||||
}
|
||||
|
||||
public function testProvideBooleanValue()
|
||||
{
|
||||
$elements = [
|
||||
[false],
|
||||
[true],
|
||||
];
|
||||
|
||||
$generator = (new SimpleTestCase())->provideBooleanValue();
|
||||
self::assertEquals($elements, GeneratorUtility::getGeneratorElements($generator));
|
||||
}
|
||||
|
||||
public function testProvideDateTimeInstance()
|
||||
{
|
||||
$dateFormat = 'Y-m-d H:i';
|
||||
|
||||
$expectedElements = [
|
||||
[new DateTime()],
|
||||
[new DateTime('yesterday')],
|
||||
[new DateTime('now')],
|
||||
[new DateTime('tomorrow')],
|
||||
];
|
||||
|
||||
$generator = (new SimpleTestCase())->provideDateTimeInstance();
|
||||
$generatedElements = GeneratorUtility::getGeneratorElements($generator);
|
||||
|
||||
/* @var DateTime $instance1 */
|
||||
$instance1 = $generatedElements[0][0];
|
||||
|
||||
/* @var DateTime $instance2 */
|
||||
$instance2 = $generatedElements[1][0];
|
||||
|
||||
/* @var DateTime $instance3 */
|
||||
$instance3 = $generatedElements[2][0];
|
||||
|
||||
/* @var DateTime $instance4 */
|
||||
$instance4 = $generatedElements[3][0];
|
||||
|
||||
self::assertCount(count($expectedElements), $generatedElements);
|
||||
self::assertEquals($instance1->format($dateFormat), (new DateTime())->format($dateFormat));
|
||||
self::assertEquals($instance2->format($dateFormat), (new DateTime('yesterday'))->format($dateFormat));
|
||||
self::assertEquals($instance3->format($dateFormat), (new DateTime('now'))->format($dateFormat));
|
||||
self::assertEquals($instance4->format($dateFormat), (new DateTime('tomorrow'))->format($dateFormat));
|
||||
}
|
||||
|
||||
public function testProvideDateTimeRelativeFormat()
|
||||
{
|
||||
$elements = [
|
||||
['now'],
|
||||
['yesterday'],
|
||||
['tomorrow'],
|
||||
['back of 10'],
|
||||
['front of 10'],
|
||||
['last day of February'],
|
||||
['first day of next month'],
|
||||
['last day of previous month'],
|
||||
['last day of next month'],
|
||||
['Y-m-d'],
|
||||
['Y-m-d 10:00'],
|
||||
];
|
||||
|
||||
$generator = (new SimpleTestCase())->provideDateTimeRelativeFormat();
|
||||
self::assertEquals($elements, GeneratorUtility::getGeneratorElements($generator));
|
||||
}
|
||||
|
||||
public function testProvideNotExistingFilePath()
|
||||
{
|
||||
$elements = [
|
||||
['lets-test.doc'],
|
||||
['lorem/ipsum.jpg'],
|
||||
['surprise/me/one/more/time.txt'],
|
||||
];
|
||||
|
||||
$generator = (new SimpleTestCase())->provideNotExistingFilePath();
|
||||
self::assertEquals($elements, GeneratorUtility::getGeneratorElements($generator));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $fileName Name of file
|
||||
* @param string $directoryPath Path of directory containing the file
|
||||
*
|
||||
* @dataProvider provideFileNameAndDirectoryPath
|
||||
*/
|
||||
public function testGetFilePathForTesting($fileName, $directoryPath)
|
||||
{
|
||||
$path = (new SimpleTestCase())->getFilePathForTesting($fileName, $directoryPath);
|
||||
|
||||
if (!empty($directoryPath)) {
|
||||
$directoryPath .= '/';
|
||||
}
|
||||
|
||||
$expectedContains = sprintf('/data/tests/%s%s', $directoryPath, $fileName);
|
||||
static::assertContains($expectedContains, $path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides name of file and path of directory containing the file
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideFileNameAndDirectoryPath()
|
||||
{
|
||||
yield[
|
||||
'abc.jpg',
|
||||
'',
|
||||
];
|
||||
|
||||
yield[
|
||||
'abc.def.jpg',
|
||||
'',
|
||||
];
|
||||
|
||||
yield[
|
||||
'abc.jpg',
|
||||
'def',
|
||||
];
|
||||
|
||||
yield[
|
||||
'abc.def.jpg',
|
||||
'def',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple test case
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class SimpleTestCase extends BaseTestCase
|
||||
{
|
||||
}
|
||||
@@ -9,17 +9,22 @@
|
||||
namespace Meritoo\Common\Test\Type\Base;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\Base\BaseType;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* Test case of the base / abstract type of something
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class BaseTypeTest extends TestCase
|
||||
class BaseTypeTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructor()
|
||||
{
|
||||
static::assertHasNoConstructor(BaseType::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param BaseType $type Type of something
|
||||
* @param array $expectedTypes Expected concrete types of given instance of type
|
||||
@@ -179,8 +184,8 @@ class BaseTypeTest extends TestCase
|
||||
/**
|
||||
* Empty type of something used for testing
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class TestEmptyType extends BaseType
|
||||
{
|
||||
@@ -189,8 +194,8 @@ class TestEmptyType extends BaseType
|
||||
/**
|
||||
* Type of something used for testing
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class TestType extends BaseType
|
||||
{
|
||||
|
||||
@@ -14,8 +14,8 @@ use Meritoo\Common\Type\DatePartType;
|
||||
/**
|
||||
* Test case of the type of date part, e.g. "year"
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class DatePartTypeTest extends BaseTypeTestCase
|
||||
{
|
||||
|
||||
@@ -6,21 +6,21 @@
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Utilities;
|
||||
namespace Meritoo\Common\Test\Type;
|
||||
|
||||
use DateTime;
|
||||
use Generator;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Test\Base\BaseTypeTestCase;
|
||||
use Meritoo\Common\Type\DatePeriod;
|
||||
use Meritoo\Common\Type\OopVisibilityType;
|
||||
use Meritoo\Common\Utilities\DatePeriod;
|
||||
|
||||
/**
|
||||
* Test case of date's period
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class DatePeriodTest extends BaseTestCase
|
||||
class DatePeriodTest extends BaseTypeTestCase
|
||||
{
|
||||
public function testConstructorVisibilityAndArguments()
|
||||
{
|
||||
@@ -58,33 +58,6 @@ class DatePeriodTest extends BaseTestCase
|
||||
self::assertEquals($endDate, $period->getEndDate());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $period Empty value, e.g. ""
|
||||
* @dataProvider provideEmptyValue
|
||||
*/
|
||||
public function testIsCorrectPeriodEmptyPeriod($period)
|
||||
{
|
||||
self::assertFalse(DatePeriod::isCorrectPeriod($period));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $period Incorrect period to verify
|
||||
* @dataProvider provideIncorrectPeriod
|
||||
*/
|
||||
public function testIsCorrectPeriodIncorrectPeriod($period)
|
||||
{
|
||||
self::assertFalse(DatePeriod::isCorrectPeriod($period));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $period The period to verify
|
||||
* @dataProvider providePeriod
|
||||
*/
|
||||
public function testIsCorrectPeriod($period)
|
||||
{
|
||||
self::assertTrue(DatePeriod::isCorrectPeriod($period));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param DatePeriod $period The date period to verify
|
||||
* @param string $format Format used to format the date
|
||||
@@ -142,36 +115,6 @@ class DatePeriodTest extends BaseTestCase
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides incorrect period
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideIncorrectPeriod()
|
||||
{
|
||||
yield[-1];
|
||||
yield[0];
|
||||
yield[10];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides period to verify
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function providePeriod()
|
||||
{
|
||||
yield[DatePeriod::LAST_WEEK];
|
||||
yield[DatePeriod::THIS_WEEK];
|
||||
yield[DatePeriod::NEXT_WEEK];
|
||||
yield[DatePeriod::LAST_MONTH];
|
||||
yield[DatePeriod::THIS_MONTH];
|
||||
yield[DatePeriod::NEXT_MONTH];
|
||||
yield[DatePeriod::LAST_YEAR];
|
||||
yield[DatePeriod::THIS_YEAR];
|
||||
yield[DatePeriod::NEXT_YEAR];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides period and incorrect format of date to verify
|
||||
*
|
||||
@@ -270,4 +213,68 @@ class DatePeriodTest extends BaseTestCase
|
||||
'2002-02-02 00:00',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all expected types of the tested type
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getAllExpectedTypes()
|
||||
{
|
||||
return [
|
||||
'LAST_MONTH' => DatePeriod::LAST_MONTH,
|
||||
'LAST_WEEK' => DatePeriod::LAST_WEEK,
|
||||
'LAST_YEAR' => DatePeriod::LAST_YEAR,
|
||||
'NEXT_MONTH' => DatePeriod::NEXT_MONTH,
|
||||
'NEXT_WEEK' => DatePeriod::NEXT_WEEK,
|
||||
'NEXT_YEAR' => DatePeriod::NEXT_YEAR,
|
||||
'THIS_MONTH' => DatePeriod::THIS_MONTH,
|
||||
'THIS_WEEK' => DatePeriod::THIS_WEEK,
|
||||
'THIS_YEAR' => DatePeriod::THIS_YEAR,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function getTestedTypeInstance()
|
||||
{
|
||||
return new DatePeriod();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function provideTypeToVerify()
|
||||
{
|
||||
yield[
|
||||
'',
|
||||
false,
|
||||
];
|
||||
|
||||
yield[
|
||||
-1,
|
||||
false,
|
||||
];
|
||||
|
||||
yield[
|
||||
true,
|
||||
false,
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePeriod::LAST_MONTH,
|
||||
true,
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePeriod::NEXT_WEEK,
|
||||
true,
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePeriod::THIS_YEAR,
|
||||
true,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -14,8 +14,8 @@ use Meritoo\Common\Utilities\Arrays;
|
||||
/**
|
||||
* Test case of the useful arrays methods
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class ArraysTest extends BaseTestCase
|
||||
{
|
||||
|
||||
@@ -8,14 +8,16 @@
|
||||
|
||||
namespace Meritoo\Common\Test\Utilities;
|
||||
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Bundle\IncorrectBundleNameException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Utilities\Bundle;
|
||||
|
||||
/**
|
||||
* Test case of the useful methods for bundle
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class BundleTest extends BaseTestCase
|
||||
{
|
||||
@@ -24,22 +26,227 @@ class BundleTest extends BaseTestCase
|
||||
static::assertHasNoConstructor(Bundle::class);
|
||||
}
|
||||
|
||||
public function testGetBundleViewPathEmptyPathAndBundle()
|
||||
/**
|
||||
* @param string $viewPath Path of the view / template, e.g. "MyDirectory/my-template"
|
||||
* @param string $bundleName Full name of the bundle, e.g. "MyExtraBundle"
|
||||
*
|
||||
* @throws IncorrectBundleNameException
|
||||
* @dataProvider provideEmptyViewPathAndBundle
|
||||
*/
|
||||
public function testGetBundleViewPathUsingEmptyPathAndBundle($viewPath, $bundleName)
|
||||
{
|
||||
self::assertNull(Bundle::getBundleViewPath('', ''));
|
||||
self::assertNull(Bundle::getBundleViewPath('test', ''));
|
||||
self::assertNull(Bundle::getBundleViewPath('', 'test'));
|
||||
self::assertNull(Bundle::getBundleViewPath($viewPath, $bundleName));
|
||||
}
|
||||
|
||||
public function testGetBundleViewPathWithDefaultExtension()
|
||||
/**
|
||||
* @param string $viewPath Path of the view / template, e.g. "MyDirectory/my-template"
|
||||
* @param string $bundleName Full name of the bundle, e.g. "MyExtraBundle"
|
||||
*
|
||||
* @dataProvider provideViewPathAndIncorrectBundleName
|
||||
*/
|
||||
public function testGetBundleViewPathUsingIncorrectBundleName($viewPath, $bundleName)
|
||||
{
|
||||
self::assertEquals('Lorem:Ipsum.html.twig', Bundle::getBundleViewPath('Ipsum', 'Lorem'));
|
||||
self::assertEquals('LobortisTincidunt:FusceElementum.html.twig', Bundle::getBundleViewPath('FusceElementum', 'LobortisTincidunt'));
|
||||
$template = 'Name of bundle \'%s\' is incorrect. It should start with big letter and end with "Bundle". Is'
|
||||
. ' there everything ok?';
|
||||
|
||||
$message = sprintf($template, $bundleName);
|
||||
$this->setExpectedException(IncorrectBundleNameException::class, $message);
|
||||
|
||||
Bundle::getBundleViewPath($viewPath, $bundleName);
|
||||
}
|
||||
|
||||
public function testGetBundleViewPathWithCustomExtension()
|
||||
/**
|
||||
* @param string $viewPath Path of the view / template, e.g. "MyDirectory/my-template"
|
||||
* @param string $bundleName Full name of the bundle, e.g. "MyExtraBundle"
|
||||
* @param string $expected Expected path to view / template
|
||||
*
|
||||
* @throws IncorrectBundleNameException
|
||||
* @dataProvider provideViewPathAndBundle
|
||||
*/
|
||||
public function testGetBundleViewPathUsingDefaultExtension($viewPath, $bundleName, $expected)
|
||||
{
|
||||
self::assertNull(Bundle::getBundleViewPath('Ipsum', 'Lorem', ''));
|
||||
self::assertEquals('Lorem:Ipsum.js.twig', Bundle::getBundleViewPath('Ipsum', 'Lorem', 'js.twig'));
|
||||
self::assertEquals($expected, Bundle::getBundleViewPath($viewPath, $bundleName));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $viewPath Path of the view / template, e.g. "MyDirectory/my-template"
|
||||
* @param string $bundleName Full name of the bundle, e.g. "MyExtraBundle"
|
||||
* @param string $extension (optional) Extension of the view / template
|
||||
* @param string $expected Expected path to view / template
|
||||
*
|
||||
* @throws IncorrectBundleNameException
|
||||
* @dataProvider provideViewPathAndBundleAndExtension
|
||||
*/
|
||||
public function testGetBundleViewPathUsingCustomExtension($viewPath, $bundleName, $extension, $expected)
|
||||
{
|
||||
self::assertEquals($expected, Bundle::getBundleViewPath($viewPath, $bundleName, $extension));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $emptyValue Empty value, e.g. ""
|
||||
*
|
||||
* @throws IncorrectBundleNameException
|
||||
* @dataProvider provideEmptyValue
|
||||
*/
|
||||
public function testGetShortBundleNameUsingEmptyValue($emptyValue)
|
||||
{
|
||||
$this->setExpectedException(IncorrectBundleNameException::class);
|
||||
Bundle::getShortBundleName($emptyValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $bundleName Full name of the bundle, e.g. "MyExtraBundle"
|
||||
*
|
||||
* @throws IncorrectBundleNameException
|
||||
* @dataProvider provideIncorrectBundleName
|
||||
*/
|
||||
public function testGetShortBundleNameUsingIncorrectBundleName($bundleName)
|
||||
{
|
||||
$this->setExpectedException(IncorrectBundleNameException::class);
|
||||
Bundle::getShortBundleName($bundleName);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $fullBundleName Full name of the bundle, e.g. "MyExtraBundle"
|
||||
* @param string $shortBundleName Short name of bundle (without "Bundle")
|
||||
*
|
||||
* @throws IncorrectBundleNameException
|
||||
* @dataProvider provideFullAndShortBundleName
|
||||
*/
|
||||
public function testGetShortBundleName($fullBundleName, $shortBundleName)
|
||||
{
|
||||
self::assertEquals($shortBundleName, Bundle::getShortBundleName($fullBundleName));
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides empty path of the view / template and/or name of bundle
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideEmptyViewPathAndBundle()
|
||||
{
|
||||
yield[
|
||||
'',
|
||||
'',
|
||||
];
|
||||
|
||||
yield[
|
||||
'test',
|
||||
'',
|
||||
];
|
||||
|
||||
yield[
|
||||
'',
|
||||
'test',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides path of the view / template and incorrect name of bundle
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideViewPathAndIncorrectBundleName()
|
||||
{
|
||||
yield[
|
||||
'User:Active',
|
||||
'myExtra',
|
||||
];
|
||||
|
||||
yield[
|
||||
'User:Active',
|
||||
'MyExtra',
|
||||
];
|
||||
|
||||
yield[
|
||||
'User:Active',
|
||||
'MySuperExtraGorgeous',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides path of the view / template and name of bundle
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideViewPathAndBundle()
|
||||
{
|
||||
yield[
|
||||
'User',
|
||||
'MyExtraBundle',
|
||||
'@MyExtra/User.html.twig',
|
||||
];
|
||||
|
||||
yield[
|
||||
'User:Active',
|
||||
'MyExtraBundle',
|
||||
'@MyExtra/User/Active.html.twig',
|
||||
];
|
||||
|
||||
yield[
|
||||
'User:Active',
|
||||
'MySuperExtraGorgeousBundle',
|
||||
'@MySuperExtraGorgeous/User/Active.html.twig',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides path of the view / template, name of bundle and extension of the view / template
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideViewPathAndBundleAndExtension()
|
||||
{
|
||||
yield[
|
||||
'User:Active',
|
||||
'MyExtraBundle',
|
||||
'',
|
||||
null,
|
||||
];
|
||||
|
||||
yield[
|
||||
'User:Active',
|
||||
'MyExtraBundle',
|
||||
'js.twig',
|
||||
'@MyExtra/User/Active.js.twig',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides incorrect name of bundle
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideIncorrectBundleName()
|
||||
{
|
||||
yield[
|
||||
'myExtra',
|
||||
];
|
||||
|
||||
yield[
|
||||
'MyExtra',
|
||||
];
|
||||
|
||||
yield[
|
||||
'MySuperExtraGorgeous',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides full and short name of bundle
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideFullAndShortBundleName()
|
||||
{
|
||||
yield[
|
||||
'MyExtraBundle',
|
||||
'MyExtra',
|
||||
];
|
||||
|
||||
yield[
|
||||
'MySuperExtraGorgeousBundle',
|
||||
'MySuperExtraGorgeous',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,8 +15,8 @@ use Meritoo\Common\Utilities\Composer;
|
||||
/**
|
||||
* Test case of the useful Composer-related methods
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class ComposerTest extends BaseTestCase
|
||||
{
|
||||
@@ -88,6 +88,6 @@ class ComposerTest extends BaseTestCase
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->composerJsonPath = $this->getFilePathToTests(Composer::FILE_NAME_MAIN);
|
||||
$this->composerJsonPath = $this->getFilePathForTesting(Composer::FILE_NAME_MAIN);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,15 +11,16 @@ namespace Meritoo\Common\Test\Utilities;
|
||||
use DateInterval;
|
||||
use DateTime;
|
||||
use Generator;
|
||||
use Meritoo\Common\Exception\Date\UnknownDatePartTypeException;
|
||||
use Meritoo\Common\Exception\Type\UnknownDatePartTypeException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Type\DatePeriod;
|
||||
use Meritoo\Common\Utilities\Date;
|
||||
|
||||
/**
|
||||
* Test case of the Date methods (only static functions)
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class DateTest extends BaseTestCase
|
||||
{
|
||||
@@ -223,7 +224,7 @@ class DateTest extends BaseTestCase
|
||||
*/
|
||||
public function testGetDayOfWeekIncorrectValues($year, $month, $day)
|
||||
{
|
||||
$this->expectException(UnknownDatePartTypeException::class);
|
||||
$this->setExpectedException(UnknownDatePartTypeException::class);
|
||||
self::assertEmpty(Date::getDayOfWeek($year, $month, $day));
|
||||
}
|
||||
|
||||
@@ -506,6 +507,35 @@ class DateTest extends BaseTestCase
|
||||
self::assertTrue($randomDate >= $intervalMinDate && $randomDate <= $intervalMaxDate);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $period Empty value, e.g. ""
|
||||
* @dataProvider provideEmptyValue
|
||||
*/
|
||||
public function testGetDatesForPeriodUsingEmptyPeriod($period)
|
||||
{
|
||||
self::assertNull(Date::getDatesForPeriod($period));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $period Incorrect period to verify
|
||||
* @dataProvider provideIncorrectPeriod
|
||||
*/
|
||||
public function testGetDatesForPeriodUsingIncorrectPeriod($period)
|
||||
{
|
||||
self::assertNull(Date::getDatesForPeriod($period));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $period The period, type of period. One of DatePeriod class constants, e.g. DatePeriod::LAST_WEEK.
|
||||
* @param DatePeriod $expected Expected start and end date for given period
|
||||
*
|
||||
* @dataProvider provideCorrectPeriod
|
||||
*/
|
||||
public function testGetDatesForPeriod($period, DatePeriod $expected)
|
||||
{
|
||||
self::assertEquals($expected, Date::getDatesForPeriod($period));
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides incorrect invalidCount of DateTime
|
||||
*
|
||||
@@ -758,4 +788,112 @@ class DateTest extends BaseTestCase
|
||||
50,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides incorrect period
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideIncorrectPeriod()
|
||||
{
|
||||
yield[-1];
|
||||
yield[0];
|
||||
yield[10];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides correct period
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideCorrectPeriod()
|
||||
{
|
||||
yield[
|
||||
DatePeriod::LAST_WEEK,
|
||||
new DatePeriod(
|
||||
(new DateTime('this week'))->sub(new DateInterval('P7D'))->setTime(0, 0, 0),
|
||||
(new DateTime('this week'))->sub(new DateInterval('P1D'))->setTime(23, 59, 59)
|
||||
),
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePeriod::THIS_WEEK,
|
||||
new DatePeriod(
|
||||
(new DateTime('this week'))->setTime(0, 0, 0),
|
||||
(new DateTime('this week'))->add(new DateInterval('P6D'))->setTime(23, 59, 59)
|
||||
),
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePeriod::NEXT_WEEK,
|
||||
new DatePeriod(
|
||||
(new DateTime('this week'))->add(new DateInterval('P7D'))->setTime(0, 0, 0),
|
||||
(new DateTime('this week'))->add(new DateInterval('P7D'))->add(new DateInterval('P6D'))->setTime(23, 59, 59)
|
||||
),
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePeriod::LAST_MONTH,
|
||||
new DatePeriod(
|
||||
(new DateTime('first day of last month'))->setTime(0, 0, 0),
|
||||
(new DateTime('last day of last month'))->setTime(23, 59, 59)
|
||||
),
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePeriod::THIS_MONTH,
|
||||
new DatePeriod(
|
||||
Date::getDatesForPeriod(DatePeriod::LAST_MONTH)
|
||||
->getEndDate()
|
||||
->add(new DateInterval('P1D'))
|
||||
->setTime(0, 0, 0),
|
||||
Date::getDatesForPeriod(DatePeriod::NEXT_MONTH)
|
||||
->getStartDate()
|
||||
->sub(new DateInterval('P1D'))
|
||||
->setTime(23, 59, 59)
|
||||
),
|
||||
];
|
||||
|
||||
yield[
|
||||
DatePeriod::NEXT_MONTH,
|
||||
new DatePeriod(
|
||||
(new DateTime('first day of next month'))->setTime(0, 0, 0),
|
||||
(new DateTime('last day of next month'))->setTime(23, 59, 59)
|
||||
),
|
||||
];
|
||||
|
||||
$lastYearStart = (new DateTime())->modify('-1 year');
|
||||
$lastYearEnd = (new DateTime())->modify('-1 year');
|
||||
$year = $lastYearStart->format('Y');
|
||||
|
||||
yield[
|
||||
DatePeriod::LAST_YEAR,
|
||||
new DatePeriod(
|
||||
$lastYearStart->setDate($year, 1, 1)->setTime(0, 0, 0),
|
||||
$lastYearEnd->setDate($year, 12, 31)->setTime(23, 59, 59)
|
||||
),
|
||||
];
|
||||
|
||||
$year = (new DateTime())->format('Y');
|
||||
|
||||
yield[
|
||||
DatePeriod::THIS_YEAR,
|
||||
new DatePeriod(
|
||||
(new DateTime())->setDate($year, 1, 1)->setTime(0, 0, 0),
|
||||
(new DateTime())->setDate($year, 12, 31)->setTime(23, 59, 59)
|
||||
),
|
||||
];
|
||||
|
||||
$nextYearStart = (new DateTime())->modify('1 year');
|
||||
$nextYearEnd = (new DateTime())->modify('1 year');
|
||||
$year = $nextYearStart->format('Y');
|
||||
|
||||
yield[
|
||||
DatePeriod::NEXT_YEAR,
|
||||
new DatePeriod(
|
||||
$nextYearStart->setDate($year, 1, 1)->setTime(0, 0, 0),
|
||||
$nextYearEnd->setDate($year, 12, 31)->setTime(23, 59, 59)
|
||||
),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,8 +14,8 @@ use Meritoo\Common\Utilities\GeneratorUtility;
|
||||
/**
|
||||
* Test case of the useful methods for the Generator class
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class GeneratorUtilityTest extends BaseTestCase
|
||||
{
|
||||
|
||||
@@ -11,15 +11,19 @@ namespace Meritoo\Common\Test\Utilities;
|
||||
use Generator;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Utilities\Locale;
|
||||
use ReflectionException;
|
||||
|
||||
/**
|
||||
* Test case of the useful locale methods
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class LocaleTest extends BaseTestCase
|
||||
{
|
||||
/**
|
||||
* @throws ReflectionException
|
||||
*/
|
||||
public function testConstructor()
|
||||
{
|
||||
static::assertHasNoConstructor(Locale::class);
|
||||
@@ -40,7 +44,7 @@ class LocaleTest extends BaseTestCase
|
||||
* @param string $encoding Encoding of the final locale
|
||||
* @param string $expected Expected long form of the locale
|
||||
*
|
||||
* @dataProvider provideLanguageAndCountryCode
|
||||
* @dataProvider provideLanguageEncodingAndCountryCode
|
||||
*/
|
||||
public function testGetLongForm($languageCode, $countryCode, $encoding, $expected)
|
||||
{
|
||||
@@ -56,24 +60,46 @@ class LocaleTest extends BaseTestCase
|
||||
self::assertFalse(Locale::setLocale($emptyValue, $emptyValue));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $category Named constant specifying the category of the functions affected by the locale
|
||||
* setting. It's the same constant as required by setlocale() function.
|
||||
* @param string $languageCode Language code, in ISO 639-1 format. Short form of the locale, e.g. "fr".
|
||||
*
|
||||
* @dataProvider provideCategoryAndLanguageCode
|
||||
*/
|
||||
public function testSetLocale($category, $languageCode)
|
||||
public function testSetLocaleIncorrectCategory()
|
||||
{
|
||||
self::assertTrue(Locale::setLocale($category, $languageCode));
|
||||
self::assertFalse(Locale::setLocale(-1, 'en'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides language and country code
|
||||
* @param int $category Named constant specifying the category of the functions affected by the locale
|
||||
* setting. It's the same constant as required by setlocale() function.
|
||||
* @param string $languageCode Language code, in ISO 639-1 format. Short form of the locale, e.g. "fr".
|
||||
* @param string $countryCode Country code, in ISO 3166-1 alpha-2 format, e.g. "FR"
|
||||
* @param string $expectedLocale Expected locale
|
||||
*
|
||||
* @dataProvider provideCategoryLanguageCodeAndExpectedLocale
|
||||
*/
|
||||
public function testSetLocale($category, $languageCode, $countryCode, $expectedLocale)
|
||||
{
|
||||
self::assertEquals($expectedLocale, Locale::setLocale($category, $languageCode, $countryCode));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $category Named constant specifying the category of the functions affected by the locale setting.
|
||||
* It's the same constant as required by setlocale() function.
|
||||
* @param string $languageCode Language code, in ISO 639-1 format. Short form of the locale, e.g. "fr".
|
||||
* @param string $countryCode Country code, in ISO 3166-1 alpha-2 format, e.g. "FR"
|
||||
* @param string $expectedLocale Expected locale
|
||||
*
|
||||
* @dataProvider provideCategoryLanguageCodeAndExpectedLocale
|
||||
*/
|
||||
public function testGetLocale($category, $languageCode, $countryCode, $expectedLocale)
|
||||
{
|
||||
Locale::setLocale($category, $languageCode, $countryCode);
|
||||
self::assertEquals($expectedLocale, Locale::getLocale($category));
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides language, encoding and country code
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideLanguageAndCountryCode()
|
||||
public function provideLanguageEncodingAndCountryCode()
|
||||
{
|
||||
yield[
|
||||
'fr',
|
||||
@@ -102,33 +128,97 @@ class LocaleTest extends BaseTestCase
|
||||
'UTF-8',
|
||||
'fr_FR.UTF-8',
|
||||
];
|
||||
|
||||
yield[
|
||||
'en',
|
||||
'US',
|
||||
'',
|
||||
'en_US',
|
||||
];
|
||||
|
||||
yield[
|
||||
'en',
|
||||
'US',
|
||||
'UTF-8',
|
||||
'en_US.UTF-8',
|
||||
];
|
||||
|
||||
yield[
|
||||
'en',
|
||||
'US',
|
||||
'ISO-8859-1',
|
||||
'en_US.ISO-8859-1',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides category and language
|
||||
* Provides category
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideCategoryAndLanguageCode()
|
||||
public function provideCategoryLanguageCodeAndExpectedLocale()
|
||||
{
|
||||
yield[
|
||||
LC_ALL,
|
||||
'fr',
|
||||
'',
|
||||
'fr_FR.UTF-8',
|
||||
];
|
||||
|
||||
yield[
|
||||
LC_COLLATE,
|
||||
'fr',
|
||||
'FR',
|
||||
'fr_FR.UTF-8',
|
||||
];
|
||||
|
||||
yield[
|
||||
LC_CTYPE,
|
||||
'en',
|
||||
'US',
|
||||
'en_US.UTF-8',
|
||||
];
|
||||
|
||||
yield[
|
||||
LC_NUMERIC,
|
||||
'en',
|
||||
'GB',
|
||||
'en_GB.UTF-8',
|
||||
];
|
||||
|
||||
yield[
|
||||
LC_MONETARY,
|
||||
'es',
|
||||
'',
|
||||
'es_ES.UTF-8',
|
||||
];
|
||||
|
||||
yield[
|
||||
LC_MONETARY,
|
||||
'es',
|
||||
'ES',
|
||||
'es_ES.UTF-8',
|
||||
];
|
||||
|
||||
yield[
|
||||
LC_TIME,
|
||||
'it',
|
||||
'',
|
||||
'it_IT.UTF-8',
|
||||
];
|
||||
|
||||
yield[
|
||||
LC_TIME,
|
||||
'it',
|
||||
'IT',
|
||||
'it_IT.UTF-8',
|
||||
];
|
||||
|
||||
yield[
|
||||
LC_TIME,
|
||||
'it',
|
||||
'it',
|
||||
'it_IT.UTF-8',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,8 +15,8 @@ use Meritoo\Common\Utilities\MimeTypes;
|
||||
/**
|
||||
* Test case of the useful methods for mime types of files
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class MimeTypesTest extends BaseTestCase
|
||||
{
|
||||
@@ -447,12 +447,12 @@ class MimeTypesTest extends BaseTestCase
|
||||
public function provideFilePathToGetMimeTypeOfRealFile()
|
||||
{
|
||||
yield[
|
||||
$this->getFilePathToTests('minion.jpg'),
|
||||
$this->getFilePathForTesting('minion.jpg'),
|
||||
'image/jpeg',
|
||||
];
|
||||
|
||||
yield[
|
||||
$this->getFilePathToTests('lorem-ipsum.txt'),
|
||||
$this->getFilePathForTesting('lorem-ipsum.txt'),
|
||||
'text/plain',
|
||||
];
|
||||
}
|
||||
@@ -465,12 +465,12 @@ class MimeTypesTest extends BaseTestCase
|
||||
public function provideExistingFilePathToCheckIsImagePath()
|
||||
{
|
||||
yield[
|
||||
$this->getFilePathToTests('minion.jpg'),
|
||||
$this->getFilePathForTesting('minion.jpg'),
|
||||
true,
|
||||
];
|
||||
|
||||
yield[
|
||||
$this->getFilePathToTests('lorem-ipsum.txt'),
|
||||
$this->getFilePathForTesting('lorem-ipsum.txt'),
|
||||
false,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -14,20 +14,25 @@ use Meritoo\Common\Exception\Regex\InvalidColorHexValueException;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Utilities\Locale;
|
||||
use Meritoo\Common\Utilities\Miscellaneous;
|
||||
use ReflectionException;
|
||||
use stdClass;
|
||||
|
||||
/**
|
||||
* Test case of the Miscellaneous methods (only static functions)
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class MiscellaneousTest extends BaseTestCase
|
||||
{
|
||||
private $stringSmall;
|
||||
private $stringCommaSeparated;
|
||||
private $stringDotSeparated;
|
||||
private $stringWithoutSpaces;
|
||||
|
||||
/**
|
||||
* @throws ReflectionException
|
||||
*/
|
||||
public function testConstructor()
|
||||
{
|
||||
static::assertHasNoConstructor(Miscellaneous::class);
|
||||
@@ -361,37 +366,36 @@ class MiscellaneousTest extends BaseTestCase
|
||||
{
|
||||
self::assertEquals('Lorem ipsum dolor sit<br>amet, consectetur<br>adipiscing<br>elit', Miscellaneous::breakLongText($this->stringCommaSeparated, 20));
|
||||
self::assertEquals('Lorem ipsum dolor sit---amet, consectetur---adipiscing---elit', Miscellaneous::breakLongText($this->stringCommaSeparated, 20, '---'));
|
||||
self::assertEquals('LoremIpsum<br>DolorSitAm<br>etConsecte<br>turAdipisc<br>ingElit', Miscellaneous::breakLongText($this->stringWithoutSpaces, 10));
|
||||
}
|
||||
|
||||
public function testRemoveDirectory()
|
||||
public function testRemoveDirectoryUsingNotExistingDirectory()
|
||||
{
|
||||
/*
|
||||
* Removing not existing directory
|
||||
*/
|
||||
self::assertTrue(Miscellaneous::removeDirectory('/abc/def/ghi'));
|
||||
self::assertNull(Miscellaneous::removeDirectory('/abc/def/ghi'));
|
||||
}
|
||||
|
||||
/*
|
||||
* Removing not directory
|
||||
*/
|
||||
public function testRemoveDirectoryUsingNoDirectory()
|
||||
{
|
||||
$directoryPath = sys_get_temp_dir() . '/ipsum.txt';
|
||||
touch($directoryPath);
|
||||
self::assertTrue(Miscellaneous::removeDirectory($directoryPath));
|
||||
}
|
||||
|
||||
/*
|
||||
* Removing simple directory
|
||||
*/
|
||||
public function testRemoveDirectoryUsingSimpleDirectory()
|
||||
{
|
||||
$directoryPath = sys_get_temp_dir() . '/lorem/ipsum';
|
||||
mkdir($directoryPath, 0777, true);
|
||||
self::assertTrue(Miscellaneous::removeDirectory($directoryPath));
|
||||
}
|
||||
|
||||
/*
|
||||
* Removing more complex directory
|
||||
*/
|
||||
public function testRemoveDirectoryUsingComplexDirectory()
|
||||
{
|
||||
$directory1Path = sys_get_temp_dir() . '/lorem/ipsum';
|
||||
$directory2Path = sys_get_temp_dir() . '/lorem/dolor/sit';
|
||||
|
||||
mkdir($directory1Path, 0777, true);
|
||||
mkdir($directory2Path, 0777, true);
|
||||
|
||||
self::assertTrue(Miscellaneous::removeDirectory(sys_get_temp_dir() . '/lorem', false));
|
||||
}
|
||||
|
||||
@@ -661,9 +665,14 @@ class MiscellaneousTest extends BaseTestCase
|
||||
self::assertEquals(255, Miscellaneous::getValidColorComponent(255, false));
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws IncorrectColorHexLengthException
|
||||
* @throws InvalidColorHexValueException
|
||||
*/
|
||||
public function testGetInvertedColorWithIncorrectLength()
|
||||
{
|
||||
$this->expectException(IncorrectColorHexLengthException::class);
|
||||
$this->setExpectedException(IncorrectColorHexLengthException::class);
|
||||
|
||||
Miscellaneous::getInvertedColor(null);
|
||||
Miscellaneous::getInvertedColor('');
|
||||
Miscellaneous::getInvertedColor(1);
|
||||
@@ -674,9 +683,14 @@ class MiscellaneousTest extends BaseTestCase
|
||||
Miscellaneous::getInvertedColor('1234567');
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws IncorrectColorHexLengthException
|
||||
* @throws InvalidColorHexValueException
|
||||
*/
|
||||
public function testGetInvertedColorWithInvalidValue()
|
||||
{
|
||||
$this->expectException(InvalidColorHexValueException::class);
|
||||
$this->setExpectedException(InvalidColorHexValueException::class);
|
||||
|
||||
Miscellaneous::getInvertedColor('0011zz');
|
||||
Miscellaneous::getInvertedColor('001#zz');
|
||||
Miscellaneous::getInvertedColor('001!zz');
|
||||
@@ -684,6 +698,10 @@ class MiscellaneousTest extends BaseTestCase
|
||||
Miscellaneous::getInvertedColor('00ppqq');
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws IncorrectColorHexLengthException
|
||||
* @throws InvalidColorHexValueException
|
||||
*/
|
||||
public function testGetInvertedColor()
|
||||
{
|
||||
/*
|
||||
@@ -1172,6 +1190,7 @@ class MiscellaneousTest extends BaseTestCase
|
||||
$this->stringSmall = 'Lorem ipsum dolor sit amet.';
|
||||
$this->stringCommaSeparated = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit';
|
||||
$this->stringDotSeparated = 'Etiam ullamcorper. Suspendisse a pellentesque dui, non felis.';
|
||||
$this->stringWithoutSpaces = 'LoremIpsumDolorSitAmetConsecteturAdipiscingElit';
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1184,5 +1203,6 @@ class MiscellaneousTest extends BaseTestCase
|
||||
unset($this->stringSmall);
|
||||
unset($this->stringCommaSeparated);
|
||||
unset($this->stringDotSeparated);
|
||||
unset($this->stringWithoutSpaces);
|
||||
}
|
||||
}
|
||||
|
||||
341
tests/Utilities/QueryBuilderUtilityTest.php
Normal file
341
tests/Utilities/QueryBuilderUtilityTest.php
Normal file
@@ -0,0 +1,341 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Utilities;
|
||||
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\ORM\EntityManager;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Doctrine\ORM\Query\Expr;
|
||||
use Doctrine\ORM\Query\Parameter;
|
||||
use Doctrine\ORM\QueryBuilder;
|
||||
use Generator;
|
||||
use Meritoo\Common\Test\Base\BaseTestCase;
|
||||
use Meritoo\Common\Utilities\QueryBuilderUtility;
|
||||
|
||||
/**
|
||||
* Test case of the useful methods for query builder (the Doctrine's QueryBuilder class)
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class QueryBuilderUtilityTest extends BaseTestCase
|
||||
{
|
||||
public function testConstructor()
|
||||
{
|
||||
static::assertHasNoConstructor(QueryBuilderUtility::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param QueryBuilder $queryBuilder The query builder to retrieve root alias
|
||||
* @param null|string $rootAlias Expected root alias of given query builder
|
||||
*
|
||||
* @dataProvider provideQueryBuilderAndRootAlias
|
||||
*/
|
||||
public function testGetRootAlias(QueryBuilder $queryBuilder, $rootAlias)
|
||||
{
|
||||
static::assertSame($rootAlias, QueryBuilderUtility::getRootAlias($queryBuilder));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param QueryBuilder $queryBuilder The query builder to verify
|
||||
* @param string $propertyName Name of property that maybe is joined
|
||||
* @param null|string $propertyAlias Expected alias of given property joined in given query builder
|
||||
*
|
||||
* @dataProvider provideQueryBuilderAndPropertyAlias
|
||||
*/
|
||||
public function testGetJoinedPropertyAlias(QueryBuilder $queryBuilder, $propertyName, $propertyAlias)
|
||||
{
|
||||
static::assertSame($propertyAlias, QueryBuilderUtility::getJoinedPropertyAlias($queryBuilder, $propertyName));
|
||||
}
|
||||
|
||||
public function testSetCriteriaWithoutCriteria()
|
||||
{
|
||||
$entityManager = $this->getMock(EntityManagerInterface::class);
|
||||
$queryBuilder = new QueryBuilder($entityManager);
|
||||
$newQueryBuilder = QueryBuilderUtility::setCriteria($queryBuilder);
|
||||
|
||||
static::assertSame($queryBuilder, $newQueryBuilder);
|
||||
static::assertCount(0, $newQueryBuilder->getParameters());
|
||||
static::assertNull($newQueryBuilder->getDQLPart('where'));
|
||||
}
|
||||
|
||||
public function testSetCriteriaWithoutAlias()
|
||||
{
|
||||
$criteria = [
|
||||
'lorem' => 11,
|
||||
'ipsum' => 22,
|
||||
];
|
||||
|
||||
$entityManager = $this->getMock(EntityManagerInterface::class);
|
||||
$queryBuilder = new QueryBuilder($entityManager);
|
||||
$newQueryBuilder = QueryBuilderUtility::setCriteria($queryBuilder, $criteria);
|
||||
|
||||
static::assertSame($queryBuilder, $newQueryBuilder);
|
||||
static::assertCount(count($criteria), $newQueryBuilder->getParameters());
|
||||
static::assertNotNull($newQueryBuilder->getDQLPart('where'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param QueryBuilder $queryBuilder The query builder
|
||||
* @param array $criteria The criteria used in WHERE clause
|
||||
*
|
||||
* @dataProvider provideQueryBuilderAndCriteria
|
||||
*/
|
||||
public function testSetCriteria(QueryBuilder $queryBuilder, array $criteria)
|
||||
{
|
||||
$newQueryBuilder = QueryBuilderUtility::setCriteria($queryBuilder, $criteria);
|
||||
$criteriaCount = count($criteria);
|
||||
$nullsCount = 0;
|
||||
|
||||
/*
|
||||
* I have to verify count/amount of NULLs and decrease $criteriaCount, because for null parameter is not added
|
||||
*/
|
||||
array_walk($criteria, function ($value) use (&$nullsCount) {
|
||||
if (null === $value) {
|
||||
++$nullsCount;
|
||||
}
|
||||
});
|
||||
|
||||
static::assertSame($queryBuilder, $newQueryBuilder);
|
||||
static::assertCount($criteriaCount - $nullsCount, $newQueryBuilder->getParameters());
|
||||
static::assertNotNull($newQueryBuilder->getDQLPart('where'));
|
||||
}
|
||||
|
||||
public function testDeleteEntitiesWithoutFlush()
|
||||
{
|
||||
$methods = [
|
||||
'remove',
|
||||
'flush',
|
||||
];
|
||||
|
||||
$entityManager = $this->getMock(EntityManager::class, $methods, [], '', false);
|
||||
$entities1 = [];
|
||||
|
||||
$entities2 = [
|
||||
new \stdClass(),
|
||||
];
|
||||
|
||||
static::assertFalse(QueryBuilderUtility::deleteEntities($entityManager, $entities1, false));
|
||||
static::assertTrue(QueryBuilderUtility::deleteEntities($entityManager, $entities2, false));
|
||||
}
|
||||
|
||||
public function testDeleteEntities()
|
||||
{
|
||||
$methods = [
|
||||
'remove',
|
||||
'flush',
|
||||
];
|
||||
|
||||
$entityManager = $this->getMock(EntityManager::class, $methods, [], '', false);
|
||||
$entities1 = [];
|
||||
|
||||
$entities2 = [
|
||||
new \stdClass(),
|
||||
];
|
||||
|
||||
static::assertFalse(QueryBuilderUtility::deleteEntities($entityManager, $entities1));
|
||||
static::assertTrue(QueryBuilderUtility::deleteEntities($entityManager, $entities2));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param QueryBuilder $queryBuilder The query builder
|
||||
* @param array|ArrayCollection $parameters Parameters to add. Collection of Doctrine\ORM\Query\Parameter
|
||||
* instances or an array with key-value pairs.
|
||||
*
|
||||
* @dataProvider provideQueryBuilderAndParameters
|
||||
*/
|
||||
public function testAddParameters(QueryBuilder $queryBuilder, $parameters)
|
||||
{
|
||||
$newQueryBuilder = QueryBuilderUtility::addParameters($queryBuilder, $parameters);
|
||||
|
||||
static::assertSame($queryBuilder, $newQueryBuilder);
|
||||
static::assertCount(count($parameters), $newQueryBuilder->getParameters());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides query builder to retrieve root alias and expected root alias
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideQueryBuilderAndRootAlias()
|
||||
{
|
||||
$entityManager = $this->getMock(EntityManagerInterface::class);
|
||||
|
||||
yield[
|
||||
new QueryBuilder($entityManager),
|
||||
null,
|
||||
];
|
||||
|
||||
yield[
|
||||
(new QueryBuilder($entityManager))->from('lorem_ipsum', 'lm'),
|
||||
'lm',
|
||||
];
|
||||
|
||||
yield[
|
||||
(new QueryBuilder($entityManager))
|
||||
->from('lorem', 'l')
|
||||
->leftJoin('l.ipsum', 'i'),
|
||||
'l',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides query builder, name of property and expected alias of given property
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideQueryBuilderAndPropertyAlias()
|
||||
{
|
||||
$entityManager = $this->getMock(EntityManagerInterface::class);
|
||||
|
||||
yield[
|
||||
new QueryBuilder($entityManager),
|
||||
'',
|
||||
null,
|
||||
];
|
||||
|
||||
yield[
|
||||
new QueryBuilder($entityManager),
|
||||
'lorem',
|
||||
null,
|
||||
];
|
||||
|
||||
yield[
|
||||
(new QueryBuilder($entityManager))->from('lorem_ipsum', 'lm'),
|
||||
'lm',
|
||||
null,
|
||||
];
|
||||
|
||||
yield[
|
||||
(new QueryBuilder($entityManager))
|
||||
->from('lorem', 'l')
|
||||
->leftJoin('l.ipsum', 'i'),
|
||||
'ipsum',
|
||||
'i',
|
||||
];
|
||||
|
||||
yield[
|
||||
(new QueryBuilder($entityManager))
|
||||
->from('lorem', 'l')
|
||||
->leftJoin('l.ipsum', 'i')
|
||||
->innerJoin('i.dolor', 'd'),
|
||||
'ipsum1',
|
||||
null,
|
||||
];
|
||||
|
||||
yield[
|
||||
(new QueryBuilder($entityManager))
|
||||
->from('lorem', 'l')
|
||||
->leftJoin('l.ipsum', 'i')
|
||||
->innerJoin('i.dolor', 'd'),
|
||||
'ipsum',
|
||||
'i',
|
||||
];
|
||||
|
||||
yield[
|
||||
(new QueryBuilder($entityManager))
|
||||
->from('lorem', 'l')
|
||||
->leftJoin('l.ipsum', 'i')
|
||||
->innerJoin('i.dolor', 'd'),
|
||||
'dolor',
|
||||
'd',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides query builder and criteria used in WHERE clause
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideQueryBuilderAndCriteria()
|
||||
{
|
||||
$entityManager = $this->getMock(EntityManager::class, ['getExpressionBuilder'], [], '', false);
|
||||
|
||||
$entityManager
|
||||
->expects(static::any())
|
||||
->method('getExpressionBuilder')
|
||||
->willReturn(new Expr());
|
||||
|
||||
yield[
|
||||
(new QueryBuilder($entityManager))->from('lorem_ipsum', 'lm'),
|
||||
[
|
||||
'lorem' => 11,
|
||||
'ipsum' => 22,
|
||||
'dolor' => null,
|
||||
],
|
||||
];
|
||||
|
||||
yield[
|
||||
(new QueryBuilder($entityManager))->from('lorem_ipsum', 'lm'),
|
||||
[
|
||||
'lorem' => [
|
||||
11,
|
||||
'>=',
|
||||
],
|
||||
'ipsum' => [
|
||||
22,
|
||||
'<',
|
||||
],
|
||||
'dolor' => null,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides query builder and parameters to add to given query builder
|
||||
*
|
||||
* @return Generator
|
||||
*/
|
||||
public function provideQueryBuilderAndParameters()
|
||||
{
|
||||
$entityManager = $this->getMock(EntityManagerInterface::class);
|
||||
|
||||
yield[
|
||||
new QueryBuilder($entityManager),
|
||||
[],
|
||||
];
|
||||
|
||||
yield[
|
||||
new QueryBuilder($entityManager),
|
||||
new ArrayCollection(),
|
||||
];
|
||||
|
||||
yield[
|
||||
new QueryBuilder($entityManager),
|
||||
[
|
||||
'lorem' => 11,
|
||||
'ipsum' => 22,
|
||||
],
|
||||
];
|
||||
|
||||
yield[
|
||||
new QueryBuilder($entityManager),
|
||||
new ArrayCollection([
|
||||
'lorem' => 11,
|
||||
'ipsum' => 22,
|
||||
]),
|
||||
];
|
||||
|
||||
yield[
|
||||
new QueryBuilder($entityManager),
|
||||
[
|
||||
new Parameter('lorem', 11),
|
||||
new Parameter('ipsum', 22),
|
||||
],
|
||||
];
|
||||
|
||||
yield[
|
||||
new QueryBuilder($entityManager),
|
||||
new ArrayCollection([
|
||||
new Parameter('lorem', 11),
|
||||
new Parameter('ipsum', 22),
|
||||
]),
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -12,8 +12,8 @@ namespace Meritoo\Common\Test\Utilities\Reflection;
|
||||
* The A class.
|
||||
* Used for testing the Reflection class.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class A
|
||||
{
|
||||
|
||||
@@ -12,10 +12,10 @@ namespace Meritoo\Common\Test\Utilities\Reflection;
|
||||
* The B class.
|
||||
* Used for testing the Reflection class.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class B extends A
|
||||
class B extends A implements I
|
||||
{
|
||||
protected $name = 'Lorem Ipsum';
|
||||
|
||||
|
||||
@@ -12,8 +12,8 @@ namespace Meritoo\Common\Test\Utilities\Reflection;
|
||||
* The C class.
|
||||
* Used for testing the Reflection class.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class C extends B
|
||||
{
|
||||
|
||||
@@ -12,8 +12,8 @@ namespace Meritoo\Common\Test\Utilities\Reflection;
|
||||
* The D class.
|
||||
* Used for testing the Reflection class.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class D
|
||||
{
|
||||
|
||||
@@ -12,8 +12,8 @@ namespace Meritoo\Common\Test\Utilities\Reflection;
|
||||
* The E trait.
|
||||
* Used for testing the Reflection class.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
trait E
|
||||
{
|
||||
|
||||
@@ -12,8 +12,8 @@ namespace Meritoo\Common\Test\Utilities\Reflection;
|
||||
* The F class.
|
||||
* Used for testing the Reflection class.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class F
|
||||
{
|
||||
|
||||
@@ -12,8 +12,8 @@ namespace Meritoo\Common\Test\Utilities\Reflection;
|
||||
* The G class.
|
||||
* Used for testing the Reflection class.
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class G
|
||||
{
|
||||
|
||||
27
tests/Utilities/Reflection/H.php
Normal file
27
tests/Utilities/Reflection/H.php
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Utilities\Reflection;
|
||||
|
||||
/**
|
||||
* The H class.
|
||||
* Used for testing the Reflection class.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class H
|
||||
{
|
||||
const DOLOR = 'sit';
|
||||
|
||||
const LOREM = 'ipsum';
|
||||
|
||||
const MAX_USERS = 5;
|
||||
|
||||
const MIN_USERS = 2;
|
||||
}
|
||||
20
tests/Utilities/Reflection/I.php
Normal file
20
tests/Utilities/Reflection/I.php
Normal file
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* (c) Meritoo.pl, http://www.meritoo.pl
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Meritoo\Common\Test\Utilities\Reflection;
|
||||
|
||||
/**
|
||||
* The H interface.
|
||||
* Used for testing the Reflection class.
|
||||
*
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
interface I
|
||||
{
|
||||
}
|
||||
@@ -22,14 +22,16 @@ use Meritoo\Common\Test\Utilities\Reflection\D;
|
||||
use Meritoo\Common\Test\Utilities\Reflection\E;
|
||||
use Meritoo\Common\Test\Utilities\Reflection\F;
|
||||
use Meritoo\Common\Test\Utilities\Reflection\G;
|
||||
use Meritoo\Common\Test\Utilities\Reflection\H;
|
||||
use Meritoo\Common\Test\Utilities\Reflection\I;
|
||||
use Meritoo\Common\Utilities\Reflection;
|
||||
use ReflectionProperty;
|
||||
|
||||
/**
|
||||
* Test case of the useful reflection methods
|
||||
*
|
||||
* @author Krzysztof Niziol <krzysztof.niziol@meritoo.pl>
|
||||
* @copyright Meritoo.pl
|
||||
* @author Meritoo <github@meritoo.pl>
|
||||
* @copyright Meritoo <http://www.meritoo.pl>
|
||||
*/
|
||||
class ReflectionTest extends BaseTestCase
|
||||
{
|
||||
@@ -122,7 +124,7 @@ class ReflectionTest extends BaseTestCase
|
||||
*/
|
||||
public function testGetChildClassesInvalidClass($invalidClass)
|
||||
{
|
||||
$this->expectException(CannotResolveClassNameException::class);
|
||||
$this->setExpectedException(CannotResolveClassNameException::class);
|
||||
|
||||
self::assertNull(Reflection::getChildClasses($invalidClass));
|
||||
self::assertNull(Reflection::getChildClasses(123));
|
||||
@@ -130,7 +132,7 @@ class ReflectionTest extends BaseTestCase
|
||||
|
||||
public function testGetChildClassesNotExistingClass()
|
||||
{
|
||||
$this->expectException(CannotResolveClassNameException::class);
|
||||
$this->setExpectedException(CannotResolveClassNameException::class);
|
||||
self::assertEquals('', Reflection::getChildClasses('xyz'));
|
||||
}
|
||||
|
||||
@@ -161,13 +163,13 @@ class ReflectionTest extends BaseTestCase
|
||||
|
||||
public function testGetOneChildClassWithMissingChildClasses()
|
||||
{
|
||||
$this->expectException(MissingChildClassesException::class);
|
||||
$this->setExpectedException(MissingChildClassesException::class);
|
||||
self::assertEquals('LoremIpsum', Reflection::getOneChildClass(C::class));
|
||||
}
|
||||
|
||||
public function testGetOneChildClassWithTooManyChildClasses()
|
||||
{
|
||||
$this->expectException(TooManyChildClassesException::class);
|
||||
$this->setExpectedException(TooManyChildClassesException::class);
|
||||
|
||||
self::assertEquals(B::class, Reflection::getOneChildClass(A::class));
|
||||
self::assertEquals(C::class, Reflection::getOneChildClass(A::class));
|
||||
@@ -195,7 +197,7 @@ class ReflectionTest extends BaseTestCase
|
||||
*/
|
||||
public function testUsesTraitInvalidClass($class, $trait)
|
||||
{
|
||||
$this->expectException(CannotResolveClassNameException::class);
|
||||
$this->setExpectedException(CannotResolveClassNameException::class);
|
||||
self::assertNull(Reflection::usesTrait($class, $trait));
|
||||
}
|
||||
|
||||
@@ -205,7 +207,7 @@ class ReflectionTest extends BaseTestCase
|
||||
*/
|
||||
public function testUsesTraitInvalidTrait($trait)
|
||||
{
|
||||
$this->expectException(CannotResolveClassNameException::class);
|
||||
$this->setExpectedException(CannotResolveClassNameException::class);
|
||||
self::assertNull(Reflection::usesTrait(DateTime::class, $trait));
|
||||
}
|
||||
|
||||
@@ -379,6 +381,99 @@ class ReflectionTest extends BaseTestCase
|
||||
self::assertEquals($expected, Reflection::getPropertyValues($collection, 'gInstance.firstName', true));
|
||||
}
|
||||
|
||||
public function testGetMaxNumberConstantUsingClassWithoutConstants()
|
||||
{
|
||||
static::assertNull(Reflection::getMaxNumberConstant(A::class));
|
||||
}
|
||||
|
||||
public function testGetMaxNumberConstant()
|
||||
{
|
||||
static::assertEquals(5, Reflection::getMaxNumberConstant(H::class));
|
||||
}
|
||||
|
||||
public function testHasMethodUsingClassWithoutMethod()
|
||||
{
|
||||
static::assertFalse(Reflection::hasMethod(A::class, 'getUser'));
|
||||
}
|
||||
|
||||
public function testHasMethod()
|
||||
{
|
||||
static::assertTrue(Reflection::hasMethod(A::class, 'getCount'));
|
||||
}
|
||||
|
||||
public function testHasPropertyUsingClassWithoutProperty()
|
||||
{
|
||||
static::assertFalse(Reflection::hasProperty(A::class, 'users'));
|
||||
}
|
||||
|
||||
public function testHasProperty()
|
||||
{
|
||||
static::assertTrue(Reflection::hasProperty(A::class, 'count'));
|
||||
}
|
||||
|
||||
public function testHasConstantUsingClassWithoutConstant()
|
||||
{
|
||||
static::assertFalse(Reflection::hasConstant(H::class, 'users'));
|
||||
}
|
||||
|
||||
public function testHasConstant()
|
||||
{
|
||||
static::assertTrue(Reflection::hasConstant(H::class, 'LOREM'));
|
||||
}
|
||||
|
||||
public function testGetConstantValueUsingClassWithoutConstant()
|
||||
{
|
||||
static::assertNull(Reflection::getConstantValue(H::class, 'users'));
|
||||
}
|
||||
|
||||
public function testGetConstantValue()
|
||||
{
|
||||
static::assertEquals(H::LOREM, Reflection::getConstantValue(H::class, 'LOREM'));
|
||||
}
|
||||
|
||||
public function testIsInterfaceImplementedUsingClassWithoutInterface()
|
||||
{
|
||||
static::assertFalse(Reflection::isInterfaceImplemented(A::class, I::class));
|
||||
}
|
||||
|
||||
public function testIsInterfaceImplemented()
|
||||
{
|
||||
static::assertTrue(Reflection::isInterfaceImplemented(B::class, I::class));
|
||||
}
|
||||
|
||||
public function testIsChildOfClassUsingClassWithoutChildClass()
|
||||
{
|
||||
static::assertFalse(Reflection::isChildOfClass(A::class, B::class));
|
||||
}
|
||||
|
||||
public function testIsChildOfClass()
|
||||
{
|
||||
static::assertTrue(Reflection::isChildOfClass(B::class, A::class));
|
||||
}
|
||||
|
||||
public function testGetPropertyUsingClassWithoutProperty()
|
||||
{
|
||||
static::assertNull(Reflection::getProperty(A::class, 'lorem'));
|
||||
}
|
||||
|
||||
public function testGetPropertyUsingClassWithPrivateProperty()
|
||||
{
|
||||
$property = Reflection::getProperty(A::class, 'count', ReflectionProperty::IS_PRIVATE);
|
||||
|
||||
static::assertInstanceOf(ReflectionProperty::class, $property);
|
||||
static::assertTrue($property->isPrivate());
|
||||
static::assertEquals('count', $property->getName());
|
||||
}
|
||||
|
||||
public function testGetPropertyUsingClassWithProtectedProperty()
|
||||
{
|
||||
$property = Reflection::getProperty(B::class, 'name', ReflectionProperty::IS_PROTECTED);
|
||||
|
||||
static::assertInstanceOf(ReflectionProperty::class, $property);
|
||||
static::assertTrue($property->isProtected());
|
||||
static::assertEquals('name', $property->getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides invalid class and trait
|
||||
*
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user