Compare commits

...

10 Commits

Author SHA1 Message Date
697f6b81b9 20250424
[Д] [ObjectArray->Add] Функция добавляет объект в массив объектов, хранящийся в данном классе (аналогично добавлению элемента в массив с помощью []).

[Д] [ObjectArray->AddRange] Функция добавляет массив объектов (или объекты, заданные с помощью array) в массив объектов, хранящийся в данном классе.

[И] [ObjectArray->Update] Добавление с помощью foreach заменено на AddRange.

[Д] [IDuplicated] Добавлен интерфейс реализации дублирования классов.

[Д] [IStoredAtSQL] Добавлен интерфейс поддержки моделей и классов, реализующих хранение свойств в SQL базе данных.
2025-04-24 07:31:59 +03:00
8da3c1df38 20250224
[Д] [StringExtension::Replace] Функция заменяет все вхождения строки поиска на строку замены в заданной строке (аналог mb_str_replace).

[Д] [StringExtension::ReplaceAll] Функция заменяет все вхождения строк поиск на соответствующие строки замены в заданной строке.
2025-02-24 23:44:57 +03:00
07a994df83 20250223-1
[О] [ClassMapper::MapToClassProperty] и [ClassMapper::SetParameterToClass]: Исправлена ошибка, при которой некорректно переводился тип bool.
2025-02-23 14:05:30 +03:00
e09ea26a3c 20250223
[О] [ClassMapper::MapClass]: Отменена проверка свойства на доступность get и set, так как выдавала ошибку. Используйте лучше в таких случаях $options['ignored'] для таких свойств.
2025-02-23 11:34:19 +03:00
ebfd42a88e 20250222
[О] [ClassMapper::GetDefaults]: Улучшено определение типа. Теперь проверка integer не вызовет ошибку, что ожидается int.

[О] [ClassMapper::MapClass]: Теперь идёт проверка свойства на доступность get и set. Свойства с только get и только set пропускаются.
2025-02-22 13:09:54 +03:00
054e6a7cdc 20250221 2025-02-21 18:33:23 +03:00
64c1f386eb 20250217
[Д] [BoolExtensions]: Добавлен новый статический класс, расширяющий возможности типа bool.
2025-02-17 17:34:14 +03:00
3aefbd7f27 20250214-1
[Д] [HashGetType]: Добавлен параметр ByHash (для получения класса хеша путём передачи ему уже вычисленного хэша).

[О] [FileHash]: __construct - $hashBy по умолчанию теперь HashGetType::ByHash.

[Д] [FileHash]: Добавлены функции сериализации и десериализации (теперь класс реализует интерфейс ISerializable).

[Д] [FileHash]: Добавлена функции валидации хэша Validate.
2025-02-14 19:07:21 +03:00
b6f9698e59 20250214
+ [TwoDimSize]: Класс, описывающий двумерный размер.

+ [HashGetType]: Перечисление типов получения хэша.

+ [FileHash]: Класс для работы с хэшем файла или строки.
2025-02-14 16:41:50 +03:00
3fd75364a1 20250208
+ [ObjectArray]: Добавлена функция Skip для пропуска $offset элементов массива.
+ [ObjectArray]: Добавлена функция Take для получения $count элементов массива.
+ [ObjectArray]: Добавлена функция SkipAndTake для получения $count элементов массива, начиная с индекса $startFrom.
2025-02-08 17:57:09 +03:00
20 changed files with 1248 additions and 382 deletions

View File

@ -16,11 +16,11 @@
}
],
"require": {
"php": ">=8.4",
"php": "^8.4",
"ext-mbstring": "*"
},
"require-dev": {
"phpunit/phpunit": ">=11.5.6"
"phpunit/phpunit": "^12.0.4"
},
"autoload": {
"psr-4": {

538
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -211,6 +211,15 @@ final class ClassMapper
// -- тип свойства
$propertyType = $property->getType();
// - если значение является типом bool
if ($propertyType->getName() === 'bool') {
// -- присваиваю дату
self::SetParameterToClass($classReflector, $key, $classObj, $value == "1");
// -- следующий элемент
continue;
}
// - если значение является классом
if (!$propertyType->isBuiltin() && is_array($value)) {
// -- присваиваю объект
@ -300,7 +309,7 @@ final class ClassMapper
$property->setAccessible(true);
// Если значение null
if ($value == null || $value == "null")
if (!is_bool($value) && ($value == null || $value == "null"))
// - то присваиваю значение по умолчанию
$value = self::GetDefaults($property->getType()->getName());
@ -314,18 +323,18 @@ final class ClassMapper
}
/**
* Получает значение по умолчанию для разных типов данных.
* Возвращает значение по умолчанию для типа $typeName.
*
* @param string $typeName Имя типа данных.
* @param string $typeName Тип
*
* @return mixed|null Результат.
* @return mixed Значение по умолчанию
*/
public static function GetDefaults (string $typeName): mixed
{
return match ($typeName) {
'int' => 0,
'float' => 0.0,
'bool' => false,
return match (strtolower($typeName)) {
'int', 'integer' => 0,
'float', 'double' => 0.0,
'bool', 'boolean' => false,
'string' => '',
'array' => [],
'object' => new stdClass(),

View File

@ -0,0 +1,108 @@
<?php
namespace goodboyalex\php_components_pack\classes;
use goodboyalex\php_components_pack\enums\HashGetType;
use goodboyalex\php_components_pack\extensions\StringExtension;
use goodboyalex\php_components_pack\interfaces\ISerializable;
/**
* Класс для работы с хэшем файла или строки.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0.1
* @since 1.0.5
*/
final class FileHash implements ISerializable
{
/**
* @var string $Hash Хэш файла.
*/
private(set) string $Hash;
/**
* Конструктор.
*
* @param string $str Хэщ, строка или имя файла.
* @param HashGetType $hashBy Тип получения хэша.
*/
public function __construct (string $str = "", HashGetType $hashBy = HashGetType::ByHash)
{
$this->Hash = match ($hashBy) {
HashGetType::ByString => $this->pGetHash($str),
HashGetType::ByFile => $this->pGetFileHash($str),
HashGetType::ByHash => $str
};
}
/**
* Получение хэша файла по строке.
*
* @param string $str Строка.
*
* @return string Хэш строки.
*/
private function pGetHash (string $str): string
{
return hash('sha256', $str);
}
/**
* Получение хэша файла по имени файла.
*
* @param string $fileName Имя файла.
*
* @return string Хэш файла.
*/
private function pGetFileHash (string $fileName): string
{
return hash_file('sha256', $fileName);
}
/**
* Сравнивает текущий хэш с хэшем <code>otherHash</code> и выдаёт <code>true</code>, если совпадают, и
* <code>false</code>, если не совпадают.
*
* @param FileHash $otherHash Другой хэш.
*
* @return bool <code>true</code>, если совпадают, и <code>false</code>, если не совпадают.
*/
public function IsEqual (FileHash $otherHash): bool
{
return StringExtension::Compare($this->Hash, $otherHash->Hash, true) === 0;
}
/**
* Проверяет, совпадает ли хэш с хэшем/файлом/строкой <code>str</code>.
*
* @param string $str Хэш, строка или имя файла.
* @param HashGetType $hashBy Тип получения хэша.
*
* @return bool <code>true</code>, если совпадают, и <code>false</code>, если не совпадают.
*/
public function Validate (string $str, HashGetType $hashBy): bool
{
return match ($hashBy) {
HashGetType::ByString => $this->pGetHash($str) == $this->Hash,
HashGetType::ByFile => $this->pGetFileHash($str) == $this->Hash,
HashGetType::ByHash => $str == $this->Hash,
};
}
/**
* @inheritDoc
*/
public function Serialize (): string
{
return serialize($this->Hash);
}
/**
* @inheritDoc
*/
public function UnSerialize (string $serialized): void
{
$this->Hash = unserialize($serialized);
}
}

View File

@ -9,6 +9,7 @@ use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArrayBasicTrait;
use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArrayConstantsTrait;
use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArrayLINQTrait;
use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArraySearchAndSortTrait;
use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArraySpecialTrait;
use IteratorAggregate;
/**
@ -38,6 +39,9 @@ final class ObjectArray implements ArrayAccess, IteratorAggregate, Countable, IS
// LINQ-подобные методы
use ObjectArrayLINQTrait;
// Специальные методы
use ObjectArraySpecialTrait;
/**
* Конструктор класса.
*
@ -47,40 +51,4 @@ final class ObjectArray implements ArrayAccess, IteratorAggregate, Countable, IS
{
$this->Container = $array;
}
/**
* Возвращает массив объектов, хранящихся в данном классе.
*
* @return array Массив объектов, хранящихся в данном классе.
*/
public function ToArray (): array
{
return $this->Container;
}
/**
* Очищает массив объектов, хранящийся в данном классе.
*
* @return void
*/
public function Clear (): void
{
// Очищаем массив
unset($this->Container);
// Создаем новый массив
$this->Container = [];
}
/**
* Объединяет массив объектов, хранящийся в данном классе, с массивом объектов, переданным в качестве параметра.
*
* @param array $objects Массив объектов, который будет объединен с массивом объектов, хранящимся в данном классе.
*
* @return void
*/
public function Merge (array $objects): void
{
$this->Container = array_merge($this->Container, $objects);
}
}

View File

@ -0,0 +1,183 @@
<?php
namespace goodboyalex\php_components_pack\classes;
use Exception;
use goodboyalex\php_components_pack\interfaces\ISerializable;
/**
* Класс, описывающий двумерный размер.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.0.5
*/
final class TwoDimSize implements ISerializable
{
/**
* Разделитель частей по умолчанию.
*/
public const string DEFAULT_DELIMITER = ':';
/**
* @var bool $NoNegativeValues Значения не должны быть отрицательными.
*/
public bool $NoNegativeValues = true;
/**
* @var int $Width Длина (публичная)
*/
public int $Width {
get {
return $this->pWidth;
}
set {
$this->pWidth = $this->NoNegativeValues ? max($value, 0) : $value;
}
}
/**
* @var int $Height Ширина (публичная)
*/
public int $Height {
get {
return $this->pHeight;
}
set {
$this->pHeight = $this->NoNegativeValues ? max($value, 0) : $value;
}
}
/**
* @var int $pWidth Длина (приватное)
*/
private int $pWidth = 0;
/**
* @var int $pHeight Ширина (приватное)
*/
private int $pHeight = 0;
/**
* Конструктор.
*
* @param int $width Длина.
* @param int $height Ширина.
* @param bool $noNegativeValues Значения не должны быть отрицательными.
*/
public function __construct (int $width = 0, int $height = 0, bool $noNegativeValues = true)
{
$this->Width = $width;
$this->Height = $height;
$this->NoNegativeValues = $noNegativeValues;
}
/**
* Конвертация в строку (магический метод).
*
* @return string Строка.
*/
public function __toString (): string
{
return $this->AsString();
}
/**
* Конвертация в строку (расширенный метод).
*
* @param string $delimiter Делитель размера.
*
* @return string Строка.
*/
public function AsString (string $delimiter = self::DEFAULT_DELIMITER): string
{
return $this->Width . $delimiter . $this->Height;
}
/**
* @inheritDoc
*/
public function Serialize (): string
{
// Получаю строковое значение
$str = $this->AsString("x");
// Добавляю допустимы ли отрицательные значения
$str .= $this->NoNegativeValues ? "x1" : "x0";
// Возвращаю строку
return $str;
}
/**
* @inheritDoc
*/
public function UnSerialize (string $serialized): void
{
// Десериализую строку
$result = explode("x", $serialized);
// Присваиваю параметры
$this->NoNegativeValues = $result[2] === "1";
// Объединяю длину и ширину
$tdSize = $result[0] . self::DEFAULT_DELIMITER . $result[1];
// Пытаюсь получить размер
try {
$result = self::Parse($tdSize, noNegativeValues: $this->NoNegativeValues);
}
catch (Exception $e) {
$result = new TwoDimSize(noNegativeValues: $this->NoNegativeValues);
}
// Присваиваю длину
$this->Width = $result->Width;
// Присваиваю ширину
$this->Height = $result->Height;
}
/**
* Получение размера из строки.
*
* @param string $str Строка.
* @param string $delimiter Разделитель размеров.
* @param bool $noNegativeValues Значения не должны быть отрицательными.
*
* @return TwoDimSize Модель размеров.
* @throws Exception Если в строке <code>str</code> не содержится символа <code>delimiter</code> или таких
* разделителей слишком много.
*/
public static function Parse (string $str, string $delimiter = self::DEFAULT_DELIMITER,
bool $noNegativeValues = true): TwoDimSize
{
// Разделяю значения
$splitSizes = explode($delimiter, $str);
// Проверяю, что массив имеет ровно два элемента
if (count($splitSizes) != 2)
throw new Exception(sprintf("Похоже, что в строке %s не содержится символа «%s» или таких разделителей слишком много!",
$str, $delimiter));
// Пытаюсь получить длину
$width = filter_var($splitSizes[0], FILTER_VALIDATE_INT);
// Если не удалось получить длину
if ($width === false)
$width = 0;
// Пытаюсь получить ширину
$height = filter_var($splitSizes[1], FILTER_VALIDATE_INT);
// Если не удалось получить ширину
if ($height === false)
$height = 0;
// Вывожу значение
return new TwoDimSize($width, $height, $noNegativeValues);
}
}

View File

@ -0,0 +1,34 @@
<?php
namespace goodboyalex\php_components_pack\enums;
use goodboyalex\php_components_pack\traits\EnumExtensionsTrait;
/**
* Перечисление типов получения хэша.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.1
* @since 1.0.5
*/
enum HashGetType: int
{
// Подключаю расширение для Enum
use EnumExtensionsTrait;
/**
* По строке хэша.
*/
case ByHash = 0;
/**
* По строке.
*/
case ByString = 1;
/**
* По файлу.
*/
case ByFile = 2;
}

View File

@ -0,0 +1,73 @@
<?php
namespace goodboyalex\php_components_pack\extensions;
use Exception;
/**
* Расширение типа "правда/ложь".
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.0.7
*/
final class BoolExtensions
{
/**
* Вывод в строку <code>ifTrue</code>, если выражение <code>b</code> правдиво и <code>ifFalse</code> в противном
* случае.
*
* @param bool $b Выражение типа правда/ложь.
* @param string $ifTrue Строка для правдивого выражения. По умолчанию "true".
* @param string $ifFalse Строка для лживого выражения. По умолчанию "false".
*
* @return string Вывод строки.
*/
public static function ExportToString (bool $b, string $ifTrue = "true", string $ifFalse = "false"): string
{
return $b ? $ifTrue : $ifFalse;
}
/**
* Вычисляет, есть ли хотя бы одно из переменных формата правда/ложь <code>expressions</code> в значении
* <code>true</code>.
*
* @param array $expressions Переменные формата правда/ложь.
*
* @return bool Есть ли хотя бы одно в значении true.
*
* @throws Exception Выбрасывается, если хотя бы один аргумент <code>expressions</code> не являются типом
* правда/ложь.
*/
public static function AnyTrue (array $expressions): bool
{
return self::TrueCount($expressions) > 0;
}
/**
* Вычисляет количество переменных формата правда/ложь <code>expressions</code> в значении <code>true</code>.
*
* @param array $expressions Переменные формата правда/ложь.
*
* @return int Количество переменных в значении true.
*
* @throws Exception Выбрасывается, если хотя бы один аргумент <code>expressions</code> не являются типом
* правда/ложь.
*/
public static function TrueCount (array $expressions): int
{
// Проверяем все аргументы
foreach ($expressions as $expression)
// - если аргумент не является типом правда/ложь
if (!is_bool($expression))
// -- то выбрасываем исключение
throw new Exception('All arguments must be bool. / Все аргументы должны быть типа «правда/ложь».');
// Используем array_filter для фильтрации всех истинных значений
$filtered = array_filter($expressions);
// Возвращаем количество элементов в отфильтрованном массиве
return count($filtered);
}
}

View File

@ -207,4 +207,63 @@ final class StringExtension
// Возвращаю обрезанный текст
return mb_substr($text, 0, $lengthWithoutEndDots) . $endDots;
}
/**
* Функция заменяет все вхождения строк поиск на соответствующие строки замены в заданной строке.
*
* @param array $searchReplace Массив с парами поиска и замены. Например, <code>['-' => '#', '$' => '%']</code>
* заменит все дефисы на # и все доллары на %.
* @param string $subject Строка, в которой нужно выполнить замену.
* @param string $encoding (необязательный) Кодировка (по умолчанию, UTF-8).
*
* @return string Возвращает новую строку с выполненными заменами.
*/
public static function ReplaceAll (array $searchReplace, string $subject, string $encoding = 'UTF-8'): string
{
// Создаю результат
$result = $subject;
// Для каждой пары поиска и замены
foreach ($searchReplace as $search => $replace)
// - заменяю все вхождения строки поиска на строку замены в заданной строке
$result = self::Replace($search, $replace, $result, $encoding);
// Возвращаю результат
return $result;
}
/**
* Функция заменяет все вхождения строки поиска на строку замены в заданной строке (аналог mb_str_replace).
*
* @param string $search Строка, которую нужно найти и заменить.
* @param string $replace Строка, на которую нужно заменить найденную строку.
* @param string $subject Строка, в которой нужно выполнить замену.
* @param string $encoding (необязательный) Кодировка (по умолчанию, UTF-8).
*
* @return string Возвращает новую строку с выполненной заменой.
*/
public static function Replace (string $search, string $replace, string $subject,
string $encoding = 'UTF-8'): string
{
// Если кодировка не UTF-8
if ($encoding != 'UTF-8') {
// - то перекодируем строку поиска, замены и исходную строку в UTF-8
$search = mb_convert_encoding($search, 'UTF-8', $encoding);
// - и перекодируем строку замены в UTF-8
$replace = mb_convert_encoding($replace, 'UTF-8', $encoding);
// - и перекодируем исходную строку в UTF-8
$subject = mb_convert_encoding($subject, 'UTF-8', $encoding);
}
// С помощью регулярного выражения заменяем все вхождения строки поиска на строку замены
$result = preg_replace('/' . preg_quote($search, '/') . '/u', $replace, $subject);
// Если кодировка не UTF-8
if ($encoding != 'UTF-8')
// - то перекодируем результат в исходную кодировку
$result = mb_convert_encoding($result, $encoding, 'UTF-8');
// Возвращаем результат
return $result;
}
}

View File

@ -0,0 +1,21 @@
<?php
namespace goodboyalex\php_components_pack\interfaces;
/**
* Интерфейс реализации дублирования классов.
*
* @author Александр Бабаев
* @package freecms
* @version 0.1
* @since 0.1
*/
interface IDuplicated
{
/**
* Дублирование класса.
*
* @return object Класс-дублёр.
*/
public function Duplicate (): object;
}

View File

@ -0,0 +1,32 @@
<?php
namespace goodboyalex\php_components_pack\interfaces;
/**
* Интерфейс поддержки моделей и классов, реализующих хранение свойств в SQL базе данных.
*
* @author Александр Бабаев
* @package freecms
* @version 0.1
* @since 0.1
*/
interface IStoredAtSQL
{
/**
* Вывод параметров добавления/обновления данных в базу данных.
*
* @param bool $withId Нужно ли добавлять Id в массив
*
* @return array Массив параметров
*/
public function ToSQL (bool $withId = true): array;
/**
* Преобразование данных из базы данных в модель, класс.
*
* @param array $sqlData Данные из базы данных
*
* @return self Класс модели с заполненными данными из базы данных
*/
public function FromSQL (array $sqlData): self;
}

View File

@ -196,8 +196,7 @@ trait ObjectArrayLINQTrait
$result = $this->Delete($wherePredicate);
// Добавляю новые элементы
foreach ($setItems as $item)
$this->Container[] = $item;
$this->AddRange($setItems);
// Возвращаю результат
return $result;
@ -334,4 +333,49 @@ trait ObjectArrayLINQTrait
// Возвращаем первый элемент
return $lastElement;
}
/**
* Пропускает первые $count элементов массива. Возвращает новый массив.
*
* ВНИМАНИЕ: рекомендуется использовать ТОЛЬКО на отсортированных массивах.
*
* @param int $count Количество элементов, которые необходимо обрезать с начала массива.
*
* @return ObjectArray Возвращает новый массив, состоящий из элементов, начиная с $count + 1 элемента.
*/
public function Skip (int $count): ObjectArray
{
return new ObjectArray(array_slice($this->Container, $count));
}
/**
* Получает первые $count элементов массива. Возвращает новый массив.
*
* ВНИМАНИЕ: рекомендуется использовать ТОЛЬКО на отсортированных массивах.
*
* @param int $count Количество элементов, которые необходимо получить с начала массива.
*
* @return ObjectArray Возвращает новый массив, состоящий из первых $count элементов старого массива.
*/
public function Take (int $count): ObjectArray
{
return new ObjectArray(array_slice($this->Container, 0, $count));
}
/**
* Совмещает в себе две функции, которые одновременно применяет к массиву: Skip ($startFrom) и Take ($count).
* Возвращает новый массив.
*
* ВНИМАНИЕ: рекомендуется использовать ТОЛЬКО на отсортированных массивах.
*
* @param int $startFrom Начальный индекс массива, с которого нужно получить.
* @param int $count Количество элементов, которые необходимо получить.
*
* @return ObjectArray Возвращает новый массив, состоящий из $count элементов старого массива, начиная с индекса
* $startFrom.
*/
public function SkipAndTake (int $startFrom, int $count): ObjectArray
{
return new ObjectArray(array_slice($this->Container, $startFrom, $count));
}
}

View File

@ -0,0 +1,81 @@
<?php
namespace goodboyalex\php_components_pack\traits\ObjectArray;
use goodboyalex\php_components_pack\classes\ObjectArray;
/**
* Часть кода класса ObjectArray, отвечающая за специальные функции.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.0
*/
trait ObjectArraySpecialTrait
{
/**
* Очищает массив объектов, хранящийся в данном классе.
*
* @return void
*/
public function Clear (): void
{
// Очищаем массив
unset($this->Container);
// Создаем новый массив
$this->Container = [];
}
/**
* Добавляет объект в массив объектов, хранящийся в данном классе (аналогично добавлению элемента в массив с
* помощью []).
*
* @param mixed $object Объект, который будет добавлен в массив объектов, хранящийся в данном классе.
*
* @return void
*/
public function Add (mixed $object): void
{
$this->Container[] = $object;
}
/**
* Добавляет массив объектов (или объекты, заданные с помощью array) в массив объектов, хранящийся в данном классе.
*
* @param ObjectArray|array $objects Массив объектов, которые будут добавлены в массив объектов.
*
* @return void
*/
public function AddRange (ObjectArray|array $objects): void
{
// Если передан массив, то не изменяем его, а если передан объект класса ObjectArray, то конвертируем его в массив объектов
$objectsToAdd = is_array($objects) ? $objects : $objects->ToArray();
// Добавляем массив объектов
$this->Merge($objectsToAdd);
}
/**
* Возвращает массив объектов, хранящихся в данном классе.
*
* @return array Массив объектов, хранящихся в данном классе.
*/
public function ToArray (): array
{
return $this->Container;
}
/**
* Объединяет массив объектов, хранящийся в данном классе, с массивом объектов, переданным в качестве параметра.
*
* @param array $objects Массив объектов, который будет объединен с массивом объектов, хранящимся в данном классе.
*
* @return void
*/
public function Merge (array $objects): void
{
$this->Container = array_merge($this->Container, $objects);
}
}

View File

@ -3,6 +3,8 @@
namespace goodboyalex\php_components_pack\tests\classes;
use goodboyalex\php_components_pack\classes\ClassMapper;
use goodboyalex\php_components_pack\tests\data\A;
use goodboyalex\php_components_pack\tests\data\B;
use PHPUnit\Framework\TestCase;
class ClassMapperTest extends TestCase
@ -11,12 +13,10 @@ class ClassMapperTest extends TestCase
{
$this->PrepareForTest();
$a = new \goodboyalex\php_components_pack\tests\data\A();
$a->a = 'a';
$a->b = 2;
$a->c = true;
$a = new A('a', 2, true);
$b = new B();
ClassMapper::MapClass($a, $b);
$this->assertEquals('a', $b->a);

View File

@ -0,0 +1,87 @@
<?php
namespace goodboyalex\php_components_pack\tests\classes;
use goodboyalex\php_components_pack\classes\FileHash;
use goodboyalex\php_components_pack\enums\HashGetType;
use PHPUnit\Framework\TestCase;
class FileHashTest extends TestCase
{
public function test__construct ()
{
$this->PrepareForTest();
$fileHash = new FileHash("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
$this->assertEquals("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", $fileHash->Hash);
$fileHash = new FileHash("Тестовое слово", HashGetType::ByString);
$this->assertEquals("000e22f7ba01ae35f781bc3069038110c46593306cafef6b489f7c83b34629b7", $fileHash->Hash);
$fileHash = new FileHash(__DIR__ . '/../data/A.php', HashGetType::ByFile);
$this->assertEquals("fc8dad93af5de5dd7c7d64e04faadfa22557e577a1538737fe462a5f78699fa2", $fileHash->Hash);
$fileHash = new FileHash(__DIR__ . '/../data/B.php', HashGetType::ByFile);
$this->assertEquals("f419262e46e9461517af46d0c1e4faf25f38990bb50351b691d84f1ad51f2299", $fileHash->Hash);
}
private function PrepareForTest (): void
{
require_once __DIR__ . '/../../sources/traits/EnumExtensionsTrait.php';
require_once __DIR__ . '/../../sources/enums/HashGetType.php';
require_once __DIR__ . '/../../sources/extensions/StringExtension.php';
require_once __DIR__ . '/../../sources/interfaces/ISerializable.php';
require_once __DIR__ . '/../../sources/classes/FileHash.php';
}
public function testIsEqual ()
{
$this->PrepareForTest();
$fileHash = new FileHash("Тестовое слово", HashGetType::ByString);
$this->assertTrue($fileHash->IsEqual(new FileHash("Тестовое слово", HashGetType::ByString)));
$this->assertFalse($fileHash->IsEqual(new FileHash("Тестовое слово2", HashGetType::ByString)));
}
public function testSerialize ()
{
$this->PrepareForTest();
$fileHash = new FileHash("Тестовое слово", HashGetType::ByString);
$serialized = $fileHash->Serialize();
$this->assertEquals("s:64:\"000e22f7ba01ae35f781bc3069038110c46593306cafef6b489f7c83b34629b7\";", $serialized);
}
public function testUnSerialize ()
{
$this->PrepareForTest();
$fileHash = new FileHash();
$serialized = "s:64:\"000e22f7ba01ae35f781bc3069038110c46593306cafef6b489f7c83b34629b7\";";
$fileHash->UnSerialize($serialized);
$this->assertEquals("000e22f7ba01ae35f781bc3069038110c46593306cafef6b489f7c83b34629b7", $fileHash->Hash);
}
public function testValidate ()
{
$this->PrepareForTest();
$fileHash = new FileHash("Тестовое слово", HashGetType::ByString);
$this->assertTrue($fileHash->Validate("Тестовое слово", HashGetType::ByString));
$this->assertTrue($fileHash->Validate("000e22f7ba01ae35f781bc3069038110c46593306cafef6b489f7c83b34629b7",
HashGetType::ByHash));
$this->assertFalse($fileHash->Validate("000e22f7ba01ae35f781bc3069038110c46593306cafef6b489f7c83b34629b7",
HashGetType::ByString));
$fileHash = new FileHash(__DIR__ . '/../data/A.php', HashGetType::ByFile);
$this->assertTrue($fileHash->Validate(__DIR__ . '/../data/A.php', HashGetType::ByFile));
}
}

View File

@ -43,6 +43,7 @@ class ObjectArrayTest extends TestCase
require_once __DIR__ . '/../../sources/traits/ObjectArray/ObjectArrayConstantsTrait.php';
require_once __DIR__ . '/../../sources/traits/ObjectArray/ObjectArrayLINQTrait.php';
require_once __DIR__ . '/../../sources/traits/ObjectArray/ObjectArraySearchAndSortTrait.php';
require_once __DIR__ . '/../../sources/traits/ObjectArray/ObjectArraySpecialTrait.php';
require_once __DIR__ . '/../../sources/classes/ObjectArray.php';
}
@ -352,4 +353,131 @@ class ObjectArrayTest extends TestCase
$this->assertEquals('b', $sr->a);
$this->assertTrue($sr->c);
}
public function testSkip ()
{
$this->PrepareForTest();
$array = [
new A("a", 3, true),
new A("c", 2, false),
new A("b", 1, true),
new A("d", 5, true),
new A("e", 4, true),
new A("f", 6, false)
];
$a_Array = new ObjectArray($array);
// Для начала отсортируем по b
$a_Array->Sort("b");
$b_Array = $a_Array->Skip(2);
$this->assertNotNull($b_Array);
$this->assertEquals(4, $b_Array->Count());
$this->assertEquals(3, $b_Array->First()->b);
$this->assertEquals(6, $b_Array->Last()->b);
}
public function testTake ()
{
$this->PrepareForTest();
$array = [
new A("a", 3, true),
new A("c", 2, false),
new A("b", 1, true),
new A("d", 5, true),
new A("e", 4, true),
new A("f", 6, false)
];
$a_Array = new ObjectArray($array);
// Для начала отсортируем по b
$a_Array->Sort("b");
$b_Array = $a_Array->Take(3);
$this->assertNotNull($b_Array);
$this->assertEquals(3, $b_Array->Count());
$this->assertEquals(1, $b_Array->First()->b);
$this->assertEquals(3, $b_Array->Last()->b);
}
public function testSkipAndTake ()
{
$this->PrepareForTest();
$array = [
new A("a", 3, true),
new A("c", 2, false),
new A("b", 1, true),
new A("d", 5, true),
new A("e", 4, true),
new A("f", 6, false)
];
$a_Array = new ObjectArray($array);
// Для начала отсортируем по b
$a_Array->Sort("b");
$b_Array = $a_Array->SkipAndTake(2, 3);
$this->assertNotNull($b_Array);
$this->assertEquals(3, $b_Array->Count());
$this->assertEquals(3, $b_Array->First()->b);
$this->assertEquals(5, $b_Array->Last()->b);
}
public function testAdd ()
{
$this->PrepareForTest();
$obj = new A("a", 3, true);
$a_Array = new ObjectArray([]);
$a_Array->Add($obj);
$b_Array = $a_Array->GetRow(fn (A $a) => $a->a == "a");
$this->assertEquals(3, $b_Array->b);
}
public function testAddRange ()
{
$this->PrepareForTest();
$array = [
new A("a", 3, true),
new A("c", 2, false),
new A("b", 1, true),
new A("d", 5, true),
new A("e", 4, true),
new A("f", 6, false)
];
$a_Array = new ObjectArray();
$a_Array->AddRange($array);
$this->assertEquals(6, $a_Array->Count());
$array2 = [
new A("g", 3, true),
new A("h", 2, false),
new A("i", 1, true),
new A("k", 5, true),
new A("l", 4, true),
new A("m", 6, false)
];
$objectArray = new ObjectArray($array2);
$a_Array->AddRange($objectArray);
$this->assertEquals(12, $a_Array->Count());
}
}

View File

@ -0,0 +1,66 @@
<?php
namespace goodboyalex\php_components_pack\tests\classes;
use Exception;
use goodboyalex\php_components_pack\classes\TwoDimSize;
use PHPUnit\Framework\TestCase;
class TwoDimSizeTest extends TestCase
{
public function testParse ()
{
$this->PrepareForTest();
try {
$size = TwoDimSize::Parse("10x20", "x");
}
catch (Exception $e) {
$this->fail($e->getMessage());
}
$this->assertEquals(10, $size->Width);
$this->assertEquals(20, $size->Height);
}
private function PrepareForTest (): void
{
require_once __DIR__ . '/../../sources/interfaces/ISerializable.php';
require_once __DIR__ . '/../../sources/classes/TwoDimSize.php';
}
public function test__toString ()
{
$this->PrepareForTest();
$size = new TwoDimSize(10, 20);
$this->assertEquals("10:20", $size->__toString());
}
public function testSerialize ()
{
$this->PrepareForTest();
$size = new TwoDimSize(10, 20);
$this->assertEquals("10x20x1", $size->Serialize());
}
public function testUnSerialize ()
{
$this->PrepareForTest();
$serialized = "10x20x1";
$size = new TwoDimSize();
$size->UnSerialize($serialized);
$this->assertEquals(10, $size->Width);
$this->assertEquals(20, $size->Height);
$this->assertTrue($size->NoNegativeValues);
}
}

View File

@ -1,10 +1,17 @@
<?php
namespace goodboyalex\php_components_pack\tests\classes;
namespace goodboyalex\php_components_pack\tests\data;
class B
{
public string $a;
public int $b;
public string $d;
public function __construct (string $a = "", int $b = 0, string $d = "")
{
$this->a = $a;
$this->b = $b;
$this->d = $d;
}
}

View File

@ -0,0 +1,68 @@
<?php
namespace goodboyalex\php_components_pack\tests\extensions;
use Exception;
use goodboyalex\php_components_pack\extensions\BoolExtensions;
use PHPUnit\Framework\TestCase;
class BoolExtensionsTest extends TestCase
{
public function testAnyTrue ()
{
$this->PrepareForTest();
$hasTrue = [
true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false,
true, false, true, false, true, false, true, false, true, false, true, false
];
$noTrue = [
false, false, false, false, false, false, false, false, false, false, false, false, false, false, false,
false, false, false, false, false, false, false, false, false, false, false
];
$this->assertTrue(BoolExtensions::AnyTrue($hasTrue));
$this->assertFalse(BoolExtensions::AnyTrue($noTrue));
}
private function PrepareForTest (): void
{
require_once __DIR__ . '/../../sources/extensions/BoolExtensions.php';
}
public function testTrueCount ()
{
$this->PrepareForTest();
$array = [
true, false, true, false, true, false, true, false, true, false, true, false,
true, false, true, false, true, false, true, false, true, false, true, false, true, false, true,
false
];
$this->assertEquals(14,
BoolExtensions::TrueCount($array));
$this->expectException(Exception::class);
$array[] = "ПРЕДАТЕЛЬ!";
BoolExtensions::TrueCount($array);
}
public function testExportToString ()
{
$this->PrepareForTest();
$b = true;
$this->assertEquals('О, да!', BoolExtensions::ExportToString($b, 'О, да!', 'О, нет!'));
$b = false;
$this->assertEquals('О, нет!', BoolExtensions::ExportToString($b, 'О, да!', 'О, нет!'));
}
}

View File

@ -63,4 +63,20 @@ class StringExtensionTest extends TestCase
$this->assertEquals('', StringExtension::GetShortText('test', 0));
}
}
public function testReplace ()
{
$this->PrepareForTest();
$this->assertEquals('Все 2 ночи и 2 дня 2 друга искали тебя!',
StringExtension::Replace("4", "2", "Все 4 ночи и 4 дня 2 друга искали тебя!"));
}
public function testReplaceAll ()
{
$this->PrepareForTest();
$this->assertEquals('Все 5 ночи и 5 дня 2 друга искали тебя!',
StringExtension::ReplaceAll(["4" => "5", "3" => "2"], "Все 4 ночи и 4 дня 3 друга искали тебя!"));
}
}