Compare commits
25 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8c7e2782ae | |||
| 7bc7674021 | |||
| 3f02bee643 | |||
| e3306a096f | |||
| d66fce374c | |||
| 7e01886ad8 | |||
| e1109e925b | |||
| 6c67ab6259 | |||
| c467ed326c | |||
| 40cd64f667 | |||
| 05dae1031a | |||
| 82ba2a189a | |||
| a8755c8c0f | |||
| 85f7e114b0 | |||
| 6b1261b157 | |||
| b695c3ffdc | |||
| 90d76bbd6c | |||
| 188f0b57d0 | |||
| b84fb5cef5 | |||
| 9a28c86991 | |||
| 38b2ffe82a | |||
| 6e547abccb | |||
| 676af5e1a4 | |||
| 118aacee28 | |||
| 564e23ecd7 |
+4
-5
@@ -1,10 +1,9 @@
|
|||||||
.libs
|
.libs
|
||||||
node_modules/
|
node_modules/
|
||||||
composer.lock
|
**/composer.lock
|
||||||
vendor/
|
**/vendor/
|
||||||
tools/
|
tools/
|
||||||
www/composer.lock
|
**/configs/.env
|
||||||
www/vendor
|
|
||||||
**/.env
|
|
||||||
**/.target
|
**/.target
|
||||||
package-lock.json
|
package-lock.json
|
||||||
|
build/
|
||||||
|
|||||||
+4
-4
@@ -1,12 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<phive xmlns="https://phar.io/phive">
|
<phive xmlns="https://phar.io/phive">
|
||||||
<phar name="phpunit" version="~9.6" installed="9.6.31" location="./tools/phpunit" copy="false"/>
|
<phar name="phpunit" version="~9.6" installed="9.6.34" location="./tools/phpunit" copy="false"/>
|
||||||
<phar name="phpcbf" version="4" installed="4.0.1" location="./tools/phpcbf" copy="false"/>
|
<phar name="phpcbf" version="4" installed="4.0.1" location="./tools/phpcbf" copy="false"/>
|
||||||
<phar name="phpcs" version="4" installed="4.0.1" location="./tools/phpcs" copy="false"/>
|
<phar name="phpcs" version="4" installed="4.0.1" location="./tools/phpcs" copy="false"/>
|
||||||
<phar name="phpstan" version="^2.0" installed="2.1.33" location="./tools/phpstan" copy="false"/>
|
<phar name="phpstan" version="^2.0" installed="2.2.2" location="./tools/phpstan" copy="false"/>
|
||||||
<phar name="phan" version="^5.4.3" installed="5.5.2" location="./tools/phan" copy="false"/>
|
<phar name="phan" version="^5.4.3" installed="5.5.2" location="./tools/phan" copy="false"/>
|
||||||
<phar name="psalm" version="^5.26.1" installed="5.26.1" location="./tools/psalm" copy="false"/>
|
<phar name="psalm" version="^5.26.1" installed="5.26.1" location="./tools/psalm" copy="false"/>
|
||||||
<phar name="phpdox" version="^0.12.0" installed="0.12.0" location="./tools/phpdox" copy="false"/>
|
<phar name="phpdox" version="^0.12.0" installed="0.12.0" location="./tools/phpdox" copy="false"/>
|
||||||
<phar name="phpdocumentor" version="^3.4.2" installed="3.9.1" location="./tools/phpDocumentor" copy="false"/>
|
<phar name="phpdocumentor" version="^3.4.2" installed="3.10.0" location="./tools/phpDocumentor" copy="false"/>
|
||||||
<phar name="php-cs-fixer" version="^3.34.1" installed="3.92.4" location="./tools/php-cs-fixer" copy="false"/>
|
<phar name="php-cs-fixer" version="^3.34.1" installed="3.95.10" location="./tools/php-cs-fixer" copy="false"/>
|
||||||
</phive>
|
</phive>
|
||||||
|
|||||||
@@ -62,9 +62,9 @@ fi;
|
|||||||
php_bin="${PHP_BIN_PATH}${php_version}";
|
php_bin="${PHP_BIN_PATH}${php_version}";
|
||||||
echo "Use PHP Version: ${php_version}";
|
echo "Use PHP Version: ${php_version}";
|
||||||
if [ "${use_composer}" -eq 1 ]; then
|
if [ "${use_composer}" -eq 1 ]; then
|
||||||
echo "Use composer installed phan";
|
echo "Use composer installed";
|
||||||
else
|
else
|
||||||
echo "Use phan installed via phives";
|
echo "Use phive installed";
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
if [ ! -f "${php_bin}" ]; then
|
if [ ! -f "${php_bin}" ]; then
|
||||||
|
|||||||
@@ -62,9 +62,9 @@ fi;
|
|||||||
php_bin="${PHP_BIN_PATH}${php_version}";
|
php_bin="${PHP_BIN_PATH}${php_version}";
|
||||||
echo "Use PHP Version: ${php_version}";
|
echo "Use PHP Version: ${php_version}";
|
||||||
if [ "${use_composer}" -eq 1 ]; then
|
if [ "${use_composer}" -eq 1 ]; then
|
||||||
echo "Use composer installed phan";
|
echo "Use composer installed";
|
||||||
else
|
else
|
||||||
echo "Use phan installed via phives";
|
echo "Use phive installed";
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
if [ ! -f "${php_bin}" ]; then
|
if [ ! -f "${php_bin}" ]; then
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ Available options:
|
|||||||
-v, --verbose Enable verbose output for PHPunit
|
-v, --verbose Enable verbose output for PHPunit
|
||||||
-c, --composer Use composer version and not the default phives bundle
|
-c, --composer Use composer version and not the default phives bundle
|
||||||
-p, --php VERSION Chose PHP version in the form of "N.N", if not found will exit
|
-p, --php VERSION Chose PHP version in the form of "N.N", if not found will exit
|
||||||
|
-C, --coverage Generate code coverage report in text format (default: disabled)
|
||||||
EOF
|
EOF
|
||||||
exit
|
exit
|
||||||
}
|
}
|
||||||
@@ -47,6 +48,8 @@ opt_verbose="";
|
|||||||
php_version="";
|
php_version="";
|
||||||
no_php_version=0;
|
no_php_version=0;
|
||||||
use_composer=0;
|
use_composer=0;
|
||||||
|
opt_generate_coverage="";
|
||||||
|
opt_generate_coverage_html="";
|
||||||
while [ -n "${1-}" ]; do
|
while [ -n "${1-}" ]; do
|
||||||
case "${1}" in
|
case "${1}" in
|
||||||
-t | --testdox)
|
-t | --testdox)
|
||||||
@@ -59,6 +62,14 @@ while [ -n "${1-}" ]; do
|
|||||||
use_composer=1;
|
use_composer=1;
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
-C | --coverage)
|
||||||
|
opt_generate_coverage="--coverage-text";
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--coverage-report)
|
||||||
|
opt_generate_coverage_html="--coverage-html build/coverage-report";
|
||||||
|
shift
|
||||||
|
;;
|
||||||
-p | --php)
|
-p | --php)
|
||||||
php_version="${2-}";
|
php_version="${2-}";
|
||||||
shift
|
shift
|
||||||
@@ -81,9 +92,9 @@ fi;
|
|||||||
php_bin="${PHP_BIN_PATH}${php_version}";
|
php_bin="${PHP_BIN_PATH}${php_version}";
|
||||||
echo "Use PHP Version: ${php_version}";
|
echo "Use PHP Version: ${php_version}";
|
||||||
if [ "${use_composer}" -eq 1 ]; then
|
if [ "${use_composer}" -eq 1 ]; then
|
||||||
echo "Use composer installed phan";
|
echo "Use composer installed";
|
||||||
else
|
else
|
||||||
echo "Use phan installed via phives";
|
echo "Use phive installed";
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
if [ ! -f "${php_bin}" ]; then
|
if [ ! -f "${php_bin}" ]; then
|
||||||
@@ -100,9 +111,15 @@ if [ "${use_composer}" -eq 1 ]; then
|
|||||||
else
|
else
|
||||||
PHPUNIT_CALL+=("${BASE_PATH}tools/phpunit");
|
PHPUNIT_CALL+=("${BASE_PATH}tools/phpunit");
|
||||||
fi;
|
fi;
|
||||||
|
if [ -n "${opt_generate_coverage}" ]; then
|
||||||
|
echo "Will run coverage report";
|
||||||
|
export XDEBUG_MODE=coverage
|
||||||
|
fi;
|
||||||
PHPUNIT_CALL+=(
|
PHPUNIT_CALL+=(
|
||||||
"${opt_testdox}"
|
"${opt_testdox}"
|
||||||
"${opt_verbose}"
|
"${opt_verbose}"
|
||||||
|
"${opt_generate_coverage}"
|
||||||
|
"${opt_generate_coverage_html}"
|
||||||
"-c" "${PHPUNIT_CONFIG}"
|
"-c" "${PHPUNIT_CONFIG}"
|
||||||
"${BASE_PATH}4dev/tests/"
|
"${BASE_PATH}4dev/tests/"
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -8,11 +8,11 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: en.UTF-8 LC_MESSAGES admin\n"
|
"Project-Id-Version: en.UTF-8 LC_MESSAGES admin\n"
|
||||||
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
"Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
|
||||||
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: clemens.schwaighofer@egplusww.co\n"
|
"Last-Translator: clemens.schwaighofer@omc.com\n"
|
||||||
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
"Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
|
||||||
"Language: en\n"
|
"Language: en\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
|||||||
@@ -8,11 +8,11 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: en.UTF-8 LC_MESSAGES frontend\n"
|
"Project-Id-Version: en.UTF-8 LC_MESSAGES frontend\n"
|
||||||
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
"Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
|
||||||
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: clemens.schwaighofer@egplusww.co\n"
|
"Last-Translator: clemens.schwaighofer@omc.com\n"
|
||||||
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
"Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
|
||||||
"Language: en\n"
|
"Language: en\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
|||||||
@@ -8,11 +8,11 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: ja.UTF-8 LC_MESSAGES admin\n"
|
"Project-Id-Version: ja.UTF-8 LC_MESSAGES admin\n"
|
||||||
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
"Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
|
||||||
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: clemens.schwaighofer@egplusww.com\n"
|
"Last-Translator: clemens.schwaighofer@omc.com\n"
|
||||||
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
"Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
|
||||||
"Language: ja\n"
|
"Language: ja\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
|||||||
@@ -8,11 +8,11 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: ja.UTF-8 LC_MESSAGES frontend\n"
|
"Project-Id-Version: ja.UTF-8 LC_MESSAGES frontend\n"
|
||||||
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
"Report-Msgid-Bugs-To: webmaster+corelibs-translation@ocex.jp\n"
|
||||||
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: clemens.schwaighofer@egplusww.com\n"
|
"Last-Translator: clemens.schwaighofer@omc.com\n"
|
||||||
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
"Language-Team: Omnicom Content Experiences Japan <webmaster@ocex.jp>\n"
|
||||||
"Language: ja\n"
|
"Language: ja\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ use PHPUnit\Framework\TestCase;
|
|||||||
*/
|
*/
|
||||||
final class CoreLibsAAASetupDataTest extends TestCase
|
final class CoreLibsAAASetupDataTest extends TestCase
|
||||||
{
|
{
|
||||||
|
public const TIME_ZONE = 'Asia/Tokyo';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Covers nothing
|
* Covers nothing
|
||||||
*
|
*
|
||||||
@@ -34,6 +36,9 @@ final class CoreLibsAAASetupDataTest extends TestCase
|
|||||||
BASE,
|
BASE,
|
||||||
'BASE Path set check'
|
'BASE Path set check'
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// if time zone is not set, errors can happen
|
||||||
|
ini_set('date.timezone', self::TIME_ZONE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -80,21 +80,27 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
'log_file_id' => 'CoreLibs-ACL-Login-Test',
|
'log_file_id' => 'CoreLibs-ACL-Login-Test',
|
||||||
]);
|
]);
|
||||||
// test database we need to connect do, if not possible this test is skipped
|
// test database we need to connect do, if not possible this test is skipped
|
||||||
self::$db = new \CoreLibs\DB\IO(
|
try {
|
||||||
[
|
self::$db = new \CoreLibs\DB\IO(
|
||||||
'db_name' => $db_name,
|
[
|
||||||
'db_user' => $db_user,
|
'db_name' => $db_name,
|
||||||
'db_pass' => $db_password,
|
'db_user' => $db_user,
|
||||||
'db_host' => $db_host,
|
'db_pass' => $db_password,
|
||||||
'db_port' => 5432,
|
'db_host' => $db_host,
|
||||||
'db_schema' => 'public',
|
'db_port' => 5432,
|
||||||
'db_type' => 'pgsql',
|
'db_schema' => 'public',
|
||||||
'db_encoding' => '',
|
'db_type' => 'pgsql',
|
||||||
'db_ssl' => 'allow', // allow, disable, require, prefer
|
'db_encoding' => '',
|
||||||
'db_debug' => true,
|
'db_ssl' => 'allow', // allow, disable, require, prefer
|
||||||
],
|
'db_debug' => true,
|
||||||
self::$log
|
],
|
||||||
);
|
self::$log
|
||||||
|
);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
self::markTestSkipped(
|
||||||
|
'Cannot connect to Test DB for ACL\Login test: ' . $e->getMessage()
|
||||||
|
);
|
||||||
|
}
|
||||||
// ALWAYS drop DB and RECREATE DB
|
// ALWAYS drop DB and RECREATE DB
|
||||||
// dropdb -U corelibs_acl_login_test -h localhost corelibs_acl_login_test
|
// dropdb -U corelibs_acl_login_test -h localhost corelibs_acl_login_test
|
||||||
// createdb -U corelibs_acl_login_test -O corelibs_acl_login_test -E utf8 corelibs_acl_login_test;
|
// createdb -U corelibs_acl_login_test -O corelibs_acl_login_test -E utf8 corelibs_acl_login_test;
|
||||||
|
|||||||
@@ -15,6 +15,12 @@ if [ ! -f "${load_sql}" ]; then
|
|||||||
echo 1;
|
echo 1;
|
||||||
exit 1;
|
exit 1;
|
||||||
fi;
|
fi;
|
||||||
|
# if we have no dropdb, createdb, psql, exit with 6
|
||||||
|
if ! command -v dropdb &> /dev/null || ! command -v createdb &> /dev/null || ! command -v psql &> /dev/null; then
|
||||||
|
echo 6;
|
||||||
|
exit 6;
|
||||||
|
fi;
|
||||||
|
|
||||||
db_user="${2}";
|
db_user="${2}";
|
||||||
db_name="${3}";
|
db_name="${3}";
|
||||||
db_host="${4}";
|
db_host="${4}";
|
||||||
@@ -24,25 +30,25 @@ if [ -z "${db_user}" ] || [ -z "${db_name}" ] || [ -z "${db_host}" ]; then
|
|||||||
exit 2;
|
exit 2;
|
||||||
fi;
|
fi;
|
||||||
# drop database, on error exit with 3
|
# drop database, on error exit with 3
|
||||||
dropdb -U ${db_user} -h ${db_host} ${db_name} 2>&1;
|
dropdb -U "${db_user}" -h "${db_host}" "${db_name}" 2>&1;
|
||||||
if [ $? -ne 0 ]; then
|
if [ ! $? ]; then
|
||||||
echo 3;
|
echo 3;
|
||||||
exit 3;
|
exit 3;
|
||||||
fi;
|
fi;
|
||||||
# create database, on error exit with 4
|
# create database, on error exit with 4
|
||||||
createdb -U ${db_user} -O ${db_user} -h ${db_host} -E utf8 ${db_name} 2>&1;
|
createdb -U "${db_user}" -O "${db_user}" -h "${db_host}" -E utf8 "${db_name}" 2>&1;
|
||||||
if [ $? -ne 0 ]; then
|
if [ ! $? ]; then
|
||||||
echo 4;
|
echo 4;
|
||||||
exit 4;
|
exit 4;
|
||||||
fi;
|
fi;
|
||||||
# if error 5 thrown, test with enabled below
|
# if error 5 thrown, test with enabled below
|
||||||
if [ ! -z "${5}" ]; then
|
if [ -n "${5}" ]; then
|
||||||
psql -U ${db_user} -h ${db_host} -f ${load_sql} ${db_name};
|
psql -U "${db_user}" -h "${db_host}" -f "${load_sql}" "${db_name}";
|
||||||
else
|
else
|
||||||
# load data (redirect ALL error to null), on error exit with 5
|
# load data (redirect ALL error to null), on error exit with 5
|
||||||
psql -U ${db_user} -h ${db_host} -f ${load_sql} ${db_name} 2>&1 1>/dev/null 2>/dev/null;
|
psql -U "${db_user}" -h "${db_host}" -f "${load_sql}" "${db_name}" 2>&1 1>/dev/null 2>/dev/null;
|
||||||
fi;
|
fi;
|
||||||
if [ $? -ne 0 ]; then
|
if [ ! $? ]; then
|
||||||
echo 5;
|
echo 5;
|
||||||
exit 5;
|
exit 5;
|
||||||
fi;
|
fi;
|
||||||
|
|||||||
@@ -1266,7 +1266,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @covers ::arrayGetPrevKey, ::arrayGetNextKey
|
* @covers ::arrayGetPrevKey
|
||||||
|
* @covers ::arrayGetNextKey
|
||||||
* @dataProvider providerArrayGetNextPrevKey
|
* @dataProvider providerArrayGetNextPrevKey
|
||||||
* @testdox arrayGetNextPrevKey get next/prev key for $search wtih $expected_prev/$expected_next [$_dataName]
|
* @testdox arrayGetNextPrevKey get next/prev key for $search wtih $expected_prev/$expected_next [$_dataName]
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<?php
|
<?php // phpcs:disable Generic.Files.LineLength
|
||||||
|
|
||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
@@ -71,15 +71,16 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
*
|
*
|
||||||
* @covers ::dateStringFormat
|
* @covers ::dateStringFormat
|
||||||
* @dataProvider timestampProvider
|
* @dataProvider timestampProvider
|
||||||
* @testdox dateStringFormat $input (microtime $flag) will be $expected [$_dataName]
|
* @testdox dateStringFormat $input (mt $flag_show_micro, float mt $flag_micro_as_float) will be $expected [$_dataName]
|
||||||
*
|
*
|
||||||
* @param int|float $input
|
* @param int|float $input
|
||||||
* @param bool $flag
|
* @param bool $flag_show_micro
|
||||||
|
* @param bool $flag_micro_as_float
|
||||||
* @param string $expected
|
* @param string $expected
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testDateStringFormat(
|
public function testDateStringFormat(
|
||||||
$input,
|
int|float $input,
|
||||||
bool $flag_show_micro,
|
bool $flag_show_micro,
|
||||||
bool $flag_micro_as_float,
|
bool $flag_micro_as_float,
|
||||||
string $expected
|
string $expected
|
||||||
@@ -490,11 +491,11 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
],
|
],
|
||||||
'micro interval with microtime' => [
|
'micro interval with microtime' => [
|
||||||
'18999d 0h 38m 10s 1235ms',
|
'18999d 0h 38m 10s 1235ms',
|
||||||
1641515890.1235,
|
1641515891.235,
|
||||||
],
|
],
|
||||||
'micro interval with microtime' => [
|
'micro interval with microtime' => [
|
||||||
'18999d 0h 38m 10s 1234567890ms',
|
'18999d 0h 38m 10s 1234567890ms',
|
||||||
1641515890.1234567,
|
1642750457.89,
|
||||||
],
|
],
|
||||||
'negative interval no microtime' => [
|
'negative interval no microtime' => [
|
||||||
'-18999d 0h 38m 10s',
|
'-18999d 0h 38m 10s',
|
||||||
@@ -503,23 +504,246 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
// short for mini tests
|
// short for mini tests
|
||||||
'microtime only' => [
|
'microtime only' => [
|
||||||
'0s 1235ms',
|
'0s 1235ms',
|
||||||
0.1235,
|
1.235,
|
||||||
],
|
],
|
||||||
'seconds only' => [
|
'seconds only' => [
|
||||||
'30s 1235ms',
|
'30s 1235ms',
|
||||||
30.1235,
|
31.235,
|
||||||
],
|
],
|
||||||
'minutes only' => [
|
'minutes only' => [
|
||||||
'1m 30s 1235ms',
|
'1m 30s 1235ms',
|
||||||
90.1235,
|
91.235,
|
||||||
],
|
],
|
||||||
'hours only' => [
|
'hours only' => [
|
||||||
'1h 1m 30s 1235ms',
|
'1h 1m 30s 1235ms',
|
||||||
3690.1235,
|
3691.235,
|
||||||
],
|
],
|
||||||
'days only' => [
|
'days only' => [
|
||||||
'1d 1h 1m 30s 1235ms',
|
'1d 1h 1m 30s 1235ms',
|
||||||
90090.1235,
|
90091.235,
|
||||||
|
],
|
||||||
|
'days only with long name' => [
|
||||||
|
'1day 1hour 1min 30second 1235millisecond',
|
||||||
|
90091.235,
|
||||||
|
],
|
||||||
|
// Test day variations
|
||||||
|
'day singular' => [
|
||||||
|
'5day',
|
||||||
|
432000,
|
||||||
|
],
|
||||||
|
'days plural' => [
|
||||||
|
'3days',
|
||||||
|
259200,
|
||||||
|
],
|
||||||
|
'days with space' => [
|
||||||
|
'2days 5h',
|
||||||
|
190800,
|
||||||
|
],
|
||||||
|
'day without space' => [
|
||||||
|
'1day1h',
|
||||||
|
90000,
|
||||||
|
],
|
||||||
|
// Test hour variations
|
||||||
|
'hour singular' => [
|
||||||
|
'2hour',
|
||||||
|
7200,
|
||||||
|
],
|
||||||
|
'hours plural' => [
|
||||||
|
'4hours',
|
||||||
|
14400,
|
||||||
|
],
|
||||||
|
'hours with space' => [
|
||||||
|
'3hours 30m',
|
||||||
|
12600,
|
||||||
|
],
|
||||||
|
'hour without space' => [
|
||||||
|
'1hour30m',
|
||||||
|
5400,
|
||||||
|
],
|
||||||
|
// Test minute variations
|
||||||
|
'min short' => [
|
||||||
|
'45min',
|
||||||
|
2700,
|
||||||
|
],
|
||||||
|
'minute singular' => [
|
||||||
|
'1minute',
|
||||||
|
60,
|
||||||
|
],
|
||||||
|
'minutes plural' => [
|
||||||
|
'10minutes',
|
||||||
|
600,
|
||||||
|
],
|
||||||
|
'minutes with space' => [
|
||||||
|
'5minutes 20s',
|
||||||
|
320,
|
||||||
|
],
|
||||||
|
'min without space' => [
|
||||||
|
'2min30s',
|
||||||
|
150,
|
||||||
|
],
|
||||||
|
// Test second variations
|
||||||
|
'sec short' => [
|
||||||
|
'30sec',
|
||||||
|
30,
|
||||||
|
],
|
||||||
|
'second singular' => [
|
||||||
|
'1second',
|
||||||
|
1,
|
||||||
|
],
|
||||||
|
'seconds plural' => [
|
||||||
|
'45seconds',
|
||||||
|
45,
|
||||||
|
],
|
||||||
|
'seconds with space' => [
|
||||||
|
'15seconds 500ms',
|
||||||
|
15.5,
|
||||||
|
],
|
||||||
|
'sec without space' => [
|
||||||
|
'10sec250ms',
|
||||||
|
10.25,
|
||||||
|
],
|
||||||
|
// Test millisecond variations
|
||||||
|
'ms short' => [
|
||||||
|
'500ms',
|
||||||
|
0.5,
|
||||||
|
],
|
||||||
|
'millis short' => [
|
||||||
|
'250millis',
|
||||||
|
0.25,
|
||||||
|
],
|
||||||
|
'millisec medium singular' => [
|
||||||
|
'250millisec',
|
||||||
|
0.25,
|
||||||
|
],
|
||||||
|
'millisecs medium plural' => [
|
||||||
|
'250millisecs',
|
||||||
|
0.25,
|
||||||
|
],
|
||||||
|
'misec medium singular' => [
|
||||||
|
'250millisec',
|
||||||
|
0.25,
|
||||||
|
],
|
||||||
|
'msecs medium plural' => [
|
||||||
|
'250millisecs',
|
||||||
|
0.25,
|
||||||
|
],
|
||||||
|
'millisecond long singular' => [
|
||||||
|
'1millisecond',
|
||||||
|
0.001,
|
||||||
|
],
|
||||||
|
'milliseconds long plural' => [
|
||||||
|
'999milliseconds',
|
||||||
|
0.999,
|
||||||
|
],
|
||||||
|
// Test negative values
|
||||||
|
'negative days' => [
|
||||||
|
'-5d',
|
||||||
|
-432000,
|
||||||
|
],
|
||||||
|
'negative hours' => [
|
||||||
|
'-3h',
|
||||||
|
-10800,
|
||||||
|
],
|
||||||
|
'negative minutes' => [
|
||||||
|
'-45m',
|
||||||
|
-2700,
|
||||||
|
],
|
||||||
|
'negative seconds' => [
|
||||||
|
'-30s',
|
||||||
|
-30,
|
||||||
|
],
|
||||||
|
'negative milliseconds' => [
|
||||||
|
'-500ms',
|
||||||
|
-0.5,
|
||||||
|
],
|
||||||
|
'negative complex' => [
|
||||||
|
'-2days 3hours 15minutes 30seconds 250milliseconds',
|
||||||
|
-184530.25,
|
||||||
|
],
|
||||||
|
// Test combined formats
|
||||||
|
'all components short' => [
|
||||||
|
'1d 2h 3m 4s 5ms',
|
||||||
|
93784.005,
|
||||||
|
],
|
||||||
|
'all components long' => [
|
||||||
|
'2days 3hours 4minutes 5seconds 678milliseconds',
|
||||||
|
183845.678,
|
||||||
|
],
|
||||||
|
'mixed short and long' => [
|
||||||
|
'1day 2h 3minutes 4sec 100ms',
|
||||||
|
93784.1,
|
||||||
|
],
|
||||||
|
'no spaces between components' => [
|
||||||
|
'1d2h3m4s5ms',
|
||||||
|
93784.005,
|
||||||
|
],
|
||||||
|
'only days and milliseconds' => [
|
||||||
|
'5d 123ms',
|
||||||
|
432000.123,
|
||||||
|
],
|
||||||
|
'only hours and seconds' => [
|
||||||
|
'2h 45s',
|
||||||
|
7245,
|
||||||
|
],
|
||||||
|
'only minutes and milliseconds' => [
|
||||||
|
'30m 500ms',
|
||||||
|
1800.5,
|
||||||
|
],
|
||||||
|
// Test zero values
|
||||||
|
'zero seconds' => [
|
||||||
|
'0s',
|
||||||
|
0,
|
||||||
|
],
|
||||||
|
'zero with milliseconds' => [
|
||||||
|
'0s 123ms',
|
||||||
|
0.123,
|
||||||
|
],
|
||||||
|
// Test large values
|
||||||
|
'large days' => [
|
||||||
|
'365days',
|
||||||
|
31536000,
|
||||||
|
],
|
||||||
|
'large hours' => [
|
||||||
|
'48hours',
|
||||||
|
172800,
|
||||||
|
],
|
||||||
|
'large minutes' => [
|
||||||
|
'1440minutes',
|
||||||
|
86400,
|
||||||
|
],
|
||||||
|
'large seconds' => [
|
||||||
|
'86400seconds',
|
||||||
|
86400,
|
||||||
|
],
|
||||||
|
// Test edge cases with spaces
|
||||||
|
'extra spaces' => [
|
||||||
|
'1d 2h 3m 4s 5ms',
|
||||||
|
93784.005,
|
||||||
|
],
|
||||||
|
'mixed spaces and no spaces' => [
|
||||||
|
'1d 2h3m 4s5ms',
|
||||||
|
93784.005,
|
||||||
|
],
|
||||||
|
// Test single component each
|
||||||
|
'only days short' => [
|
||||||
|
'7d',
|
||||||
|
604800,
|
||||||
|
],
|
||||||
|
'only hours short' => [
|
||||||
|
'12h',
|
||||||
|
43200,
|
||||||
|
],
|
||||||
|
'only minutes short' => [
|
||||||
|
'90m',
|
||||||
|
5400,
|
||||||
|
],
|
||||||
|
'only seconds short' => [
|
||||||
|
'120s',
|
||||||
|
120,
|
||||||
|
],
|
||||||
|
'only milliseconds short' => [
|
||||||
|
'1500ms',
|
||||||
|
1.5,
|
||||||
],
|
],
|
||||||
'already set' => [
|
'already set' => [
|
||||||
1641515890,
|
1641515890,
|
||||||
@@ -529,10 +753,18 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
'xyz',
|
'xyz',
|
||||||
'xyz',
|
'xyz',
|
||||||
],
|
],
|
||||||
|
'empty data' => [
|
||||||
|
' ',
|
||||||
|
' ',
|
||||||
|
],
|
||||||
'out of bound data' => [
|
'out of bound data' => [
|
||||||
'99999999999999999999d',
|
'99999999999999999999d',
|
||||||
8.64E+24
|
8.64E+24
|
||||||
],
|
],
|
||||||
|
'spaces inbetween' => [
|
||||||
|
' - 9 d 2h 58minutes 35 seconds 123 ms ',
|
||||||
|
-788315.123,
|
||||||
|
]
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -555,6 +787,36 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::stringToTime
|
||||||
|
* @testdox stringToTime invalid input will throw exception if requested
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testStringToTimeException(): void
|
||||||
|
{
|
||||||
|
$this->expectException(\InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionMessageMatches("/^Invalid time string format, cannot parse: /");
|
||||||
|
\CoreLibs\Combined\DateTime::stringToTime('1x 2y 3z', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::stringToTime
|
||||||
|
* @testdox stringToTime empty input will throw exception if requested
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testStringToTimeExceptionEmpty(): void
|
||||||
|
{
|
||||||
|
$this->expectException(\InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionMessageMatches("/^Invalid time string format, no interval value found: /");
|
||||||
|
\CoreLibs\Combined\DateTime::stringToTime(' ', true);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ final class CoreLibsConvertColorTest extends TestCase
|
|||||||
* @covers ::rgbToHwb
|
* @covers ::rgbToHwb
|
||||||
* @covers ::hsbToRgb
|
* @covers ::hsbToRgb
|
||||||
* @covers ::hslToRgb
|
* @covers ::hslToRgb
|
||||||
* @covers ::hwebToRgb
|
* @covers ::hwbToRgb
|
||||||
* @testdox Convert from and to RGB via HSL, HWB, HSB/V
|
* @testdox Convert from and to RGB via HSL, HWB, HSB/V
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -298,7 +298,6 @@ final class CoreLibsConvertColorTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @covers ::returnAsHex()
|
|
||||||
* @testdox Convert from and to RGB via hex
|
* @testdox Convert from and to RGB via hex
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -342,8 +341,6 @@ final class CoreLibsConvertColorTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* linear RGB conversion tests
|
* linear RGB conversion tests
|
||||||
*
|
*
|
||||||
* @covers ::fromLinear
|
|
||||||
* @covers ::toLinear
|
|
||||||
* @testdox Convert from and to RGB linear conversion check
|
* @testdox Convert from and to RGB linear conversion check
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -933,7 +930,6 @@ final class CoreLibsConvertColorTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @covers ::__get
|
|
||||||
* @testdox Exception handling for RGB general calls
|
* @testdox Exception handling for RGB general calls
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -958,7 +954,6 @@ final class CoreLibsConvertColorTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @covers ::setFromHex
|
|
||||||
* @testdox Exception handling for RGB setFromHex failues
|
* @testdox Exception handling for RGB setFromHex failues
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -1086,7 +1081,6 @@ final class CoreLibsConvertColorTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @covers ::__get
|
|
||||||
* @testdox Exception handling for Lab general calls
|
* @testdox Exception handling for Lab general calls
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -1120,7 +1114,6 @@ final class CoreLibsConvertColorTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @covers ::__get
|
|
||||||
* @testdox Exception handling for LCH general calls
|
* @testdox Exception handling for LCH general calls
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -1155,7 +1148,6 @@ final class CoreLibsConvertColorTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @covers ::__get
|
|
||||||
* @testdox Exception handling for XYZ general calls
|
* @testdox Exception handling for XYZ general calls
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
|
|||||||
@@ -164,6 +164,51 @@ final class CoreLibsConvertJsonTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test with flags
|
||||||
|
*
|
||||||
|
* @covers ::jsonConvertToArray
|
||||||
|
* @testdox jsonConvertToArray flag test, if flag is used
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testJsonConvertToArrayWithFlags(): void
|
||||||
|
{
|
||||||
|
$input = '{"valid":"json","invalid":"\xB1\x31"}';
|
||||||
|
/* $expected_without_flag = [
|
||||||
|
'valid' => 'json'
|
||||||
|
];
|
||||||
|
$expected_with_flag = [
|
||||||
|
'valid' => 'json',
|
||||||
|
'invalid' => "\xB1\x31"
|
||||||
|
]; */
|
||||||
|
// no idea why in both it throws an erro
|
||||||
|
$expected_without_flag = [];
|
||||||
|
$expected_with_flag = [];
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_without_flag,
|
||||||
|
\CoreLibs\Convert\Json::jsonConvertToArray($input)
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_with_flag,
|
||||||
|
\CoreLibs\Convert\Json::jsonConvertToArray($input, flags:JSON_INVALID_UTF8_IGNORE)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testJsonConvertToArrayRemoveThrowFlag(): void
|
||||||
|
{
|
||||||
|
$input = '{"valid":"json","invalid":"\xB1\x31"}';
|
||||||
|
// show NOT throw an exception
|
||||||
|
try {
|
||||||
|
$this->assertEquals(
|
||||||
|
[],
|
||||||
|
\CoreLibs\Convert\Json::jsonConvertToArray($input, flags:JSON_THROW_ON_ERROR)
|
||||||
|
);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$this->fail('Exception was thrown despite flag removal');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* test json error states
|
* test json error states
|
||||||
*
|
*
|
||||||
@@ -189,6 +234,81 @@ final class CoreLibsConvertJsonTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test json error states
|
||||||
|
*
|
||||||
|
* @covers ::jsonValidate
|
||||||
|
* @dataProvider jsonErrorProvider
|
||||||
|
* @testdox jsonValidate $input will be $expected_i/$expected_s [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|null $input
|
||||||
|
* @param int $expected_i
|
||||||
|
* @param string $expected_s
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testJsonValidateGetLastError(?string $input, int $expected_i, string $expected_s): void
|
||||||
|
{
|
||||||
|
\CoreLibs\Convert\Json::jsonValidate($input);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_i,
|
||||||
|
\CoreLibs\Convert\Json::jsonGetLastError()
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_s,
|
||||||
|
\CoreLibs\Convert\Json::jsonGetLastError(true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test json validation
|
||||||
|
*
|
||||||
|
* @covers ::jsonValidate
|
||||||
|
* @testdox jsonValidate test valid and invalid json
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testJsonValidate(): void
|
||||||
|
{
|
||||||
|
$this->assertTrue(
|
||||||
|
\CoreLibs\Convert\Json::jsonValidate('{"valid": "json"}')
|
||||||
|
);
|
||||||
|
$this->assertFalse(
|
||||||
|
\CoreLibs\Convert\Json::jsonValidate('not valid json')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if invalid flag throws exception
|
||||||
|
*
|
||||||
|
* @covers ::jsonValidate
|
||||||
|
* @testdox jsonValidate test exception thrown on invalid flag
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testJsonValidateInvalidFlag(): void
|
||||||
|
{
|
||||||
|
$this->expectException("\InvalidArgumentException");
|
||||||
|
\CoreLibs\Convert\Json::jsonValidate('{"valid": "json"}', 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if valid flag throws no exception
|
||||||
|
*
|
||||||
|
* @covers ::jsonValidate
|
||||||
|
* @testdox jsonValidate test no exception on valid flag
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testJsonValidateValidflag(): void
|
||||||
|
{
|
||||||
|
$this->assertTrue(
|
||||||
|
\CoreLibs\Convert\Json::jsonValidate('{"valid": "json"}', 0)
|
||||||
|
);
|
||||||
|
$this->assertTrue(
|
||||||
|
\CoreLibs\Convert\Json::jsonValidate('{"valid": "json"}', JSON_INVALID_UTF8_IGNORE)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -671,7 +671,7 @@ final class CoreLibsConvertStringsTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @covers ::isValidRegexSimple
|
* @covers ::isValidRegex
|
||||||
* @dataProvider isValidRegexSimpleProvider
|
* @dataProvider isValidRegexSimpleProvider
|
||||||
* @testdox isValidRegexSimple make $input unqiue to $expected [$_dataName]
|
* @testdox isValidRegexSimple make $input unqiue to $expected [$_dataName]
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ final class CoreLibsCreateRandomKeyTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @covers ::randomKeyGeyn
|
* @covers ::randomKeyGen
|
||||||
* @dataProvider randomKeyGenProvider
|
* @dataProvider randomKeyGenProvider
|
||||||
* @testdox randomKeyGen use $input key length $expected [$_dataName]
|
* @testdox randomKeyGen use $input key length $expected [$_dataName]
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -78,7 +78,6 @@ final class CoreLibsCreateSessionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Test session start
|
* Test session start
|
||||||
*
|
*
|
||||||
* @covers ::startSession
|
|
||||||
* @dataProvider sessionProvider
|
* @dataProvider sessionProvider
|
||||||
* @testdox startSession $input name for $type will be $expected (error: $expected_error) [$_dataName]
|
* @testdox startSession $input name for $type will be $expected (error: $expected_error) [$_dataName]
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -121,7 +121,6 @@ final class CoreLibsCreateUidsTest extends TestCase
|
|||||||
* must match 7e78fe0d-59b8-4637-af7f-e88d221a7d1e
|
* must match 7e78fe0d-59b8-4637-af7f-e88d221a7d1e
|
||||||
*
|
*
|
||||||
* @covers ::uuidv4
|
* @covers ::uuidv4
|
||||||
* @covers ::validateUuidv4
|
|
||||||
* @testdox uuidv4 check that return is matching regex [$_dataName]
|
* @testdox uuidv4 check that return is matching regex [$_dataName]
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
|
|||||||
@@ -45,7 +45,6 @@ use CoreLibs\DB\Support\ConvertPlaceholder;
|
|||||||
* Test class for DB\IO + DB\SQL\PgSQL
|
* Test class for DB\IO + DB\SQL\PgSQL
|
||||||
* This will only test the PgSQL parts
|
* This will only test the PgSQL parts
|
||||||
* @coversDefaultClass \CoreLibs\DB\IO
|
* @coversDefaultClass \CoreLibs\DB\IO
|
||||||
* @coversDefaultClass \CoreLibs\DB\SQL\PgSQL
|
|
||||||
* @testdox \CoreLibs\DB\IO method tests for SQL\PgSQL
|
* @testdox \CoreLibs\DB\IO method tests for SQL\PgSQL
|
||||||
*/
|
*/
|
||||||
final class CoreLibsDBIOTest extends TestCase
|
final class CoreLibsDBIOTest extends TestCase
|
||||||
@@ -124,10 +123,16 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
'log_file_id' => 'CoreLibs-DB-IO-Test',
|
'log_file_id' => 'CoreLibs-DB-IO-Test',
|
||||||
]);
|
]);
|
||||||
// will be true, default logging is true
|
// will be true, default logging is true
|
||||||
$db = new \CoreLibs\DB\IO(
|
try {
|
||||||
self::$db_config['valid'],
|
$db = new \CoreLibs\DB\IO(
|
||||||
self::$log
|
self::$db_config['valid'],
|
||||||
);
|
self::$log
|
||||||
|
);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
self::markTestSkipped(
|
||||||
|
'Cannot connect to Test DB for DB\IO test: ' . $e->getMessage()
|
||||||
|
);
|
||||||
|
}
|
||||||
if (!$db->dbGetConnectionStatus()) {
|
if (!$db->dbGetConnectionStatus()) {
|
||||||
self::markTestSkipped(
|
self::markTestSkipped(
|
||||||
'Cannot connect to valid Test DB for DB\IO test.'
|
'Cannot connect to valid Test DB for DB\IO test.'
|
||||||
@@ -544,8 +549,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Test dbSetDbug, dbGetDebug
|
* Test dbSetDbug, dbGetDebug
|
||||||
*
|
*
|
||||||
* @covers ::dbGetDbug
|
|
||||||
* @covers ::dbSetDebug
|
|
||||||
* @testdox Set and Get Debug flag
|
* @testdox Set and Get Debug flag
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -3022,8 +3025,6 @@ final class CoreLibsDBIOTest extends TestCase
|
|||||||
* @covers ::dbReturnParams
|
* @covers ::dbReturnParams
|
||||||
* @covers ::dbCacheReset
|
* @covers ::dbCacheReset
|
||||||
* @covers ::dbGetCursorExt
|
* @covers ::dbGetCursorExt
|
||||||
* @covers ::dbCursorPos
|
|
||||||
* @covers ::dbCursorNumRows
|
|
||||||
* @dataProvider dbReturnProvider
|
* @dataProvider dbReturnProvider
|
||||||
* @testdox dbReturn Read First $read_first_only only and cache $flag_cache and assoc $flag_assoc with (Warning: $warning/Error: $error) [$_dataName]
|
* @testdox dbReturn Read First $read_first_only only and cache $flag_cache and assoc $flag_assoc with (Warning: $warning/Error: $error) [$_dataName]
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -13,29 +13,6 @@ use PHPUnit\Framework\TestCase;
|
|||||||
*/
|
*/
|
||||||
final class CoreLibsDebugFileWriterTest extends TestCase
|
final class CoreLibsDebugFileWriterTest extends TestCase
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function fsetFolderProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'valid log folder name' => [
|
|
||||||
0 => '/tmp/',
|
|
||||||
1 => true,
|
|
||||||
],
|
|
||||||
'invalid log folder name' => [
|
|
||||||
0 => 'some name',
|
|
||||||
1 => false,
|
|
||||||
],
|
|
||||||
'not writeable log folder name' => [
|
|
||||||
0 => '/opt',
|
|
||||||
1 => false,
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -85,18 +62,59 @@ final class CoreLibsDebugFileWriterTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @dataProvider fsetFolderProvider
|
* @testdox fsetFolder test correct return code
|
||||||
* @testdox fsetFolder $input will match $expected [$_dataName]
|
|
||||||
*
|
*
|
||||||
* @param string $input
|
|
||||||
* @param boolean $expected
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testFsetFolder(string $input, bool $expected): void
|
public function testFsetFolder(): void
|
||||||
{
|
{
|
||||||
|
// check the following
|
||||||
|
// - valid folder, writeable
|
||||||
|
// - valid folder, not writeable
|
||||||
|
// - invalid folder (eg file)
|
||||||
|
// - invalid folder name (eg contains spaces), must match ^[\w\-\/]+
|
||||||
|
|
||||||
|
// if we have no /tmp/ folder, we cannot test this, so skip the test
|
||||||
|
if (!is_dir('/tmp')) {
|
||||||
|
$this->markTestSkipped('No /tmp folder found, cannot test fsetFolder');
|
||||||
|
}
|
||||||
|
// TEST 3:
|
||||||
|
// create a file in /tmp/ to test invalid folder (eg file)
|
||||||
|
$test_file = '/tmp/somefile.txt';
|
||||||
|
if (!is_file($test_file)) {
|
||||||
|
touch($test_file);
|
||||||
|
}
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
false,
|
||||||
\CoreLibs\Debug\FileWriter::fsetFolder($input)
|
\CoreLibs\Debug\FileWriter::fsetFolder($test_file)
|
||||||
|
);
|
||||||
|
// TEST 4:
|
||||||
|
// test invalid folder name (eg contains spaces), must match ^[\w\-\/]+
|
||||||
|
$this->assertEquals(
|
||||||
|
false,
|
||||||
|
\CoreLibs\Debug\FileWriter::fsetFolder('some name')
|
||||||
|
);
|
||||||
|
// TEST 1:
|
||||||
|
// create a folder in /tmp/ to test valid folder, writeable
|
||||||
|
$test_folder = '/tmp/somefolder';
|
||||||
|
if (!is_dir($test_folder)) {
|
||||||
|
mkdir($test_folder);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
true,
|
||||||
|
\CoreLibs\Debug\FileWriter::fsetFolder($test_folder)
|
||||||
|
);
|
||||||
|
// TEST 2:
|
||||||
|
// create a folder in /tmp/ to test valid folder, not writeable
|
||||||
|
$test_folder = '/tmp/somefolder2';
|
||||||
|
if (!is_dir($test_folder)) {
|
||||||
|
mkdir($test_folder);
|
||||||
|
}
|
||||||
|
// remove all write permissions for the folder
|
||||||
|
chmod($test_folder, 0555);
|
||||||
|
$this->assertEquals(
|
||||||
|
false,
|
||||||
|
\CoreLibs\Debug\FileWriter::fsetFolder($test_folder)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,8 +48,8 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
* @dataProvider printTimeProvider
|
* @dataProvider printTimeProvider
|
||||||
* @testdox printTime test with $microtime and match to regex [$_dataName]
|
* @testdox printTime test with $microtime and match to regex [$_dataName]
|
||||||
*
|
*
|
||||||
* @param int|null $mircrotime
|
* @param ?int $microtime
|
||||||
* @param string $expected
|
* @param string $regex
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testPrintTime(?int $microtime, string $regex): void
|
public function testPrintTime(?int $microtime, string $regex): void
|
||||||
@@ -460,10 +460,8 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @cover ::getCallerFileLine
|
* @cover ::getCallerFileLine
|
||||||
* @testWith ["vendor/phpunit/phpunit/src/Framework/TestCase.php:6434","phar:///home/clemens/.phive/phars/phpunit-9.6.13.phar/phpunit/Framework/TestCase.php:6434"]
|
|
||||||
* @testdox getCallerFileLine check based on regex .../Framework/TestCase.php:\d+ [$_dataName]
|
* @testdox getCallerFileLine check based on regex .../Framework/TestCase.php:\d+ [$_dataName]
|
||||||
*
|
*
|
||||||
* @param string $expected
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testGetCallerFileLine(): void
|
public function testGetCallerFileLine(): void
|
||||||
@@ -471,15 +469,19 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
// regex prefix with path "/../" and then fixed vendor + \d+
|
// regex prefix with path "/../" and then fixed vendor + \d+
|
||||||
// or phar start if phiev installed
|
// or phar start if phiev installed
|
||||||
// phar:///home/clemens/.phive/phars/phpunit-9.6.13.phar/phpunit/Framework/TestCase.php
|
// phar:///home/clemens/.phive/phars/phpunit-9.6.13.phar/phpunit/Framework/TestCase.php
|
||||||
|
// phar:///usr/local/bin/phpunit/phpunit/Framework/TestCase.php
|
||||||
$regex = "/^("
|
$regex = "/^("
|
||||||
. "\/.*\/vendor\/phpunit\/phpunit\/src"
|
. "\/.*\/vendor\/phpunit\/phpunit\/src"
|
||||||
. "|"
|
. "|"
|
||||||
. "phar:\/\/\/.*\.phive\/phars\/phpunit-\d+\.\d+\.\d+\.phar\/phpunit"
|
. "phar:\/\/\/.*\.phive\/phars\/phpunit-\d+\.\d+\.\d+\.phar\/phpunit"
|
||||||
|
. "|"
|
||||||
|
. "phar:\/\/\/usr\/local\/bin\/phpunit\/phpunit"
|
||||||
. ")"
|
. ")"
|
||||||
. "\/Framework\/TestCase.php:\d+$/";
|
. "\/Framework\/TestCase.php:\d+$/";
|
||||||
$this->assertMatchesRegularExpression(
|
$this->assertMatchesRegularExpression(
|
||||||
$regex,
|
$regex,
|
||||||
Support::getCallerFileLine()
|
Support::getCallerFileLine(),
|
||||||
|
'Failed for: ' . Support::getCallerFileLine()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -522,7 +524,7 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
$compare,
|
$compare,
|
||||||
'assert expected 10'
|
'assert expected 10: ' . print_r($compare, true)
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 11:
|
case 11:
|
||||||
@@ -545,27 +547,38 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
$compare,
|
$compare,
|
||||||
'assert expected 11'
|
'assert expected 11: ' . print_r($compare, true)
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 12:
|
case 12:
|
||||||
// add two "run" before "runBare"
|
// if compare starts with "main"
|
||||||
array_splice(
|
if ($compare[0] == 'main') {
|
||||||
$expected,
|
// add two more run after main
|
||||||
7,
|
array_splice(
|
||||||
0,
|
$expected,
|
||||||
['run']
|
1,
|
||||||
);
|
0,
|
||||||
array_splice(
|
['run', 'run']
|
||||||
$expected,
|
);
|
||||||
0,
|
} else {
|
||||||
0,
|
// add two "run" before "runBare"
|
||||||
['include']
|
array_splice(
|
||||||
);
|
$expected,
|
||||||
|
7,
|
||||||
|
0,
|
||||||
|
['run']
|
||||||
|
);
|
||||||
|
array_splice(
|
||||||
|
$expected,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
['include']
|
||||||
|
);
|
||||||
|
}
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
$compare,
|
$compare,
|
||||||
'assert expected 12'
|
'assert expected 12: ' . print_r($compare, true)
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -589,7 +602,7 @@ final class CoreLibsDebugSupportTest extends TestCase
|
|||||||
if ($call_stack < 8) {
|
if ($call_stack < 8) {
|
||||||
$this->assertFalse(true, 'getCallStack too low: 8');
|
$this->assertFalse(true, 'getCallStack too low: 8');
|
||||||
} else {
|
} else {
|
||||||
$this->assertTrue(true, 'getCallSteck ok');
|
$this->assertTrue(true, 'getCallStack ok');
|
||||||
}
|
}
|
||||||
// just test top entry
|
// just test top entry
|
||||||
$first = array_shift($call_stack);
|
$first = array_shift($call_stack);
|
||||||
|
|||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
test.env
|
||||||
@@ -442,7 +442,6 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
* init check and connected change translation
|
* init check and connected change translation
|
||||||
*
|
*
|
||||||
* @covers ::getTranslator
|
* @covers ::getTranslator
|
||||||
* @covers ::l10nReloadMOfile
|
|
||||||
* @dataProvider getTranslatorProvider
|
* @dataProvider getTranslatorProvider
|
||||||
* @testdox change locale from $locale and domain $domain to locale $locale_new and domain $domain_new [$_dataName]
|
* @testdox change locale from $locale and domain $domain to locale $locale_new and domain $domain_new [$_dataName]
|
||||||
*
|
*
|
||||||
@@ -639,7 +638,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
* plural and plural context
|
* plural and plural context
|
||||||
*
|
*
|
||||||
* @covers ::__n
|
* @covers ::__n
|
||||||
* @covers ::__pn
|
* @covers ::__np
|
||||||
* @dataProvider ngettextProvider
|
* @dataProvider ngettextProvider
|
||||||
* @testdox plural string test for locale $locale and domain $domain with $context [$_dataName]
|
* @testdox plural string test for locale $locale and domain $domain with $context [$_dataName]
|
||||||
*
|
*
|
||||||
@@ -865,6 +864,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
string $value,
|
string $value,
|
||||||
string $expected
|
string $expected
|
||||||
): void {
|
): void {
|
||||||
|
$old_value = null;
|
||||||
switch ($type) {
|
switch ($type) {
|
||||||
case 'global':
|
case 'global':
|
||||||
$GLOBALS[$var] = $value;
|
$GLOBALS[$var] = $value;
|
||||||
@@ -1101,11 +1101,11 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
* fuctions check
|
* fuctions check
|
||||||
* TODO: others d/dn/dp/dnp gettext functions
|
* TODO: others d/dn/dp/dnp gettext functions
|
||||||
*
|
*
|
||||||
* @covers __setlocale
|
* @covers _setlocale
|
||||||
* @covers __bindtextdomain
|
* @covers _bindtextdomain
|
||||||
* @covers __bind_textdomain_codeset
|
* @covers _bind_textdomain_codeset
|
||||||
* @covers __textdomain
|
* @covers _textdomain
|
||||||
* @covers __gettext
|
* @covers _gettext
|
||||||
* @covers __
|
* @covers __
|
||||||
* @dataProvider functionsProvider
|
* @dataProvider functionsProvider
|
||||||
* @testdox check functions with locale $locale and domain $domain [$_dataName]
|
* @testdox check functions with locale $locale and domain $domain [$_dataName]
|
||||||
|
|||||||
@@ -514,7 +514,6 @@ final class CoreLibsLoggingLoggingTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @covers Logger\Flag
|
|
||||||
* @testdox Logger\Flag enum test
|
* @testdox Logger\Flag enum test
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
@@ -828,6 +827,7 @@ final class CoreLibsLoggingLoggingTest extends TestCase
|
|||||||
// clean all data in folder first
|
// clean all data in folder first
|
||||||
array_map('unlink', glob($log->getLogFolder() . $log->getLogFileId() . '*.log'));
|
array_map('unlink', glob($log->getLogFolder() . $log->getLogFileId() . '*.log'));
|
||||||
|
|
||||||
|
$log_status = false;
|
||||||
switch ($level->value) {
|
switch ($level->value) {
|
||||||
case 200:
|
case 200:
|
||||||
$log_status = $log->info($message);
|
$log_status = $log->info($message);
|
||||||
@@ -851,7 +851,7 @@ final class CoreLibsLoggingLoggingTest extends TestCase
|
|||||||
$log_status = $log->emergency($message);
|
$log_status = $log->emergency($message);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
$this->assertTrue($log_status, 'log write successful');
|
$this->assertTrue($log_status, 'log write unsuccessful for level: ' . $level->getName());
|
||||||
$file_content = file_get_contents(
|
$file_content = file_get_contents(
|
||||||
$log->getLogFolder() . $log->getLogFile()
|
$log->getLogFolder() . $log->getLogFile()
|
||||||
) ?: '';
|
) ?: '';
|
||||||
|
|||||||
@@ -334,7 +334,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* test encrypt/decrypt produce correct output
|
* test encrypt/decrypt produce correct output
|
||||||
*
|
*
|
||||||
* @covers ::generateRandomKey
|
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptDecryptSuccess
|
* @dataProvider providerEncryptDecryptSuccess
|
||||||
@@ -370,7 +369,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* test encrypt/decrypt produce correct output
|
* test encrypt/decrypt produce correct output
|
||||||
*
|
*
|
||||||
* @covers ::generateRandomKey
|
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptDecryptSuccess
|
* @dataProvider providerEncryptDecryptSuccess
|
||||||
@@ -397,7 +395,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* test encrypt/decrypt produce correct output
|
* test encrypt/decrypt produce correct output
|
||||||
*
|
*
|
||||||
* @covers ::generateRandomKey
|
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptDecryptSuccess
|
* @dataProvider providerEncryptDecryptSuccess
|
||||||
@@ -424,7 +421,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* test encrypt/decrypt produce correct output
|
* test encrypt/decrypt produce correct output
|
||||||
*
|
*
|
||||||
* @covers ::generateRandomKey
|
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptDecryptSuccess
|
* @dataProvider providerEncryptDecryptSuccess
|
||||||
@@ -469,7 +465,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Test decryption with wrong key
|
* Test decryption with wrong key
|
||||||
*
|
*
|
||||||
* @covers ::generateRandomKey
|
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptFailed
|
* @dataProvider providerEncryptFailed
|
||||||
@@ -496,7 +491,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Test decryption with wrong key
|
* Test decryption with wrong key
|
||||||
*
|
*
|
||||||
* @covers ::generateRandomKey
|
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptFailed
|
* @dataProvider providerEncryptFailed
|
||||||
@@ -521,7 +515,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Test decryption with wrong key
|
* Test decryption with wrong key
|
||||||
*
|
*
|
||||||
* @covers ::generateRandomKey
|
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptFailed
|
* @dataProvider providerEncryptFailed
|
||||||
|
|||||||
@@ -104,7 +104,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* test encrypt/decrypt produce correct output
|
* test encrypt/decrypt produce correct output
|
||||||
*
|
*
|
||||||
* @covers ::generateRandomKey
|
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptDecryptSuccess
|
* @dataProvider providerEncryptDecryptSuccess
|
||||||
@@ -132,7 +131,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* test encrypt/decrypt produce correct output
|
* test encrypt/decrypt produce correct output
|
||||||
*
|
*
|
||||||
* @covers ::generateRandomKey
|
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptDecryptSuccess
|
* @dataProvider providerEncryptDecryptSuccess
|
||||||
@@ -158,7 +156,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* test encrypt/decrypt produce correct output
|
* test encrypt/decrypt produce correct output
|
||||||
*
|
*
|
||||||
* @covers ::generateRandomKey
|
|
||||||
* @covers ::encryptKey
|
* @covers ::encryptKey
|
||||||
* @covers ::decryptKey
|
* @covers ::decryptKey
|
||||||
* @dataProvider providerEncryptDecryptSuccess
|
* @dataProvider providerEncryptDecryptSuccess
|
||||||
@@ -202,7 +199,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Test decryption with wrong key
|
* Test decryption with wrong key
|
||||||
*
|
*
|
||||||
* @covers ::generateRandomKey
|
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptFailed
|
* @dataProvider providerEncryptFailed
|
||||||
@@ -228,7 +224,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Test decryption with wrong key
|
* Test decryption with wrong key
|
||||||
*
|
*
|
||||||
* @covers ::generateRandomKey
|
|
||||||
* @covers ::encrypt
|
* @covers ::encrypt
|
||||||
* @covers ::decrypt
|
* @covers ::decrypt
|
||||||
* @dataProvider providerEncryptFailed
|
* @dataProvider providerEncryptFailed
|
||||||
@@ -252,7 +247,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Test decryption with wrong key
|
* Test decryption with wrong key
|
||||||
*
|
*
|
||||||
* @covers ::generateRandomKey
|
|
||||||
* @covers ::encryptKey
|
* @covers ::encryptKey
|
||||||
* @covers ::decryptKey
|
* @covers ::decryptKey
|
||||||
* @dataProvider providerEncryptFailed
|
* @dataProvider providerEncryptFailed
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ final class CoreLibsTemplateHtmlBuilderElementTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @covers ::Element
|
|
||||||
* @covers ::buildHtml
|
* @covers ::buildHtml
|
||||||
* @covers ::getTag
|
* @covers ::getTag
|
||||||
* @covers ::getId
|
* @covers ::getId
|
||||||
|
|||||||
@@ -58,6 +58,11 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
if ($handle === false) {
|
if ($handle === false) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
|
||||||
|
$status = curl_exec($handle);
|
||||||
|
if ($status === false) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
$this->url_basic = $url;
|
$this->url_basic = $url;
|
||||||
// print "Open: $url\n";
|
// print "Open: $url\n";
|
||||||
break;
|
break;
|
||||||
@@ -459,20 +464,19 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
/**
|
/**
|
||||||
* set setup + header, base uri change
|
* set setup + header, base uri change
|
||||||
*
|
*
|
||||||
* @covers ::Curl
|
|
||||||
* @covers ::setBaseUri
|
* @covers ::setBaseUri
|
||||||
* @covers ::addHeader
|
* @covers ::setHeaders
|
||||||
* @covers ::removeHEader
|
* @covers ::removeHeaders
|
||||||
* @dataProvider providerUrlRequestsCurlSetup
|
* @dataProvider providerUrlRequestsCurlSetup
|
||||||
* @testdox UrlRequests\Curl Class setup tasks [$_dataName]
|
* @testdox UrlRequests\Curl Class setup tasks [$_dataName]
|
||||||
*
|
*
|
||||||
* @param null|array $config
|
* @param null|array $config
|
||||||
* @param array $expected
|
* @param array<string,mixed> $expected_set
|
||||||
* @param null|string $new_base_uri
|
* @param null|string $new_base_uri
|
||||||
* @param null|array $set_header
|
* @param null|array $set_header
|
||||||
* @param null|bool $set_header_add
|
* @param null|bool $set_header_add
|
||||||
* @param null|array $remove_header
|
* @param null|array $remove_header
|
||||||
* @param null|array $expected_change
|
* @param null|array $expected_change
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testUrlRequestsCurlSetupConfig(
|
public function testUrlRequestsCurlSetupConfig(
|
||||||
@@ -492,10 +496,18 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
};
|
};
|
||||||
// if ($new_base_uri === null && $set_header === null && $remove_header === null) {
|
// if ($new_base_uri === null && $set_header === null && $remove_header === null) {
|
||||||
// }
|
// }
|
||||||
$this->assertEquals($expected_set, $curl->getConfig(), 'Class setup config mismatch');
|
$this->assertEquals(
|
||||||
|
$expected_set,
|
||||||
|
$curl->getConfig(),
|
||||||
|
'Class setup config mismatch'
|
||||||
|
);
|
||||||
if ($new_base_uri !== null) {
|
if ($new_base_uri !== null) {
|
||||||
$curl->setBaseUri($new_base_uri);
|
$curl->setBaseUri($new_base_uri);
|
||||||
$this->assertEquals($expected_change, $curl->getConfig(), 'new base_uri not matching');
|
$this->assertEquals(
|
||||||
|
$expected_change,
|
||||||
|
$curl->getConfig(),
|
||||||
|
'new base_uri not matching'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if ($set_header !== null) {
|
if ($set_header !== null) {
|
||||||
if ($set_header_add !== null) {
|
if ($set_header_add !== null) {
|
||||||
@@ -503,11 +515,19 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
} else {
|
} else {
|
||||||
$curl->setHeaders($set_header);
|
$curl->setHeaders($set_header);
|
||||||
}
|
}
|
||||||
$this->assertEquals($expected_change, $curl->getConfig(), 'new headers not matching');
|
$this->assertEquals(
|
||||||
|
$expected_change,
|
||||||
|
$curl->getConfig(),
|
||||||
|
'new headers not matching'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if ($remove_header !== null) {
|
if ($remove_header !== null) {
|
||||||
$curl->removeHeaders($remove_header);
|
$curl->removeHeaders($remove_header);
|
||||||
$this->assertEquals($expected_change, $curl->getConfig(), 'removed headers not matching');
|
$this->assertEquals(
|
||||||
|
$expected_change,
|
||||||
|
$curl->getConfig(),
|
||||||
|
'removed headers not matching'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -877,7 +897,7 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
string $return_content
|
string $return_content
|
||||||
) {
|
) {
|
||||||
if (!$this->url_basic) {
|
if (!$this->url_basic) {
|
||||||
$this->markTestSkipped('No backend interface setup for testing: GET');
|
$this->markTestSkipped('No backend interface setup for testing');
|
||||||
}
|
}
|
||||||
$curl = new \CoreLibs\UrlRequests\Curl();
|
$curl = new \CoreLibs\UrlRequests\Curl();
|
||||||
// options
|
// options
|
||||||
@@ -960,6 +980,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testUrlRequestsCurlRequestMultiple()
|
public function testUrlRequestsCurlRequestMultiple()
|
||||||
{
|
{
|
||||||
|
if (!$this->url_basic) {
|
||||||
|
$this->markTestSkipped('No backend interface setup for testing');
|
||||||
|
}
|
||||||
$curl = new \CoreLibs\UrlRequests\Curl();
|
$curl = new \CoreLibs\UrlRequests\Curl();
|
||||||
// get
|
// get
|
||||||
$response = $curl->get($this->url_basic, [
|
$response = $curl->get($this->url_basic, [
|
||||||
@@ -1051,6 +1074,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testUrlRequestsCurlAuthHeader()
|
public function testUrlRequestsCurlAuthHeader()
|
||||||
{
|
{
|
||||||
|
if (!$this->url_basic) {
|
||||||
|
$this->markTestSkipped('No backend interface setup for testing');
|
||||||
|
}
|
||||||
$curl = new \CoreLibs\UrlRequests\Curl([
|
$curl = new \CoreLibs\UrlRequests\Curl([
|
||||||
"auth" => ["user", "pass", "basic"],
|
"auth" => ["user", "pass", "basic"],
|
||||||
"http_errors" => false,
|
"http_errors" => false,
|
||||||
@@ -1117,6 +1143,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testExceptionInvalidHeaderKey(): void
|
public function testExceptionInvalidHeaderKey(): void
|
||||||
{
|
{
|
||||||
|
if (!$this->url_basic) {
|
||||||
|
$this->markTestSkipped('No backend interface setup for testing');
|
||||||
|
}
|
||||||
$curl = new \CoreLibs\UrlRequests\Curl();
|
$curl = new \CoreLibs\UrlRequests\Curl();
|
||||||
$this->expectException(\RuntimeException::class);
|
$this->expectException(\RuntimeException::class);
|
||||||
$this->expectExceptionMessageMatches("/InvalidHeaderKey/");
|
$this->expectExceptionMessageMatches("/InvalidHeaderKey/");
|
||||||
@@ -1137,6 +1166,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testExceptionInvalidHeaderValue(): void
|
public function testExceptionInvalidHeaderValue(): void
|
||||||
{
|
{
|
||||||
|
if (!$this->url_basic) {
|
||||||
|
$this->markTestSkipped('No backend interface setup for testing');
|
||||||
|
}
|
||||||
$curl = new \CoreLibs\UrlRequests\Curl();
|
$curl = new \CoreLibs\UrlRequests\Curl();
|
||||||
$this->expectException(\RuntimeException::class);
|
$this->expectException(\RuntimeException::class);
|
||||||
$this->expectExceptionMessageMatches("/InvalidHeaderValue/");
|
$this->expectExceptionMessageMatches("/InvalidHeaderValue/");
|
||||||
@@ -1186,6 +1218,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testExceptionBadRequest(): void
|
public function testExceptionBadRequest(): void
|
||||||
{
|
{
|
||||||
|
if (!$this->url_basic) {
|
||||||
|
$this->markTestSkipped('No backend interface setup for testing');
|
||||||
|
}
|
||||||
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => true]);
|
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => true]);
|
||||||
$this->expectException(\RuntimeException::class);
|
$this->expectException(\RuntimeException::class);
|
||||||
$this->expectExceptionMessageMatches("/ClientError/");
|
$this->expectExceptionMessageMatches("/ClientError/");
|
||||||
@@ -1207,6 +1242,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testExceptionBadRequestEnable(): void
|
public function testExceptionBadRequestEnable(): void
|
||||||
{
|
{
|
||||||
|
if (!$this->url_basic) {
|
||||||
|
$this->markTestSkipped('No backend interface setup for testing');
|
||||||
|
}
|
||||||
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => false]);
|
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => false]);
|
||||||
$this->expectException(\RuntimeException::class);
|
$this->expectException(\RuntimeException::class);
|
||||||
$this->expectExceptionMessageMatches("/ClientError/");
|
$this->expectExceptionMessageMatches("/ClientError/");
|
||||||
@@ -1229,6 +1267,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testExceptionBadRequestUnset(): void
|
public function testExceptionBadRequestUnset(): void
|
||||||
{
|
{
|
||||||
|
if (!$this->url_basic) {
|
||||||
|
$this->markTestSkipped('No backend interface setup for testing');
|
||||||
|
}
|
||||||
// if true, with false it has to be off
|
// if true, with false it has to be off
|
||||||
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => true]);
|
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => true]);
|
||||||
$response = $curl->request('get', $this->url_basic, [
|
$response = $curl->request('get', $this->url_basic, [
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
$set = 0;
|
$set = 0;
|
||||||
foreach (['/../../www', '/../www', '/../..', '/..', '/../../src', '/../src'] as $src) {
|
foreach (['/../../www', '/../www', '/../../src', '/../src', '/../..', '/..'] as $src) {
|
||||||
if (is_file(dirname(__DIR__) . $src . '/vendor/autoload.php')) {
|
if (is_file(dirname(__DIR__) . $src . '/vendor/autoload.php')) {
|
||||||
require dirname(__DIR__) . $src . '/vendor/autoload.php';
|
require dirname(__DIR__) . $src . '/vendor/autoload.php';
|
||||||
$set = 1;
|
$set = 1;
|
||||||
|
|||||||
+5
-2
@@ -1,8 +1,11 @@
|
|||||||
// https://www.typescriptlang.org/tsconfig/#compilerOptions
|
// https://www.typescriptlang.org/tsconfig/#compilerOptions
|
||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"module": "ESNext",
|
// if "bundler"
|
||||||
"moduleResolution": "Node",
|
// "module": "ESNext",
|
||||||
|
"module": "NodeNext",
|
||||||
|
// "bundler" (front), "nodenext" or "node16"
|
||||||
|
"moduleResolution": "nodenext",
|
||||||
"target": "ES2020",
|
"target": "ES2020",
|
||||||
"jsx": "react",
|
"jsx": "react",
|
||||||
"checkJs": true,
|
"checkJs": true,
|
||||||
|
|||||||
+13
@@ -10,4 +10,17 @@
|
|||||||
<directory>4dev/tests</directory>
|
<directory>4dev/tests</directory>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
</testsuites>
|
</testsuites>
|
||||||
|
<coverage processUncoveredFiles="true">
|
||||||
|
<include>
|
||||||
|
<directory suffix=".php">./www/lib/CoreLibs</directory>
|
||||||
|
</include>
|
||||||
|
<!-- <report>
|
||||||
|
<html outputDirectory="build/coverage-report"/>
|
||||||
|
</report> -->
|
||||||
|
</coverage>
|
||||||
|
<!-- <source>
|
||||||
|
<include>
|
||||||
|
<directory>./www/lib/CoreLibs</directory>
|
||||||
|
</include>
|
||||||
|
</source> -->
|
||||||
</phpunit>
|
</phpunit>
|
||||||
|
|||||||
@@ -225,6 +225,36 @@ foreach ($intervals as $interval) {
|
|||||||
print "STRINGTOTIME: $reverse_interval: " . DateTime::stringToTime($reverse_interval) . "<br>";
|
print "STRINGTOTIME: $reverse_interval: " . DateTime::stringToTime($reverse_interval) . "<br>";
|
||||||
}
|
}
|
||||||
print "<hr>";
|
print "<hr>";
|
||||||
|
$interval_strings = [
|
||||||
|
'10d 5h 30m 15s 123456ms',
|
||||||
|
'18999d 0h 38m 10s 1235ms',
|
||||||
|
'18999 d 0 h 38 m 10s 1235ms',
|
||||||
|
'-2h 15m 5s',
|
||||||
|
'45s 500ms',
|
||||||
|
'0s',
|
||||||
|
'0ms',
|
||||||
|
'1s 5ms',
|
||||||
|
'1s 50ms',
|
||||||
|
'1s 500ms',
|
||||||
|
'1s 5000ms',
|
||||||
|
'10day 5hour 30min 15sec 123456millis',
|
||||||
|
'10day 5hour 30min 15sec 123456millisec',
|
||||||
|
'10day 5hour 30min 15sec 123456msec',
|
||||||
|
'-2days 3hours 15minutes 30seconds 250milliseconds',
|
||||||
|
'',
|
||||||
|
' ',
|
||||||
|
'invalid',
|
||||||
|
];
|
||||||
|
foreach ($interval_strings as $interval_string) {
|
||||||
|
print "STRINGTOTIME: $interval_string: " . DateTime::stringToTime($interval_string) . "<br>";
|
||||||
|
try {
|
||||||
|
// test exception
|
||||||
|
DateTime::stringToTime($interval_string, throw_exception:true);
|
||||||
|
} catch (\InvalidArgumentException $e) {
|
||||||
|
print "ERROR: " . $e->getMessage() . "<br><pre>" . $e . "</pre><br>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print "<hr>";
|
||||||
$check_dates = [
|
$check_dates = [
|
||||||
'2021-05-01',
|
'2021-05-01',
|
||||||
'2021-05-40'
|
'2021-05-40'
|
||||||
|
|||||||
@@ -38,6 +38,25 @@ print "GETFILENAMEENDING: $file: " . File::getFilenameEnding($file) . "<br>";
|
|||||||
$file = getcwd() . DIRECTORY_SEPARATOR . 'class_test.file.php';
|
$file = getcwd() . DIRECTORY_SEPARATOR . 'class_test.file.php';
|
||||||
print "GETLINESFROMFILE: $file: " . File::getLinesFromFile($file) . "<br>";
|
print "GETLINESFROMFILE: $file: " . File::getLinesFromFile($file) . "<br>";
|
||||||
print "MIMEINFO: $file: " . File::getMimeType($file) . "<br>";
|
print "MIMEINFO: $file: " . File::getMimeType($file) . "<br>";
|
||||||
|
try {
|
||||||
|
print "MIMEINFO: does_not_exists.txt " . File::getMimeType("does_not_exists.txt") . "<br>";
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
print "Error: " . get_class($e) . ": " . $e->getMessage() . "<br>";
|
||||||
|
}
|
||||||
|
|
||||||
|
$files = [
|
||||||
|
'layout/css/edit.css',
|
||||||
|
'layout/javascript/edit.jq.js',
|
||||||
|
'class_test.file.php',
|
||||||
|
getcwd() . DIRECTORY_SEPARATOR . 'class_test.file.php',
|
||||||
|
];
|
||||||
|
foreach ($files as $file) {
|
||||||
|
try {
|
||||||
|
print "MIMEINFO: $file: " . File::getMimeType($file) . "<br>";
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
print "Error: " . get_class($e) . ": " . $e->getMessage() . "<br>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
print "</body></html>";
|
print "</body></html>";
|
||||||
|
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ $json = '["f: {b"""ar}]';
|
|||||||
$output = Json::jsonConvertToArray($json);
|
$output = Json::jsonConvertToArray($json);
|
||||||
print "S::E-JSON: $json: " . DgS::printAr($output) . "<br>";
|
print "S::E-JSON: $json: " . DgS::printAr($output) . "<br>";
|
||||||
print "S::E-JSON ERROR: " . Json::jsonGetLastError() . ": " . Json::jsonGetLastError(true) . "<br>";
|
print "S::E-JSON ERROR: " . Json::jsonGetLastError() . ": " . Json::jsonGetLastError(true) . "<br>";
|
||||||
|
print "S::E Validate: " . Json::jsonValidate($json) . ": " . Json::jsonGetLastError(true) . "<br>";
|
||||||
|
|
||||||
// direct
|
// direct
|
||||||
$json = '{"direct": "static function call"}';
|
$json = '{"direct": "static function call"}';
|
||||||
@@ -58,6 +59,24 @@ $output = $json_class::jsonConvertToArray($json);
|
|||||||
print "J/S::E-JSON: $json: " . DgS::printAr($output) . "<br>";
|
print "J/S::E-JSON: $json: " . DgS::printAr($output) . "<br>";
|
||||||
print "J/S::E-JSON ERROR: " . $json_class::jsonGetLastError() . ": " . $json_class::jsonGetLastError(true) . "<br>";
|
print "J/S::E-JSON ERROR: " . $json_class::jsonGetLastError() . ": " . $json_class::jsonGetLastError(true) . "<br>";
|
||||||
|
|
||||||
|
echo "<hr>";
|
||||||
|
$json = '{"valid":"json","invalid":"\xB1\x31"}';
|
||||||
|
// $json = '{"valid":"json","invalid":"abc\x80def"}';
|
||||||
|
$output_no_flag = Json::jsonConvertToArray($json);
|
||||||
|
print "No Flag JSON: $json: " . DgS::printAr($output_no_flag) . "<br>";
|
||||||
|
print "No Flag JSON ERROR: " . Json::jsonGetLastError() . ": " . Json::jsonGetLastError(true) . "<br>";
|
||||||
|
$output_flag = Json::jsonConvertToArray($json, flags:JSON_INVALID_UTF8_IGNORE);
|
||||||
|
print "No Flag JSON: $json: " . DgS::printAr($output_flag) . "<br>";
|
||||||
|
print "No Flag JSON ERROR: " . Json::jsonGetLastError() . ": " . Json::jsonGetLastError(true) . "<br>";
|
||||||
|
$output_raw = json_decode($json, true, flags:JSON_INVALID_UTF8_IGNORE);
|
||||||
|
print "No Flag JSON RAW (F-1): $json: " . DgS::printAr($output_raw) . "<br>";
|
||||||
|
$output_raw = json_decode($json, true, flags:JSON_INVALID_UTF8_SUBSTITUTE);
|
||||||
|
print "No Flag JSON RAW (F-2): $json: " . DgS::printAr($output_raw) . "<br>";
|
||||||
|
$output_raw = json_decode($json, true);
|
||||||
|
print "No Flag JSON RAW: $json: " . DgS::printAr($output_raw) . "<br>";
|
||||||
|
echo "<hr>";
|
||||||
|
|
||||||
|
|
||||||
// $json = '{"foo": "bar"}';
|
// $json = '{"foo": "bar"}';
|
||||||
// $output = Jason::jsonConvertToArray($json);
|
// $output = Jason::jsonConvertToArray($json);
|
||||||
// print "S::JSON: $json: " . DgS::printAr($output) . "<br>";
|
// print "S::JSON: $json: " . DgS::printAr($output) . "<br>";
|
||||||
|
|||||||
@@ -34,6 +34,20 @@ print "<body>";
|
|||||||
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
||||||
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
||||||
|
|
||||||
|
$output = RandomKey::randomKeyGen(
|
||||||
|
12,
|
||||||
|
[
|
||||||
|
0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D', 4 => 'E', 5 => 'F', 6 => 'G', 7 => 'H', 8 => 'I', 9 => 'J', 10 => 'K',
|
||||||
|
11 => 'L', 12 => 'M', 13 => 'N', 14 => 'O', 15 => 'P', 16 => 'Q', 17 => 'R', 18 => 'S', 19 => 'T', 20 => 'U',
|
||||||
|
21 => 'V', 22 => 'W', 23 => 'X', 24 => 'Y', 25 => 'Z', 26 => 'a', 27 => 'b', 28 => 'c', 29 => 'd', 30 => 'e',
|
||||||
|
31 => 'f', 32 => 'g', 33 => 'h', 34 => 'i', 35 => 'j', 36 => 'k', 37 => 'l', 38 => 'm', 39 => 'n', 40 => 'o',
|
||||||
|
41 => 'p', 42 => 'q', 43 => 'r', 44 => 's', 45 => 't', 46 => 'u', 47 => 'v', 48 => 'w', 49 => 'x', 50 => 'y',
|
||||||
|
51 => 'z', 52 => '0', 53 => '1', 54 => '2', 55 => '3', 56 => '4', 57 => '5', 58 => '6', 59 => '7', 60 => '8',
|
||||||
|
61 => '9'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
print "CUSTOM OUTPUT: " . $output . "<br>";
|
||||||
|
|
||||||
$key_length = 10;
|
$key_length = 10;
|
||||||
$key_length_b = 5;
|
$key_length_b = 5;
|
||||||
$key_lenght_long = 64;
|
$key_lenght_long = 64;
|
||||||
@@ -54,6 +68,7 @@ print "===<Br>";
|
|||||||
$_array = new CoreLibs\Create\RandomKey(['A', 'F', 'B'], ['1', '5', '9']);
|
$_array = new CoreLibs\Create\RandomKey(['A', 'F', 'B'], ['1', '5', '9']);
|
||||||
print "C->RANDOMKEYGEN(pre set): " . $_array->randomKeyGen() . "<br>";
|
print "C->RANDOMKEYGEN(pre set): " . $_array->randomKeyGen() . "<br>";
|
||||||
|
|
||||||
|
|
||||||
print "</body></html>";
|
print "</body></html>";
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -122,6 +122,16 @@ print "Combined strings A: "
|
|||||||
. Strings::buildCharStringFromLists(['A', 'B', 'C'], ['0', '1', '2']) . "<br>";
|
. Strings::buildCharStringFromLists(['A', 'B', 'C'], ['0', '1', '2']) . "<br>";
|
||||||
print "Combined strings B: "
|
print "Combined strings B: "
|
||||||
. Strings::buildCharStringFromLists([['F'], ['G'], 'H'], [['5', ['6']], ['0'], '1', '2']) . "<br>";
|
. Strings::buildCharStringFromLists([['F'], ['G'], 'H'], [['5', ['6']], ['0'], '1', '2']) . "<br>";
|
||||||
|
print "Combined strings C: "
|
||||||
|
. Strings::buildCharStringFromLists([
|
||||||
|
0 => 'A', 1 => 'B', 2 => 'C', 3 => 'D', 4 => 'E', 5 => 'F', 6 => 'G', 7 => 'H', 8 => 'I', 9 => 'J', 10 => 'K',
|
||||||
|
11 => 'L', 12 => 'M', 13 => 'N', 14 => 'O', 15 => 'P', 16 => 'Q', 17 => 'R', 18 => 'S', 19 => 'T', 20 => 'U',
|
||||||
|
21 => 'V', 22 => 'W', 23 => 'X', 24 => 'Y', 25 => 'Z', 26 => 'a', 27 => 'b', 28 => 'c', 29 => 'd', 30 => 'e',
|
||||||
|
31 => 'f', 32 => 'g', 33 => 'h', 34 => 'i', 35 => 'j', 36 => 'k', 37 => 'l', 38 => 'm', 39 => 'n', 40 => 'o',
|
||||||
|
41 => 'p', 42 => 'q', 43 => 'r', 44 => 's', 45 => 't', 46 => 'u', 47 => 'v', 48 => 'w', 49 => 'x', 50 => 'y',
|
||||||
|
51 => 'z', 52 => '0', 53 => '1', 54 => '2', 55 => '3', 56 => '4', 57 => '5', 58 => '6', 59 => '7', 60 => '8',
|
||||||
|
61 => '9'
|
||||||
|
]) . "<br>";
|
||||||
|
|
||||||
$input_string = "AaBbCc";
|
$input_string = "AaBbCc";
|
||||||
print "Unique: " . Strings::removeDuplicates($input_string) . "<br>";
|
print "Unique: " . Strings::removeDuplicates($input_string) . "<br>";
|
||||||
|
|||||||
@@ -1598,4 +1598,17 @@ function createNavMenu(nav_menu, header_id = 'mainHeader') // eslint-disable-lin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HTML decode &something; entrie
|
||||||
|
* @param {string} str
|
||||||
|
* @returns string
|
||||||
|
* @deprecated use utils.js
|
||||||
|
*/
|
||||||
|
function decodeHtmlEntities(str) // eslint-disable-line no-unused-vars
|
||||||
|
{
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const doc = parser.parseFromString(str, 'text/html');
|
||||||
|
return doc.documentElement.textContent;
|
||||||
|
}
|
||||||
|
|
||||||
/* END */
|
/* END */
|
||||||
|
|||||||
+9680
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -135,7 +135,7 @@ var HtmlElementCreator = class {
|
|||||||
* @param {String} tag must set tag (div, span, etc)
|
* @param {String} tag must set tag (div, span, etc)
|
||||||
* @param {String} [id=''] optional set for id, if input, select will be used for name
|
* @param {String} [id=''] optional set for id, if input, select will be used for name
|
||||||
* @param {String} [content=''] text content inside, is skipped if sub elements exist
|
* @param {String} [content=''] text content inside, is skipped if sub elements exist
|
||||||
* @param {Array} [css=[]] array for css tags
|
* @param {Array<String>} [css=[]] array for css tags
|
||||||
* @param {Object} [options={}] anything else (value, placeholder, OnClick, style)
|
* @param {Object} [options={}] anything else (value, placeholder, OnClick, style)
|
||||||
* @return {Object} created element as an object
|
* @return {Object} created element as an object
|
||||||
*/
|
*/
|
||||||
@@ -509,6 +509,11 @@ function numberWithCommas(number) {
|
|||||||
function convertLBtoBR(string) {
|
function convertLBtoBR(string) {
|
||||||
return string.replace(/(?:\r\n|\r|\n)/g, "<br>");
|
return string.replace(/(?:\r\n|\r|\n)/g, "<br>");
|
||||||
}
|
}
|
||||||
|
function decodeHtmlEntities(str) {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const doc = parser.parseFromString(str, "text/html");
|
||||||
|
return doc.documentElement.textContent;
|
||||||
|
}
|
||||||
|
|
||||||
// src/utils/DateTimeHelpers.mjs
|
// src/utils/DateTimeHelpers.mjs
|
||||||
function getTimestamp() {
|
function getTimestamp() {
|
||||||
@@ -660,18 +665,19 @@ function getQueryStringParam(search = "", query = "", single = false) {
|
|||||||
if (search) {
|
if (search) {
|
||||||
let _params = url.searchParams.getAll(search);
|
let _params = url.searchParams.getAll(search);
|
||||||
if (_params.length == 1 || single === true) {
|
if (_params.length == 1 || single === true) {
|
||||||
param = _params[0];
|
return _params[0];
|
||||||
} else if (_params.length > 1) {
|
} else if (_params.length > 1) {
|
||||||
param = _params;
|
return _params;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
param = {};
|
let param2 = {};
|
||||||
for (const [key] of url.searchParams.entries()) {
|
for (const [key] of url.searchParams.entries()) {
|
||||||
if (typeof param[key] === "undefined") {
|
if (typeof param2[key] === "undefined") {
|
||||||
let _params = url.searchParams.getAll(key);
|
let _params = url.searchParams.getAll(key);
|
||||||
param[key] = _params.length < 2 || single === true ? _params[0] : _params;
|
param2[key] = _params.length < 2 || single === true ? _params[0] : _params;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return param2;
|
||||||
}
|
}
|
||||||
return param;
|
return param;
|
||||||
}
|
}
|
||||||
@@ -1425,6 +1431,9 @@ function numberWithCommas2(x) {
|
|||||||
function convertLBtoBR2(string) {
|
function convertLBtoBR2(string) {
|
||||||
return convertLBtoBR(string);
|
return convertLBtoBR(string);
|
||||||
}
|
}
|
||||||
|
function decodeHtmlEntities2(string) {
|
||||||
|
return decodeHtmlEntities(string);
|
||||||
|
}
|
||||||
function getTimestamp2() {
|
function getTimestamp2() {
|
||||||
return getTimestamp();
|
return getTimestamp();
|
||||||
}
|
}
|
||||||
@@ -1549,7 +1558,7 @@ function acssel(_element, css) {
|
|||||||
return hec.acssel(_element, css);
|
return hec.acssel(_element, css);
|
||||||
}
|
}
|
||||||
function scssel(_element, rcss, acss) {
|
function scssel(_element, rcss, acss) {
|
||||||
hec.scssel(_element, rcss, acss);
|
return hec.scssel(_element, rcss, acss);
|
||||||
}
|
}
|
||||||
function phfo(tree) {
|
function phfo(tree) {
|
||||||
return hec.phfo(tree);
|
return hec.phfo(tree);
|
||||||
|
|||||||
+1
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2
-2
@@ -17,13 +17,13 @@
|
|||||||
"repositories": {
|
"repositories": {
|
||||||
"git.egplusww.jp.Composer": {
|
"git.egplusww.jp.Composer": {
|
||||||
"type": "composer",
|
"type": "composer",
|
||||||
"url": "https://git.egplusww.jp/api/packages/Composer/composer"
|
"url": "https://packages.omnicomproduction.jp/api/packages/Composer/composer"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"egrajp/smarty-extended": "^5.4",
|
"egrajp/smarty-extended": "^5.4",
|
||||||
"php": ">=8.1",
|
"php": ">=8.1",
|
||||||
"gullevek/dotenv": "^2.0",
|
"gullevek/dotenv": "^3.0",
|
||||||
"psr/log": "^2.0 || ^3.0",
|
"psr/log": "^2.0 || ^3.0",
|
||||||
"php-privacy/openpgp": "^2.1"
|
"php-privacy/openpgp": "^2.1"
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -58,15 +58,21 @@ class File
|
|||||||
* else returns '' for any other finfo read problem
|
* else returns '' for any other finfo read problem
|
||||||
*
|
*
|
||||||
* @param string $read_file File to read, relative or absolute path
|
* @param string $read_file File to read, relative or absolute path
|
||||||
* @return string
|
* @return string mime type
|
||||||
|
* @throws \UnexpectedValueException if file cannot be read or is not a file
|
||||||
|
* @throws \RangeException if we cannot get a mime type and throw exception is on
|
||||||
*/
|
*/
|
||||||
public static function getMimeType(string $read_file): string
|
public static function getMimeType(string $read_file): string
|
||||||
{
|
{
|
||||||
$finfo = new \finfo(FILEINFO_MIME_TYPE);
|
$finfo = new \finfo(FILEINFO_MIME_TYPE);
|
||||||
if (!is_file($read_file)) {
|
if (!is_file($read_file) || !is_readable($read_file)) {
|
||||||
throw new \UnexpectedValueException('[getMimeType] File not found: ' . $read_file);
|
throw new \UnexpectedValueException('[getMimeType] File not found: ' . $read_file);
|
||||||
}
|
}
|
||||||
return $finfo->file($read_file) ?: '';
|
$mime_type = $finfo->file($read_file);
|
||||||
|
if ($mime_type === false) {
|
||||||
|
throw new \RangeException('[getMimeType] Cannot get mime type for: ' . $read_file);
|
||||||
|
}
|
||||||
|
return $mime_type;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ class DateTime
|
|||||||
} else {
|
} else {
|
||||||
for ($i = 0, $iMax = count($timegroups); $i < $iMax; $i++) {
|
for ($i = 0, $iMax = count($timegroups); $i < $iMax; $i++) {
|
||||||
$output = floor((float)$timestamp / $timegroups[$i]);
|
$output = floor((float)$timestamp / $timegroups[$i]);
|
||||||
$timestamp = (float)$timestamp % $timegroups[$i];
|
$timestamp = $timestamp % $timegroups[$i];
|
||||||
// output has days|hours|min|sec
|
// output has days|hours|min|sec
|
||||||
if ($output || $time_string) {
|
if ($output || $time_string) {
|
||||||
$time_string .= $output . $labels[$i] . (($i + 1) != count($timegroups) ? ' ' : '');
|
$time_string .= $output . $labels[$i] . (($i + 1) != count($timegroups) ? ' ' : '');
|
||||||
@@ -395,39 +395,68 @@ class DateTime
|
|||||||
* does a reverse of the timeStringFormat and converts the string from
|
* does a reverse of the timeStringFormat and converts the string from
|
||||||
* xd xh xm xs xms to a timestamp.microtime format
|
* xd xh xm xs xms to a timestamp.microtime format
|
||||||
*
|
*
|
||||||
* @param string|int|float $timestring formatted interval
|
* @param string|int|float $timestring formatted interval
|
||||||
* @return string|int|float converted float interval, or string as is
|
* @param bool $throw_exception [default=false] if set to true will throw exception
|
||||||
|
* instead of returning input value as is
|
||||||
|
* @return string|int|float converted float interval, or string as is
|
||||||
*/
|
*/
|
||||||
public static function stringToTime(string|int|float $timestring): string|int|float
|
public static function stringToTime(
|
||||||
{
|
string|int|float $timestring,
|
||||||
|
bool $throw_exception = false
|
||||||
|
): string|int|float {
|
||||||
$timestamp = 0;
|
$timestamp = 0;
|
||||||
if (!preg_match("/(d|h|m|s|ms)/", (string)$timestring)) {
|
|
||||||
return $timestring;
|
|
||||||
}
|
|
||||||
$timestring = (string)$timestring;
|
|
||||||
// pos for preg match read + multiply factor
|
|
||||||
$timegroups = [2 => 86400, 4 => 3600, 6 => 60, 8 => 1];
|
|
||||||
$matches = [];
|
$matches = [];
|
||||||
// if start with -, strip and set negative
|
|
||||||
$negative = false;
|
|
||||||
if (preg_match("/^-/", $timestring)) {
|
|
||||||
$negative = true;
|
|
||||||
$timestring = substr($timestring, 1);
|
|
||||||
}
|
|
||||||
// preg match: 0: full string
|
// preg match: 0: full string
|
||||||
// 2, 4, 6, 8 are the to need values
|
// 2, 4, 6, 8 are the to need values
|
||||||
preg_match("/^((\d+)d ?)?((\d+)h ?)?((\d+)m ?)?((\d+)s ?)?((\d+)ms)?$/", $timestring, $matches);
|
if (
|
||||||
|
!preg_match(
|
||||||
|
"/^\s*(-)?\s*"
|
||||||
|
. "((\d+)\s*d(?:ay(?:s)?)?)?\s*"
|
||||||
|
. "((\d+)\s*h(?:our(?:s)?)?)?\s*"
|
||||||
|
. "((\d+)\s*m(?:in(?:ute)?(?:s)?)?)?\s*"
|
||||||
|
. "((\d+)\s*s(?:ec(?:ond)?(?:s)?)?)?\s*"
|
||||||
|
. "((\d+)\s*m(?:illi)?s(?:ec(?:ond)?(?:s)?)?)?\s*"
|
||||||
|
. "$/",
|
||||||
|
(string)$timestring,
|
||||||
|
$matches
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
if ($throw_exception) {
|
||||||
|
throw new \InvalidArgumentException(
|
||||||
|
'Invalid time string format, cannot parse: "' . (string)$timestring . '"',
|
||||||
|
1
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return $timestring;
|
||||||
|
}
|
||||||
|
if (count($matches) < 2) {
|
||||||
|
if ($throw_exception) {
|
||||||
|
throw new \InvalidArgumentException(
|
||||||
|
'Invalid time string format, no interval value found: "' . (string)$timestring . '"',
|
||||||
|
2
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return $timestring;
|
||||||
|
}
|
||||||
|
// pos for preg match read + multiply factor
|
||||||
|
$timegroups = [3 => 86400, 5 => 3600, 7 => 60, 9 => 1];
|
||||||
|
// if start with -, strip and set negative
|
||||||
|
$negative = false;
|
||||||
|
if (!empty($matches[1])) {
|
||||||
|
$negative = true;
|
||||||
|
}
|
||||||
// multiply the returned matches and sum them up. the last one (ms) is added with .
|
// multiply the returned matches and sum them up. the last one (ms) is added with .
|
||||||
foreach ($timegroups as $i => $time_multiply) {
|
foreach ($timegroups as $i => $time_multiply) {
|
||||||
if (isset($matches[$i]) && is_numeric($matches[$i])) {
|
if (isset($matches[$i]) && is_numeric($matches[$i])) {
|
||||||
$timestamp += (float)$matches[$i] * $time_multiply;
|
$timestamp += (float)$matches[$i] * $time_multiply;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isset($matches[10]) && is_numeric($matches[10])) {
|
if (isset($matches[11]) && is_numeric($matches[11])) {
|
||||||
$timestamp .= '.' . $matches[10];
|
// for milliseconds, we need to divide by 1000 and add them
|
||||||
|
$timestamp += ((float)$matches[11] / 1000);
|
||||||
}
|
}
|
||||||
if ($negative) {
|
if ($negative) {
|
||||||
// cast to flaot so we can do a negative multiplication
|
// cast to float so we can do a negative multiplication
|
||||||
$timestamp = (float)$timestamp * -1;
|
$timestamp = (float)$timestamp * -1;
|
||||||
}
|
}
|
||||||
return $timestamp;
|
return $timestamp;
|
||||||
|
|||||||
@@ -43,71 +43,70 @@ class Byte
|
|||||||
public static function humanReadableByteFormat(string|int|float $bytes, int $flags = 0): string
|
public static function humanReadableByteFormat(string|int|float $bytes, int $flags = 0): string
|
||||||
{
|
{
|
||||||
// if not numeric, return as is
|
// if not numeric, return as is
|
||||||
if (is_numeric($bytes)) {
|
if (!is_numeric($bytes)) {
|
||||||
// flags bit wise check
|
|
||||||
// remove space between number and suffix
|
|
||||||
if ($flags & self::BYTE_FORMAT_NOSPACE) {
|
|
||||||
$space = false;
|
|
||||||
} else {
|
|
||||||
$space = true;
|
|
||||||
}
|
|
||||||
// use sprintf instead of round
|
|
||||||
if ($flags & self::BYTE_FORMAT_ADJUST) {
|
|
||||||
$adjust = true;
|
|
||||||
} else {
|
|
||||||
$adjust = false;
|
|
||||||
}
|
|
||||||
// use SI 1000 mod and not 1024 mod
|
|
||||||
if ($flags & self::BYTE_FORMAT_SI) {
|
|
||||||
$si = true;
|
|
||||||
} else {
|
|
||||||
$si = false;
|
|
||||||
}
|
|
||||||
if ($flags > 7) {
|
|
||||||
throw new \InvalidArgumentException("Invalid flags parameter: $flags", 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// si or normal
|
|
||||||
$unit = $si ? 1000 : 1024;
|
|
||||||
// always positive
|
|
||||||
$abs_bytes = $bytes == PHP_INT_MIN ? PHP_INT_MAX : abs((float)$bytes);
|
|
||||||
// smaller than unit is always B
|
|
||||||
if ($abs_bytes < $unit) {
|
|
||||||
return $bytes . 'B';
|
|
||||||
}
|
|
||||||
// labels in order of size [Y, Z]
|
|
||||||
$labels = ['', 'K', 'M', 'G', 'T', 'P', 'E'];
|
|
||||||
// exp position calculation
|
|
||||||
$exp = (int)floor(log($abs_bytes, $unit));
|
|
||||||
// avoid printing out anything larger than max labels
|
|
||||||
if ($exp >= count($labels)) {
|
|
||||||
$exp = count($labels) - 1;
|
|
||||||
}
|
|
||||||
// deviation calculation
|
|
||||||
$dev = pow($unit, $exp) * ($unit - 0.05);
|
|
||||||
// shift the exp +1 for on the border units
|
|
||||||
if (
|
|
||||||
$exp < 6 &&
|
|
||||||
$abs_bytes > ($dev - (((int)$dev & 0xfff) == 0xd00 ? 52 : 0))
|
|
||||||
) {
|
|
||||||
$exp++;
|
|
||||||
}
|
|
||||||
// label name, including leading space if flagged
|
|
||||||
$pre = ($space ? ' ' : '') . ($labels[$exp] ?? '>E') . ($si ? 'i' : '') . 'B';
|
|
||||||
$bytes_calc = $abs_bytes / pow($unit, $exp);
|
|
||||||
// if original is negative, reverse
|
|
||||||
if ($bytes < 0) {
|
|
||||||
$bytes_calc *= -1;
|
|
||||||
}
|
|
||||||
if ($adjust) {
|
|
||||||
return sprintf("%.2f%s", $bytes_calc, $pre);
|
|
||||||
} else {
|
|
||||||
return round($bytes_calc, 2) . $pre;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// if anything other return as string
|
// if anything other return as string
|
||||||
return (string)$bytes;
|
return (string)$bytes;
|
||||||
}
|
}
|
||||||
|
// flags bit wise check
|
||||||
|
// remove space between number and suffix
|
||||||
|
if ($flags & self::BYTE_FORMAT_NOSPACE) {
|
||||||
|
$space = false;
|
||||||
|
} else {
|
||||||
|
$space = true;
|
||||||
|
}
|
||||||
|
// use sprintf instead of round
|
||||||
|
if ($flags & self::BYTE_FORMAT_ADJUST) {
|
||||||
|
$adjust = true;
|
||||||
|
} else {
|
||||||
|
$adjust = false;
|
||||||
|
}
|
||||||
|
// use SI 1000 mod and not 1024 mod
|
||||||
|
if ($flags & self::BYTE_FORMAT_SI) {
|
||||||
|
$si = true;
|
||||||
|
} else {
|
||||||
|
$si = false;
|
||||||
|
}
|
||||||
|
if ($flags > 7) {
|
||||||
|
throw new \InvalidArgumentException("Invalid flags parameter: $flags", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// si or normal
|
||||||
|
$unit = $si ? 1000 : 1024;
|
||||||
|
// always positive
|
||||||
|
$abs_bytes = $bytes == PHP_INT_MIN ? PHP_INT_MAX : abs((float)$bytes);
|
||||||
|
// smaller than unit is always B
|
||||||
|
if ($abs_bytes < $unit) {
|
||||||
|
return $bytes . 'B';
|
||||||
|
}
|
||||||
|
// labels in order of size [Y, Z]
|
||||||
|
$labels = ['', 'K', 'M', 'G', 'T', 'P', 'E'];
|
||||||
|
// exp position calculation
|
||||||
|
$exp = (int)floor(log($abs_bytes, $unit));
|
||||||
|
// avoid printing out anything larger than max labels
|
||||||
|
if ($exp >= count($labels)) {
|
||||||
|
$exp = count($labels) - 1;
|
||||||
|
}
|
||||||
|
// deviation calculation
|
||||||
|
$dev = pow($unit, $exp) * ($unit - 0.05);
|
||||||
|
// shift the exp +1 for on the border units
|
||||||
|
if (
|
||||||
|
$exp < 6 &&
|
||||||
|
$abs_bytes > ($dev - (((int)$dev & 0xfff) == 0xd00 ? 52 : 0))
|
||||||
|
) {
|
||||||
|
$exp++;
|
||||||
|
}
|
||||||
|
// label name, including leading space if flagged
|
||||||
|
$pre = ($space ? ' ' : '') . ($labels[$exp] ?? '>E') . ($si ? 'i' : '') . 'B';
|
||||||
|
$bytes_calc = $abs_bytes / pow($unit, $exp);
|
||||||
|
// if original is negative, reverse
|
||||||
|
if ($bytes < 0) {
|
||||||
|
$bytes_calc *= -1;
|
||||||
|
}
|
||||||
|
if ($adjust) {
|
||||||
|
return sprintf("%.2f%s", $bytes_calc, $pre);
|
||||||
|
} else {
|
||||||
|
return round($bytes_calc, 2) . $pre;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -154,7 +153,7 @@ class Byte
|
|||||||
if (!empty($matches[1])) {
|
if (!empty($matches[1])) {
|
||||||
$number_negative = true;
|
$number_negative = true;
|
||||||
}
|
}
|
||||||
if (isset($matches[2]) && isset($matches[3])) {
|
if (isset($matches[2])) {
|
||||||
// remove all non valid characters from the number
|
// remove all non valid characters from the number
|
||||||
$number = preg_replace('/[^0-9\.]/', '', $matches[2]);
|
$number = preg_replace('/[^0-9\.]/', '', $matches[2]);
|
||||||
// final clean up and convert to float
|
// final clean up and convert to float
|
||||||
|
|||||||
@@ -957,9 +957,9 @@ class Color
|
|||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @param HWB $hwb
|
* @param HWB $hwb
|
||||||
* @return Lch
|
* @return LCH
|
||||||
*/
|
*/
|
||||||
public static function hwbToLch(HWB $hwb): Lch
|
public static function hwbToLch(HWB $hwb): LCH
|
||||||
{
|
{
|
||||||
return self::rgbToLch(
|
return self::rgbToLch(
|
||||||
self::hwbToRgb($hwb)
|
self::hwbToRgb($hwb)
|
||||||
@@ -1078,10 +1078,10 @@ class Color
|
|||||||
/**
|
/**
|
||||||
* OkLab to Lch (CIE)
|
* OkLab to Lch (CIE)
|
||||||
*
|
*
|
||||||
* @param LAB $lab
|
* @param Lab $lab
|
||||||
* @return LCH
|
* @return LCH
|
||||||
*/
|
*/
|
||||||
public static function okLabToLch(LAB $lab): LCH
|
public static function okLabToLch(Lab $lab): LCH
|
||||||
{
|
{
|
||||||
return self::labToLch(
|
return self::labToLch(
|
||||||
self::okLabToLab($lab)
|
self::okLabToLab($lab)
|
||||||
@@ -1092,9 +1092,9 @@ class Color
|
|||||||
* Lch (CIE) to OkLab
|
* Lch (CIE) to OkLab
|
||||||
*
|
*
|
||||||
* @param LCH $lch
|
* @param LCH $lch
|
||||||
* @return LAB
|
* @return Lab
|
||||||
*/
|
*/
|
||||||
public static function lchToOkLab(LCH $lch): LAB
|
public static function lchToOkLab(LCH $lch): Lab
|
||||||
{
|
{
|
||||||
return self::labToOkLab(
|
return self::labToOkLab(
|
||||||
self::lchToLab($lch)
|
self::lchToLab($lch)
|
||||||
|
|||||||
@@ -27,10 +27,14 @@ class Json
|
|||||||
* set original value as array
|
* set original value as array
|
||||||
* @return array<mixed> returns an array from the json values
|
* @return array<mixed> returns an array from the json values
|
||||||
*/
|
*/
|
||||||
public static function jsonConvertToArray(?string $json, bool $override = false): array
|
public static function jsonConvertToArray(?string $json, bool $override = false, int $flags = 0): array
|
||||||
{
|
{
|
||||||
if ($json !== null) {
|
if ($json !== null) {
|
||||||
$_json = json_decode($json, true);
|
// if flags has JSON_THROW_ON_ERROR remove it
|
||||||
|
if ($flags & JSON_THROW_ON_ERROR) {
|
||||||
|
$flags = $flags & ~JSON_THROW_ON_ERROR;
|
||||||
|
}
|
||||||
|
$_json = json_decode($json, true, flags:$flags);
|
||||||
if (self::$json_last_error = json_last_error()) {
|
if (self::$json_last_error = json_last_error()) {
|
||||||
if ($override == true) {
|
if ($override == true) {
|
||||||
// init return as array with original as element
|
// init return as array with original as element
|
||||||
@@ -65,6 +69,25 @@ class Json
|
|||||||
return (string)$json_string;
|
return (string)$json_string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate if a json string could be decoded.
|
||||||
|
* Weill set the internval last error state and info can be read with jsonGetLastError
|
||||||
|
*
|
||||||
|
* @param string $json
|
||||||
|
* @param int $flags only JSON_INVALID_UTF8_IGNORE is currently allowed
|
||||||
|
* @return bool
|
||||||
|
* @throws \InvalidArgumentException if flags is invalid
|
||||||
|
*/
|
||||||
|
public static function jsonValidate(string $json, int $flags = 0): bool
|
||||||
|
{
|
||||||
|
if ($flags != 0 && $flags != JSON_INVALID_UTF8_IGNORE) {
|
||||||
|
throw new \InvalidArgumentException("For flag only 0 or JSON_INVALID_UTF8_IGNORE is allwed: " . $flags);
|
||||||
|
}
|
||||||
|
$json_valid = json_validate($json, flags:$flags);
|
||||||
|
self::$json_last_error = json_last_error();
|
||||||
|
return $json_valid;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* returns human readable string for json errors thrown in jsonConvertToArray
|
* returns human readable string for json errors thrown in jsonConvertToArray
|
||||||
* Source: https://www.php.net/manual/en/function.json-last-error.php
|
* Source: https://www.php.net/manual/en/function.json-last-error.php
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class RandomKey
|
|||||||
private static function validateRandomKeyData(array ...$key_range): string
|
private static function validateRandomKeyData(array ...$key_range): string
|
||||||
{
|
{
|
||||||
$key_character_range = Strings::buildCharStringFromLists(...$key_range);
|
$key_character_range = Strings::buildCharStringFromLists(...$key_range);
|
||||||
if (strlen(self::$key_character_range) <= 1) {
|
if (strlen($key_character_range) <= 1) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
return $key_character_range;
|
return $key_character_range;
|
||||||
|
|||||||
@@ -2232,9 +2232,9 @@ class IO
|
|||||||
$milliseconds = $matches[13] ?? '';
|
$milliseconds = $matches[13] ?? '';
|
||||||
|
|
||||||
// clean up, hide entries that have 00 in the time group
|
// clean up, hide entries that have 00 in the time group
|
||||||
$hour = $hour != '00' ? preg_replace('/^0/', '', $hour) : '';
|
$hour = !empty($hour) ? preg_replace('/^0/', '', $hour) : '';
|
||||||
$minutes = $minutes != '00' ? preg_replace('/^0/', '', $minutes) : '';
|
$minutes = !empty($minutes) ? preg_replace('/^0/', '', $minutes) : '';
|
||||||
$seconds = $seconds != '00' ? preg_replace('/^0/', '', $seconds) : '';
|
$seconds = !empty($seconds) ? preg_replace('/^0/', '', $seconds) : '';
|
||||||
|
|
||||||
// strip any leading or trailing spaces
|
// strip any leading or trailing spaces
|
||||||
$time_string = trim(
|
$time_string = trim(
|
||||||
@@ -2562,21 +2562,27 @@ class IO
|
|||||||
// set field names
|
// set field names
|
||||||
$this->cursor_ext[$query_hash]['field_names'] = [];
|
$this->cursor_ext[$query_hash]['field_names'] = [];
|
||||||
for ($i = 0; $i < $this->cursor_ext[$query_hash]['num_fields']; $i++) {
|
for ($i = 0; $i < $this->cursor_ext[$query_hash]['num_fields']; $i++) {
|
||||||
$this->cursor_ext[$query_hash]['field_names'][] =
|
if (
|
||||||
$this->db_functions->__dbFieldName(
|
($field_name = $this->db_functions->__dbFieldName(
|
||||||
$this->cursor_ext[$query_hash]['cursor'],
|
$this->cursor_ext[$query_hash]['cursor'],
|
||||||
$i
|
$i
|
||||||
);
|
)) !== false
|
||||||
|
) {
|
||||||
|
$this->cursor_ext[$query_hash]['field_names'][] = $field_name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$this->field_names = $this->cursor_ext[$query_hash]['field_names'];
|
$this->field_names = $this->cursor_ext[$query_hash]['field_names'];
|
||||||
// field types
|
// field types
|
||||||
$this->cursor_ext[$query_hash]['field_types'] = [];
|
$this->cursor_ext[$query_hash]['field_types'] = [];
|
||||||
for ($i = 0; $i < $this->cursor_ext[$query_hash]['num_fields']; $i++) {
|
for ($i = 0; $i < $this->cursor_ext[$query_hash]['num_fields']; $i++) {
|
||||||
$this->cursor_ext[$query_hash]['field_types'][] =
|
if (
|
||||||
$this->db_functions->__dbFieldType(
|
($field_type = $this->db_functions->__dbFieldType(
|
||||||
$this->cursor_ext[$query_hash]['cursor'],
|
$this->cursor_ext[$query_hash]['cursor'],
|
||||||
$i
|
$i
|
||||||
);
|
)) !== false
|
||||||
|
) {
|
||||||
|
$this->cursor_ext[$query_hash]['field_types'][] = $field_type;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$this->field_types = $this->cursor_ext[$query_hash]['field_types'];
|
$this->field_types = $this->cursor_ext[$query_hash]['field_types'];
|
||||||
// combined name => type
|
// combined name => type
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ enum Convert: int
|
|||||||
/**
|
/**
|
||||||
* Get internal name from int value
|
* Get internal name from int value
|
||||||
*
|
*
|
||||||
* @param int $value
|
* @param int $value
|
||||||
* @return self
|
* @return self
|
||||||
*/
|
*/
|
||||||
public static function fromValue(int $value): self
|
public static function fromValue(int $value): self
|
||||||
|
|||||||
@@ -536,7 +536,7 @@ class PgSQL implements Interface\SqlFunctions
|
|||||||
$connection_string[] = 'sslmode=' . $db_ssl;
|
$connection_string[] = 'sslmode=' . $db_ssl;
|
||||||
}
|
}
|
||||||
// connect
|
// connect
|
||||||
$this->dbh = pg_connect(join(' ', $connection_string));
|
$this->dbh = @pg_connect(join(' ', $connection_string));
|
||||||
return $this->dbh;
|
return $this->dbh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,11 +32,11 @@ class FileWriter
|
|||||||
if (!is_writeable($folder)) {
|
if (!is_writeable($folder)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// if last is not / then add
|
if (!is_dir($folder)) {
|
||||||
if (substr($folder, -1, 1) != DIRECTORY_SEPARATOR) {
|
return false;
|
||||||
$folder .= DIRECTORY_SEPARATOR;
|
|
||||||
}
|
}
|
||||||
self::$debug_folder = $folder;
|
// if last is not / then add
|
||||||
|
self::$debug_folder = rtrim($folder, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -134,8 +134,8 @@ class Support
|
|||||||
* Convert bool value to string value. Short name alias for printBool
|
* Convert bool value to string value. Short name alias for printBool
|
||||||
*
|
*
|
||||||
* @param bool $bool Bool value to be transformed
|
* @param bool $bool Bool value to be transformed
|
||||||
* @param string $true [='true'] Override default string 'true'
|
* @param string $true [=true] Override default string 'true'
|
||||||
* @param string $false [=false'] Override default string 'false'
|
* @param string $false [=false] Override default string 'false'
|
||||||
* @return string $true or $false string for true/false bool
|
* @return string $true or $false string for true/false bool
|
||||||
*/
|
*/
|
||||||
public static function prBl(
|
public static function prBl(
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ class L10n
|
|||||||
* @param string $locale language name, if not set, try previous set
|
* @param string $locale language name, if not set, try previous set
|
||||||
* @param string $domain set name for mo file, if not set, try previous set
|
* @param string $domain set name for mo file, if not set, try previous set
|
||||||
* @param string $path path, if not set try to get from paths array, else self
|
* @param string $path path, if not set try to get from paths array, else self
|
||||||
* @param string $override_encoding if locale does not env encoding set, use this one
|
* @param string $override_encoding if locale does not have encoding set, use this one
|
||||||
* @return GetTextReader the main gettext reader object
|
* @return GetTextReader the main gettext reader object
|
||||||
*/
|
*/
|
||||||
public function getTranslator(
|
public function getTranslator(
|
||||||
@@ -301,7 +301,7 @@ class L10n
|
|||||||
* Get the local as array same to the GetLocale::setLocale return
|
* Get the local as array same to the GetLocale::setLocale return
|
||||||
* This does not set from outside, but only what is set in the l10n class
|
* This does not set from outside, but only what is set in the l10n class
|
||||||
*
|
*
|
||||||
* @return array{locale: string, lang: string, lang_short: string, domain: string, encoding: string, path: string}
|
* @return array{locale:string,lang:string,lang_short:string,domain:string,encoding:string,path:string}
|
||||||
*/
|
*/
|
||||||
public function getLocaleAsArray(): array
|
public function getLocaleAsArray(): array
|
||||||
{
|
{
|
||||||
@@ -321,7 +321,7 @@ class L10n
|
|||||||
* parse the locale string for further processing
|
* parse the locale string for further processing
|
||||||
*
|
*
|
||||||
* @param string $locale Locale to parse
|
* @param string $locale Locale to parse
|
||||||
* @return array<string,string|null> array with lang, country, charset, modifier
|
* @return array{lang:string|null,country:string|null,charset:string|null,modifier:string|null} parsed locale
|
||||||
*/
|
*/
|
||||||
public static function parseLocale(string $locale = ''): array
|
public static function parseLocale(string $locale = ''): array
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ enum Flag: int
|
|||||||
/**
|
/**
|
||||||
* Get internal name from int value
|
* Get internal name from int value
|
||||||
*
|
*
|
||||||
* @param int $value
|
* @param value-of<self::VALUES> $value
|
||||||
* @return self
|
* @return self
|
||||||
*/
|
*/
|
||||||
public static function fromValue(int $value): self
|
public static function fromValue(int $value): self
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ enum Level: int
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param value-of<self::NAMES>|LogLevel::*|'Debug'|'Info'|'Notice'|'Warning'|'Error'|'Critical'|'Alert'|'Emergency' $name
|
* @param value-of<self::NAMES>|LogLevel::*|'Debug'|'Info'|'Notice'|'Warning'|'Error'|'Critical'|'Alert'|'Emergency' $name
|
||||||
* @return static
|
* @return self
|
||||||
*/
|
*/
|
||||||
public static function fromName(string $name): self
|
public static function fromName(string $name): self
|
||||||
{
|
{
|
||||||
@@ -104,7 +104,7 @@ enum Level: int
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param value-of<self::VALUES> $value
|
* @param value-of<self::VALUES> $value
|
||||||
* @return static
|
* @return self
|
||||||
*/
|
*/
|
||||||
public static function fromValue(int $value): self
|
public static function fromValue(int $value): self
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -178,11 +178,11 @@ class Elements
|
|||||||
"/(href=\")?(\>)?\b($protRegex)([\w\.\-?&=+%#~,;\/]+)\b([\.\-?&=+%#~,;\/]*)(\|([^\||^#]+)(#([^\|]+))?\|)?/",
|
"/(href=\")?(\>)?\b($protRegex)([\w\.\-?&=+%#~,;\/]+)\b([\.\-?&=+%#~,;\/]*)(\|([^\||^#]+)(#([^\|]+))?\|)?/",
|
||||||
function ($matches) {
|
function ($matches) {
|
||||||
return self::createUrl(
|
return self::createUrl(
|
||||||
$matches[1] ?? '',
|
$matches[1],
|
||||||
$matches[2] ?? '',
|
$matches[2],
|
||||||
$matches[3] ?? '',
|
$matches[3],
|
||||||
$matches[4] ?? '',
|
$matches[4],
|
||||||
$matches[5] ?? '',
|
$matches[5],
|
||||||
$matches[7] ?? '',
|
$matches[7] ?? '',
|
||||||
$matches[9] ?? ''
|
$matches[9] ?? ''
|
||||||
);
|
);
|
||||||
@@ -232,8 +232,15 @@ class Elements
|
|||||||
* @param string $class style sheet
|
* @param string $class style sheet
|
||||||
* @return string correct string for url href process
|
* @return string correct string for url href process
|
||||||
*/
|
*/
|
||||||
private static function createUrl($href, $atag, $_1, $_2, $_3, $name, $class): string
|
private static function createUrl(
|
||||||
{
|
string $href,
|
||||||
|
string $atag,
|
||||||
|
string $_1,
|
||||||
|
string $_2,
|
||||||
|
string $_3,
|
||||||
|
string $name,
|
||||||
|
string $class
|
||||||
|
): string {
|
||||||
// $this->debug('URL', "1: $_1 - 2: $_2 - $_3 - atag: $atag - name: $name - class: $class");
|
// $this->debug('URL', "1: $_1 - 2: $_2 - $_3 - atag: $atag - name: $name - class: $class");
|
||||||
// if $_1 ends with //, then we strip $_1 complete & target is also blanked (its an internal link)
|
// if $_1 ends with //, then we strip $_1 complete & target is also blanked (its an internal link)
|
||||||
if (preg_match("/\/\/$/", $_1) && preg_match("/^\//", $_2)) {
|
if (preg_match("/\/\/$/", $_1) && preg_match("/^\//", $_2)) {
|
||||||
@@ -250,11 +257,8 @@ class Elements
|
|||||||
. "##GT##" . ($name ? $name : $_2 . $_3) . "##LT##/a##GT##";
|
. "##GT##" . ($name ? $name : $_2 . $_3) . "##LT##/a##GT##";
|
||||||
} elseif ($href && !$atag) {
|
} elseif ($href && !$atag) {
|
||||||
return "href=##QUOT##$_1$_2$_3##QUOT##";
|
return "href=##QUOT##$_1$_2$_3##QUOT##";
|
||||||
} elseif ($atag) {
|
|
||||||
return $atag . $_2 . $_3;
|
|
||||||
} else {
|
|
||||||
return $href;
|
|
||||||
}
|
}
|
||||||
|
return $atag . $_2 . $_3;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -269,8 +273,15 @@ class Elements
|
|||||||
* @param string $class style sheet
|
* @param string $class style sheet
|
||||||
* @return string created html email a href string
|
* @return string created html email a href string
|
||||||
*/
|
*/
|
||||||
private static function createEmail($mailto, $atag, $_1, $_2, $_3, $title, $class)
|
private static function createEmail(
|
||||||
{
|
string $mailto,
|
||||||
|
string $atag,
|
||||||
|
string $_1,
|
||||||
|
string $_2,
|
||||||
|
string $_3,
|
||||||
|
string $title,
|
||||||
|
string $class
|
||||||
|
): string {
|
||||||
$email = $_1 . "@" . $_2 . "." . $_3;
|
$email = $_1 . "@" . $_2 . "." . $_3;
|
||||||
if (!$mailto && !$atag) {
|
if (!$mailto && !$atag) {
|
||||||
return "##LT##a href=##QUOT##mailto:" . $email . "##QUOT##"
|
return "##LT##a href=##QUOT##mailto:" . $email . "##QUOT##"
|
||||||
@@ -278,12 +289,8 @@ class Elements
|
|||||||
. "##GT##" . ($title ? $title : $email) . "##LT##/a##GT##";
|
. "##GT##" . ($title ? $title : $email) . "##LT##/a##GT##";
|
||||||
} elseif ($mailto && !$atag) {
|
} elseif ($mailto && !$atag) {
|
||||||
return "mailto:" . $email;
|
return "mailto:" . $email;
|
||||||
} elseif ($atag) {
|
|
||||||
return $atag . $email;
|
|
||||||
} else {
|
|
||||||
// else just return email as is
|
|
||||||
return $email;
|
|
||||||
}
|
}
|
||||||
|
return $atag . $email;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -954,11 +954,10 @@ class Curl implements Interface\RequestsInterface
|
|||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
unset($this->config['headers'][$header_key]);
|
unset($this->config['headers'][$header_key]);
|
||||||
unset($this->headers_named[$header_key]);
|
unset($this->headers_named[strtolower($header_key)]);
|
||||||
} elseif (
|
} elseif (
|
||||||
// string value, array keys = in
|
// right side is array, and value is anything string or array
|
||||||
// or both array and not a full match in the one before
|
// if right side is string, and we give value array, we do nothing
|
||||||
(is_string($value) || is_array($value)) &&
|
|
||||||
is_array($this->config['headers'][$header_key])
|
is_array($this->config['headers'][$header_key])
|
||||||
) {
|
) {
|
||||||
// part remove of key, value must be array
|
// part remove of key, value must be array
|
||||||
@@ -966,10 +965,14 @@ class Curl implements Interface\RequestsInterface
|
|||||||
$value = [$value];
|
$value = [$value];
|
||||||
}
|
}
|
||||||
// array values so we rewrite the key pos
|
// array values so we rewrite the key pos
|
||||||
$this->config['headers'][$header_key] = array_values(array_diff(
|
/** @var array<int|string,string> $headers */
|
||||||
$this->config['headers'][$header_key],
|
$headers = $this->config['headers'][$header_key];
|
||||||
$value
|
$this->config['headers'][$header_key] = array_values(
|
||||||
));
|
array_diff(
|
||||||
|
$headers,
|
||||||
|
$value
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user