@@ -48,12 +48,10 @@ class Arrays
if (is_array($value)) {
$effect .= self::values2string($value, $arrayColumnKey, $separator);
- } else {
- if (empty($arrayColumnKey)) {
- $effect .= $value;
- } elseif ($key === $arrayColumnKey) {
- $effect .= $array[$arrayColumnKey];
- }
+ } elseif (empty($arrayColumnKey)) {
+ $effect .= $value;
+ } elseif ($key === $arrayColumnKey) {
+ $effect .= $array[$arrayColumnKey];
}
}
}
@@ -111,8 +109,8 @@ class Arrays
*/
if (is_array($row) && !empty($row)) {
- foreach ($row as &$value) {
- $value = html_entity_decode($value);
+ foreach ($row as $key => $value) {
+ $row[$key] = html_entity_decode($value);
}
$rows[] = implode($separator, $row);
@@ -363,7 +361,7 @@ class Arrays
* Name of the variable was not provided and it's a multi dimensional array?
* Let's create the name, because variable is required for later usage (related to multi dimensional array)
*/
- if (self::isMultiDimensional($array) && empty($jsVariableName)) {
+ if (empty($jsVariableName) && $isMultiDimensional) {
$jsVariableName = 'autoGeneratedVariable';
}
@@ -384,13 +382,13 @@ class Arrays
if (is_array($value)) {
$variable = $index;
- if (is_integer($index)) {
+ if (is_int($index)) {
$variable = 'value_' . $variable;
}
$value = self::array2JavaScript($value, $variable, $preserveIndexes);
- if (!empty($value)) {
+ if (null !== $value && '' !== $value) {
/*
* Add an empty line for the 1st iteration only. Required to avoid missing empty line after
* declaration of variable:
@@ -409,21 +407,19 @@ class Arrays
$effect .= "\n";
}
}
- } else {
- if ($preserveIndexes) {
- if (!empty($jsVariableName)) {
- $index = Miscellaneous::quoteValue($index);
- $effect .= sprintf("\n%s[%s] = %s;", $jsVariableName, $index, $value);
- }
- } else {
- $format = '%s';
-
- if ($counter < $arrayCount) {
- $format .= ', ';
- }
-
- $effect .= sprintf($format, $value);
+ } elseif ($preserveIndexes) {
+ if (!empty($jsVariableName)) {
+ $index = Miscellaneous::quoteValue($index);
+ $effect .= sprintf("\n%s[%s] = %s;", $jsVariableName, $index, $value);
}
+ } else {
+ $format = '%s';
+
+ if ($counter < $arrayCount) {
+ $format .= ', ';
+ }
+
+ $effect .= sprintf($format, $value);
}
}
@@ -474,7 +470,7 @@ class Arrays
{
if (is_string($item)) {
if ($last) {
- $item = substr($item, 0, strlen($item) - 1);
+ $item = substr($item, 0, -1);
} else {
$item = substr($item, 1);
}
@@ -517,7 +513,7 @@ class Arrays
* No elements or the element does not exist?
* Nothing to do
*/
- if (empty($array) || !in_array($item, $array)) {
+ if (empty($array) || !in_array($item, $array, true)) {
return false;
}
@@ -556,19 +552,18 @@ class Arrays
foreach ($array as $key => &$value) {
$remove = false;
+ $isArray = is_array($value);
- if (is_array($value)) {
+ if ($isArray) {
self::removeElements($value, $needle, $before);
- if (is_array($value) && empty($value)) {
+ if ($isArray && empty($value)) {
$remove = true;
}
+ } elseif ($value === $needle) {
+ break;
} else {
- if ($value === $needle) {
- break;
- } else {
- $remove = true;
- }
+ $remove = true;
}
if ($remove) {
@@ -749,7 +744,7 @@ class Arrays
foreach ($exploded as $item) {
$exploded2 = explode($valuesKeysSeparator, $item);
- if (2 == count($exploded2)) {
+ if (2 === count($exploded2)) {
$key = trim($exploded2[0]);
$value = trim($exploded2[1]);
@@ -781,19 +776,17 @@ class Arrays
if ($firstKey) {
$effect = $exists;
$firstKey = false;
+ } elseif ($explicit) {
+ $effect = $effect && $exists;
+
+ if (!$effect) {
+ break;
+ }
} else {
- if ($explicit) {
- $effect = $effect && $exists;
+ $effect = $effect || $exists;
- if (!$effect) {
- break;
- }
- } else {
- $effect = $effect || $exists;
-
- if ($effect) {
- break;
- }
+ if ($effect) {
+ break;
}
}
}
@@ -839,6 +832,7 @@ class Arrays
foreach ($array as $key => $value) {
$path = $key;
$stopRecursion = false;
+ $valueIsArray = is_array($value);
/*
* If the path of parent element is delivered,
@@ -871,7 +865,7 @@ class Arrays
* or
* - the process is stopped, recursive is not used
*/
- if (!is_array($value) || (is_array($value) && empty($value)) || $stopRecursion) {
+ if (!$valueIsArray || ($valueIsArray && empty($value)) || $stopRecursion) {
$paths[$path] = $value;
continue;
}
@@ -879,7 +873,7 @@ class Arrays
/*
* Let's iterate through the next level, using recursive
*/
- if (is_array($value)) {
+ if ($valueIsArray) {
$recursivePaths = self::getLastElementsPaths($value, $separator, $path, $stopIfMatchedBy);
$paths += $recursivePaths;
}
@@ -1100,7 +1094,8 @@ class Arrays
$recursiveValues = self::getAllValuesOfKey($value, $key);
if (!empty($recursiveValues)) {
- $values = array_merge($values, $recursiveValues);
+ $merged = array_merge($values, $recursiveValues);
+ $values = $merged;
}
}
}
@@ -1282,7 +1277,7 @@ class Arrays
}
if (Regex::endsWith($element, $separator)) {
- $element = substr($element, 0, strlen($element) - 1);
+ $element = substr($element, 0, -1);
}
}
@@ -1354,7 +1349,7 @@ class Arrays
* Values should be compared only and both arrays are one-dimensional?
* Let's find difference by using simple function
*/
- if ($valuesOnly && 1 == self::getDimensionsCount($array1) && 1 == self::getDimensionsCount($array2)) {
+ if ($valuesOnly && 1 === self::getDimensionsCount($array1) && 1 === self::getDimensionsCount($array2)) {
return array_diff($array1, $array2);
}
@@ -1371,58 +1366,55 @@ class Arrays
if ($array2HasKey && is_array($array2[$key])) {
$difference = self::arrayDiffRecursive($value, $array2[$key], $valuesOnly);
}
- } else {
+ } elseif (!$array2HasKey || ($array2HasKey && $value !== $array2[$key])) {
/*
- * 2nd array hasn't key from 1st array?
+ * We are here, because:
+ * a) 2nd array hasn't key from 1st array
* OR
- * Key exists in both, 1st and 2nd array, but values are different?
+ * b) key exists in both, 1st and 2nd array, but values are different
*/
- if (!$array2HasKey || ($array2HasKey && $value != $array2[$key])) {
- $difference = $value;
- }
+ $difference = $value;
}
if (null !== $difference) {
$effect[] = $difference;
}
- } else {
+
/*
- * The key exists in 2nd array?
- */
- if ($array2HasKey) {
- /*
- * The value it's an array (it's a nested array)?
- */
- if (is_array($value)) {
- $diff = [];
+ * The key exists in 2nd array?
+ */
+ } elseif ($array2HasKey) {
+ /*
+ * The value it's an array (it's a nested array)?
+ */
+ if (is_array($value)) {
+ $diff = [];
- if (is_array($array2[$key])) {
- /*
- * Let's verify the nested array
- */
- $diff = self::arrayDiffRecursive($value, $array2[$key], $valuesOnly);
- }
-
- if (empty($diff)) {
- continue;
- }
-
- $effect[$key] = $diff;
- } else {
+ if (is_array($array2[$key])) {
/*
- * Value is different than in 2nd array?
- * OKay, I've got difference
+ * Let's verify the nested array
*/
- if ($value != $array2[$key]) {
- $effect[$key] = $value;
- }
+ $diff = self::arrayDiffRecursive($value, $array2[$key], $valuesOnly);
}
- } else {
+
+ if (empty($diff)) {
+ continue;
+ }
+
+ $effect[$key] = $diff;
+
/*
+ * Value is different than in 2nd array?
* OKay, I've got difference
*/
+ } elseif ($value !== $array2[$key]) {
$effect[$key] = $value;
}
+ } else {
+ /*
+ * OKay, I've got difference
+ */
+ $effect[$key] = $value;
}
}
@@ -1581,6 +1573,52 @@ class Arrays
return $dimensionsCount;
}
+ /**
+ * Returns non-empty values, e.g. without "" (empty string), null or []
+ *
+ * @param array $values The values to filter
+ * @return array
+ */
+ public static function getNonEmptyValues(array $values)
+ {
+ /*
+ * No values?
+ * Nothing to do
+ */
+ if (empty($values)) {
+ return [];
+ }
+
+ return array_filter($values, function ($value) {
+ $nonEmptyScalar = is_scalar($value) && '' !== $value;
+ $nonEmptyArray = is_array($value) && !empty($value);
+
+ return $nonEmptyScalar || $nonEmptyArray || is_object($value);
+ });
+ }
+
+ /**
+ * Returns non-empty values concatenated by given separator
+ *
+ * @param array $values The values to filter
+ * @param string $separator (optional) Separator used to implode the values. Default: ", ".
+ * @return string
+ */
+ public static function getNonEmptyValuesAsString(array $values, $separator = ', ')
+ {
+ $nonEmpty = self::getNonEmptyValues($values);
+
+ /*
+ * No values?
+ * Nothing to do
+ */
+ if (empty($nonEmpty)) {
+ return '';
+ }
+
+ return implode($separator, $nonEmpty);
+ }
+
/**
* Returns neighbour (next or previous element) for given element
*
@@ -1595,17 +1633,17 @@ class Arrays
$noPrevious = !$next && self::isFirstElement($array, $element);
/*
- * No elements?
- * OR
- * Given element does not exist in given array?
+ * Previous neighbour should be returned and given element is first?
* OR
* Next neighbour should be returned and given element is last?
* OR
- * Previous neighbour should be returned and given element is first?
+ * No elements?
+ * OR
+ * Given element does not exist in given array?
*
* Nothing to do
*/
- if (empty($array) || !in_array($element, $array) || $noNext || $noPrevious) {
+ if ($noPrevious || $noNext || empty($array) || !in_array($element, $array, true)) {
return null;
}
diff --git a/src/Utilities/Date.php b/src/Utilities/Date.php
index 40b76db..b6f33c4 100644
--- a/src/Utilities/Date.php
+++ b/src/Utilities/Date.php
@@ -64,8 +64,7 @@ class Date
const DATE_DIFFERENCE_UNIT_YEARS = 'years';
/**
- * Returns start and end date for given period.
- * The dates are returned in an array with indexes 'start' and 'end'.
+ * Returns date's period (that contains start and end date) for given period
*
* @param int $period The period, type of period. One of DatePeriod class constants, e.g. DatePeriod::LAST_WEEK.
* @throws Exception
@@ -141,7 +140,12 @@ class Date
$dateStart = new DateTime();
$dateEnd = new DateTime();
- if (DatePeriod::LAST_YEAR === $period || DatePeriod::NEXT_YEAR === $period) {
+ $yearPeriod = [
+ DatePeriod::LAST_YEAR,
+ DatePeriod::NEXT_YEAR,
+ ];
+
+ if (in_array($period, $yearPeriod, true)) {
$yearDifference = 1;
if (DatePeriod::LAST_YEAR === $period) {
@@ -168,7 +172,7 @@ class Date
return null;
}
- $dateStart->setTime(0, 0, 0);
+ $dateStart->setTime(0, 0);
$dateEnd->setTime(23, 59, 59);
return new DatePeriod($dateStart, $dateEnd);
@@ -218,7 +222,8 @@ class Date
return $dateTime
->setTime($hour, $minute, $second)
- ->format($format);
+ ->format($format)
+ ;
}
/**
@@ -350,7 +355,7 @@ class Date
*
* @param string|DateTime $dateStart The start date
* @param string|DateTime $dateEnd The end date
- * @param int $differenceUnit (optional) Unit of date difference. One of this class
+ * @param string $differenceUnit (optional) Unit of date difference. One of this class
* DATE_DIFFERENCE_UNIT_* constants. If is set to null all units are
* returned in the array.
* @return array|int
@@ -531,11 +536,15 @@ class Date
/**
* Returns random date based on given start date
*
- * @param DateTime $startDate The start date. Start of the random date.
- * @param int $start (optional) Start of random partition
- * @param int $end (optional) End of random partition
+ * @param DateTime $startDate (optional) Beginning of the random date. If not provided, current date will
+ * be used (default behaviour).
+ * @param int $start (optional) Start of random partition. If not provided, 1 will be used
+ * (default behaviour).
+ * @param int $end (optional) End of random partition. If not provided, 100 will be used
+ * (default behaviour).
* @param string $intervalTemplate (optional) Template used to build date interval. The placeholder is replaced
- * with next, iterated value.
+ * with next, iterated value. If not provided, "P%sD" will be used (default
+ * behaviour).
* @throws Exception
* @return DateTime
*/
@@ -569,10 +578,11 @@ class Date
* @param mixed $value The value which maybe is a date
* @param bool $allowCompoundFormats (optional) If is set to true, the compound formats used to create an
* instance of DateTime class are allowed (e.g. "now", "last day of next
- * month", "yyyy"). Otherwise - not and every incorrect value is refused.
+ * month", "yyyy"). Otherwise - not and every incorrect value is refused
+ * (default behaviour).
* @param string $dateFormat (optional) Format of date used to verify if given value is actually a date.
* It should be format matched to the given value, e.g. "Y-m-d H:i" for
- * "2015-01-01 10:00" value.
+ * "2015-01-01 10:00" value. Default: "Y-m-d".
* @return DateTime|bool
*/
public static function getDateTime($value, $allowCompoundFormats = false, $dateFormat = 'Y-m-d')
diff --git a/src/Utilities/Locale.php b/src/Utilities/Locale.php
index ae7abc6..770c01b 100644
--- a/src/Utilities/Locale.php
+++ b/src/Utilities/Locale.php
@@ -52,7 +52,7 @@ class Locale
LC_MESSAGES,
];
- if (empty($languageCode) || !in_array($category, $availableCategories)) {
+ if (empty($languageCode) || !in_array($category, $availableCategories, true)) {
return false;
}
diff --git a/src/Utilities/MimeTypes.php b/src/Utilities/MimeTypes.php
index f046012..2c02b10 100644
--- a/src/Utilities/MimeTypes.php
+++ b/src/Utilities/MimeTypes.php
@@ -733,7 +733,7 @@ class MimeTypes
*/
public static function getExtension($mimeType)
{
- if (is_string($mimeType) && in_array($mimeType, self::$mimeTypes)) {
+ if (is_string($mimeType) && in_array($mimeType, self::$mimeTypes, true)) {
$data = Arrays::setKeysAsValues(self::$mimeTypes, false);
return $data[$mimeType];
@@ -806,7 +806,7 @@ class MimeTypes
*/
public static function isImage($mimeType)
{
- if (in_array($mimeType, self::$mimeTypes)) {
+ if (in_array($mimeType, self::$mimeTypes, true)) {
return (bool)preg_match('|^image/.+$|', $mimeType);
}
diff --git a/src/Utilities/Miscellaneous.php b/src/Utilities/Miscellaneous.php
index 57ae076..283e929 100644
--- a/src/Utilities/Miscellaneous.php
+++ b/src/Utilities/Miscellaneous.php
@@ -296,34 +296,6 @@ class Miscellaneous
return $effect;
}
- /**
- * Displays variable content as preformatted text (fixed-width font and preserves both spaces and line breaks)
- *
- * If xdebug php module is loaded, displays variable using var_dump(), otherwise var_dump()
.
- * You can pass as many variables as you wish.
- *
- * Pass each variable as argument of this function. Amount unlimited. Variables are loaded using the
- * func_get_args() function (@see http://pl1.php.net/manual/en/function.func-get-args.php).
- */
- public static function variableDump()
- {
- $xdebugLoaded = self::isPhpModuleLoaded('xdebug');
-
- if (!$xdebugLoaded) {
- echo '';
- }
-
- $arguments = func_get_args();
-
- foreach ($arguments as $argument) {
- var_dump($argument);
- }
-
- if (!$xdebugLoaded) {
- echo '';
- }
- }
-
/**
* Returns information if given PHP module is compiled and loaded
*
diff --git a/src/Utilities/QueryBuilderUtility.php b/src/Utilities/QueryBuilderUtility.php
index fd912aa..0e87ed1 100644
--- a/src/Utilities/QueryBuilderUtility.php
+++ b/src/Utilities/QueryBuilderUtility.php
@@ -10,7 +10,6 @@ namespace Meritoo\Common\Utilities;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityManager;
-use Doctrine\ORM\OptimisticLockException;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\Query\Parameter;
use Doctrine\ORM\QueryBuilder;
@@ -91,7 +90,7 @@ class QueryBuilderUtility
* @param array $criteria (optional) The criteria used in WHERE clause. It may simple array with pairs
* key-value or an array of arrays where second element of sub-array is the
* comparison operator. Example below.
- * @param string $alias (optional) Alias used in the query
+ * @param string|null $alias (optional) Alias used in the query
* @return QueryBuilder
*
* Example of the $criteria argument:
@@ -107,7 +106,7 @@ class QueryBuilderUtility
* 'position' => 5,
* ]
*/
- public static function setCriteria(QueryBuilder $queryBuilder, array $criteria = [], $alias = '')
+ public static function setCriteria(QueryBuilder $queryBuilder, array $criteria = [], $alias = null)
{
/*
* No criteria used in WHERE clause?
@@ -121,7 +120,7 @@ class QueryBuilderUtility
* No alias provided?
* Let's use root alias
*/
- if (empty($alias)) {
+ if (null === $alias || '' === $alias) {
$alias = self::getRootAlias($queryBuilder);
}
@@ -129,7 +128,7 @@ class QueryBuilderUtility
$compareOperator = '=';
if (is_array($value) && !empty($value)) {
- if (2 == count($value)) {
+ if (2 === count($value)) {
$compareOperator = $value[1];
}
@@ -158,7 +157,6 @@ class QueryBuilderUtility
* @param array|ArrayCollection $entities The entities to delete
* @param bool $flushDeleted (optional) If is set to true, flushes the deleted objects (default
* behaviour). Otherwise - not.
- * @throws OptimisticLockException
* @return bool
*/
public static function deleteEntities(EntityManager $entityManager, $entities, $flushDeleted = true)
diff --git a/src/Utilities/Reflection.php b/src/Utilities/Reflection.php
index b03a0bd..c3fbafe 100644
--- a/src/Utilities/Reflection.php
+++ b/src/Utilities/Reflection.php
@@ -662,7 +662,7 @@ class Reflection
}
/**
- * Sets value of given property
+ * Sets value of given property in given object
*
* @param mixed $object Object that should contains given property
* @param string $property Name of the property
@@ -692,4 +692,25 @@ class Reflection
$reflectionProperty->setAccessible(false);
}
}
+
+ /**
+ * Sets values of properties in given object
+ *
+ * @param mixed $object Object that should contains given property
+ * @param array $propertiesValues Key-value pairs, where key - name of the property, value - value of the property
+ */
+ public static function setPropertiesValues($object, array $propertiesValues)
+ {
+ /*
+ * No properties?
+ * Nothing to do
+ */
+ if (empty($propertiesValues)) {
+ return;
+ }
+
+ foreach ($propertiesValues as $property => $value) {
+ static::setPropertyValue($object, $property, $value);
+ }
+ }
}
diff --git a/src/Utilities/Regex.php b/src/Utilities/Regex.php
index 20841bc..46d5b37 100644
--- a/src/Utilities/Regex.php
+++ b/src/Utilities/Regex.php
@@ -12,7 +12,7 @@ use Meritoo\Common\Exception\Regex\IncorrectColorHexLengthException;
use Meritoo\Common\Exception\Regex\InvalidColorHexValueException;
/**
- * Useful regular expressions methods
+ * Useful methods related to regular expressions
*
* @author Meritoo
* @copyright Meritoo
@@ -102,7 +102,7 @@ class Regex
* Tax ID is not 10 characters length OR is not numeric?
* Nothing to do
*/
- if (10 !== strlen($taxId) || !is_numeric($taxId)) {
+ if (!is_numeric($taxId) || 10 !== strlen($taxId)) {
return false;
}
@@ -125,14 +125,11 @@ class Regex
}
/*
- * Last number it's not a remainder from dividing per 11?
- * Nothing to do
+ * Last number it's a remainder from dividing per 11?
+ * Tax ID is valid
*/
- if ($sum % 11 == $taxId[9]) {
- return true;
- }
- return false;
+ return $sum % 11 === (int)$taxId[9];
}
/**
@@ -248,7 +245,7 @@ class Regex
if ($itsRegularExpression) {
$matchesCount = preg_match($filterExpression, $value);
- $remove = 0 == $matchesCount;
+ $remove = 0 === $matchesCount;
} else {
if (is_string($value)) {
$value = sprintf('\'%s\'', $value);
@@ -306,11 +303,9 @@ class Regex
if ($mustAllMatch) {
$effect = $effect && $matched;
- } else {
- if ($matched) {
- $effect = $matched;
- break;
- }
+ } elseif ($matched) {
+ $effect = $matched;
+ break;
}
}
@@ -501,7 +496,7 @@ class Regex
public static function startsWith($string, $beginning)
{
if (!empty($string) && !empty($beginning)) {
- if (1 == strlen($beginning) && !self::isLetterOrDigit($beginning)) {
+ if (1 === strlen($beginning) && !self::isLetterOrDigit($beginning)) {
$beginning = '\\' . $beginning;
}
@@ -522,7 +517,7 @@ class Regex
*/
public static function endsWith($string, $ending)
{
- if (1 == strlen($ending) && !self::isLetterOrDigit($ending)) {
+ if (1 === strlen($ending) && !self::isLetterOrDigit($ending)) {
$ending = '\\' . $ending;
}
@@ -607,7 +602,7 @@ class Regex
*/
public static function contains($haystack, $needle)
{
- if (1 == strlen($needle) && !self::isLetterOrDigit($needle)) {
+ if (1 === strlen($needle) && !self::isLetterOrDigit($needle)) {
$needle = '\\' . $needle;
}
@@ -694,14 +689,14 @@ class Regex
*/
public static function isValidNip($nip)
{
- $nip = preg_replace('/[^0-9]/', '', $nip);
+ $nip = preg_replace('/[\D]/', '', $nip);
$invalidNips = [
'1234567890',
'0000000000',
];
- if (!preg_match('/^[0-9]{10}$/', $nip) || in_array($nip, $invalidNips)) {
+ if (!preg_match('/^[\d]{10}$/', $nip) || in_array($nip, $invalidNips, true)) {
return false;
}
@@ -723,9 +718,9 @@ class Regex
}
$modulo = $sum % 11;
- $numberControl = (10 == $modulo) ? 0 : $modulo;
+ $numberControl = (10 === $modulo) ? 0 : $modulo;
- return $numberControl == $nip[9];
+ return $numberControl === (int)$nip[9];
}
/**
@@ -924,4 +919,37 @@ class Regex
return (bool)preg_match($pattern, $value);
}
+
+ /**
+ * Returns slug for given value
+ *
+ * @param string $value Value that should be transformed to slug
+ * @return string|bool
+ */
+ public static function createSlug($value)
+ {
+ /*
+ * Not a scalar value?
+ * Nothing to do
+ */
+ if (!is_scalar($value)) {
+ return false;
+ }
+
+ /*
+ * It's an empty string?
+ * Nothing to do
+ */
+ if ('' === $value) {
+ return '';
+ }
+
+ $id = 'Latin-ASCII; NFD; [:Nonspacing Mark:] Remove; NFC; [:Punctuation:] Remove; Lower();';
+ $transliterator = \Transliterator::create($id);
+
+ $cleanValue = trim($value);
+ $result = $transliterator->transliterate($cleanValue);
+
+ return preg_replace('/[-\s]+/', '-', $result);
+ }
}
diff --git a/src/Utilities/Repository.php b/src/Utilities/Repository.php
index fbc8d12..32dc95c 100644
--- a/src/Utilities/Repository.php
+++ b/src/Utilities/Repository.php
@@ -177,10 +177,13 @@ class Repository
$direction = 'ASC'
) {
$alias = 'qb';
+ $queryBuilder = $repository->createQueryBuilder($alias);
- return $repository
- ->createQueryBuilder($alias)
- ->orderBy(sprintf('%s.%s', $alias, $property), $direction);
+ if (empty($property)) {
+ return $queryBuilder;
+ }
+
+ return $queryBuilder->orderBy(sprintf('%s.%s', $alias, $property), $direction);
}
/**
diff --git a/src/Utilities/Uri.php b/src/Utilities/Uri.php
index bc1ec19..ebc1142 100644
--- a/src/Utilities/Uri.php
+++ b/src/Utilities/Uri.php
@@ -93,7 +93,7 @@ class Uri
/*
* Oops, cannot match protocol
*/
- if (0 == $matchCount) {
+ if (0 === $matchCount) {
return '';
}
diff --git a/src/Utilities/Xml.php b/src/Utilities/Xml.php
index a6878cd..366b86c 100644
--- a/src/Utilities/Xml.php
+++ b/src/Utilities/Xml.php
@@ -40,7 +40,7 @@ class Xml
$query = $path->query('/*/*');
$nodesCount = $query->length;
- if (0 == $nodesCount) {
+ if (0 === $nodesCount) {
return $element1;
}
diff --git a/src/ValueObject/Address.php b/src/ValueObject/Address.php
new file mode 100644
index 0000000..337f7ca
--- /dev/null
+++ b/src/ValueObject/Address.php
@@ -0,0 +1,159 @@
+
+ * @copyright Meritoo
+ */
+class Address
+{
+ /**
+ * The street
+ *
+ * @var string
+ */
+ protected $street;
+
+ /**
+ * The number of building
+ *
+ * @var string
+ */
+ protected $buildingNumber;
+
+ /**
+ * The number of flat
+ *
+ * @var string
+ */
+ protected $flatNumber;
+
+ /**
+ * The zip code
+ *
+ * @var string
+ */
+ protected $zipCode;
+
+ /**
+ * The city, location
+ *
+ * @var string
+ */
+ protected $city;
+
+ /**
+ * Class constructor
+ *
+ * @param string $city City, location
+ * @param string $zipCode The zip code
+ * @param string $street The street
+ * @param string $buildingNumber The number of building
+ * @param string $flatNumber (optional) The number of flat. Default: "".
+ */
+ public function __construct($city, $zipCode, $street, $buildingNumber, $flatNumber = '')
+ {
+ $this->city = $city;
+ $this->zipCode = $zipCode;
+ $this->street = $street;
+ $this->buildingNumber = $buildingNumber;
+ $this->flatNumber = $flatNumber;
+ }
+
+ /**
+ * Returns representation of object as string
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ $values = [
+ $this->getFullStreet(),
+ $this->zipCode,
+ $this->city,
+ ];
+
+ return Arrays::getNonEmptyValuesAsString($values);
+ }
+
+ /**
+ * Returns street
+ *
+ * @return string
+ */
+ public function getStreet()
+ {
+ return $this->street;
+ }
+
+ /**
+ * Returns full street (name + building & flat number)
+ *
+ * @return string
+ */
+ public function getFullStreet()
+ {
+ if (empty($this->street)) {
+ return '';
+ }
+
+ $numbers = $this->buildingNumber;
+
+ if (!empty($numbers) && !empty($this->flatNumber)) {
+ $numbers = sprintf('%s/%s', $numbers, $this->flatNumber);
+ }
+
+ return sprintf('%s %s', $this->street, $numbers);
+ }
+
+ /**
+ * Returns number of building
+ *
+ * @return string
+ */
+ public function getBuildingNumber()
+ {
+ return $this->buildingNumber;
+ }
+
+ /**
+ * Returns number of flat
+ *
+ * @return string
+ */
+ public function getFlatNumber()
+ {
+ return $this->flatNumber;
+ }
+
+ /**
+ * Returns zip code
+ *
+ * @return string
+ */
+ public function getZipCode()
+ {
+ return $this->zipCode;
+ }
+
+ /**
+ * Returns city, location
+ *
+ * @return string
+ */
+ public function getCity()
+ {
+ return $this->city;
+ }
+}
diff --git a/src/ValueObject/BankAccount.php b/src/ValueObject/BankAccount.php
new file mode 100644
index 0000000..0b2c83f
--- /dev/null
+++ b/src/ValueObject/BankAccount.php
@@ -0,0 +1,81 @@
+
+ * @copyright Meritoo
+ */
+class BankAccount
+{
+ /**
+ * Name of bank
+ *
+ * @var string
+ */
+ protected $bankName;
+
+ /**
+ * Number of bank's account
+ *
+ * @var string
+ */
+ protected $accountNumber;
+
+ /**
+ * Class constructor
+ *
+ * @param string $bankName Name of bank
+ * @param string $accountNumber Number of bank's account
+ */
+ public function __construct($bankName, $accountNumber)
+ {
+ $this->bankName = $bankName;
+ $this->accountNumber = $accountNumber;
+ }
+
+ /**
+ * Returns representation of object as string
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ $values = [
+ $this->bankName,
+ $this->accountNumber,
+ ];
+
+ return Arrays::getNonEmptyValuesAsString($values);
+ }
+
+ /**
+ * Returns name of bank
+ *
+ * @return string
+ */
+ public function getBankName()
+ {
+ return $this->bankName;
+ }
+
+ /**
+ * Returns number of bank's account
+ *
+ * @return string
+ */
+ public function getAccountNumber()
+ {
+ return $this->accountNumber;
+ }
+}
diff --git a/src/ValueObject/Company.php b/src/ValueObject/Company.php
new file mode 100644
index 0000000..05facea
--- /dev/null
+++ b/src/ValueObject/Company.php
@@ -0,0 +1,101 @@
+
+ * @copyright Meritoo
+ */
+class Company
+{
+ /**
+ * Name of company
+ *
+ * @var string
+ */
+ protected $name;
+
+ /**
+ * Address of company
+ *
+ * @var Address
+ */
+ protected $address;
+
+ /**
+ * Bank account of company
+ *
+ * @var BankAccount
+ */
+ protected $bankAccount;
+
+ /**
+ * Class constructor
+ *
+ * @param string $name Name of company
+ * @param Address $address Address of company
+ * @param BankAccount|null $bankAccount (optional) Bank account of company
+ */
+ public function __construct($name, Address $address, BankAccount $bankAccount = null)
+ {
+ $this->name = $name;
+ $this->address = $address;
+ $this->bankAccount = $bankAccount;
+ }
+
+ /**
+ * Returns representation of object as string
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ $values = [
+ $this->name,
+ $this->address,
+ $this->bankAccount,
+ ];
+
+ return Arrays::getNonEmptyValuesAsString($values);
+ }
+
+ /**
+ * Returns name of company
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ /**
+ * Returns address of company
+ *
+ * @return Address
+ */
+ public function getAddress()
+ {
+ return $this->address;
+ }
+
+ /**
+ * Returns bank account of company
+ *
+ * @return BankAccount|null
+ */
+ public function getBankAccount()
+ {
+ return $this->bankAccount;
+ }
+}
diff --git a/tests/Resources/var/cache/.gitkeep b/tests/Resources/var/cache/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/tests/Resources/var/log/.gitkeep b/tests/Resources/var/log/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/tests/Resources/var/sessions/.gitkeep b/tests/Resources/var/sessions/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/tests/Utilities/Arrays/SimpleToString.php b/tests/Utilities/Arrays/SimpleToString.php
new file mode 100644
index 0000000..04bec45
--- /dev/null
+++ b/tests/Utilities/Arrays/SimpleToString.php
@@ -0,0 +1,44 @@
+
+ * @copyright Meritoo
+ */
+class SimpleToString
+{
+ /**
+ * Identifier
+ *
+ * @var string
+ */
+ private $id;
+
+ /**
+ * Class constructor
+ *
+ * @param string $id Identifier
+ */
+ public function __construct($id)
+ {
+ $this->id = $id;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function __toString()
+ {
+ return sprintf('Instance with ID: %s', $this->id);
+ }
+}
diff --git a/tests/Utilities/ArraysTest.php b/tests/Utilities/ArraysTest.php
index d43da0d..71d9583 100644
--- a/tests/Utilities/ArraysTest.php
+++ b/tests/Utilities/ArraysTest.php
@@ -9,6 +9,7 @@
namespace Meritoo\Common\Test\Utilities;
use Meritoo\Common\Test\Base\BaseTestCase;
+use Meritoo\Common\Test\Utilities\Arrays\SimpleToString;
use Meritoo\Common\Utilities\Arrays;
/**
@@ -1486,6 +1487,43 @@ letsTest[2] = value_2;';
self::assertTrue(Arrays::isMultiDimensional($this->complexArray));
}
+ /**
+ * @param string $description Description of test case
+ * @param array $values The values to filter
+ * @param array $expected Expected non-empty values
+ *
+ * @dataProvider provideValuesToFilterNonEmpty
+ */
+ public function testGetNonEmptyValues($description, array $values, array $expected)
+ {
+ self::assertSame($expected, Arrays::getNonEmptyValues($values), $description);
+ }
+
+ /**
+ * @param string $description Description of test case
+ * @param array $values The values to filter
+ * @param string $expected Expected non-empty values (as string)
+ *
+ * @dataProvider provideValuesToFilterNonEmptyAsStringUsingDefaultSeparator
+ */
+ public function testGetNonEmptyValuesAsStringUsingDefaultSeparator($description, array $values, $expected)
+ {
+ self::assertSame($expected, Arrays::getNonEmptyValuesAsString($values), $description);
+ }
+
+ /**
+ * @param string $description Description of test case
+ * @param array $values The values to filter
+ * @param string $separator Separator used to implode the values
+ * @param string $expected Expected non-empty values (as string)
+ *
+ * @dataProvider provideValuesToFilterNonEmptyAsString
+ */
+ public function testGetNonEmptyValuesAsString($description, array $values, $separator, $expected)
+ {
+ self::assertSame($expected, Arrays::getNonEmptyValuesAsString($values, $separator), $description);
+ }
+
/**
* Provides simple array to set/replace values with keys
*
@@ -1807,6 +1845,264 @@ letsTest[2] = value_2;';
];
}
+ /**
+ * Provide values to filter and get non-empty values
+ *
+ * @return \Generator
+ */
+ public function provideValuesToFilterNonEmpty()
+ {
+ $simpleObject = new SimpleToString('1234');
+
+ yield[
+ 'An empty array (no values to filter)',
+ [],
+ [],
+ ];
+
+ yield[
+ 'All values are empty',
+ [
+ '',
+ null,
+ [],
+ ],
+ [],
+ ];
+
+ yield[
+ '5 values with 2 empty strings',
+ [
+ 'test 1',
+ '',
+ 'test 2',
+ 'test 3',
+ '',
+ ],
+ [
+ 0 => 'test 1',
+ 2 => 'test 2',
+ 3 => 'test 3',
+ ],
+ ];
+
+ yield[
+ '"0" shouldn\'t be treated like an empty value',
+ [
+ 123,
+ 0,
+ 456,
+ ],
+ [
+ 123,
+ 0,
+ 456,
+ ],
+ ];
+
+ yield[
+ 'Object shouldn\'t be treated like an empty value',
+ [
+ 'test 1',
+ $simpleObject,
+ 'test 2',
+ null,
+ 'test 3',
+ ],
+ [
+ 0 => 'test 1',
+ 1 => $simpleObject,
+ 2 => 'test 2',
+ 4 => 'test 3',
+ ],
+ ];
+
+ yield[
+ 'Mixed values (non-empty, empty, strings, integers, objects)',
+ [
+ 'test 1',
+ '',
+ 123,
+ null,
+ 'test 2',
+ 'test 3',
+ 0,
+ $simpleObject,
+ 456,
+ [],
+ $simpleObject,
+ ],
+ [
+ 0 => 'test 1',
+ 2 => 123,
+ 4 => 'test 2',
+ 5 => 'test 3',
+ 6 => 0,
+ 7 => $simpleObject,
+ 8 => 456,
+ 10 => $simpleObject,
+ ],
+ ];
+ }
+
+ /**
+ * Provide values to filter and get non-empty values concatenated by default separator
+ *
+ * @return \Generator
+ */
+ public function provideValuesToFilterNonEmptyAsStringUsingDefaultSeparator()
+ {
+ yield[
+ 'An empty array (no values to filter)',
+ [],
+ '',
+ ];
+
+ yield[
+ 'All values are empty',
+ [
+ '',
+ null,
+ [],
+ ],
+ '',
+ ];
+
+ yield[
+ '5 values with 2 empty strings',
+ [
+ 'test 1',
+ '',
+ 'test 2',
+ 'test 3',
+ '',
+ ],
+ 'test 1, test 2, test 3',
+ ];
+
+ yield[
+ 'Numbers with "0" that shouldn\'t be treated like an empty value',
+ [
+ 123,
+ 0,
+ 456,
+ ],
+ '123, 0, 456',
+ ];
+
+ yield[
+ 'Object shouldn\'t be treated like an empty value',
+ [
+ 'test 1',
+ new SimpleToString('1234'),
+ 'test 2',
+ null,
+ 'test 3',
+ ],
+ 'test 1, Instance with ID: 1234, test 2, test 3',
+ ];
+
+ yield[
+ 'Mixed values (non-empty, empty, strings, integers, objects)',
+ [
+ 'test 1',
+ '',
+ 123,
+ null,
+ 'test 2',
+ 'test 3',
+ 0,
+ new SimpleToString('A1XC90Z'),
+ 456,
+ [],
+ new SimpleToString('FF-45-0Z'),
+ ],
+ 'test 1, 123, test 2, test 3, 0, Instance with ID: A1XC90Z, 456, Instance with ID: FF-45-0Z',
+ ];
+ }
+
+ /**
+ * Provide values to filter and get non-empty values concatenated by given separator
+ *
+ * @return \Generator
+ */
+ public function provideValuesToFilterNonEmptyAsString()
+ {
+ yield[
+ 'An empty array (no values to filter)',
+ [],
+ ' | ',
+ '',
+ ];
+
+ yield[
+ 'All values are empty',
+ [
+ '',
+ null,
+ [],
+ ],
+ ' | ',
+ '',
+ ];
+
+ yield[
+ '5 values with 2 empty strings',
+ [
+ 'test 1',
+ '',
+ 'test 2',
+ 'test 3',
+ '',
+ ],
+ ' | ',
+ 'test 1 | test 2 | test 3',
+ ];
+
+ yield[
+ 'Numbers with "0" that shouldn\'t be treated like an empty value',
+ [
+ 123,
+ 0,
+ 456,
+ ],
+ ' <-> ',
+ '123 <-> 0 <-> 456',
+ ];
+
+ yield[
+ 'Object shouldn\'t be treated like an empty value',
+ [
+ 'test 1',
+ new SimpleToString('1234'),
+ 'test 2',
+ null,
+ 'test 3',
+ ],
+ ' | ',
+ 'test 1 | Instance with ID: 1234 | test 2 | test 3',
+ ];
+
+ yield[
+ 'Mixed values (non-empty, empty, strings, integers, objects)',
+ [
+ 'test 1',
+ '',
+ 123,
+ null,
+ 'test 2',
+ 'test 3',
+ 0,
+ new SimpleToString('A1XC90Z'),
+ 456,
+ [],
+ new SimpleToString('FF-45-0Z'),
+ ],
+ ';',
+ 'test 1;123;test 2;test 3;0;Instance with ID: A1XC90Z;456;Instance with ID: FF-45-0Z',
+ ];
+ }
+
/**
* {@inheritdoc}
*/
diff --git a/tests/Utilities/DateTest.php b/tests/Utilities/DateTest.php
index bcf9cd6..94a7813 100644
--- a/tests/Utilities/DateTest.php
+++ b/tests/Utilities/DateTest.php
@@ -279,9 +279,18 @@ class DateTest extends BaseTestCase
self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_YEARS));
self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_YEARS));
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MONTHS));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MONTHS));
+
self::assertEquals(1, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_DAYS));
self::assertEquals(1, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_DAYS));
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_HOURS));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_HOURS));
+
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MINUTES));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MINUTES));
+
/*
* Difference of 1 day (using the relative date format)
*/
@@ -294,8 +303,10 @@ class DateTest extends BaseTestCase
];
self::assertEquals($effect, Date::getDateDifference(new DateTime('yesterday'), new DateTime('midnight')));
+ self::assertEquals(0, Date::getDateDifference(new DateTime('yesterday'), new DateTime('midnight'), Date::DATE_DIFFERENCE_UNIT_MONTHS));
self::assertEquals(1, Date::getDateDifference(new DateTime('yesterday'), new DateTime('midnight'), Date::DATE_DIFFERENCE_UNIT_DAYS));
self::assertEquals(0, Date::getDateDifference(new DateTime('yesterday'), new DateTime('midnight'), Date::DATE_DIFFERENCE_UNIT_HOURS));
+ self::assertEquals(0, Date::getDateDifference(new DateTime('yesterday'), new DateTime('midnight'), Date::DATE_DIFFERENCE_UNIT_MINUTES));
}
public function testGetDateDifferenceOneDayTwoHours()
@@ -320,6 +331,12 @@ class DateTest extends BaseTestCase
self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_YEARS));
self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_YEARS));
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MONTHS));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MONTHS));
+
+ self::assertEquals(1, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_DAYS));
+ self::assertEquals(1, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_DAYS));
+
self::assertEquals(2, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_HOURS));
self::assertEquals(2, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_HOURS));
@@ -355,10 +372,141 @@ class DateTest extends BaseTestCase
self::assertEquals(41, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_DAYS));
self::assertEquals(41, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_DAYS));
+ self::assertEquals(4, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_HOURS));
+ self::assertEquals(4, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_HOURS));
+
self::assertEquals(30, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MINUTES));
self::assertEquals(30, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MINUTES));
}
+ public function testGetDateDifferenceNewYear()
+ {
+ $dateStart = '2017-12-31 23:59';
+ $dateEnd = '2018-01-01 00:00';
+
+ $effect = [
+ Date::DATE_DIFFERENCE_UNIT_YEARS => 0,
+ Date::DATE_DIFFERENCE_UNIT_MONTHS => 0,
+ Date::DATE_DIFFERENCE_UNIT_DAYS => 0,
+ Date::DATE_DIFFERENCE_UNIT_HOURS => 0,
+ Date::DATE_DIFFERENCE_UNIT_MINUTES => 1,
+ ];
+
+ self::assertEquals($effect, Date::getDateDifference($dateStart, $dateEnd));
+ self::assertEquals($effect, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd)));
+
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_YEARS));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_YEARS));
+
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MONTHS));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MONTHS));
+
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_DAYS));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_DAYS));
+
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_HOURS));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_HOURS));
+
+ self::assertEquals(1, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MINUTES));
+ self::assertEquals(1, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MINUTES));
+ }
+
+ public function testGetDateDifferenceLessThan24Hours()
+ {
+ $dateStart = '2017-01-01 16:00';
+ $dateEnd = '2017-01-02 10:00';
+
+ $effect = [
+ Date::DATE_DIFFERENCE_UNIT_YEARS => 0,
+ Date::DATE_DIFFERENCE_UNIT_MONTHS => 0,
+ Date::DATE_DIFFERENCE_UNIT_DAYS => 0,
+ Date::DATE_DIFFERENCE_UNIT_HOURS => 18,
+ Date::DATE_DIFFERENCE_UNIT_MINUTES => 0,
+ ];
+
+ self::assertEquals($effect, Date::getDateDifference($dateStart, $dateEnd));
+ self::assertEquals($effect, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd)));
+
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_YEARS));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_YEARS));
+
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MONTHS));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MONTHS));
+
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_DAYS));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_DAYS));
+
+ self::assertEquals(18, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_HOURS));
+ self::assertEquals(18, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_HOURS));
+
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MINUTES));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MINUTES));
+ }
+
+ public function testGetDateDifferenceEqual24Hours()
+ {
+ $dateStart = '2017-01-01 00:00';
+ $dateEnd = '2017-01-02 00:00';
+
+ $effect = [
+ Date::DATE_DIFFERENCE_UNIT_YEARS => 0,
+ Date::DATE_DIFFERENCE_UNIT_MONTHS => 0,
+ Date::DATE_DIFFERENCE_UNIT_DAYS => 1,
+ Date::DATE_DIFFERENCE_UNIT_HOURS => 0,
+ Date::DATE_DIFFERENCE_UNIT_MINUTES => 0,
+ ];
+
+ self::assertEquals($effect, Date::getDateDifference($dateStart, $dateEnd));
+ self::assertEquals($effect, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd)));
+
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_YEARS));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_YEARS));
+
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MONTHS));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MONTHS));
+
+ self::assertEquals(1, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_DAYS));
+ self::assertEquals(1, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_DAYS));
+
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_HOURS));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_HOURS));
+
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MINUTES));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MINUTES));
+ }
+
+ public function testGetDateDifferenceInvertedDates()
+ {
+ $dateStart = '2017-01-02 10:00';
+ $dateEnd = '2017-01-01 16:00';
+
+ $effect = [
+ Date::DATE_DIFFERENCE_UNIT_YEARS => 0,
+ Date::DATE_DIFFERENCE_UNIT_MONTHS => 0,
+ Date::DATE_DIFFERENCE_UNIT_DAYS => -1,
+ Date::DATE_DIFFERENCE_UNIT_HOURS => 6,
+ Date::DATE_DIFFERENCE_UNIT_MINUTES => 0,
+ ];
+
+ self::assertEquals($effect, Date::getDateDifference($dateStart, $dateEnd));
+ self::assertEquals($effect, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd)));
+
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_YEARS));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_YEARS));
+
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MONTHS));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MONTHS));
+
+ self::assertEquals(-1, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_DAYS));
+ self::assertEquals(-1, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_DAYS));
+
+ self::assertEquals(6, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_HOURS));
+ self::assertEquals(6, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_HOURS));
+
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MINUTES));
+ self::assertEquals(0, Date::getDateDifference(new DateTime($dateStart), new DateTime($dateEnd), Date::DATE_DIFFERENCE_UNIT_MINUTES));
+ }
+
public function testGetDateDifferenceNoDifference()
{
/*
@@ -384,6 +532,12 @@ class DateTest extends BaseTestCase
self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MONTHS));
self::assertEquals(0, Date::getDateDifference(new DateTime(), new DateTime(), Date::DATE_DIFFERENCE_UNIT_MONTHS));
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_DAYS));
+ self::assertEquals(0, Date::getDateDifference(new DateTime(), new DateTime(), Date::DATE_DIFFERENCE_UNIT_DAYS));
+
+ self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_HOURS));
+ self::assertEquals(0, Date::getDateDifference(new DateTime(), new DateTime(), Date::DATE_DIFFERENCE_UNIT_HOURS));
+
self::assertEquals(0, Date::getDateDifference($dateStart, $dateEnd, Date::DATE_DIFFERENCE_UNIT_MINUTES));
self::assertEquals(0, Date::getDateDifference(new DateTime(), new DateTime(), Date::DATE_DIFFERENCE_UNIT_MINUTES));
}
diff --git a/tests/Utilities/MiscellaneousTest.php b/tests/Utilities/MiscellaneousTest.php
index aa54c6a..c5cfed2 100644
--- a/tests/Utilities/MiscellaneousTest.php
+++ b/tests/Utilities/MiscellaneousTest.php
@@ -156,33 +156,6 @@ class MiscellaneousTest extends BaseTestCase
self::assertFalse(Miscellaneous::isPhpModuleLoaded('xyz123'));
}
- public function testVariableDump()
- {
- $xdebugLoaded = Miscellaneous::isPhpModuleLoaded('xdebug');
-
- $variable = 123;
- $expected = "int(123)\n";
-
- if ($xdebugLoaded) {
- $libraryPath = realpath(sprintf('%s%s', __DIR__, '/../..'));
- $filePath = sprintf('%s%s', $libraryPath, '/src/Utilities/Miscellaneous.php:');
-
- /*
- * Attention. I have to use "\d+" at the end of $filePath, because number of line may be different if new
- * method / function will be created.
- */
- $filePathQuoted = sprintf('%s\d+\:', preg_quote($filePath, '/'));
-
- $expectedPattern = sprintf("/%s\n%s/", $filePathQuoted, preg_quote($expected, '/'));
- $this->expectOutputRegex($expectedPattern);
- } else {
- $expected = sprintf('%s
', $expected);
- $this->expectOutputString($expected);
- }
-
- Miscellaneous::variableDump($variable);
- }
-
/**
* @param mixed $string Empty value, e.g. ""
* @dataProvider provideEmptyValue
diff --git a/tests/Utilities/ReflectionTest.php b/tests/Utilities/ReflectionTest.php
index 69ce170..8763716 100644
--- a/tests/Utilities/ReflectionTest.php
+++ b/tests/Utilities/ReflectionTest.php
@@ -82,8 +82,15 @@ class ReflectionTest extends BaseTestCase
* Class with namespace containing name of class (duplicated string)
*/
if (class_exists('Symfony\Bundle\SecurityBundle\SecurityBundle')) {
- self::assertEquals('Symfony\Bundle\SecurityBundle\SecurityBundle', Reflection::getClassName('Symfony\Bundle\SecurityBundle\SecurityBundle'));
- self::assertEquals('SecurityBundle', Reflection::getClassName('Symfony\Bundle\SecurityBundle\SecurityBundle', true));
+ self::assertEquals(
+ 'Symfony\Bundle\SecurityBundle\SecurityBundle',
+ Reflection::getClassName('Symfony\Bundle\SecurityBundle\SecurityBundle')
+ );
+
+ self::assertEquals(
+ 'SecurityBundle',
+ Reflection::getClassName('Symfony\Bundle\SecurityBundle\SecurityBundle', true)
+ );
}
}
@@ -115,7 +122,10 @@ class ReflectionTest extends BaseTestCase
* Class with namespace containing name of class (duplicated string)
*/
if (class_exists('Symfony\Bundle\SecurityBundle\SecurityBundle')) {
- self::assertEquals('Symfony\Bundle\SecurityBundle', Reflection::getClassNamespace('Symfony\Bundle\SecurityBundle\SecurityBundle'));
+ self::assertEquals(
+ 'Symfony\Bundle\SecurityBundle',
+ Reflection::getClassNamespace('Symfony\Bundle\SecurityBundle\SecurityBundle')
+ );
}
}
@@ -183,11 +193,11 @@ class ReflectionTest extends BaseTestCase
public function testGetMethods()
{
- self::assertEquals(1, count(Reflection::getMethods(B::class, true)));
- self::assertEquals(3, count(Reflection::getMethods(B::class)));
- self::assertEquals(2, count(Reflection::getMethods(A::class)));
- self::assertEquals(2, count(Reflection::getMethods(C::class, true)));
- self::assertEquals(5, count(Reflection::getMethods(C::class)));
+ self::assertCount(1, Reflection::getMethods(B::class, true));
+ self::assertCount(3, Reflection::getMethods(B::class));
+ self::assertCount(2, Reflection::getMethods(A::class));
+ self::assertCount(2, Reflection::getMethods(C::class, true));
+ self::assertCount(5, Reflection::getMethods(C::class));
}
/**
@@ -235,9 +245,20 @@ class ReflectionTest extends BaseTestCase
public function testGetPropertiesUsingFilter()
{
- self::assertCount(1, Reflection::getProperties(B::class, ReflectionProperty::IS_PROTECTED));
- self::assertCount(0, Reflection::getProperties(B::class, ReflectionProperty::IS_PRIVATE));
- self::assertCount(1, Reflection::getProperties(B::class, ReflectionProperty::IS_PRIVATE, true));
+ self::assertCount(
+ 1,
+ Reflection::getProperties(B::class, ReflectionProperty::IS_PROTECTED)
+ );
+
+ self::assertCount(
+ 0,
+ Reflection::getProperties(B::class, ReflectionProperty::IS_PRIVATE)
+ );
+
+ self::assertCount(
+ 1,
+ Reflection::getProperties(B::class, ReflectionProperty::IS_PRIVATE, true)
+ );
}
public function testGetPropertiesWithParents()
@@ -484,9 +505,7 @@ class ReflectionTest extends BaseTestCase
public function testSetPropertyValueUsingNotExistingProperty($object, $property)
{
$this->setExpectedException(NotExistingPropertyException::class);
-
- $object = new \stdClass();
- Reflection::setPropertyValue($object, 'test', 'test test test');
+ Reflection::setPropertyValue($object, $property, 'test test test');
}
/**
@@ -506,6 +525,43 @@ class ReflectionTest extends BaseTestCase
static::assertSame($newValue, $value);
}
+ public function testSetPropertiesValuesWithoutProperties()
+ {
+ $object = new G();
+ Reflection::setPropertiesValues($object, []);
+
+ static::assertSame($object->getFirstName(), 'John');
+ static::assertSame($object->getLastName(), 'Scott');
+ }
+
+ /**
+ * @param mixed $object Object that should contains given property
+ * @param array $propertiesValues Key-value pairs, where key - name of the property, value - value of the property
+ *
+ * @dataProvider provideObjectAndNotExistingProperties
+ */
+ public function testSetPropertiesValuesUsingNotExistingProperties($object, array $propertiesValues)
+ {
+ $this->setExpectedException(NotExistingPropertyException::class);
+ Reflection::setPropertiesValues($object, $propertiesValues);
+ }
+
+ /**
+ * @param mixed $object Object that should contains given property
+ * @param array $propertiesValues Key-value pairs, where key - name of the property, value - value of the property
+ *
+ * @dataProvider provideObjectAndPropertiesValues
+ */
+ public function testSetPropertiesValues($object, array $propertiesValues)
+ {
+ Reflection::setPropertiesValues($object, $propertiesValues);
+
+ foreach ($propertiesValues as $property => $value) {
+ $realValue = Reflection::getPropertyValue($object, $property);
+ static::assertSame($value, $realValue);
+ }
+ }
+
/**
* Provides invalid class and trait
*
@@ -588,4 +644,104 @@ class ReflectionTest extends BaseTestCase
'Smith',
];
}
+
+ /**
+ * Provides object and not existing properties
+ *
+ * @return Generator
+ */
+ public function provideObjectAndNotExistingProperties()
+ {
+ yield[
+ new \stdClass(),
+ [
+ 'test' => 1,
+ ],
+ ];
+
+ yield[
+ new A(),
+ [
+ 'test' => 2,
+ ],
+ ];
+
+ yield[
+ new B(),
+ [
+ 'firstName' => '',
+ ],
+ ];
+ }
+
+ /**
+ * Provides object and its new values of properties
+ *
+ * @return Generator
+ */
+ public function provideObjectAndPropertiesValues()
+ {
+ yield[
+ new A(),
+ [
+ 'count' => 123,
+ ],
+ ];
+
+ yield[
+ new B(),
+ [
+ 'name' => 'test test',
+ ],
+ ];
+
+ yield[
+ new G(),
+ [
+ 'firstName' => 'Jane',
+ ],
+ ];
+
+ yield[
+ new G(),
+ [
+ 'lastName' => 'Smith',
+ ],
+ ];
+
+ yield[
+ new G(),
+ [
+ 'firstName' => 'Jane',
+ 'lastName' => 'Brown',
+ ],
+ ];
+
+ yield[
+ new F(
+ 123,
+ 'New York',
+ 'USA',
+ 'UnKnown'
+ ),
+ [
+ 'gInstance' => new G(),
+ ],
+ ];
+
+ yield[
+ new F(
+ 123,
+ 'New York',
+ 'USA',
+ 'UnKnown',
+ 'Mary',
+ 'Brown'
+ ),
+ [
+ 'country' => 'Canada',
+ 'accountBalance' => 456,
+ ],
+ ];
+ }
}
diff --git a/tests/Utilities/RegexTest.php b/tests/Utilities/RegexTest.php
index 8ecea57..be0b29e 100644
--- a/tests/Utilities/RegexTest.php
+++ b/tests/Utilities/RegexTest.php
@@ -12,7 +12,6 @@ use Generator;
use Meritoo\Common\Exception\Regex\IncorrectColorHexLengthException;
use Meritoo\Common\Exception\Regex\InvalidColorHexValueException;
use Meritoo\Common\Test\Base\BaseTestCase;
-use ReflectionException;
/**
* Test case of the useful regular expressions methods
@@ -25,9 +24,6 @@ class RegexTest extends BaseTestCase
private $simpleText;
private $camelCaseText;
- /**
- * @throws ReflectionException
- */
public function testConstructor()
{
static::assertHasNoConstructor(Regex::class);
@@ -553,10 +549,6 @@ class RegexTest extends BaseTestCase
/**
* @param mixed $nonScalarValue Non scalar value, e.g. [] or null
- *
- * @throws IncorrectColorHexLengthException
- * @throws InvalidColorHexValueException
- *
* @dataProvider provideNonScalarValue
*/
public function testGetValidColorHexValueUsingNonScalarValue($nonScalarValue)
@@ -566,10 +558,6 @@ class RegexTest extends BaseTestCase
/**
* @param mixed $emptyValue Empty value, e.g. ""
- *
- * @throws IncorrectColorHexLengthException
- * @throws InvalidColorHexValueException
- *
* @dataProvider provideColorEmptyValue
*/
public function testGetValidColorHexValueUsingEmptyValueWithoutException($emptyValue)
@@ -579,10 +567,6 @@ class RegexTest extends BaseTestCase
/**
* @param mixed $emptyValue Empty value, e.g. ""
- *
- * @throws IncorrectColorHexLengthException
- * @throws InvalidColorHexValueException
- *
* @dataProvider provideColorEmptyValue
*/
public function testGetValidColorHexValueUsingEmptyValue($emptyValue)
@@ -593,10 +577,6 @@ class RegexTest extends BaseTestCase
/**
* @param string $incorrectColor Incorrect value of color
- *
- * @throws IncorrectColorHexLengthException
- * @throws InvalidColorHexValueException
- *
* @dataProvider provideColorIncorrectLength
*/
public function testGetValidColorHexValueUsingIncorrectValueWithoutException($incorrectColor)
@@ -606,10 +586,6 @@ class RegexTest extends BaseTestCase
/**
* @param string $incorrectColor Incorrect value of color
- *
- * @throws IncorrectColorHexLengthException
- * @throws InvalidColorHexValueException
- *
* @dataProvider provideColorIncorrectLength
*/
public function testGetValidColorHexValueUsingIncorrectValue($incorrectColor)
@@ -620,10 +596,6 @@ class RegexTest extends BaseTestCase
/**
* @param string $invalidColor Invalid value of color
- *
- * @throws IncorrectColorHexLengthException
- * @throws InvalidColorHexValueException
- *
* @dataProvider provideColorInvalidValue
*/
public function testGetValidColorHexValueUsingInvalidValueWithoutException($invalidColor)
@@ -633,10 +605,6 @@ class RegexTest extends BaseTestCase
/**
* @param string $invalidColor Invalid value of color
- *
- * @throws IncorrectColorHexLengthException
- * @throws InvalidColorHexValueException
- *
* @dataProvider provideColorInvalidValue
*/
public function testGetValidColorHexValueUsingInvalidValue($invalidColor)
@@ -649,9 +617,6 @@ class RegexTest extends BaseTestCase
* @param string $color Color to verify
* @param string $expected Expected value of color
*
- * @throws IncorrectColorHexLengthException
- * @throws InvalidColorHexValueException
- *
* @dataProvider provideColor
*/
public function testGetValidColorHexValue($color, $expected)
@@ -659,6 +624,17 @@ class RegexTest extends BaseTestCase
self::assertEquals($expected, Regex::getValidColorHexValue($color));
}
+ /**
+ * @param string $value Value that should be transformed to slug
+ * @param string $expected Expected slug
+ *
+ * @dataProvider provideValueSlug
+ */
+ public function testCreateSlug($value, $expected)
+ {
+ self::assertSame($expected, Regex::createSlug($value));
+ }
+
/**
* Provides name of bundle and information if it's valid name
*
@@ -834,12 +810,12 @@ class RegexTest extends BaseTestCase
];
yield[
- fread(fopen($file1Path, 'r'), 1),
+ fread(fopen($file1Path, 'rb'), 1),
false,
];
yield[
- fread(fopen($file2Path, 'r'), 1),
+ fread(fopen($file2Path, 'rb'), 1),
true,
];
}
@@ -1729,6 +1705,89 @@ class RegexTest extends BaseTestCase
];
}
+ /**
+ * Provide value to create slug
+ *
+ * @return Generator
+ */
+ public function provideValueSlug()
+ {
+ yield[
+ [],
+ false,
+ ];
+
+ yield[
+ null,
+ false,
+ ];
+
+ yield[
+ '',
+ '',
+ ];
+
+ yield[
+ 1234,
+ '1234',
+ ];
+
+ yield[
+ '1234',
+ '1234',
+ ];
+
+ yield[
+ '1/2/3/4',
+ '1234',
+ ];
+
+ yield[
+ '1 / 2 / 3 / 4',
+ '1-2-3-4',
+ ];
+
+ yield[
+ 'test',
+ 'test',
+ ];
+
+ yield[
+ 'test test',
+ 'test-test',
+ ];
+
+ yield[
+ 'lorem ipsum dolor sit',
+ 'lorem-ipsum-dolor-sit',
+ ];
+
+ yield[
+ 'Lorem ipsum. Dolor sit 12.34 amet.',
+ 'lorem-ipsum-dolor-sit-1234-amet',
+ ];
+
+ yield[
+ 'Was sind Löwen, Bären, Vögel und Käfer (für die Prüfung)?',
+ 'was-sind-lowen-baren-vogel-und-kafer-fur-die-prufung',
+ ];
+
+ yield[
+ 'äöü (ÄÖÜ)',
+ 'aou-aou',
+ ];
+
+ yield[
+ 'Półka dębowa. Kolor: żółędziowy. Wymiary: 80 x 30 cm.',
+ 'polka-debowa-kolor-zoledziowy-wymiary-80-x-30-cm',
+ ];
+
+ yield[
+ 'ąęółńśżźć (ĄĘÓŁŃŚŻŹĆ)',
+ 'aeolnszzc-aeolnszzc',
+ ];
+ }
+
/**
* {@inheritdoc}
*/
@@ -1737,7 +1796,8 @@ class RegexTest extends BaseTestCase
parent::setUp();
$this->simpleText = 'lorem ipsum dolor sit';
- $this->camelCaseText = str_replace(' ', '', lcfirst(ucwords($this->simpleText))); // 'loremIpsumDolorSit'
+ $simpleUppercase = ucwords($this->simpleText);
+ $this->camelCaseText = str_replace(' ', '', lcfirst($simpleUppercase)); // 'loremIpsumDolorSit'
}
/**
@@ -1746,8 +1806,6 @@ class RegexTest extends BaseTestCase
protected function tearDown()
{
parent::tearDown();
-
- unset($this->simpleText);
- unset($this->camelCaseText);
+ unset($this->simpleText, $this->camelCaseText);
}
}
diff --git a/tests/Utilities/RepositoryTest.php b/tests/Utilities/RepositoryTest.php
index aafeadb..0ccedd4 100644
--- a/tests/Utilities/RepositoryTest.php
+++ b/tests/Utilities/RepositoryTest.php
@@ -8,6 +8,10 @@
namespace Meritoo\Common\Test\Utilities;
+use Doctrine\ORM\EntityManagerInterface;
+use Doctrine\ORM\EntityRepository;
+use Doctrine\ORM\Query\Expr\OrderBy;
+use Doctrine\ORM\QueryBuilder;
use Generator;
use Meritoo\Common\Test\Base\BaseTestCase;
use Meritoo\Common\Test\Utilities\Repository\Sortable;
@@ -160,7 +164,7 @@ class RepositoryTest extends BaseTestCase
/**
* @param array $items Objects who have "getPosition()" and "setPosition()" methods or arrays
- * @param bool $max (optional) If is set to true, maximum value is returned. Otherwise - minimum.
+ * @param bool $max If is set to true, maximum value is returned. Otherwise - minimum.
* @param int $expected Extreme position (max or min) of given items
*
* @dataProvider provideArraysWithoutExtremePositionToGetExtremePosition
@@ -170,12 +174,122 @@ class RepositoryTest extends BaseTestCase
static::assertEquals($expected, Repository::getExtremePosition($items, $max));
}
- public function testGetExtremePositionUsingObjects()
+ /**
+ * @param array $items Objects who have "getPosition()" and "setPosition()" methods or arrays
+ * @param bool $max If is set to true, maximum value is returned. Otherwise - minimum.
+ * @param int $expected Extreme position (max or min) of given items
+ *
+ * @dataProvider provideArraysWithExtremePositionToGetExtremePosition
+ */
+ public function testGetExtremePositionUsingArraysWithExtremePosition(array $items, $max, $expected)
{
+ static::assertEquals($expected, Repository::getExtremePosition($items, $max));
}
- public function testGetEntityOrderedQueryBuilder()
+ /**
+ * @param array $items Objects who have "getPosition()" and "setPosition()" methods or arrays
+ * @param bool $max If is set to true, maximum value is returned. Otherwise - minimum.
+ * @param int $expected Extreme position (max or min) of given items
+ *
+ * @dataProvider provideObjectsWithoutExtremePositionToGetExtremePosition
+ */
+ public function testGetExtremePositionUsingObjectsWithoutExtremePosition(array $items, $max, $expected)
{
+ static::assertEquals($expected, Repository::getExtremePosition($items, $max));
+ }
+
+ /**
+ * @param array $items Objects who have "getPosition()" and "setPosition()" methods or arrays
+ * @param bool $max If is set to true, maximum value is returned. Otherwise - minimum.
+ * @param int $expected Extreme position (max or min) of given items
+ *
+ * @dataProvider provideObjectsWithExtremePositionToGetExtremePosition
+ */
+ public function testGetExtremePositionUsingObjectsWithExtremePosition(array $items, $max, $expected)
+ {
+ static::assertEquals($expected, Repository::getExtremePosition($items, $max));
+ }
+
+ public function testGetEntityOrderedQueryBuilderUsingDefaults()
+ {
+ $entityManager = $this->getMock(EntityManagerInterface::class);
+
+ $entityRepository = $this
+ ->getMockBuilder(EntityRepository::class)
+ ->disableOriginalConstructor()
+ ->setMethods([
+ 'createQueryBuilder',
+ ])
+ ->getMock();
+
+ $expectedQueryBuilder = new QueryBuilder($entityManager);
+ $expectedQueryBuilder->from('any_table_name', 'qb');
+
+ $entityRepository
+ ->expects(static::once())
+ ->method('createQueryBuilder')
+ ->willReturn($expectedQueryBuilder);
+
+ $queryBuilder = Repository::getEntityOrderedQueryBuilder($entityRepository);
+ $selectDQLPart = $queryBuilder->getDQLPart('select');
+ $whereDQLPart = $queryBuilder->getDQLPart('where');
+ $orderDQLPart = $queryBuilder->getDQLPart('orderBy');
+
+ /* @var OrderBy $orderBy */
+ $orderBy = $orderDQLPart[0];
+
+ static::assertInstanceOf(QueryBuilder::class, $queryBuilder);
+ static::assertArraySubset(['qb'], $queryBuilder->getRootAliases());
+ static::assertSame([], $selectDQLPart);
+ static::assertNull($whereDQLPart);
+ static::assertSame(['qb.name ASC'], $orderBy->getParts());
+ }
+
+ /**
+ * @param string $property Name of property used by the ORDER BY clause
+ * @param string $direction Direction used by the ORDER BY clause ("ASC" or "DESC")
+ * @param string $expectedOrderBy Expected ORDER BY clause
+ *
+ * @dataProvider providePropertyAndDirectionToGetEntityOrderedQueryBuilder
+ */
+ public function testGetEntityOrderedQueryBuilder($property, $direction, $expectedOrderBy)
+ {
+ $entityManager = $this->getMock(EntityManagerInterface::class);
+
+ $entityRepository = $this
+ ->getMockBuilder(EntityRepository::class)
+ ->disableOriginalConstructor()
+ ->setMethods([
+ 'createQueryBuilder',
+ ])
+ ->getMock();
+
+ $expectedQueryBuilder = new QueryBuilder($entityManager);
+ $expectedQueryBuilder->from('any_table_name', 'qb');
+
+ $entityRepository
+ ->expects(static::once())
+ ->method('createQueryBuilder')
+ ->willReturn($expectedQueryBuilder);
+
+ $queryBuilder = Repository::getEntityOrderedQueryBuilder($entityRepository, $property, $direction);
+ $selectDQLPart = $queryBuilder->getDQLPart('select');
+ $whereDQLPart = $queryBuilder->getDQLPart('where');
+ $orderDQLPart = $queryBuilder->getDQLPart('orderBy');
+
+ static::assertInstanceOf(QueryBuilder::class, $queryBuilder);
+ static::assertArraySubset(['qb'], $queryBuilder->getRootAliases());
+ static::assertSame([], $selectDQLPart);
+ static::assertNull($whereDQLPart);
+
+ if (empty($property)) {
+ static::assertSame([], $orderDQLPart);
+ } else {
+ /* @var OrderBy $orderBy */
+ $orderBy = $orderDQLPart[0];
+
+ static::assertSame([$expectedOrderBy], $orderBy->getParts());
+ }
}
/**
@@ -581,7 +695,7 @@ class RepositoryTest extends BaseTestCase
[],
],
true,
- 1,
+ 2,
];
yield[
@@ -596,7 +710,125 @@ class RepositoryTest extends BaseTestCase
[],
],
false,
- 2,
+ 1,
+ ];
+ }
+
+ /**
+ * Provides objects without extreme position used to get extreme position
+ *
+ * @return Generator
+ */
+ public function provideObjectsWithoutExtremePositionToGetExtremePosition()
+ {
+ yield[
+ [],
+ false,
+ null,
+ ];
+
+ yield[
+ [],
+ true,
+ null,
+ ];
+
+ yield[
+ [
+ new Sortable(),
+ new Sortable(),
+ new Sortable(),
+ ],
+ true,
+ null,
+ ];
+
+ yield[
+ [
+ new Sortable(),
+ new Sortable(),
+ new Sortable(),
+ ],
+ false,
+ null,
+ ];
+ }
+
+ /**
+ * Provides objects with extreme position used to get extreme position
+ *
+ * @return Generator
+ */
+ public function provideObjectsWithExtremePositionToGetExtremePosition()
+ {
+ yield[
+ [
+ new Sortable(1),
+ new Sortable(2),
+ new Sortable(3),
+ ],
+ true,
+ 3,
+ ];
+
+ yield[
+ [
+ new Sortable(1),
+ new Sortable(2),
+ new Sortable(3),
+ ],
+ false,
+ 1,
+ ];
+ }
+
+ /**
+ * Provide name of property, direction and expected ORDER BY clause used to get query builder
+ *
+ * @return Generator
+ */
+ public function providePropertyAndDirectionToGetEntityOrderedQueryBuilder()
+ {
+ yield[
+ null,
+ null,
+ '',
+ ];
+
+ yield[
+ '',
+ '',
+ '',
+ ];
+
+ yield[
+ 'first_name',
+ '',
+ 'qb.first_name ASC',
+ ];
+
+ yield[
+ 'first_name',
+ 'asc',
+ 'qb.first_name asc',
+ ];
+
+ yield[
+ 'first_name',
+ 'ASC',
+ 'qb.first_name ASC',
+ ];
+
+ yield[
+ 'first_name',
+ 'desc',
+ 'qb.first_name desc',
+ ];
+
+ yield[
+ 'first_name',
+ 'DESC',
+ 'qb.first_name DESC',
];
}
}
diff --git a/tests/ValueObject/AddressTest.php b/tests/ValueObject/AddressTest.php
new file mode 100644
index 0000000..e07db25
--- /dev/null
+++ b/tests/ValueObject/AddressTest.php
@@ -0,0 +1,105 @@
+
+ * @copyright Meritoo
+ */
+class AddressTest extends BaseTestCase
+{
+ /**
+ * @var Address
+ */
+ private $address;
+
+ /**
+ * @var Address
+ */
+ private $addressWithoutFlat;
+
+ /**
+ * @var Address
+ */
+ private $addressWithoutStreet;
+
+ public function testConstructor()
+ {
+ static::assertConstructorVisibilityAndArguments(
+ Address::class,
+ OopVisibilityType::IS_PUBLIC,
+ 5,
+ 4
+ );
+ }
+
+ public function testGetFlatNumber()
+ {
+ static::assertSame('200', $this->address->getFlatNumber());
+ static::assertSame('', $this->addressWithoutFlat->getFlatNumber());
+ static::assertSame('300', $this->addressWithoutStreet->getFlatNumber());
+ }
+
+ public function testGetBuildingNumber()
+ {
+ static::assertSame('10', $this->address->getBuildingNumber());
+ static::assertSame('22', $this->addressWithoutFlat->getBuildingNumber());
+ static::assertSame('1', $this->addressWithoutStreet->getBuildingNumber());
+ }
+
+ public function testGetStreet()
+ {
+ static::assertSame('4th Avenue', $this->address->getStreet());
+ static::assertSame('Green Street', $this->addressWithoutFlat->getStreet());
+ static::assertSame('', $this->addressWithoutStreet->getStreet());
+ }
+
+ public function testGetFullStreet()
+ {
+ static::assertSame('4th Avenue 10/200', $this->address->getFullStreet());
+ static::assertSame('Green Street 22', $this->addressWithoutFlat->getFullStreet());
+ static::assertSame('', $this->addressWithoutStreet->getFullStreet());
+ }
+
+ public function testGetCity()
+ {
+ static::assertSame('New York', $this->address->getCity());
+ static::assertSame('San Francisco', $this->addressWithoutFlat->getCity());
+ static::assertSame('Saint Louis', $this->addressWithoutStreet->getCity());
+ }
+
+ public function testGetZipCode()
+ {
+ static::assertSame('00123', $this->address->getZipCode());
+ static::assertSame('00456', $this->addressWithoutFlat->getZipCode());
+ static::assertSame('00111', $this->addressWithoutStreet->getZipCode());
+ }
+
+ public function testToString()
+ {
+ static::assertSame('4th Avenue 10/200, 00123, New York', (string)$this->address);
+ static::assertSame('Green Street 22, 00456, San Francisco', (string)$this->addressWithoutFlat);
+ static::assertSame('00111, Saint Louis', (string)$this->addressWithoutStreet);
+ }
+
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->address = new Address('New York', '00123', '4th Avenue', '10', '200');
+ $this->addressWithoutFlat = new Address('San Francisco', '00456', 'Green Street', '22');
+ $this->addressWithoutStreet = new Address('Saint Louis', '00111', '', '1', '300');
+ }
+}
diff --git a/tests/ValueObject/BankAccountTest.php b/tests/ValueObject/BankAccountTest.php
new file mode 100644
index 0000000..9dc6ab4
--- /dev/null
+++ b/tests/ValueObject/BankAccountTest.php
@@ -0,0 +1,71 @@
+
+ * @copyright Meritoo
+ */
+class BankAccountTest extends BaseTestCase
+{
+ /**
+ * @var BankAccount
+ */
+ private $emptyBankAccount;
+
+ /**
+ * @var BankAccount
+ */
+ private $bankAccount;
+
+ public function testConstructor()
+ {
+ static::assertConstructorVisibilityAndArguments(
+ BankAccount::class,
+ OopVisibilityType::IS_PUBLIC,
+ 2,
+ 2
+ );
+ }
+
+ public function testGetAccountNumber()
+ {
+ self::assertSame('', $this->emptyBankAccount->getAccountNumber());
+ self::assertSame('1234567890', $this->bankAccount->getAccountNumber());
+ }
+
+ public function testGetBankName()
+ {
+ self::assertSame('', $this->emptyBankAccount->getBankName());
+ self::assertSame('Bank of America', $this->bankAccount->getBankName());
+ }
+
+ public function testToString()
+ {
+ static::assertSame('', (string)$this->emptyBankAccount);
+ static::assertSame('Bank of America, 1234567890', (string)$this->bankAccount);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->emptyBankAccount = new BankAccount('', '');
+ $this->bankAccount = new BankAccount('Bank of America', '1234567890');
+ }
+}
diff --git a/tests/ValueObject/CompanyTest.php b/tests/ValueObject/CompanyTest.php
new file mode 100644
index 0000000..d6da00b
--- /dev/null
+++ b/tests/ValueObject/CompanyTest.php
@@ -0,0 +1,98 @@
+
+ * @copyright Meritoo
+ */
+class CompanyTest extends BaseTestCase
+{
+ /**
+ * @var Company
+ */
+ private $company;
+
+ /**
+ * @var Company
+ */
+ private $companyWithoutBankAccount;
+
+ public function testConstructor()
+ {
+ static::assertConstructorVisibilityAndArguments(
+ Company::class,
+ OopVisibilityType::IS_PUBLIC,
+ 3,
+ 2
+ );
+ }
+
+ public function testGetName()
+ {
+ static::assertSame('Test 1', $this->company->getName());
+ static::assertSame('Test 2', $this->companyWithoutBankAccount->getName());
+ }
+
+ public function testGetAddress()
+ {
+ static::assertEquals(
+ new Address('New York', '00123', '4th Avenue', '10', '200'),
+ $this->company->getAddress()
+ );
+
+ static::assertEquals(
+ new Address('San Francisco', '00456', 'Green Street', '22'),
+ $this->companyWithoutBankAccount->getAddress()
+ );
+ }
+
+ public function testGetBankAccount()
+ {
+ static::assertEquals(
+ new BankAccount('Bank 1', '12345'),
+ $this->company->getBankAccount()
+ );
+
+ static::assertNull($this->companyWithoutBankAccount->getBankAccount());
+ }
+
+ public function testToString()
+ {
+ static::assertSame('Test 1, 4th Avenue 10/200, 00123, New York, Bank 1, 12345', (string)$this->company);
+ static::assertSame('Test 2, Green Street 22, 00456, San Francisco', (string)$this->companyWithoutBankAccount);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function setUp()
+ {
+ parent::setUp();
+
+ $this->company = new Company(
+ 'Test 1',
+ new Address('New York', '00123', '4th Avenue', '10', '200'),
+ new BankAccount('Bank 1', '12345')
+ );
+
+ $this->companyWithoutBankAccount = new Company(
+ 'Test 2',
+ new Address('San Francisco', '00456', 'Green Street', '22')
+ );
+ }
+}
diff --git a/tests/ValueObject/VersionTest.php b/tests/ValueObject/VersionTest.php
index fb0e783..7876798 100644
--- a/tests/ValueObject/VersionTest.php
+++ b/tests/ValueObject/VersionTest.php
@@ -6,7 +6,7 @@
* file that was distributed with this source code.
*/
-namespace Meritoo\Test\Common\ValueObject;
+namespace Meritoo\Common\Test\ValueObject;
use Generator;
use Meritoo\Common\Test\Base\BaseTestCase;