Compare commits

...
33 Commits
Author SHA1 Message Date
cliphouse 369f2e2586 Immutable hash for arrays, add not sort keys flag 2026-09-18 21:53:36 +09:00
cliphouse 3a33f07ae7 Add DB:IO strip non assoc entries from result
if we have a mixed result, strip all int key (non assoc) entries from the result
2026-09-18 18:56:43 +09:00
cliphouse 0b057864ae Hash: immutable hash over array
with sorted keys, but arrays stay unsorted
2026-09-18 18:36:40 +09:00
cliphouse 2bb405d741 Add tests for new array functions, other minro fixes for phan && phpstan checks 2026-09-18 17:33:44 +09:00
cliphouse c38ff8b405 Merge branch 'development' into feature/TTD-2662/function-add-to-ArrayCombined 2026-09-18 15:44:01 +09:00
cliphouse 66d5f6247b Add eslint packages 2026-09-18 15:43:01 +09:00
cliphouse 74da813832 Add logging to phpunit.xml 2026-06-25 19:08:57 +09:00
cliphouse 8c7e2782ae DB IO PgSQL supress warnings if we cannot connect 2026-06-25 18:22:13 +09:00
cliphouse 7bc7674021 Cleaned up all warnings for phpunit tests 2026-06-25 18:10:18 +09:00
cliphouse 3f02bee643 Test updates with skip for DB, URL check skip and lookup fix
curl fix for printing out response, we just want true/false if connect worked
skip curl tests where we need a base url
skip any DB tests if there is no DB
update the caller method list test
2026-06-25 17:24:45 +09:00
cliphouse e3306a096f Tests updates: DB try catch for the ACL test, curl setup fix
curl init alone is not enought to validate a url.

for DB conneciton use try/catch to get errors and skip test
2026-06-25 16:40:10 +09:00
cliphouse d66fce374c Update tests for fsetFolder 2026-06-25 16:26:15 +09:00
cliphouse 7e01886ad8 Test updates: add timezone, some fixes for debug callers 2026-06-25 15:52:53 +09:00
cliphouse e1109e925b phpstan fixes 2026-06-25 14:12:47 +09:00
cliphouse 6c67ab6259 Update for humanReadableByteFormat, update edit.jq.js
edit.jq.js: remove deprecated function decodeHtmlEntities, use utils.js instead

update for humanReadableByteFormat to return non numeric first and then proceed with
the convert
2026-05-27 09:00:48 +09:00
cliphouse c467ed326c Logger Level returns self 2026-05-20 18:46:57 +09:00
cliphouse 40cd64f667 Update JS Utils to v1.1.0, back add html entities convert to Javascript 2026-05-20 18:45:54 +09:00
Clemens Schwaighofer 05dae1031a Locale files test update, L10n PHPdoc typo fix 2026-05-12 14:49:07 +09:00
Clemens Schwaighofer 82ba2a189a L10n update for PHPdoc array descriptions
Make the PHPdoc array description detailed for the parseLocale method
2026-05-12 11:39:19 +09:00
Clemens Schwaighofer a8755c8c0f phpstan check fixes 2026-05-11 15:31:59 +09:00
Clemens Schwaighofer 85f7e114b0 Add throw exception to get mime info if there is no mime type found
Instead of returning empty
2026-05-11 13:38:17 +09:00
Clemens Schwaighofer 6b1261b157 Update dotenv to v3 2026-04-20 16:19:19 +09:00
Clemens Schwaighofer b695c3ffdc phive updates 2026-04-20 10:36:53 +09:00
Clemens Schwaighofer e2362418aa phive updates 2026-04-20 10:36:26 +09:00
Clemens Schwaighofer 71e34848d9 Merge branch 'development' into feature/TTD-2662/function-add-to-ArrayCombined 2026-04-17 18:57:59 +09:00
Clemens Schwaighofer 90d76bbd6c phpunit coverate checks added with report to HTMl, phpstan check fixes for enum 2026-04-17 18:56:07 +09:00
Clemens Schwaighofer f275180571 Add bew array handler functions for various array interfaces
get random entry, remove array entry by value, add string to each entry in array, create sort by array key
2026-03-25 18:51:28 +09:00
Clemens Schwaighofer 188f0b57d0 Clean up .gitignore and add coverage option to phpunit.sh 2026-02-27 10:58:05 +09:00
Clemens Schwaighofer b84fb5cef5 Comemit message fix for function param (phpdoc) 2026-02-17 18:16:16 +09:00
Clemens Schwaighofer 9a28c86991 json test file update 2026-01-22 11:51:32 +09:00
Clemens Schwaighofer 38b2ffe82a jsonConvertToArray with JSON_INVALID_UTF8_IGNORE does not work
json_decode JSON_INVALID_UTF8_IGNORE is not honoring any of those flags at the moment
2026-01-22 11:44:11 +09:00
Clemens Schwaighofer 6e547abccb Fix text in check runners 2026-01-22 11:31:01 +09:00
Clemens Schwaighofer 676af5e1a4 Add json validation and update tests
Also add removal of THROW flag for json decode to not throw an exception if if wanted

Add jquery 4.0.0 libs
2026-01-22 11:08:18 +09:00
70 changed files with 11026 additions and 357 deletions
+4 -5
View File
@@ -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
View File
@@ -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>
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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 -2
View File
@@ -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/"
); );
+3 -3
View File
@@ -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"
+3 -3
View File
@@ -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"
+3 -3
View File
@@ -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"
+3 -3
View File
@@ -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);
} }
} }
+6
View File
@@ -80,6 +80,7 @@ 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
try {
self::$db = new \CoreLibs\DB\IO( self::$db = new \CoreLibs\DB\IO(
[ [
'db_name' => $db_name, 'db_name' => $db_name,
@@ -95,6 +96,11 @@ final class CoreLibsACLLoginTest extends TestCase
], ],
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;
@@ -16,7 +16,7 @@ use PHPUnit\Framework\TestCase;
*/ */
final class CoreLibsCombinedArrayHandlerTest extends TestCase final class CoreLibsCombinedArrayHandlerTest extends TestCase
{ {
// we use that for all /** @var array<mixed> we use that for all */
public static $array = [ public static $array = [
'a' => [ 'a' => [
'b' => 'bar', 'b' => 'bar',
@@ -51,7 +51,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @return array * @return array<mixed>
*/ */
public function arraySearchRecursiveProvider(): array public function arraySearchRecursiveProvider(): array
{ {
@@ -110,7 +110,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @return array * @return array<mixed>
*/ */
public function arraySearchRecursiveAllProvider(): array public function arraySearchRecursiveAllProvider(): array
{ {
@@ -182,7 +182,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @return array * @return array<mixed>
*/ */
public function arraySearchSimpleProvider(): array public function arraySearchSimpleProvider(): array
{ {
@@ -383,7 +383,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @return array * @return array<mixed>
*/ */
public function arraySearchKeyProvider(): array public function arraySearchKeyProvider(): array
{ {
@@ -565,7 +565,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/** /**
* provides array listing for the merge test * provides array listing for the merge test
* *
* @return array * @return array<mixed>
*/ */
public function arrayMergeRecursiveProvider(): array public function arrayMergeRecursiveProvider(): array
{ {
@@ -602,7 +602,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/** /**
* for warning checks * for warning checks
* *
* @return array * @return array<mixed>
*/ */
public function arrayMergeRecursiveProviderWarning(): array public function arrayMergeRecursiveProviderWarning(): array
{ {
@@ -634,7 +634,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @return array * @return array<mixed>
*/ */
public function arrayCompareProvider(): array public function arrayCompareProvider(): array
{ {
@@ -665,7 +665,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @return array * @return array<mixed>
*/ */
public function inArrayAnyProvider(): array public function inArrayAnyProvider(): array
{ {
@@ -688,6 +688,11 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
]; ];
} }
/**
* Undocumented function
*
* @return array<mixed>
*/
public function genAssocArrayProvider(): array public function genAssocArrayProvider(): array
{ {
return [ return [
@@ -764,7 +769,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @return array * @return array<mixed>
*/ */
public function flattenArrayProvider(): array public function flattenArrayProvider(): array
{ {
@@ -808,7 +813,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/** /**
* use the flattenArrayProvider and replace 1 with 2 array pos * use the flattenArrayProvider and replace 1 with 2 array pos
* *
* @return array * @return array<mixed>
*/ */
public function flattenArrayKeyProvider(): array public function flattenArrayKeyProvider(): array
{ {
@@ -825,7 +830,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/** /**
* use the flattenArrayProvider and replace 1 with array pos * use the flattenArrayProvider and replace 1 with array pos
* *
* @return array * @return array<mixed>
*/ */
public function flattenArrayKeyLeavesOnlyProvider(): array public function flattenArrayKeyLeavesOnlyProvider(): array
{ {
@@ -842,7 +847,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
/** /**
* Undocumented function * Undocumented function
* *
* @return array * @return array<mixed>
*/ */
public function arrayFlatForKeyProvider(): array public function arrayFlatForKeyProvider(): array
{ {
@@ -906,6 +911,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
]; ];
} }
// MARK: arraySearchRecursive
/** /**
* Undocumented function * Undocumented function
* *
@@ -926,6 +933,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
); );
} }
// MARK: arraySearchRecursiveAll
/** /**
* Undocumented function * Undocumented function
* *
@@ -947,6 +956,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
); );
} }
// MARK: arraySearchSimple
/** /**
* Undocumented function * Undocumented function
* *
@@ -969,6 +980,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
); );
} }
// MARK: arraySearchKey
/** /**
* Undocumented function * Undocumented function
* *
@@ -1007,6 +1020,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
); );
} }
// MARK: arrayMergeRecursive
/** /**
* Undocumented function * Undocumented function
* *
@@ -1031,6 +1046,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
); );
} }
// MARK: arrayMergeRecursive
/** /**
* Undocumented function * Undocumented function
* *
@@ -1063,6 +1080,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
restore_error_handler(); restore_error_handler();
} }
// MARK: arrayDiff
/** /**
* Undocumented function * Undocumented function
* *
@@ -1083,6 +1102,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
); );
} }
// MARK: inArrayAny
/** /**
* Undocumented function * Undocumented function
* *
@@ -1103,6 +1124,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
); );
} }
// MARK: genAssocArray
/** /**
* Undocumented function * Undocumented function
* *
@@ -1125,6 +1148,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
); );
} }
// MARK: flattenArray
/** /**
* Undocumented function * Undocumented function
* *
@@ -1144,6 +1169,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
); );
} }
// MARK: flattenArrayKey
/** /**
* Undocumented function * Undocumented function
* *
@@ -1163,6 +1190,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
); );
} }
// MARK: flattenArrayKeyLeavesOnly
/** /**
* Undocumented function * Undocumented function
* *
@@ -1182,6 +1211,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
); );
} }
// MARK: arrayFlatForKey
/** /**
* Undocumented function * Undocumented function
* *
@@ -1202,6 +1233,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
); );
} }
// MARK: arrayGetPrevKey, arrayGetNextKey
/** /**
* Undocumented function * Undocumented function
* *
@@ -1266,7 +1299,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]
* *
@@ -1294,6 +1328,13 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
); );
} }
// MARK: arrayReturnMatchingKeyOnly
/**
* Undocumented function
*
* @return array
*/
public function providerReturnMatchingKeyOnley(): array public function providerReturnMatchingKeyOnley(): array
{ {
return [ return [
@@ -1379,6 +1420,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
); );
} }
// MARK: arrayModifyKey
/** /**
* provider for arrayModifyKey * provider for arrayModifyKey
* *
@@ -1491,6 +1534,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
); );
} }
// MARK: sortArray
/** /**
* sort * sort
* *
@@ -1710,7 +1755,9 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
} }
} }
/** // MARK: ksortArray
/**
* sort * sort
* *
* @return array * @return array
@@ -1866,6 +1913,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
} }
} }
// MARK: findArraysMissingKey
/** /**
* Undocumented function * Undocumented function
* *
@@ -2033,6 +2082,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
); );
} }
// MARK: selectArrayFromOption
/** /**
* Undocumented function * Undocumented function
* *
@@ -2378,6 +2429,316 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
$result $result
); );
} }
// MARK: getRandomEntryFromArrayProvider
/**
* Get random entry from array provider
*
* @return array<mixed>
*/
public function getRandomEntryFromArrayProvider(): array
{
return [
'empty array' => [
[],
],
'single element array' => [
['only'],
],
'multiple elements array' => [
['first', 'second', 'third'],
],
];
}
/**
* Undocumented function
*
* @covers ::getRandomEntryFromArray
* @dataProvider getRandomEntryFromArrayProvider
* @testdox getRandomEntryFromArray get random value from array [$_dataName]
*
* @param array $input
* @return void
*/
public function testGetRandomEntryFromArray(array $input): void
{
$result = \CoreLibs\Combined\ArrayHandler::getRandomEntryFromArray($input);
if (empty($input)) {
$this->assertNull($result);
} else {
$this->assertContains($result, $input);
}
}
// MARK: removeArrayEntryByValue
/**
* Remove array entry by value provider
*
* @return array<mixed>
*/
public function removeArrayEntryByValueProvider(): array
{
return [
'empty array' => [
[],
'',
null,
[],
],
'single element array' => [
['only'],
'only',
null,
[]
],
'single element array, not found' => [
['only'],
'foo',
null,
['only']
],
'multiple elements array' => [
['first', 'second', 'third'],
'second',
null,
['first', 'third'],
],
'array with multiple identical elements' => [
['first', 'second', 'first', 'third'],
'first',
null,
['second', 'third'],
],
'array with multiple identical elements, other remove' => [
['first', 'second', 'first', 'third'],
'second',
null,
['first', 'first', 'third'],
],
'array with key value entries' => [
[
'key1' => 'value1',
'key2' => 'value2',
'key3' => 'value3',
],
'value2',
null,
[
'key1' => 'value1',
'key3' => 'value3',
]
],
'nested array, array match' => [
[
['first', 'second'],
['third', 'fourth'],
],
['third', 'fourth'],
null,
[
['first', 'second'],
],
],
'strict test, off' => [
['3', 3,],
'3',
null,
[],
],
'strict test, on' => [
['3', 3,],
'3',
true,
[3,],
],
'strict test bool, off' => [
['false', false, 0],
false,
null,
['false'],
],
'strict test bool, on' => [
['false', false, 0],
false,
true,
['false', 0],
],
'strict test float, off' => [
['3.14', 3.14],
3.14,
null,
[],
],
'strict test float, on' => [
['3.14', 3.14],
3.14,
true,
['3.14'],
],
'stric test float and int, off' => [
['1.0', '1', 1.0, 1],
1,
null,
[],
],
'stric test float and int, on' => [
['1.0', '1', 1.0, 1],
1,
true,
['1.0', '1', 1.0],
],
];
}
/**
* Test for removeArrayEntryByValue function
*
* @covers ::removeArrayEntryByValue
* @dataProvider removeArrayEntryByValueProvider
* @testdox removeArrayEntryByValue Remove $value from array $input, with $strict [$_dataName]
*
* @param array $input
* @param string|int|float|bool|array $value
* @param bool|null $strict
* @param array $expected
* @return void
*/
public function testRemoveArrayEntryByValue(
array $input,
string|int|float|bool|array $value,
?bool $strict,
array $expected
): void {
if ($strict !== null) {
$result = \CoreLibs\Combined\ArrayHandler::removeArrayEntryByValue($input, $value, $strict);
} else {
$result = \CoreLibs\Combined\ArrayHandler::removeArrayEntryByValue($input, $value);
}
$this->assertEquals(array_values($expected), array_values($result));
}
// MARK: addStringToEachValueInArray
/**
* Data provider for addStringToEachValueInArray tests.
*
* @return array
*/
public function addStringToEachValueInArrayProvider(): array
{
return [
'empty array' => [
[],
'string',
null,
[],
],
'empty string to add' => [
['a', 'b'],
'',
null,
['a', 'b'],
],
'prefix true' => [
['a', 'b'],
'pre_',
true,
['pre_a', 'pre_b'],
],
'prefix false' => [
['a', 'b'],
'_suf',
false,
['a_suf', 'b_suf'],
],
'mixed values' => [
['a', 'b', 'c', 5, 6],
'X',
true,
['Xa', 'Xb', 'Xc', 'X5', 'X6'],
]
];
}
/**
* Test for addStringToEachValueInArray function
*
* @covers ::addStringToEachValueInArray
* @dataProvider addStringToEachValueInArrayProvider
* @testdox addStringToEachValueInArray Add $string_to_add to each value in $array, with $prefix [$_dataName]
*
* @param array $array
* @param string $string_to_add
* @param bool|null $prefix
* @param array|null $expected
* @return void
*/
public function testAddStringToEachValueInArray(
array $array,
string $string_to_add,
?bool $prefix,
?array $expected
) {
if ($prefix == null) {
$result = \CoreLibs\Combined\ArrayHandler::addStringToEachValueInArray($array, $string_to_add);
} else {
$result = \CoreLibs\Combined\ArrayHandler::addStringToEachValueInArray($array, $string_to_add, $prefix);
}
$this->assertEquals($expected, $result);
}
// MARK: createSortedArrayByKey
/**
* Data provider for createSortedArrayByKey tests.
*
* @return array
*/
public function createSortedArrayByKeyProvider(): array
{
return [
'empty' => [
[],
[],
],
'flat array' => [
['b' => 2, 'a' => 1, 'c' => 3],
['a' => 1, 'b' => 2, 'c' => 3],
],
'nested array' => [
['b' => 2, 'a' => 1, 'c' => ['d' => 4, 'b' => 2]],
['a' => 1, 'b' => 2, 'c' => ['b' => 2, 'd' => 4]],
],
'deeply nested array' => [
['b' => 2, 'a' => 1, 'c' => ['d' => 4, 'b' => 2, 'e' => ['g' => 7, 'f' => 6]]],
['a' => 1, 'b' => 2, 'c' => ['b' => 2, 'd' => 4, 'e' => ['f' => 6, 'g' => 7]]],
],
'mixed key type' => [
['b' => 2, 1 => 'one', 'a' => 1],
[1 => 'one', 'a' => 1, 'b' => 2],
],
];
}
/**
* Test for createSortedArrayByKey function
*
* @covers ::createSortedArrayByKey
* @dataProvider createSortedArrayByKeyProvider
* @testdox createSortedArrayByKey Sort the array by keys recursively [$_dataName]
*
* @param array $input
* @param array $expected
* @return void
*/
public function testCreateSortedArrayByKey(array $input, array $expected): void
{
$result = \CoreLibs\Combined\ArrayHandler::createSortedArrayByKey($input);
$this->assertEquals($expected, $result);
}
} }
// __END__ // __END__
@@ -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
@@ -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]
* *
@@ -421,6 +421,100 @@ final class CoreLibsCreateHashTest extends TestCase
'hash hmac valid' 'hash hmac valid'
); );
} }
// MARK: generateImmutableHashForArray
/**
* Data provider for testGenerateImmutableHashForArray.
*
* @return array
*/
public function generateImmutableHashForArrayProvider(): array
{
return [
'Empty array' => [
[],
null,
'064f01fe',
],
'Simple array' => [
['key' => 'value'],
null,
'78f40899',
],
'flat array a' => [
[0, 1, 'b', 'c', 'a'],
null,
'ccec0f5b',
],
'flat array b' => [
['b', 'c', 'a', 1, 0],
null,
'c6040f5b',
],
'flat array b, not sorted' => [
['b', 'c', 'a', 1, 0],
false,
'c6040f5b',
],
'key array a' => [
['A' => 0, 'F' => 1, 'C' => 'b', 'K' => 'c', 'B' => 'a'],
null,
'01f11355',
],
'key array a, not sorted' => [
['A' => 0, 'F' => 1, 'C' => 'b', 'K' => 'c', 'B' => 'a'],
false,
'04911355',
],
'key array b' => [
['A' => 0, 'B' => 'a', 'C' => 'b', 'F' => 1, 'K' => 'c'],
null,
'01f11355',
],
'key array b, not sorted' => [
['A' => 0, 'B' => 'a', 'C' => 'b', 'F' => 1, 'K' => 'c'],
false,
'01f11355',
],
'complex nested array' => [
[
'level1' => [
'level2' => [
'level3' => 'value'
]
]
],
null,
'd8de1565',
]
];
}
/**
* Test for generating an immutable hash from an array.
*
* @covers ::generateImmutableHashForArray
* @dataProvider generateImmutableHashForArrayProvider
* @testdox generate immutable hash for array with result $expected [$_dataName]
*
* @param array<mixed> $input
* @param string $expected
*/
public function testGenerateImmutableHashForArray(array $input, ?bool $sort_keys, string $expected): void
{
if ($sort_keys === null) {
$this->assertEquals(
$expected,
\CoreLibs\Create\Hash::generateImmutableHashForArray($input)
);
} else {
$this->assertEquals(
$expected,
\CoreLibs\Create\Hash::generateImmutableHashForArray($input, $sort_keys)
);
}
}
} }
// __END__ // __END__
@@ -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
+59 -5
View File
@@ -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
try {
$db = new \CoreLibs\DB\IO( $db = new \CoreLibs\DB\IO(
self::$db_config['valid'], self::$db_config['valid'],
self::$log 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
@@ -1004,6 +1007,59 @@ final class CoreLibsDBIOTest extends TestCase
$db->dbClose(); $db->dbClose();
} }
// MARK: stripAssocOnly
/**
* Data provider for stripAssocOnly tests
*
* @return array<mixed>
*/
public function stripAssocOnlyProvider(): array
{
return [
'empty' => [
[],
[]
],
'int only' => [
[0 => 'foo', 1 => 'bar'],
[],
],
'mixed' => [
[0 => 'foo', 'col_a' => 'foo', 1 => 'bar', 'col_b' => 'bar'],
['col_a' => 'foo', 'col_b' => 'bar'],
],
'key only' => [
['col_a' => 'foo', 'col_b' => 'bar'],
['col_a' => 'foo', 'col_b' => 'bar'],
]
];
}
/**
* Test for stripAssocOnly function
*
* @covers ::stripAssocOnly
* @dataProvider stripAssocOnlyProvider
* @testdox strip assoc non string entries from return [$_dataName]
*
* @param array<mixed> $input
* @param array<string,mixed> $expected
* @return void
*/
public function testStripAssocOnly(array $input, array $expected): void
{
$db = new \CoreLibs\DB\IO(
self::$db_config['valid'],
self::$log
);
$this->assertEquals(
$expected,
$db->stripAssocOnly($input)
);
$db->dbClose();
}
// - string escape tests // - string escape tests
// dbEscapeString, dbEscapeLiteral, dbEscapeIdentifier, // dbEscapeString, dbEscapeLiteral, dbEscapeIdentifier,
@@ -3022,8 +3078,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)
); );
} }
+22 -9
View File
@@ -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,10 +547,20 @@ 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:
// if compare starts with "main"
if ($compare[0] == 'main') {
// add two more run after main
array_splice(
$expected,
1,
0,
['run', 'run']
);
} else {
// add two "run" before "runBare" // add two "run" before "runBare"
array_splice( array_splice(
$expected, $expected,
@@ -562,10 +574,11 @@ final class CoreLibsDebugSupportTest extends TestCase
0, 0,
['include'] ['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);
+1
View File
@@ -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,15 +464,14 @@ 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
@@ -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 -1
View File
@@ -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;
+8
View File
@@ -124,3 +124,11 @@ The development for those files is located in a different repository
General: <https://[service]/CodeBlocks/JavaScript.utils> General: <https://[service]/CodeBlocks/JavaScript.utils>
Org: <https://[serverice]/[org]/Code-Blocks.JavaScript.utils> Org: <https://[serverice]/[org]/Code-Blocks.JavaScript.utils>
### Update NPM packages
```sh
npm-check-updates
ncu -u
npm install
```
+4
View File
@@ -18,6 +18,10 @@ export default [
globals: { globals: {
...globals.browser, ...globals.browser,
...globals.jquery ...globals.jquery
},
parserOptions: {
ecmaVersion: 2022,
sourceType: "script",
} }
}}, }},
pluginJs.configs.recommended, pluginJs.configs.recommended,
+5 -2
View File
@@ -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,
+4 -4
View File
@@ -9,9 +9,9 @@
"license": "", "license": "",
"description": "Core Libraries", "description": "Core Libraries",
"devDependencies": { "devDependencies": {
"@eslint/js": "^9.20.0", "@eslint/js": "^10.0.1",
"esbuild": "^0.25.0", "esbuild": "^0.28.1",
"eslint": "^9.20.1", "eslint": "^10.5.0",
"globals": "^15.15.0" "globals": "^17.7.0"
} }
} }
+19
View File
@@ -10,4 +10,23 @@
<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> -->
<logging>
<!-- JUnit XML log (Most Common for CI/CD) -->
<junit outputFile="build/logs/junit.xml"/>
<!-- TestDox HTML log -->
<testdoxHtml outputFile="build/testdox.html"/>
</logging>
</phpunit> </phpunit>
+19
View File
@@ -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>";
+14
View File
@@ -103,6 +103,20 @@ foreach ($hash_types as $hash_type) {
// print "UNIQU ID SHORT : " . Hash::__uniqId() . "<br>"; // print "UNIQU ID SHORT : " . Hash::__uniqId() . "<br>";
// print "UNIQU ID LONG : " . Hash::__uniqIdLong() . "<br>"; // print "UNIQU ID LONG : " . Hash::__uniqIdLong() . "<br>";
$tests = [
// array diff
[0, 1, 'b', 'c', 'a'],
['b', 'c', 'a', 1, 0],
// key set arrays DO NOT diff
['A' => 0, 'F' => 1, 'C' => 'b', 'K' => 'c', 'B' => 'a'],
['A' => 0, 'B' => 'a', 'C' => 'b', 'F' => 1, 'K' => 'c'],
];
foreach ($tests as $test) {
print "IMMUTABLE HASH FOR ARRAY: " . Hash::generateImmutableHashForArray($test) . "<br>";
print "IMMUTABLE HASH FOR ARRAY: " . Hash::generateImmutableHashForArray($test, sort_keys:false) . "<br>";
print "SERIALIZED HASH FOR ARRAY: " . hash(Hash::DEFAULT_HASH, serialize($test)) . "<br>";
}
print "</body></html>"; print "</body></html>";
// __END__ // __END__
+19
View File
@@ -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>";
+13
View File
@@ -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 */
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+16 -7
View File
@@ -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);
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+3 -3
View File
@@ -15,15 +15,15 @@
] ]
}, },
"repositories": { "repositories": {
"git.egplusww.jp.Composer": { "packages.omnicomproduction.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.
+9 -3
View File
@@ -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
*/ */
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;
} }
} }
+88 -2
View File
@@ -475,8 +475,7 @@ class ArrayHandler
throw new \ArgumentCountError(__FUNCTION__ . ' needs two or more array arguments'); throw new \ArgumentCountError(__FUNCTION__ . ' needs two or more array arguments');
} }
$merged = []; $merged = [];
while ($in_arrays) { foreach ($in_arrays as $in_array) {
$in_array = array_shift($in_arrays);
if (!is_array($in_array)) { if (!is_array($in_array)) {
throw new \TypeError(__FUNCTION__ . ' encountered a non array argument'); throw new \TypeError(__FUNCTION__ . ' encountered a non array argument');
} }
@@ -811,6 +810,93 @@ class ArrayHandler
); );
return $in_array; return $in_array;
} }
/**
* return one random entry from an array (value)
* the return entry is null if the incoming array is empty
* the array can also be an array of arrays
*
* @param array<mixed> $array
* @return string|int|float|bool|array<mixed>|null
*/
public static function getRandomEntryFromArray(array $array): string|int|float|bool|array|null
{
if (empty($array)) {
return null;
}
$random_index = array_rand($array);
return $array[$random_index];
}
/**
* find and remove one value
* on default does not strict compare
*
* @param array<mixed> $array
* @param string|int|float|bool|array<mixed> $value
* @param bool $strict [false]
* @return array<mixed>
*/
public static function removeArrayEntryByValue(
array $array,
string|int|float|bool|array $value,
bool $strict = false,
): array {
if (empty($array)) {
return $array;
}
return array_filter($array, function ($element) use ($value, $strict) {
return $strict ?
$element !== $value :
$element != $value;
});
}
/**
* add a string to each element in an array, default is at the end of the value,
* can be switched with the prefix flag
*
* @param array<string> $array
* @param string $string_to_add
* @param bool $prefix [false]
* @return array<string>
*/
public static function addStringToEachValueInArray(array $array, string $string_to_add, bool $prefix = false): array
{
// nothing set, skip
if (empty($string_to_add) || empty($array)) {
return $array;
}
return array_map(function ($value) use ($string_to_add, $prefix) {
return $prefix ?
$string_to_add . $value :
$value . $string_to_add;
}, $array);
}
/**
* sort by key any array, even if it is nested
*
* @param array<mixed> $data
* @return array<mixed>
*/
public static function createSortedArrayByKey(array $data): array
{
if (empty($data)) {
return $data;
}
// Sort by keys
ksort($data);
// Recursively sort nested arrays
foreach ($data as $key => $value) {
if (is_array($value)) {
$data[$key] = self::createSortedArrayByKey($value);
}
}
return $data;
}
} }
// __END__ // __END__
+2 -2
View File
@@ -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) ? ' ' : '');
@@ -453,7 +453,7 @@ class DateTime
} }
if (isset($matches[11]) && is_numeric($matches[11])) { if (isset($matches[11]) && is_numeric($matches[11])) {
// for milliseconds, we need to divide by 1000 and add them // for milliseconds, we need to divide by 1000 and add them
$timestamp += (float)($matches[11] / 1000); $timestamp += ((float)$matches[11] / 1000);
} }
if ($negative) { if ($negative) {
// cast to float so we can do a negative multiplication // cast to float so we can do a negative multiplication
+5 -6
View File
@@ -43,7 +43,10 @@ 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)) {
// if anything other return as string
return (string)$bytes;
}
// flags bit wise check // flags bit wise check
// remove space between number and suffix // remove space between number and suffix
if ($flags & self::BYTE_FORMAT_NOSPACE) { if ($flags & self::BYTE_FORMAT_NOSPACE) {
@@ -104,10 +107,6 @@ class Byte
} else { } else {
return round($bytes_calc, 2) . $pre; return round($bytes_calc, 2) . $pre;
} }
} else {
// if anything other return as string
return (string)$bytes;
}
} }
/** /**
@@ -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
+6 -6
View File
@@ -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)
+25 -2
View File
@@ -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
+23
View File
@@ -8,6 +8,8 @@ declare(strict_types=1);
namespace CoreLibs\Create; namespace CoreLibs\Create;
use CoreLibs\Combined\ArrayHandler;
class Hash class Hash
{ {
/** @var string default short hash -> deprecated use STANDARD_HASH_SHORT */ /** @var string default short hash -> deprecated use STANDARD_HASH_SHORT */
@@ -210,6 +212,27 @@ class Hash
{ {
return self::hash($string, self::STANDARD_HASH); return self::hash($string, self::STANDARD_HASH);
} }
/**
* generate a hash over any array data
* optional will not sort keys and so create hashes based on the original data.
* for correct array comapre it is recommended to keep sort keys on
*
* @param array<mixed> $data
* @param bool $sort_keys [true] Whether to sort the array keys before hashing
* @return string
*/
public static function generateImmutableHashForArray(array $data, bool $sort_keys = true): string
{
// Create a sorted copy to ensure consistent hashing
// Generate hash using serialize for better accuracy
return hash(
self::DEFAULT_HASH,
serialize(
$sort_keys ? ArrayHandler::createSortedArrayByKey($data) : $data
)
);
}
} }
// __END__ // __END__
+1 -1
View File
@@ -156,7 +156,7 @@ class RandomKey
* *
* @param int $key_length [default=-1] key length override, * @param int $key_length [default=-1] key length override,
* if not set use default [LEGACY] * if not set use default [LEGACY]
* @param array<string> $key_range a list of key ranges as array, * @param array<string> ...$key_range a list of key ranges as array,
* if not set use previous set data * if not set use previous set data
* @return string random key * @return string random key
*/ */
+51 -31
View File
@@ -520,7 +520,7 @@ class IO
} }
// ************************************************************* // *************************************************************
// PRIVATE METHODS // MARK: PRIVATE METHODS
// ************************************************************* // *************************************************************
/** /**
@@ -1703,11 +1703,11 @@ class IO
} }
// ************************************************************* // *************************************************************
// PUBLIC METHODS // MARK: PUBLIC METHODS
// ************************************************************* // *************************************************************
// *************************** // ***************************
// CLOSE, STATUS, SETTINGS VARIABLE READ // MARK: CLOSE, STATUS, SETTINGS VARIABLE READ
// *************************** // ***************************
/** /**
@@ -1950,7 +1950,7 @@ class IO
} }
// *************************** // ***************************
// DEBUG DATA DUMP // MARK: DEBUG DATA DUMP
// *************************** // ***************************
/** /**
@@ -1978,7 +1978,7 @@ class IO
} }
// *************************** // ***************************
// CHECK QUERY TYPE // MARK: CHECK QUERY TYPE
// *************************** // ***************************
/** /**
@@ -2035,7 +2035,7 @@ class IO
} }
// *************************** // ***************************
// DATA WRITE CONVERSION // MARK: DATA WRITE CONVERSION
// *************************** // ***************************
/** /**
@@ -2156,7 +2156,7 @@ class IO
} }
// *************************** // ***************************
// DATA READ/WRITE CONVERSION // MARK: DATA READ/WRITE CONVERSION
// *************************** // ***************************
/** /**
@@ -2194,7 +2194,7 @@ class IO
} }
// *************************** // ***************************
// DATA READ CONVERSION // MARK: DATA READ CONVERSION
// *************************** // ***************************
/** /**
@@ -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(
@@ -2263,8 +2263,22 @@ class IO
return is_array($__db_array_parse) ? $__db_array_parse : []; return is_array($__db_array_parse) ? $__db_array_parse : [];
} }
/**
* Will strip all single numberic entries from the array.
* This is for database return
*
* @param array<mixed> $res
* @return array<string,mixed>
*/
public function stripAssocOnly(array $res): array
{
return array_filter($res, function ($key) {
return !is_numeric($key);
}, ARRAY_FILTER_USE_KEY);
}
// *************************** // ***************************
// TABLE META DATA READ // MARK: TABLE META DATA READ
// *************************** // ***************************
/** /**
@@ -2290,7 +2304,7 @@ class IO
} }
// *************************** // ***************************
// QUERY EXECUSION AND DATA READ // MARK: QUERY EXECUSION AND DATA READ
// *************************** // ***************************
/** /**
@@ -2562,21 +2576,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
@@ -2921,7 +2941,7 @@ class IO
} }
// *************************** // ***************************
// CURSOR RETURN // MARK: CURSOR RETURN
// *************************** // ***************************
/** /**
@@ -2935,7 +2955,7 @@ class IO
} }
// *************************** // ***************************
// CURSOR EXT CACHE RESET // MARK: CURSOR EXT CACHE RESET
// *************************** // ***************************
/** /**
@@ -2965,7 +2985,7 @@ class IO
} }
// *************************** // ***************************
// CURSOR EXT DATA CHECK // MARK: CURSOR EXT DATA CHECK
// *************************** // ***************************
/** /**
@@ -3060,7 +3080,7 @@ class IO
} }
// *************************** // ***************************
// MAXIMUM QUERY EXECUTION CHECK HELPERS // MARK: MAXIMUM QUERY EXECUTION CHECK HELPERS
// *************************** // ***************************
/** /**
@@ -3096,7 +3116,7 @@ class IO
} }
// *************************** // ***************************
// PREPARED QUERY WORK // MARK: PREPARED QUERY WORK
// *************************** // ***************************
/** /**
@@ -3373,7 +3393,7 @@ class IO
} }
// *************************** // ***************************
// ASYNCHRONUS EXECUTION/CHECK // MARK: ASYNCHRONUS EXECUTION/CHECK
// *************************** // ***************************
/** /**
@@ -3533,7 +3553,7 @@ class IO
} }
// *************************** // ***************************
// COMPLEX WRITE WITH CONFIG ARRAYS // MARK: COMPLEX WRITE WITH CONFIG ARRAYS
// *************************** // ***************************
// ** REMARK ** // ** REMARK **
@@ -3714,7 +3734,7 @@ class IO
} }
// *************************** // ***************************
// INTERNAL SETTINGS READ/CHANGE // MARK: INTERNAL SETTINGS READ/CHANGE
// *************************** // ***************************
/** /**
@@ -4042,7 +4062,7 @@ class IO
} }
// *************************** // ***************************
// QUERY DATA AND DB HANDLER // MARK: QUERY DATA AND DB HANDLER
// *************************** // ***************************
/** /**
@@ -4145,7 +4165,7 @@ class IO
} }
// *************************** // ***************************
// INTERNAL VARIABLES READ POST QUERY RUN // MARK: INTERNAL VARIABLES READ POST QUERY RUN
// *************************** // ***************************
/** /**
@@ -4436,7 +4456,7 @@ class IO
} }
// *************************** // ***************************
// ERROR AND WARNING DATA // MARK: ERROR AND WARNING DATA
// *************************** // ***************************
/** /**
@@ -4493,7 +4513,7 @@ class IO
} }
// *************************** // ***************************
// DEPEREACTED CALLS // MARK: DEPEREACTED CALLS
// all call below are no longer in use and throw deprecated errors // all call below are no longer in use and throw deprecated errors
// *************************** // ***************************
+1 -1
View File
@@ -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;
} }
@@ -290,7 +290,7 @@ class ConvertPlaceholder
} }
$match = $matches[self::MATCHING_POS]; $match = $matches[self::MATCHING_POS];
// only count pos up for actual replacements we will do // only count pos up for actual replacements we will do
if (!empty($match)) { if (strlen((string)$match) > 0) {
$pos++; $pos++;
$params_lookup[] = '$' . $pos; $params_lookup[] = '$' . $pos;
} }
+4 -4
View File
@@ -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;
} }
+2 -2
View File
@@ -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(
+3 -3
View File
@@ -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
{ {
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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
{ {
+25 -18
View File
@@ -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;
} }
} }
+10 -7
View File
@@ -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];
$this->config['headers'][$header_key] = array_values(
array_diff(
$headers,
$value $value
)); )
);
} }
} }
} }