Compare commits
154 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8497144053 | ||
|
|
2006798388 | ||
|
|
bf63d850ca | ||
|
|
53e267ce24 | ||
|
|
1754ecf2ee | ||
|
|
3c37899a48 | ||
|
|
0436cfe3da | ||
|
|
3606de1a00 | ||
|
|
3081439eda | ||
|
|
7af0e74b85 | ||
|
|
7748b83a6b | ||
|
|
f83293ff1a | ||
|
|
9c3be2942e | ||
|
|
ee62bd98ee | ||
|
|
02e9610fad | ||
|
|
8a41db4649 | ||
|
|
e27ea3dc9f | ||
|
|
ec4bf54d81 | ||
|
|
ec3ca787fa | ||
|
|
86acbbb85b | ||
|
|
8e0af7a5f7 | ||
|
|
b022662dfc | ||
|
|
3039ebf913 | ||
|
|
e2e080c404 | ||
|
|
4671143d1c | ||
|
|
b492558cca | ||
|
|
64e76530d4 | ||
|
|
0b93f9f146 | ||
|
|
4c6fe1cd6c | ||
|
|
83ba48f598 | ||
|
|
62c6de8244 | ||
|
|
1c2f9f0c2c | ||
|
|
30bb0e8895 | ||
|
|
75c4c98de8 | ||
|
|
f72055909b | ||
|
|
b0a8783276 | ||
|
|
7b5ad92e66 | ||
|
|
250067927a | ||
|
|
7c2cbbaca7 | ||
|
|
ac037eabde | ||
|
|
0250b86b3f | ||
|
|
e45acc412b | ||
|
|
854206bc70 | ||
|
|
b192e98a8a | ||
|
|
c4e2c781c6 | ||
|
|
e80b3b8dfd | ||
|
|
2b079ff836 | ||
|
|
37201799b5 | ||
|
|
b9d8911c7b | ||
|
|
c51ceb926e | ||
|
|
b4b33d6873 | ||
|
|
959240b0fa | ||
|
|
7eace1013e | ||
|
|
be1e55cad7 | ||
|
|
11a8c6440b | ||
|
|
742cbc31df | ||
|
|
28909fdc03 | ||
|
|
c3b29ad0d7 | ||
|
|
6d481657df | ||
|
|
fc57aabf5d | ||
|
|
d56ee68482 | ||
|
|
b89ab09e12 | ||
|
|
e873ade6c0 | ||
|
|
5910b884ac | ||
|
|
e3bd2c1c3b | ||
|
|
90a8c5540f | ||
|
|
ea503fffe9 | ||
|
|
feba79a2e8 | ||
|
|
6bec59e387 | ||
|
|
03fbcaecfb | ||
|
|
283e7de1dc | ||
|
|
d952c5f774 | ||
|
|
cd8351d761 | ||
|
|
b992901072 | ||
|
|
1596654149 | ||
|
|
44f37b7f74 | ||
|
|
829f5c567f | ||
|
|
710a48abcd | ||
|
|
f564c27319 | ||
|
|
00b98e7230 | ||
|
|
7cae3e701a | ||
|
|
da67d1bde3 | ||
|
|
16c3653cee | ||
|
|
47c4c5cb69 | ||
|
|
7b9dc9c8b2 | ||
|
|
6133da9069 | ||
|
|
fa0b102d1a | ||
|
|
0e99700bbe | ||
|
|
2f0b9fb360 | ||
|
|
c7cc3c2938 | ||
|
|
f508b607a6 | ||
|
|
f94b350ba4 | ||
|
|
53eef03387 | ||
|
|
5a81445a28 | ||
|
|
4bbbd653cd | ||
|
|
4c28e6d0ec | ||
|
|
66b7e81463 | ||
|
|
cf58f86802 | ||
|
|
ff644310cd | ||
|
|
58988b9c0f | ||
|
|
fe75f1d724 | ||
|
|
0607cdc3be | ||
|
|
6cb14daf49 | ||
|
|
330582f273 | ||
|
|
b0293b52bd | ||
|
|
00591deb00 | ||
|
|
737f70fac5 | ||
|
|
0328ccd2fe | ||
|
|
eba1e2885f | ||
|
|
53813261fb | ||
|
|
df2ae66942 | ||
|
|
78e1d73cd9 | ||
|
|
620a5878c1 | ||
|
|
5a0b09a916 | ||
|
|
98c6033c75 | ||
|
|
6dcebc9b67 | ||
|
|
c97520e186 | ||
|
|
764ca1f098 | ||
|
|
3d23e5b066 | ||
|
|
90e418ba24 | ||
|
|
b6a0937e0c | ||
|
|
b3f6f8ef18 | ||
|
|
d9d5400498 | ||
|
|
b1be681afb | ||
|
|
8ef309d479 | ||
|
|
6e59b63791 | ||
|
|
9c7b3cea83 | ||
|
|
26af6a07f4 | ||
|
|
b7c6d4b478 | ||
|
|
9936fc04da | ||
|
|
1e0dfa2106 | ||
|
|
3af6f6a8f0 | ||
|
|
1e793c0d16 | ||
|
|
5be34453ce | ||
|
|
7773b78e17 | ||
|
|
2a3798c8c2 | ||
|
|
bc8303fe5f | ||
|
|
ba89b188d9 | ||
|
|
d15618cde4 | ||
|
|
0fd89727e9 | ||
|
|
a8e75d158b | ||
|
|
4b3fbaa309 | ||
|
|
1a6c65df0e | ||
|
|
24f553a17e | ||
|
|
9a3ea2f7db | ||
|
|
bcdb877d90 | ||
|
|
6d0e528c38 | ||
|
|
7e6474195b | ||
|
|
1795d3ba6c | ||
|
|
e1340acf55 | ||
|
|
b5ead3e266 | ||
|
|
f5daaca598 | ||
|
|
6b4f310cd2 | ||
|
|
7b5bddb529 |
@@ -26,6 +26,8 @@
|
|||||||
use Phan\Config;
|
use Phan\Config;
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
// "target_php_version" => "8.2",
|
||||||
|
"minimum_target_php_version" => "8.1",
|
||||||
// turn color on (-C)
|
// turn color on (-C)
|
||||||
"color_issue_messages_if_supported" => true,
|
"color_issue_messages_if_supported" => true,
|
||||||
// If true, missing properties will be created when
|
// If true, missing properties will be created when
|
||||||
@@ -94,8 +96,6 @@ return [
|
|||||||
"exclude_analysis_directory_list" => [
|
"exclude_analysis_directory_list" => [
|
||||||
'www/vendor',
|
'www/vendor',
|
||||||
'www/tests',
|
'www/tests',
|
||||||
'www/lib/Smarty',
|
|
||||||
'www/lib/smarty-4.1.0',
|
|
||||||
'www/templates_c',
|
'www/templates_c',
|
||||||
'www/log',
|
'www/log',
|
||||||
'www/tmp',
|
'www/tmp',
|
||||||
@@ -116,8 +116,6 @@ return [
|
|||||||
// ignore the old qq tests
|
// ignore the old qq tests
|
||||||
'www/admin/qq_file_upload_front.php',
|
'www/admin/qq_file_upload_front.php',
|
||||||
'www/admin/qq_file_upload_ajax.php',
|
'www/admin/qq_file_upload_ajax.php',
|
||||||
// symlink ignore
|
|
||||||
'www/lib/smarty-4.1.0/libs/Smarty.class.php'
|
|
||||||
],
|
],
|
||||||
|
|
||||||
// what not to show as problem
|
// what not to show as problem
|
||||||
@@ -130,7 +128,10 @@ return [
|
|||||||
'PhanWriteOnlyPublicProperty',
|
'PhanWriteOnlyPublicProperty',
|
||||||
'PhanUnreferencedConstant',
|
'PhanUnreferencedConstant',
|
||||||
'PhanWriteOnlyPublicProperty',
|
'PhanWriteOnlyPublicProperty',
|
||||||
'PhanReadOnlyPublicProperty'
|
'PhanReadOnlyPublicProperty',
|
||||||
|
// start ignore annotations
|
||||||
|
'PhanUnextractableAnnotationElementName',
|
||||||
|
'PhanUnextractableAnnotationSuffix',
|
||||||
],
|
],
|
||||||
|
|
||||||
// Override to hardcode existence and types of (non-builtin) globals in the global scope.
|
// Override to hardcode existence and types of (non-builtin) globals in the global scope.
|
||||||
|
|||||||
@@ -1,13 +1,15 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
base_folder='/var/www/html/developers/clemens/core_data/php_libraries/trunk/www/';
|
BASE_FOLDER=$(dirname $(readlink -f $0))"/";
|
||||||
|
# Assume script is in 4dev/bin
|
||||||
|
base_folder="${BASE_FOLDER}../../www/";
|
||||||
|
|
||||||
# locale gettext po to mo translator master
|
# locale gettext po to mo translator master
|
||||||
for file in $(ls -1 ${base_folder}../4dev/locale/*.po); do
|
for file in $(ls -1 ${base_folder}../4dev/locale/*.po); do
|
||||||
file=$(basename $file .po);
|
file=$(basename $file .po);
|
||||||
echo "Translate language ${file}";
|
|
||||||
locale=$(echo "${file}" | cut -d "-" -f 1);
|
locale=$(echo "${file}" | cut -d "-" -f 1);
|
||||||
domain=$(echo "${file}" | cut -d "-" -f 2);
|
domain=$(echo "${file}" | cut -d "-" -f 2);
|
||||||
|
echo "- Translate language file '${file}' for locale '${locale}' and domain '${domain}':";
|
||||||
if [ ! -d "${base_folder}/includes/locale/${locale}/LC_MESSAGES/" ]; then
|
if [ ! -d "${base_folder}/includes/locale/${locale}/LC_MESSAGES/" ]; then
|
||||||
mkdir -p "${base_folder}/includes/locale/${locale}/LC_MESSAGES/";
|
mkdir -p "${base_folder}/includes/locale/${locale}/LC_MESSAGES/";
|
||||||
fi;
|
fi;
|
||||||
|
|||||||
169
4dev/bin/mo_to_js.sh
Executable file
169
4dev/bin/mo_to_js.sh
Executable file
@@ -0,0 +1,169 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# read source mo files and writes target js files in object form
|
||||||
|
|
||||||
|
# check for ARG 1 is "mv"
|
||||||
|
# then move the files directly and don't do manual check (don't create temp files)
|
||||||
|
FILE_MOVE=0;
|
||||||
|
if [ "${1}" = "mv" ]; then
|
||||||
|
echo "*** Direct write ***";
|
||||||
|
FILE_MOVE=1;
|
||||||
|
fi;
|
||||||
|
|
||||||
|
target='';
|
||||||
|
BASE_FOLDER=$(dirname $(readlink -f $0))"/";
|
||||||
|
# Assume script is in 4dev/bin
|
||||||
|
base_folder="${BASE_FOLDER}../../www/";
|
||||||
|
po_folder='../4dev/locale/'
|
||||||
|
mo_folder='includes/locale/';
|
||||||
|
target_folder='';
|
||||||
|
template_file_stump='##SUFFIX##translate-##LANGUAGE##.TMP.js';
|
||||||
|
# for output file names
|
||||||
|
source_list=(iw);
|
||||||
|
language_list=(en ja);
|
||||||
|
# set target names
|
||||||
|
if [ "${target}" == '' ]; then
|
||||||
|
echo "*** Non smarty ***";
|
||||||
|
TEXTDOMAINDIR=${base_folder}${mo_folder}.
|
||||||
|
# default is admin
|
||||||
|
TEXTDOMAIN=admin;
|
||||||
|
fi;
|
||||||
|
js_folder="layout/${TEXTDOMAIN}/javascript/";
|
||||||
|
|
||||||
|
error=0;
|
||||||
|
# this checks if the TEXTDOMAIN target actually exists
|
||||||
|
if [ ! -d "${base_folder}${js_folder}" ]; then
|
||||||
|
echo "Cannot find target javascript folder ${base_folder}${js_folder}";
|
||||||
|
error=1;
|
||||||
|
else
|
||||||
|
target_folder="${base_folder}${js_folder}";
|
||||||
|
fi;
|
||||||
|
|
||||||
|
if [ ${error} -eq 1 ]; then
|
||||||
|
exit;
|
||||||
|
fi;
|
||||||
|
|
||||||
|
# locale gettext po to mo translator master
|
||||||
|
for file in $(ls -1 ${base_folder}../4dev/locale/*.po); do
|
||||||
|
file=$(basename $file .po);
|
||||||
|
echo "Translate language ${file}";
|
||||||
|
locale=$(echo "${file}" | cut -d "-" -f 1);
|
||||||
|
domain=$(echo "${file}" | cut -d "-" -f 2);
|
||||||
|
if [ ! -d "${base_folder}/includes/locale/${locale}/LC_MESSAGES/" ]; then
|
||||||
|
mkdir -p "${base_folder}/includes/locale/${locale}/LC_MESSAGES/";
|
||||||
|
fi;
|
||||||
|
msgfmt -o ${base_folder}/includes/locale/${locale}/LC_MESSAGES/${domain}.mo ${base_folder}${po_folder}${locale}-${domain}.po;
|
||||||
|
done;
|
||||||
|
|
||||||
|
rx_msgid_empty="^msgid \"\"";
|
||||||
|
rx_msgid="^msgid \"";
|
||||||
|
rx_msgstr="^msgstr \""
|
||||||
|
|
||||||
|
# quick copy string at the end
|
||||||
|
quick_copy='';
|
||||||
|
|
||||||
|
for language in ${language_list[*]}; do
|
||||||
|
# I don't know which one must be set, but I think at least LANGUAGE
|
||||||
|
case ${language} in
|
||||||
|
ja)
|
||||||
|
LANG=ja_JP.UTF-8;
|
||||||
|
ENCODING=UTF-8;
|
||||||
|
LANGUAGE=ja;
|
||||||
|
;;
|
||||||
|
en)
|
||||||
|
# was en_JP.UTF-8
|
||||||
|
LANG=en_US.UTF-8;
|
||||||
|
ENCODING=UTF-8;
|
||||||
|
LANGUAGE=en;
|
||||||
|
;;
|
||||||
|
esac;
|
||||||
|
# write only one for language and then symlink files
|
||||||
|
template_file=$(echo ${template_file_stump} | sed -e "s/##SUFFIX##//" | sed -e "s/##LANGUAGE##/${LANG}/");
|
||||||
|
original_file=$(echo ${template_file} | sed -e 's/\.TMP//g');
|
||||||
|
if [ "${FILE_MOVE}" -eq 0 ]; then
|
||||||
|
file=${target_folder}${template_file};
|
||||||
|
else
|
||||||
|
file=${target_folder}${original_file};
|
||||||
|
fi;
|
||||||
|
echo "===> Write translation file ${file}";
|
||||||
|
echo ". = normal, : = escape, x = skip";
|
||||||
|
# init line [aka don't touch this file]
|
||||||
|
echo "// AUTO FILL, changes will be overwritten" > $file;
|
||||||
|
echo "// source: ${suffix}, language: ${language}" >> $file;
|
||||||
|
echo "// Translation strings in the format" >> $file;
|
||||||
|
echo "// \"Original\":\"Translated\""$'\n' >> $file;
|
||||||
|
echo "var i18n = {" >> $file;
|
||||||
|
# translations stuff
|
||||||
|
# read the po file
|
||||||
|
pos=0; # do we add a , for the next line
|
||||||
|
cat "${base_folder}${po_folder}${language}-${TEXTDOMAIN}.po" |
|
||||||
|
while read str; do
|
||||||
|
# echo "S: ${str}";
|
||||||
|
# skip empty
|
||||||
|
if [[ "${str}" =~ ${rx_msgid_empty} ]]; then
|
||||||
|
# skip on empty
|
||||||
|
echo -n "x";
|
||||||
|
# msgid is left, msgstr is right
|
||||||
|
elif [[ "${str}" =~ ${rx_msgid} ]]; then
|
||||||
|
echo -n ".";
|
||||||
|
# open left side
|
||||||
|
# TODO: how to handle multi line strings: or don't use them
|
||||||
|
# extract from between ""
|
||||||
|
str_source=$(echo "${str}" | sed -e "s/^msgid \"//" | sed -e "s/\"$//");
|
||||||
|
# close right side, if not last add ,
|
||||||
|
if [ "${pos}" -eq 1 ]; then
|
||||||
|
echo -n "," >> $file;
|
||||||
|
fi;
|
||||||
|
# all " inside string need to be escaped
|
||||||
|
str_source=$(echo "${str_source}" | sed -e 's/"/\\"/g');
|
||||||
|
# fix with proper layout
|
||||||
|
echo -n "\"$str_source\":\"$(TEXTDOMAINDIR=${TEXTDOMAINDIR} LANGUAGE=${language} LANG=${LANG} gettext ${TEXTDOMAIN} "${str_source}")\"" >> $file;
|
||||||
|
pos=1;
|
||||||
|
elif [[ "${str}" =~ ${rx_msgstr} ]]; then
|
||||||
|
# open right side (ignore)
|
||||||
|
echo -n "";
|
||||||
|
else
|
||||||
|
# general ignore (anything between or comments)
|
||||||
|
echo -n "";
|
||||||
|
fi;
|
||||||
|
done;
|
||||||
|
|
||||||
|
echo "" >> $file;
|
||||||
|
echo "};" >> $file;
|
||||||
|
echo " [DONE]";
|
||||||
|
|
||||||
|
# on no move
|
||||||
|
if [ "${FILE_MOVE}" -eq 0 ]; then
|
||||||
|
echo "===> Confirm all changes in ${file} and then move data to original";
|
||||||
|
echo "";
|
||||||
|
quick_copy=${quick_copy}"mv ${template_file} ${original_file}"$'\n';
|
||||||
|
fi;
|
||||||
|
|
||||||
|
# symlink to master file
|
||||||
|
for suffix in ${source_list[*]}; do
|
||||||
|
# symlink with full lang name
|
||||||
|
symlink_file[0]=$(echo ${template_file_stump} | sed -e "s/##SUFFIX##/${suffix}_/" | sed -e "s/##LANGUAGE##/${LANG}/" | sed -e 's/\.TMP//g');
|
||||||
|
# create second one with lang (no country) + encoding
|
||||||
|
symlink_file[1]=$(echo ${template_file_stump} | sed -e "s/##SUFFIX##/${suffix}_/" | sed -e "s/##LANGUAGE##/${LANGUAGE}\.${ENCODING}/" | sed -e 's/\.TMP//g');
|
||||||
|
for template_file in ${symlink_file[@]}; do
|
||||||
|
# if this is not symlink, create them
|
||||||
|
if [ ! -h "${template_file}" ]; then
|
||||||
|
echo "Create symlink: ${template_file}";
|
||||||
|
# symlik to original
|
||||||
|
cd "${target_folder}";
|
||||||
|
ln -sf "${original_file}" "${template_file}";
|
||||||
|
cd - >/dev/null;
|
||||||
|
fi;
|
||||||
|
done;
|
||||||
|
done;
|
||||||
|
done;
|
||||||
|
|
||||||
|
if [ "${FILE_MOVE}" -eq 0 ]; then
|
||||||
|
echo "";
|
||||||
|
echo "-- IN FOLDER: ${target_folder}";
|
||||||
|
echo "-- START: copy lines below to copy created over original --";
|
||||||
|
echo "${quick_copy}";
|
||||||
|
echo "-- END ----------------------------------------------------";
|
||||||
|
fi;
|
||||||
|
|
||||||
|
# __END__
|
||||||
@@ -1,9 +1,11 @@
|
|||||||
|
#!/bin/env bash
|
||||||
|
|
||||||
base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
|
base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
|
||||||
# -c phpunit.xml
|
# -c phpunit.xml
|
||||||
# --testdox
|
# --testdox
|
||||||
# call with "t" to give verbose testdox output
|
# call with "t" to give verbose testdox output
|
||||||
# SUPPORTED: https://www.php.net/supported-versions.php
|
# SUPPORTED: https://www.php.net/supported-versions.php
|
||||||
# call with 7.3, 7.4, 8.0, 8.1 to force a certain php version
|
# call with php version number to force a certain php version
|
||||||
|
|
||||||
opt_testdox="";
|
opt_testdox="";
|
||||||
if [ "${1}" = "t" ] || [ "${2}" = "t" ]; then
|
if [ "${1}" = "t" ] || [ "${2}" = "t" ]; then
|
||||||
@@ -13,18 +15,20 @@ php_bin="";
|
|||||||
if [ ! -z "${1}" ]; then
|
if [ ! -z "${1}" ]; then
|
||||||
case "${1}" in
|
case "${1}" in
|
||||||
# "7.3") php_bin="/usr/bin/php7.3 "; ;;
|
# "7.3") php_bin="/usr/bin/php7.3 "; ;;
|
||||||
"7.4") php_bin="/usr/bin/php7.4 "; ;;
|
# "7.4") php_bin="/usr/bin/php7.4 "; ;;
|
||||||
"8.0") php_bin="/usr/bin/php8.0 "; ;;
|
# "8.0") php_bin="/usr/bin/php8.0 "; ;;
|
||||||
"8.1") php_bin="/usr/bin/php8.1 "; ;;
|
"8.1") php_bin="/usr/bin/php8.1 "; ;;
|
||||||
|
"8.2") php_bin="/usr/bin/php8.2 "; ;;
|
||||||
*) echo "Not support PHP: ${1}"; exit; ;;
|
*) echo "Not support PHP: ${1}"; exit; ;;
|
||||||
esac;
|
esac;
|
||||||
fi;
|
fi;
|
||||||
if [ ! -z "${2}" ] && [ -z "${php_bin}" ]; then
|
if [ ! -z "${2}" ] && [ -z "${php_bin}" ]; then
|
||||||
case "${2}" in
|
case "${2}" in
|
||||||
# "7.3") php_bin="/usr/bin/php7.3 "; ;;
|
# "7.3") php_bin="/usr/bin/php7.3 "; ;;
|
||||||
"7.4") php_bin="/usr/bin/php7.4 "; ;;
|
# "7.4") php_bin="/usr/bin/php7.4 "; ;;
|
||||||
"8.0") php_bin="/usr/bin/php8.0 "; ;;
|
# "8.0") php_bin="/usr/bin/php8.0 "; ;;
|
||||||
"8.1") php_bin="/usr/bin/php8.1 "; ;;
|
"8.1") php_bin="/usr/bin/php8.1 "; ;;
|
||||||
|
"8.2") php_bin="/usr/bin/php8.2 "; ;;
|
||||||
*) echo "Not support PHP: ${1}"; exit; ;;
|
*) echo "Not support PHP: ${1}"; exit; ;;
|
||||||
esac;
|
esac;
|
||||||
fi;
|
fi;
|
||||||
|
|||||||
22
4dev/composer/sync-to-composer-all-folder.sh
Executable file
22
4dev/composer/sync-to-composer-all-folder.sh
Executable file
@@ -0,0 +1,22 @@
|
|||||||
|
#!/bin/env bash
|
||||||
|
|
||||||
|
# syncs
|
||||||
|
# 4dev/tests/
|
||||||
|
# www/lib/CoreLibs/
|
||||||
|
#
|
||||||
|
# to the composer corelibs all repo
|
||||||
|
|
||||||
|
GO="${1}";
|
||||||
|
DRY_RUN="";
|
||||||
|
if [ "${GO}" != "go" ]; then
|
||||||
|
DRY_RUN="-n ";
|
||||||
|
fi;
|
||||||
|
|
||||||
|
BASE="/storage/var/www/html/developers/clemens/core_data/";
|
||||||
|
SOURCE="${BASE}php_libraries/trunk/"
|
||||||
|
TARGET="${BASE}composer-packages/CoreLibs-Composer-All/"
|
||||||
|
|
||||||
|
rsync ${DRY_RUN}-Plzvrupt --stats --delete ${SOURCE}4dev/tests/ ${TARGET}test/phpunit/
|
||||||
|
rsync ${DRY_RUN}-Plzvrupt --stats --delete ${SOURCE}www/lib/CoreLibs/ ${TARGET}src/
|
||||||
|
|
||||||
|
# __END__
|
||||||
@@ -25,4 +25,4 @@ BEGIN
|
|||||||
RETURN NEW;
|
RETURN NEW;
|
||||||
END;
|
END;
|
||||||
$$
|
$$
|
||||||
LANGUAGE 'plpgsql';
|
LANGUAGE 'plpgsql';
|
||||||
|
|||||||
@@ -25,4 +25,4 @@ BEGIN
|
|||||||
RETURN NEW;
|
RETURN NEW;
|
||||||
END;
|
END;
|
||||||
$$
|
$$
|
||||||
LANGUAGE 'plpgsql';
|
LANGUAGE 'plpgsql';
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ CREATE OR REPLACE FUNCTION set_edit_generic()
|
|||||||
RETURNS TRIGGER AS
|
RETURNS TRIGGER AS
|
||||||
$$
|
$$
|
||||||
DECLARE
|
DECLARE
|
||||||
random_length INT = 12; -- that should be long enough
|
random_length INT = 25; -- that should be long enough
|
||||||
BEGIN
|
BEGIN
|
||||||
IF TG_OP = 'INSERT' THEN
|
IF TG_OP = 'INSERT' THEN
|
||||||
NEW.date_created := 'now';
|
NEW.date_created := 'now';
|
||||||
|
|||||||
@@ -1,51 +0,0 @@
|
|||||||
-- 2022/6/17 update edit_user with login uid
|
|
||||||
|
|
||||||
-- the login uid, at least 32 chars
|
|
||||||
ALTER TABLE edit_user ADD login_user_id VARCHAR UNIQUE;
|
|
||||||
-- CREATE UNIQUE INDEX edit_user_login_user_id_key ON edit_user (login_user_id) WHERE login_user_id IS NOT NULL;
|
|
||||||
-- ALTER TABLE edit_user ADD CONSTRAINT edit_user_login_user_id_key UNIQUE (login_user_id);
|
|
||||||
-- when above uid was set
|
|
||||||
ALTER TABLE edit_user ADD login_user_id_set_date TIMESTAMP WITHOUT TIME ZONE;
|
|
||||||
ALTER TABLE edit_user ADD login_user_id_last_revalidate TIMESTAMP WITHOUT TIME ZONE;
|
|
||||||
-- if set, from/until when the above uid is valid
|
|
||||||
ALTER TABLE edit_user ADD login_user_id_valid_from TIMESTAMP WITHOUT TIME ZONE;
|
|
||||||
ALTER TABLE edit_user ADD login_user_id_valid_until TIMESTAMP WITHOUT TIME ZONE;
|
|
||||||
-- user must login to revalidated login id after set days, 0 for forever
|
|
||||||
ALTER TABLE edit_user ADD login_user_id_revalidate_after INTERVAL;
|
|
||||||
-- lock for login user id, but still allow normal login
|
|
||||||
ALTER TABLE edit_user ADD login_user_id_locked SMALLINT NOT NULL DEFAULT 0;
|
|
||||||
|
|
||||||
-- disable login before date
|
|
||||||
ALTER TABLE edit_user ADD lock_until TIMESTAMP WITHOUT TIME ZONE;
|
|
||||||
-- disable login after date
|
|
||||||
ALTER TABLE edit_user ADD lock_after TIMESTAMP WITHOUT TIME ZONE;
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION set_login_user_id_set_date()
|
|
||||||
RETURNS TRIGGER AS
|
|
||||||
$$
|
|
||||||
BEGIN
|
|
||||||
-- if new is not null/empty
|
|
||||||
-- and old one is null or old one different new one
|
|
||||||
-- set NOW()
|
|
||||||
-- if new one is NULL
|
|
||||||
-- set NULL
|
|
||||||
IF
|
|
||||||
NEW.login_user_id IS NOT NULL AND NEW.login_user_id <> '' AND
|
|
||||||
(OLD.login_user_id IS NULL OR NEW.login_user_id <> OLD.login_user_id)
|
|
||||||
THEN
|
|
||||||
NEW.login_user_id_set_date = NOW();
|
|
||||||
NEW.login_user_id_last_revalidate = NOW();
|
|
||||||
ELSIF NEW.login_user_id IS NULL OR NEW.login_user_id = '' THEN
|
|
||||||
NEW.login_user_id_set_date = NULL;
|
|
||||||
NEW.login_user_id_last_revalidate = NULL;
|
|
||||||
END IF;
|
|
||||||
RETURN NEW;
|
|
||||||
END;
|
|
||||||
$$
|
|
||||||
LANGUAGE 'plpgsql';
|
|
||||||
|
|
||||||
CREATE TRIGGER trg_edit_user_set_login_user_id_set_date
|
|
||||||
BEFORE INSERT OR UPDATE ON edit_user
|
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_login_user_id_set_date();
|
|
||||||
|
|
||||||
-- __END__
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# create path
|
# create path
|
||||||
path=$(pwd)"/"$0;
|
path=$(pwd)"/"$0;
|
||||||
@@ -10,6 +10,11 @@ TARGET_HOST_WEB="<user>@<host>";
|
|||||||
TMP_DIR=$LOCAL_BASE_DIR"/4dev/tmp/";
|
TMP_DIR=$LOCAL_BASE_DIR"/4dev/tmp/";
|
||||||
tmpf_web=$TMP_DIR"sync.exclude.tmp";
|
tmpf_web=$TMP_DIR"sync.exclude.tmp";
|
||||||
|
|
||||||
|
if [ ! -d "$LOCAL_BASE_DIR" ]; then
|
||||||
|
echo "Folder: $LOCAL_BASE_DIR not found";
|
||||||
|
exit;
|
||||||
|
fi;
|
||||||
|
|
||||||
# if vendor be sure group folder is +x
|
# if vendor be sure group folder is +x
|
||||||
chmod -R ug+rX ${LOCAL_DIR}/vender/
|
chmod -R ug+rX ${LOCAL_DIR}/vender/
|
||||||
|
|
||||||
@@ -18,6 +23,7 @@ rm -f $tmpf_web;
|
|||||||
echo ".*.swp" >> $tmpf_web;
|
echo ".*.swp" >> $tmpf_web;
|
||||||
echo "._*" >> $tmpf_web;
|
echo "._*" >> $tmpf_web;
|
||||||
echo ".DS_Store" >> $tmpf_web;
|
echo ".DS_Store" >> $tmpf_web;
|
||||||
|
echo ".user.ini" >> $tmpf_web;
|
||||||
echo ".svn" >> $tmpf_web;
|
echo ".svn" >> $tmpf_web;
|
||||||
echo ".svnignore" >> $tmpf_web;
|
echo ".svnignore" >> $tmpf_web;
|
||||||
echo ".git" >> $tmpf_web;
|
echo ".git" >> $tmpf_web;
|
||||||
|
|||||||
40
4dev/tests/AAASetupData/CoreLibsAAASetupDataTest.php
Normal file
40
4dev/tests/AAASetupData/CoreLibsAAASetupDataTest.php
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test base setup
|
||||||
|
* @testdox AAASetupData\AAASetupDataTest just setup BASE
|
||||||
|
*/
|
||||||
|
final class CoreLibsAAASetupDataTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Covers nothing
|
||||||
|
*
|
||||||
|
* @testdox Just setup BASE
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetupData(): void
|
||||||
|
{
|
||||||
|
if (!defined('BASE')) {
|
||||||
|
define(
|
||||||
|
'BASE',
|
||||||
|
str_replace('/configs', '', __DIR__)
|
||||||
|
. DIRECTORY_SEPARATOR
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
str_replace('/configs', '', __DIR__)
|
||||||
|
. DIRECTORY_SEPARATOR,
|
||||||
|
BASE,
|
||||||
|
'BASE Path set check'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
1
4dev/tests/AAASetupData/includes
Symbolic link
1
4dev/tests/AAASetupData/includes
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../Language/includes/
|
||||||
1
4dev/tests/AAASetupData/log
Symbolic link
1
4dev/tests/AAASetupData/log
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../Debug/log/
|
||||||
@@ -7,6 +7,14 @@ namespace tests;
|
|||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use PHPUnit\Framework\MockObject\MockObject;
|
use PHPUnit\Framework\MockObject\MockObject;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Not yet covered tests:
|
||||||
|
- loginGetLocale
|
||||||
|
- loginGetHeaderColor
|
||||||
|
- loginGetPages
|
||||||
|
- loginGetEuid
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test class for ACL\Login
|
* Test class for ACL\Login
|
||||||
* @coversDefaultClass \CoreLibs\ACL\Login
|
* @coversDefaultClass \CoreLibs\ACL\Login
|
||||||
@@ -60,13 +68,10 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
|
|
||||||
// logger is always needed
|
// logger is always needed
|
||||||
// define basic connection set valid and one invalid
|
// define basic connection set valid and one invalid
|
||||||
self::$log = new \CoreLibs\Debug\Logging([
|
self::$log = new \CoreLibs\Logging\Logging([
|
||||||
// 'log_folder' => __DIR__ . DIRECTORY_SEPARATOR . 'log',
|
// 'log_folder' => __DIR__ . DIRECTORY_SEPARATOR . 'log',
|
||||||
'log_folder' => DIRECTORY_SEPARATOR . 'tmp',
|
'log_folder' => DIRECTORY_SEPARATOR . 'tmp',
|
||||||
'file_id' => 'CoreLibs-ACL-Login-Test',
|
'log_file_id' => 'CoreLibs-ACL-Login-Test',
|
||||||
'debug_all' => true,
|
|
||||||
'echo_all' => false,
|
|
||||||
'print_all' => true,
|
|
||||||
]);
|
]);
|
||||||
// test database we need to connect do, if not possible this test is skipped
|
// test database we need to connect do, if not possible this test is skipped
|
||||||
self::$db = new \CoreLibs\DB\IO(
|
self::$db = new \CoreLibs\DB\IO(
|
||||||
@@ -120,8 +125,6 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
// define('LOGIN_DB_SCHEMA', '');
|
// define('LOGIN_DB_SCHEMA', '');
|
||||||
|
|
||||||
// SHOULD SET
|
// SHOULD SET
|
||||||
// PASSWORD_MIN_LENGTH (d9)
|
|
||||||
// PASSWORD_MAX_LENGTH (d255)
|
|
||||||
// DEFAULT_ACL_LEVEL (d80)
|
// DEFAULT_ACL_LEVEL (d80)
|
||||||
|
|
||||||
// OPT:
|
// OPT:
|
||||||
@@ -261,6 +264,8 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
'GROUP_ACL_LEVEL' => -1,
|
'GROUP_ACL_LEVEL' => -1,
|
||||||
'PAGES_ACL_LEVEL' => [],
|
'PAGES_ACL_LEVEL' => [],
|
||||||
'USER_ACL_LEVEL' => -1,
|
'USER_ACL_LEVEL' => -1,
|
||||||
|
'USER_ADDITIONAL_ACL' => [],
|
||||||
|
'GROUP_ADDITIONAL_ACL' => [],
|
||||||
'UNIT_UID' => [
|
'UNIT_UID' => [
|
||||||
'AdminAccess' => 1,
|
'AdminAccess' => 1,
|
||||||
],
|
],
|
||||||
@@ -274,6 +279,7 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
'data' => [
|
'data' => [
|
||||||
'test' => 'value',
|
'test' => 'value',
|
||||||
],
|
],
|
||||||
|
'additional_acl' => []
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
// 'UNIT_DEFAULT' => '',
|
// 'UNIT_DEFAULT' => '',
|
||||||
@@ -1106,7 +1112,22 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
|
|
||||||
/** @var \CoreLibs\ACL\Login&MockObject */
|
/** @var \CoreLibs\ACL\Login&MockObject */
|
||||||
$login_mock = $this->getMockBuilder(\CoreLibs\ACL\Login::class)
|
$login_mock = $this->getMockBuilder(\CoreLibs\ACL\Login::class)
|
||||||
->setConstructorArgs([self::$db, self::$log, $session_mock, false])
|
->setConstructorArgs([
|
||||||
|
self::$db,
|
||||||
|
self::$log,
|
||||||
|
$session_mock,
|
||||||
|
[
|
||||||
|
'auto_login' => false,
|
||||||
|
'default_acl_level' => 80,
|
||||||
|
'logout_target' => '',
|
||||||
|
'site_locale' => 'en_US.UTF-8',
|
||||||
|
'site_domain' => 'admin',
|
||||||
|
'site_encoding' => 'UTF-8',
|
||||||
|
'locale_path' => __DIR__ . DIRECTORY_SEPARATOR
|
||||||
|
. 'includes' . DIRECTORY_SEPARATOR
|
||||||
|
. 'locale' . DIRECTORY_SEPARATOR,
|
||||||
|
]
|
||||||
|
])
|
||||||
->onlyMethods(['loginTerminate', 'loginReadPageName', 'loginPrintLogin'])
|
->onlyMethods(['loginTerminate', 'loginReadPageName', 'loginPrintLogin'])
|
||||||
->getMock();
|
->getMock();
|
||||||
$login_mock->expects($this->any())
|
$login_mock->expects($this->any())
|
||||||
@@ -1477,7 +1498,7 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
);
|
);
|
||||||
// - loginGetLoginHTML
|
// - loginGetLoginHTML
|
||||||
$this->assertStringContainsString(
|
$this->assertStringContainsString(
|
||||||
'<html>',
|
'<html lang="',
|
||||||
$login_mock->loginGetLoginHTML(),
|
$login_mock->loginGetLoginHTML(),
|
||||||
'Assert login html string exits'
|
'Assert login html string exits'
|
||||||
);
|
);
|
||||||
@@ -1529,7 +1550,7 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
// html login basic check only, content is the same as when
|
// html login basic check only, content is the same as when
|
||||||
// read from loginGetLoginHTML()
|
// read from loginGetLoginHTML()
|
||||||
$this->assertStringContainsString(
|
$this->assertStringContainsString(
|
||||||
'<html>',
|
'<html lang="',
|
||||||
$_POST['login_html'],
|
$_POST['login_html'],
|
||||||
'Assert ajax _POST html string exits'
|
'Assert ajax _POST html string exits'
|
||||||
);
|
);
|
||||||
@@ -1729,7 +1750,7 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
],
|
],
|
||||||
20
|
20
|
||||||
],
|
],
|
||||||
'invalud search' => [
|
'invalid search' => [
|
||||||
12,
|
12,
|
||||||
'foo',
|
'foo',
|
||||||
[],
|
[],
|
||||||
@@ -1774,7 +1795,22 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
);
|
);
|
||||||
/** @var \CoreLibs\ACL\Login&MockObject */
|
/** @var \CoreLibs\ACL\Login&MockObject */
|
||||||
$login_mock = $this->getMockBuilder(\CoreLibs\ACL\Login::class)
|
$login_mock = $this->getMockBuilder(\CoreLibs\ACL\Login::class)
|
||||||
->setConstructorArgs([self::$db, self::$log, $session_mock, false])
|
->setConstructorArgs([
|
||||||
|
self::$db,
|
||||||
|
self::$log,
|
||||||
|
$session_mock,
|
||||||
|
[
|
||||||
|
'auto_login' => false,
|
||||||
|
'default_acl_level' => 80,
|
||||||
|
'logout_target' => '',
|
||||||
|
'site_locale' => 'en_US.UTF-8',
|
||||||
|
'site_domain' => 'admin',
|
||||||
|
'site_encoding' => 'UTF-8',
|
||||||
|
'locale_path' => __DIR__ . DIRECTORY_SEPARATOR
|
||||||
|
. 'includes' . DIRECTORY_SEPARATOR
|
||||||
|
. 'locale' . DIRECTORY_SEPARATOR,
|
||||||
|
]
|
||||||
|
])
|
||||||
->onlyMethods(['loginTerminate'])
|
->onlyMethods(['loginTerminate'])
|
||||||
->getMock();
|
->getMock();
|
||||||
$login_mock->expects($this->any())
|
$login_mock->expects($this->any())
|
||||||
@@ -1873,7 +1909,22 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
);
|
);
|
||||||
/** @var \CoreLibs\ACL\Login&MockObject */
|
/** @var \CoreLibs\ACL\Login&MockObject */
|
||||||
$login_mock = $this->getMockBuilder(\CoreLibs\ACL\Login::class)
|
$login_mock = $this->getMockBuilder(\CoreLibs\ACL\Login::class)
|
||||||
->setConstructorArgs([self::$db, self::$log, $session_mock, false])
|
->setConstructorArgs([
|
||||||
|
self::$db,
|
||||||
|
self::$log,
|
||||||
|
$session_mock,
|
||||||
|
[
|
||||||
|
'auto_login' => false,
|
||||||
|
'default_acl_level' => 80,
|
||||||
|
'logout_target' => '',
|
||||||
|
'site_locale' => 'en_US.UTF-8',
|
||||||
|
'site_domain' => 'admin',
|
||||||
|
'site_encoding' => 'UTF-8',
|
||||||
|
'locale_path' => __DIR__ . DIRECTORY_SEPARATOR
|
||||||
|
. 'includes' . DIRECTORY_SEPARATOR
|
||||||
|
. 'locale' . DIRECTORY_SEPARATOR,
|
||||||
|
]
|
||||||
|
])
|
||||||
->onlyMethods(['loginTerminate'])
|
->onlyMethods(['loginTerminate'])
|
||||||
->getMock();
|
->getMock();
|
||||||
$login_mock->expects($this->any())
|
$login_mock->expects($this->any())
|
||||||
@@ -1946,7 +1997,22 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
);
|
);
|
||||||
/** @var \CoreLibs\ACL\Login&MockObject */
|
/** @var \CoreLibs\ACL\Login&MockObject */
|
||||||
$login_mock = $this->getMockBuilder(\CoreLibs\ACL\Login::class)
|
$login_mock = $this->getMockBuilder(\CoreLibs\ACL\Login::class)
|
||||||
->setConstructorArgs([self::$db, self::$log, $session_mock, false])
|
->setConstructorArgs([
|
||||||
|
self::$db,
|
||||||
|
self::$log,
|
||||||
|
$session_mock,
|
||||||
|
[
|
||||||
|
'auto_login' => false,
|
||||||
|
'default_acl_level' => 80,
|
||||||
|
'logout_target' => '',
|
||||||
|
'site_locale' => 'en_US.UTF-8',
|
||||||
|
'site_domain' => 'admin',
|
||||||
|
'site_encoding' => 'UTF-8',
|
||||||
|
'locale_path' => __DIR__ . DIRECTORY_SEPARATOR
|
||||||
|
. 'includes' . DIRECTORY_SEPARATOR
|
||||||
|
. 'locale' . DIRECTORY_SEPARATOR,
|
||||||
|
]
|
||||||
|
])
|
||||||
->onlyMethods(['loginTerminate'])
|
->onlyMethods(['loginTerminate'])
|
||||||
->getMock();
|
->getMock();
|
||||||
$login_mock->expects($this->any())
|
$login_mock->expects($this->any())
|
||||||
@@ -2027,7 +2093,22 @@ final class CoreLibsACLLoginTest extends TestCase
|
|||||||
);
|
);
|
||||||
/** @var \CoreLibs\ACL\Login&MockObject */
|
/** @var \CoreLibs\ACL\Login&MockObject */
|
||||||
$login_mock = $this->getMockBuilder(\CoreLibs\ACL\Login::class)
|
$login_mock = $this->getMockBuilder(\CoreLibs\ACL\Login::class)
|
||||||
->setConstructorArgs([self::$db, self::$log, $session_mock, false])
|
->setConstructorArgs([
|
||||||
|
self::$db,
|
||||||
|
self::$log,
|
||||||
|
$session_mock,
|
||||||
|
[
|
||||||
|
'auto_login' => false,
|
||||||
|
'default_acl_level' => 80,
|
||||||
|
'logout_target' => '',
|
||||||
|
'site_locale' => 'en_US.UTF-8',
|
||||||
|
'site_domain' => 'admin',
|
||||||
|
'site_encoding' => 'UTF-8',
|
||||||
|
'locale_path' => __DIR__ . DIRECTORY_SEPARATOR
|
||||||
|
. 'includes' . DIRECTORY_SEPARATOR
|
||||||
|
. 'locale' . DIRECTORY_SEPARATOR,
|
||||||
|
]
|
||||||
|
])
|
||||||
->onlyMethods(['loginTerminate'])
|
->onlyMethods(['loginTerminate'])
|
||||||
->getMock();
|
->getMock();
|
||||||
$login_mock->expects($this->any())
|
$login_mock->expects($this->any())
|
||||||
1
4dev/tests/ACL/includes
Symbolic link
1
4dev/tests/ACL/includes
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../AAASetupData/includes
|
||||||
47
4dev/tests/Admin/CoreLibsAdminEditPageTest.php
Normal file
47
4dev/tests/Admin/CoreLibsAdminEditPageTest.php
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Admin\EditPage
|
||||||
|
* @coversDefaultClass \CoreLibs\Admin\EditPage
|
||||||
|
* @testdox \CoreLibs\Admin\EditPage method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsAdminEditPageTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function setUp(): void
|
||||||
|
{
|
||||||
|
if (!extension_loaded('pgsql')) {
|
||||||
|
$this->markTestSkipped(
|
||||||
|
'The PgSQL extension is not available.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @testdox Admin\EditPage Class tests
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testAdminEditPage()
|
||||||
|
{
|
||||||
|
/* $this->assertTrue(true, 'ACL Login Tests not implemented');
|
||||||
|
$this->markTestIncomplete(
|
||||||
|
'ACL\Login Tests have not yet been implemented'
|
||||||
|
); */
|
||||||
|
$this->markTestSkipped('No implementation for Admin\EditPage at the moment');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
329
4dev/tests/Check/CoreLibsCheckColorsTest.php
Normal file
329
4dev/tests/Check/CoreLibsCheckColorsTest.php
Normal file
@@ -0,0 +1,329 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Check\Colors
|
||||||
|
* @coversDefaultClass \CoreLibs\Check\Colors
|
||||||
|
* @testdox \CoreLibs\Check\Colors method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsCheckColorsTest extends TestCase
|
||||||
|
{
|
||||||
|
public function validateColorProvider(): array
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
0: input color string
|
||||||
|
1: flag (or flags to set)
|
||||||
|
2: expected result (bool)
|
||||||
|
*/
|
||||||
|
return [
|
||||||
|
// * hex
|
||||||
|
'valid hex rgb, flag ALL (default)' => [
|
||||||
|
'#ab12cd',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hex rgb, flag ALL' => [
|
||||||
|
'#ab12cd',
|
||||||
|
\CoreLibs\Check\Colors::ALL,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hex rgb, flag HEX_RGB' => [
|
||||||
|
'#ab12cd',
|
||||||
|
\CoreLibs\Check\Colors::HEX_RGB,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hex rgb, wrong flag' => [
|
||||||
|
'#ab12cd',
|
||||||
|
\CoreLibs\Check\Colors::RGB,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
// error
|
||||||
|
'invalid hex rgb A' => [
|
||||||
|
'#ab12zz',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid hex rgb B' => [
|
||||||
|
'#ZyQfo',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
// other valid hex checks
|
||||||
|
'valid hex rgb, alt A' => [
|
||||||
|
'#AB12cd',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// * hax alpha
|
||||||
|
'valid hex rgb alpha, flag ALL (default)' => [
|
||||||
|
'#ab12cd12',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hex rgb alpha, flag ALL' => [
|
||||||
|
'#ab12cd12',
|
||||||
|
\CoreLibs\Check\Colors::ALL,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hex rgb alpha, flag HEX_RGBA' => [
|
||||||
|
'#ab12cd12',
|
||||||
|
\CoreLibs\Check\Colors::HEX_RGBA,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hex rgb alpha, wrong flag' => [
|
||||||
|
'#ab12cd12',
|
||||||
|
\CoreLibs\Check\Colors::RGB,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
// error
|
||||||
|
'invalid hex rgb alpha A' => [
|
||||||
|
'#ab12dd1',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid hex rgb alpha B' => [
|
||||||
|
'#ab12ddzz',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'valid hex rgb alpha, alt A' => [
|
||||||
|
'#ab12cdEE',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// * rgb
|
||||||
|
'valid rgb, flag ALL (default)' => [
|
||||||
|
'rgb(255, 10, 20)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid rgb, flag ALL' => [
|
||||||
|
'rgb(255, 10, 20)',
|
||||||
|
\CoreLibs\Check\Colors::ALL,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid rgb, flag RGB' => [
|
||||||
|
'rgb(255, 10, 20)',
|
||||||
|
\CoreLibs\Check\Colors::RGB,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid rgb, wrong flag' => [
|
||||||
|
'rgb(255, 10, 20)',
|
||||||
|
\CoreLibs\Check\Colors::HEX_RGB,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
// error
|
||||||
|
'invalid rgb A' => [
|
||||||
|
'rgb(356, 10, 20)',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
// other valid rgb conbinations
|
||||||
|
'valid rgb, alt A (percent)' => [
|
||||||
|
'rgb(100%, 10%, 20%)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// TODO check all % and non percent combinations
|
||||||
|
'valid rgb, alt B (percent, mix)' => [
|
||||||
|
'rgb(100%, 10, 40)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// * rgb alpha
|
||||||
|
'valid rgba, flag ALL (default)' => [
|
||||||
|
'rgba(255, 10, 20, 0.5)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid rgba, flag ALL' => [
|
||||||
|
'rgba(255, 10, 20, 0.5)',
|
||||||
|
\CoreLibs\Check\Colors::ALL,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid rgba, flag RGB' => [
|
||||||
|
'rgba(255, 10, 20, 0.5)',
|
||||||
|
\CoreLibs\Check\Colors::RGBA,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid rgba, wrong flag' => [
|
||||||
|
'rgba(255, 10, 20, 0.5)',
|
||||||
|
\CoreLibs\Check\Colors::HEX_RGB,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
// error
|
||||||
|
'invalid rgba A' => [
|
||||||
|
'rgba(356, 10, 20, 0.5)',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
// other valid rgba combinations
|
||||||
|
'valid rgba, alt A (percent)' => [
|
||||||
|
'rgba(100%, 10%, 20%, 0.5)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// TODO check all % and non percent combinations
|
||||||
|
'valid rgba, alt B (percent, mix)' => [
|
||||||
|
'rgba(100%, 10, 40, 0.5)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// TODO check all % and non percent combinations with percent transparent
|
||||||
|
'valid rgba, alt C (percent transparent)' => [
|
||||||
|
'rgba(100%, 10%, 20%, 50%)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
/*
|
||||||
|
// hsl
|
||||||
|
'hsl(100, 50%, 60%)',
|
||||||
|
'hsl(100, 50.5%, 60.5%)',
|
||||||
|
'hsla(100, 50%, 60%)',
|
||||||
|
'hsla(100, 50.5%, 60.5%)',
|
||||||
|
'hsla(100, 50%, 60%, 0.5)',
|
||||||
|
'hsla(100, 50.5%, 60.5%, 0.5)',
|
||||||
|
'hsla(100, 50%, 60%, 50%)',
|
||||||
|
'hsla(100, 50.5%, 60.5%, 50%)',
|
||||||
|
*/
|
||||||
|
// * hsl
|
||||||
|
'valid hsl, flag ALL (default)' => [
|
||||||
|
'hsl(100, 50%, 60%)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hsl, flag ALL' => [
|
||||||
|
'hsl(100, 50%, 60%)',
|
||||||
|
\CoreLibs\Check\Colors::ALL,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hsl, flag RGB' => [
|
||||||
|
'hsl(100, 50%, 60%)',
|
||||||
|
\CoreLibs\Check\Colors::HSL,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hsl, wrong flag' => [
|
||||||
|
'hsl(100, 50%, 60%)',
|
||||||
|
\CoreLibs\Check\Colors::HEX_RGB,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid hsl A' => [
|
||||||
|
'hsl(500, 50%, 60%)',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'valid hsl, alt A' => [
|
||||||
|
'hsl(100, 50.5%, 60.5%)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// * hsl alpha
|
||||||
|
'valid hsla, flag ALL (default)' => [
|
||||||
|
'hsla(100, 50%, 60%, 0.5)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hsla, flag ALL' => [
|
||||||
|
'hsla(100, 50%, 60%, 0.5)',
|
||||||
|
\CoreLibs\Check\Colors::ALL,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hsla, flag RGB' => [
|
||||||
|
'hsla(100, 50%, 60%, 0.5)',
|
||||||
|
\CoreLibs\Check\Colors::HSLA,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hsla, wrong flag' => [
|
||||||
|
'hsla(100, 50%, 60%, 0.5)',
|
||||||
|
\CoreLibs\Check\Colors::HEX_RGB,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid hsla A' => [
|
||||||
|
'hsla(500, 50%, 60%, 0.5)',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'valid hsla, alt A (percent alpha' => [
|
||||||
|
'hsla(100, 50%, 60%, 50%)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid hsla, alt A (percent alpha' => [
|
||||||
|
'hsla(100, 50.5%, 60.5%, 50%)',
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// * combined flag checks
|
||||||
|
'valid rgb, flag RGB|RGBA' => [
|
||||||
|
'rgb(100%, 10%, 20%)',
|
||||||
|
\CoreLibs\Check\Colors::RGB | \CoreLibs\Check\Colors::RGBA,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
// TODO other combined flag checks all combinations
|
||||||
|
// * invalid string
|
||||||
|
'invalid string A' => [
|
||||||
|
'invalid string',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid string B' => [
|
||||||
|
'(hsla(100, 100, 100))',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid string C' => [
|
||||||
|
'hsla(100, 100, 100',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::validateColor
|
||||||
|
* @dataProvider validateColorProvider
|
||||||
|
* @testdox validateColor $input with flags $flags be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param int|null $flags
|
||||||
|
* @param bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testValidateColor(string $input, ?int $flags, bool $expected)
|
||||||
|
{
|
||||||
|
if ($flags === null) {
|
||||||
|
$result = \CoreLibs\Check\Colors::validateColor($input);
|
||||||
|
} else {
|
||||||
|
$result = \CoreLibs\Check\Colors::validateColor($input, $flags);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$result
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::validateColor
|
||||||
|
* @testWith [99]
|
||||||
|
* @testdox Check Exception throw for $flag
|
||||||
|
*
|
||||||
|
* @param int $flag
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testValidateColorException(int $flag): void
|
||||||
|
{
|
||||||
|
$this->expectException(\Exception::class);
|
||||||
|
\CoreLibs\Check\Colors::validateColor('#ffffff', $flag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -92,6 +92,7 @@ final class CoreLibsCheckEncodingTest extends TestCase
|
|||||||
$error_char,
|
$error_char,
|
||||||
$expected
|
$expected
|
||||||
): void {
|
): void {
|
||||||
|
$current_subsitute_character = mb_substitute_character();
|
||||||
if ($error_char !== null) {
|
if ($error_char !== null) {
|
||||||
\CoreLibs\Check\Encoding::setErrorChar($error_char);
|
\CoreLibs\Check\Encoding::setErrorChar($error_char);
|
||||||
if (!in_array($error_char, ['none', 'long', 'entity'])) {
|
if (!in_array($error_char, ['none', 'long', 'entity'])) {
|
||||||
@@ -111,6 +112,8 @@ final class CoreLibsCheckEncodingTest extends TestCase
|
|||||||
$expected,
|
$expected,
|
||||||
$return
|
$return
|
||||||
);
|
);
|
||||||
|
// reset after test
|
||||||
|
mb_substitute_character($current_subsitute_character);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -31,6 +31,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
|||||||
4,
|
4,
|
||||||
'b',
|
'b',
|
||||||
'c' => 'test',
|
'c' => 'test',
|
||||||
|
'single' => 'single',
|
||||||
'same' => 'same',
|
'same' => 'same',
|
||||||
'deep' => [
|
'deep' => [
|
||||||
'sub' => [
|
'sub' => [
|
||||||
@@ -107,6 +108,13 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function arraySearchRecursiveAllProvider(): array
|
public function arraySearchRecursiveAllProvider(): array
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
0: $needle,
|
||||||
|
1: array $input,
|
||||||
|
2: ?string $key_search_for,
|
||||||
|
3: bool $flag,
|
||||||
|
4: array $expected
|
||||||
|
*/
|
||||||
return [
|
return [
|
||||||
'find value' => [
|
'find value' => [
|
||||||
0 => 'bar',
|
0 => 'bar',
|
||||||
@@ -172,6 +180,13 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function arraySearchSimpleProvider(): array
|
public function arraySearchSimpleProvider(): array
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
0: array $input,
|
||||||
|
1: $key,
|
||||||
|
2: $value,
|
||||||
|
3: bool $flag,
|
||||||
|
4: bool $expected
|
||||||
|
*/
|
||||||
return [
|
return [
|
||||||
'key/value exist' => [
|
'key/value exist' => [
|
||||||
0 => self::$array,
|
0 => self::$array,
|
||||||
@@ -274,6 +289,188 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function arraySearchKeyProvider(): array
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
0: search in array
|
||||||
|
1: search keys
|
||||||
|
2: flat flag
|
||||||
|
3: prefix flag
|
||||||
|
4: expected array
|
||||||
|
*/
|
||||||
|
return [
|
||||||
|
// single
|
||||||
|
'find single, standard' => [
|
||||||
|
0 => self::$array,
|
||||||
|
1 => ['single'],
|
||||||
|
2 => null,
|
||||||
|
3 => null,
|
||||||
|
4 => [
|
||||||
|
0 => [
|
||||||
|
'value' => 'single',
|
||||||
|
'path' => ['single'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'find single, prefix' => [
|
||||||
|
0 => self::$array,
|
||||||
|
1 => ['single'],
|
||||||
|
2 => null,
|
||||||
|
3 => true,
|
||||||
|
4 => [
|
||||||
|
'single' => [
|
||||||
|
0 => [
|
||||||
|
'value' => 'single',
|
||||||
|
'path' => ['single'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'find single, flat' => [
|
||||||
|
0 => self::$array,
|
||||||
|
1 => ['single'],
|
||||||
|
2 => true,
|
||||||
|
3 => null,
|
||||||
|
4 => [
|
||||||
|
'single',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'find single, flat, prefix' => [
|
||||||
|
0 => self::$array,
|
||||||
|
1 => ['single'],
|
||||||
|
2 => true,
|
||||||
|
3 => true,
|
||||||
|
4 => [
|
||||||
|
'single' => [
|
||||||
|
'single',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// not found
|
||||||
|
'not found, standard' => [
|
||||||
|
0 => self::$array,
|
||||||
|
1 => ['NOT FOUND'],
|
||||||
|
2 => null,
|
||||||
|
3 => null,
|
||||||
|
4 => [],
|
||||||
|
],
|
||||||
|
'not found, standard, prefix' => [
|
||||||
|
0 => self::$array,
|
||||||
|
1 => ['NOT FOUND'],
|
||||||
|
2 => null,
|
||||||
|
3 => true,
|
||||||
|
4 => [
|
||||||
|
'NOT FOUND' => [],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'not found, flat' => [
|
||||||
|
0 => self::$array,
|
||||||
|
1 => ['NOT FOUND'],
|
||||||
|
2 => true,
|
||||||
|
3 => null,
|
||||||
|
4 => [],
|
||||||
|
],
|
||||||
|
'not found, flat, prefix' => [
|
||||||
|
0 => self::$array,
|
||||||
|
1 => ['NOT FOUND'],
|
||||||
|
2 => true,
|
||||||
|
3 => true,
|
||||||
|
4 => [
|
||||||
|
'NOT FOUND' => [],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// multi
|
||||||
|
'multiple found, standard' => [
|
||||||
|
0 => self::$array,
|
||||||
|
1 => ['same'],
|
||||||
|
2 => null,
|
||||||
|
3 => null,
|
||||||
|
4 => [
|
||||||
|
[
|
||||||
|
'value' => 'same',
|
||||||
|
'path' => ['a', 'same', ],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'value' => 'same',
|
||||||
|
'path' => ['same', ],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'value' => 'same',
|
||||||
|
'path' => ['deep', 'sub', 'same', ],
|
||||||
|
],
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'multiple found, flat' => [
|
||||||
|
0 => self::$array,
|
||||||
|
1 => ['same'],
|
||||||
|
2 => true,
|
||||||
|
3 => null,
|
||||||
|
4 => ['same', 'same', 'same', ],
|
||||||
|
],
|
||||||
|
// search with multiple
|
||||||
|
'search multiple, standard' => [
|
||||||
|
0 => self::$array,
|
||||||
|
1 => ['single', 'nested'],
|
||||||
|
2 => null,
|
||||||
|
3 => null,
|
||||||
|
4 => [
|
||||||
|
[
|
||||||
|
'value' => 'single',
|
||||||
|
'path' => ['single'],
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'value' => 'bar',
|
||||||
|
'path' => ['deep', 'sub', 'nested', ],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'search multiple, prefix' => [
|
||||||
|
0 => self::$array,
|
||||||
|
1 => ['single', 'nested'],
|
||||||
|
2 => null,
|
||||||
|
3 => true,
|
||||||
|
4 => [
|
||||||
|
'single' => [
|
||||||
|
[
|
||||||
|
'value' => 'single',
|
||||||
|
'path' => ['single'],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'nested' => [
|
||||||
|
[
|
||||||
|
'value' => 'bar',
|
||||||
|
'path' => ['deep', 'sub', 'nested', ],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'search multiple, flat' => [
|
||||||
|
0 => self::$array,
|
||||||
|
1 => ['single', 'nested'],
|
||||||
|
2 => true,
|
||||||
|
3 => null,
|
||||||
|
4 => [
|
||||||
|
'single', 'bar',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'search multiple, flat, prefix' => [
|
||||||
|
0 => self::$array,
|
||||||
|
1 => ['single', 'nested'],
|
||||||
|
2 => true,
|
||||||
|
3 => true,
|
||||||
|
4 => [
|
||||||
|
'single' => ['single', ],
|
||||||
|
'nested' => ['bar', ],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* provides array listing for the merge test
|
* provides array listing for the merge test
|
||||||
*
|
*
|
||||||
@@ -665,7 +862,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
|||||||
*
|
*
|
||||||
* @param array $input
|
* @param array $input
|
||||||
* @param string|int $key
|
* @param string|int $key
|
||||||
* @param string|int $value
|
* @param string|int|bool $value
|
||||||
* @param bool $expected
|
* @param bool $expected
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
@@ -677,6 +874,44 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers::arraySearchKey
|
||||||
|
* @dataProvider arraySearchKeyProvider
|
||||||
|
* @testdox arraySearchKey Search array with keys and flat: $flat, prefix: $prefix [$_dataName]
|
||||||
|
*
|
||||||
|
* @param array $input
|
||||||
|
* @param array $needles
|
||||||
|
* @param bool|null $flat
|
||||||
|
* @param bool|null $prefix
|
||||||
|
* @param array $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testArraySearchKey(
|
||||||
|
array $input,
|
||||||
|
array $needles,
|
||||||
|
?bool $flat,
|
||||||
|
?bool $prefix,
|
||||||
|
array $expected
|
||||||
|
): void {
|
||||||
|
if ($flat === null && $prefix === null) {
|
||||||
|
$result = \CoreLibs\Combined\ArrayHandler::arraySearchKey($input, $needles);
|
||||||
|
} elseif ($flat === null) {
|
||||||
|
$result = \CoreLibs\Combined\ArrayHandler::arraySearchKey($input, $needles, prefix: $prefix);
|
||||||
|
} elseif ($prefix === null) {
|
||||||
|
$result = \CoreLibs\Combined\ArrayHandler::arraySearchKey($input, $needles, flat: $flat);
|
||||||
|
} else {
|
||||||
|
$result = \CoreLibs\Combined\ArrayHandler::arraySearchKey($input, $needles, $flat, $prefix);
|
||||||
|
}
|
||||||
|
// print "E: " . print_r($expected, true) . "\n";
|
||||||
|
// print "R: " . print_r($result, true) . "\n";
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$result
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -712,12 +947,23 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function testArrayMergeRecursiveWarningA(): void
|
public function testArrayMergeRecursiveWarningA(): void
|
||||||
{
|
{
|
||||||
|
set_error_handler(
|
||||||
|
static function (int $errno, string $errstr): never {
|
||||||
|
throw new Exception($errstr, $errno);
|
||||||
|
},
|
||||||
|
E_USER_WARNING
|
||||||
|
);
|
||||||
|
|
||||||
$arrays = func_get_args();
|
$arrays = func_get_args();
|
||||||
// first is expected warning
|
// first is expected warning
|
||||||
$warning = array_shift($arrays);
|
$warning = array_shift($arrays);
|
||||||
$this->expectWarning();
|
|
||||||
$this->expectWarningMessage($warning);
|
// phpunit 10.0 compatible
|
||||||
|
$this->expectExceptionMessage($warning);
|
||||||
|
|
||||||
\CoreLibs\Combined\ArrayHandler::arrayMergeRecursive(...$arrays);
|
\CoreLibs\Combined\ArrayHandler::arrayMergeRecursive(...$arrays);
|
||||||
|
|
||||||
|
restore_error_handler();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
849
4dev/tests/Combined/CoreLibsCombinedDateTimeTest.php
Normal file
849
4dev/tests/Combined/CoreLibsCombinedDateTimeTest.php
Normal file
@@ -0,0 +1,849 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Combined\DateTime
|
||||||
|
* @coversDefaultClass \CoreLibs\Combined\DateTime
|
||||||
|
* @testdox \CoreLibs\Combined\DateTime method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsCombinedDateTimeTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* timestamps
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function timestampProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'valid timestamp no microtime' => [
|
||||||
|
1641515890,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
'2022-01-07 09:38:10',
|
||||||
|
],
|
||||||
|
'valid timestamp with microtime' => [
|
||||||
|
1641515890,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
'2022-01-07 09:38:10',
|
||||||
|
],
|
||||||
|
'valid timestamp with microtime float' => [
|
||||||
|
1641515890,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
'2022-01-07 09:38:10',
|
||||||
|
],
|
||||||
|
'valid micro timestamp with microtime' => [
|
||||||
|
1641515890.123456,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
'2022-01-07 09:38:10 1235ms',
|
||||||
|
],
|
||||||
|
'valid micro timestamp with microtime float' => [
|
||||||
|
1641515890.123456,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
'2022-01-07 09:38:10.1235',
|
||||||
|
],
|
||||||
|
'valid micro timestamp no microtime' => [
|
||||||
|
1641515890.123456,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
'2022-01-07 09:38:10',
|
||||||
|
],
|
||||||
|
'invalid timestamp' => [
|
||||||
|
-123123,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
'1969-12-30 22:47:57',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* interval for both directions
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function intervalProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'interval no microtime' => [
|
||||||
|
1641515890,
|
||||||
|
false,
|
||||||
|
'18999d 0h 38m 10s',
|
||||||
|
],
|
||||||
|
'interval with microtime' => [
|
||||||
|
1641515890,
|
||||||
|
true,
|
||||||
|
'18999d 0h 38m 10s',
|
||||||
|
],
|
||||||
|
'micro interval no microtime' => [
|
||||||
|
1641515890.123456,
|
||||||
|
false,
|
||||||
|
'18999d 0h 38m 10s',
|
||||||
|
],
|
||||||
|
'micro interval with microtime' => [
|
||||||
|
1641515890.123456,
|
||||||
|
true,
|
||||||
|
'18999d 0h 38m 10s 1235ms',
|
||||||
|
],
|
||||||
|
'negative interval no microtime' => [
|
||||||
|
-1641515890,
|
||||||
|
false,
|
||||||
|
'-18999d 0h 38m 10s',
|
||||||
|
],
|
||||||
|
// short for mini tests
|
||||||
|
'microtime only' => [
|
||||||
|
0.123456,
|
||||||
|
true,
|
||||||
|
'0s 1235ms',
|
||||||
|
],
|
||||||
|
'seconds only' => [
|
||||||
|
30.123456,
|
||||||
|
true,
|
||||||
|
'30s 1235ms',
|
||||||
|
],
|
||||||
|
'minutes only' => [
|
||||||
|
90.123456,
|
||||||
|
true,
|
||||||
|
'1m 30s 1235ms',
|
||||||
|
],
|
||||||
|
'hours only' => [
|
||||||
|
3690.123456,
|
||||||
|
true,
|
||||||
|
'1h 1m 30s 1235ms',
|
||||||
|
],
|
||||||
|
'days only' => [
|
||||||
|
90090.123456,
|
||||||
|
true,
|
||||||
|
'1d 1h 1m 30s 1235ms',
|
||||||
|
],
|
||||||
|
'already set' => [
|
||||||
|
'1d 1h 1m 30s 1235ms',
|
||||||
|
true,
|
||||||
|
'1d 1h 1m 30s 1235ms',
|
||||||
|
],
|
||||||
|
'invalid data' => [
|
||||||
|
'xyz',
|
||||||
|
true,
|
||||||
|
'0s',
|
||||||
|
],
|
||||||
|
'out of bounds timestamp' => [
|
||||||
|
999999999999999,
|
||||||
|
false,
|
||||||
|
'1s'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function reverseIntervalProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'interval no microtime' => [
|
||||||
|
'18999d 0h 38m 10s',
|
||||||
|
1641515890,
|
||||||
|
],
|
||||||
|
'micro interval with microtime' => [
|
||||||
|
'18999d 0h 38m 10s 1235ms',
|
||||||
|
1641515890.1235,
|
||||||
|
],
|
||||||
|
'micro interval with microtime' => [
|
||||||
|
'18999d 0h 38m 10s 1234567890ms',
|
||||||
|
1641515890.1234567,
|
||||||
|
],
|
||||||
|
'negative interval no microtime' => [
|
||||||
|
'-18999d 0h 38m 10s',
|
||||||
|
-1641515890,
|
||||||
|
],
|
||||||
|
// short for mini tests
|
||||||
|
'microtime only' => [
|
||||||
|
'0s 1235ms',
|
||||||
|
0.1235,
|
||||||
|
],
|
||||||
|
'seconds only' => [
|
||||||
|
'30s 1235ms',
|
||||||
|
30.1235,
|
||||||
|
],
|
||||||
|
'minutes only' => [
|
||||||
|
'1m 30s 1235ms',
|
||||||
|
90.1235,
|
||||||
|
],
|
||||||
|
'hours only' => [
|
||||||
|
'1h 1m 30s 1235ms',
|
||||||
|
3690.1235,
|
||||||
|
],
|
||||||
|
'days only' => [
|
||||||
|
'1d 1h 1m 30s 1235ms',
|
||||||
|
90090.1235,
|
||||||
|
],
|
||||||
|
'already set' => [
|
||||||
|
1641515890,
|
||||||
|
1641515890,
|
||||||
|
],
|
||||||
|
'invalid data' => [
|
||||||
|
'xyz',
|
||||||
|
'xyz',
|
||||||
|
],
|
||||||
|
'out of bound data' => [
|
||||||
|
'99999999999999999999d',
|
||||||
|
8.64E+24
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function dateProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'valid date with -' => [
|
||||||
|
'2021-12-12',
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid date with /' => [
|
||||||
|
'2021/12/12',
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid date time with -' => [
|
||||||
|
'2021-12-12 12:12:12',
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'invalid date' => [
|
||||||
|
'2021-31-31',
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid date string' => [
|
||||||
|
'xyz',
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'out of bound date' => [
|
||||||
|
'9999-12-31',
|
||||||
|
true
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function dateTimeProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'valid date time with -' => [
|
||||||
|
'2021-12-12 12:12:12',
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid date time with /' => [
|
||||||
|
'2021/12/12 12:12:12',
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'vald date time with hour/min' => [
|
||||||
|
'2021/12/12 12:12',
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'valid date missing time' => [
|
||||||
|
'2021-12-12',
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'valid date invalid time string' => [
|
||||||
|
'2021-12-12 ab:cd',
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid hour +' => [
|
||||||
|
'2021-12-12 35:12',
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid hour -' => [
|
||||||
|
'2021-12-12 -12:12',
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid minute +' => [
|
||||||
|
'2021-12-12 23:65:12',
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid minute -' => [
|
||||||
|
'2021-12-12 23:-12:12',
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid seconds +' => [
|
||||||
|
'2021-12-12 23:12:99',
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid seconds -' => [
|
||||||
|
'2021-12-12 23:12:-12',
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid seconds string' => [
|
||||||
|
'2021-12-12 23:12:ss',
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function dateCompareProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'first date smaller' => [
|
||||||
|
'2020-12-12',
|
||||||
|
'2021-12-12',
|
||||||
|
-1,
|
||||||
|
],
|
||||||
|
'dates equal' => [
|
||||||
|
'2020-12-12',
|
||||||
|
'2020-12-12',
|
||||||
|
0,
|
||||||
|
],
|
||||||
|
'second date smaller' => [
|
||||||
|
'2021-12-12',
|
||||||
|
'2020-12-12',
|
||||||
|
1
|
||||||
|
],
|
||||||
|
'dates equal with different time' => [
|
||||||
|
'2020-12-12 12:12:12',
|
||||||
|
'2020-12-12 13:13:13',
|
||||||
|
0,
|
||||||
|
],
|
||||||
|
'invalid dates --' => [
|
||||||
|
'--',
|
||||||
|
'--',
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'empty dates' => [
|
||||||
|
'',
|
||||||
|
'',
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'invalid dates' => [
|
||||||
|
'not a date',
|
||||||
|
'not a date either',
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'out of bound dates' => [
|
||||||
|
'1900-1-1',
|
||||||
|
'9999-12-31',
|
||||||
|
-1
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function dateTimeCompareProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'first date smaller no time' => [
|
||||||
|
'2020-12-12',
|
||||||
|
'2021-12-12',
|
||||||
|
-1,
|
||||||
|
],
|
||||||
|
'dates equal no timestamp' => [
|
||||||
|
'2020-12-12',
|
||||||
|
'2020-12-12',
|
||||||
|
0,
|
||||||
|
],
|
||||||
|
'second date smaller no timestamp' => [
|
||||||
|
'2021-12-12',
|
||||||
|
'2020-12-12',
|
||||||
|
1
|
||||||
|
],
|
||||||
|
'date equal first time smaller' => [
|
||||||
|
'2020-12-12 12:12:12',
|
||||||
|
'2020-12-12 13:13:13',
|
||||||
|
-1,
|
||||||
|
],
|
||||||
|
'date equal time equal' => [
|
||||||
|
'2020-12-12 12:12:12',
|
||||||
|
'2020-12-12 12:12:12',
|
||||||
|
0,
|
||||||
|
],
|
||||||
|
'date equal second time smaller' => [
|
||||||
|
'2020-12-12 13:13:13',
|
||||||
|
'2020-12-12 12:12:12',
|
||||||
|
1,
|
||||||
|
],
|
||||||
|
'valid date invalid time' => [
|
||||||
|
'2020-12-12 13:99:13',
|
||||||
|
'2020-12-12 12:12:99',
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid datetimes --' => [
|
||||||
|
'--',
|
||||||
|
'--',
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'empty datetimess' => [
|
||||||
|
'',
|
||||||
|
'',
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid datetimes' => [
|
||||||
|
'not a date',
|
||||||
|
'not a date either',
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function daysIntervalProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'valid interval /, not named array' => [
|
||||||
|
'2020/1/1',
|
||||||
|
'2020/1/30',
|
||||||
|
false,
|
||||||
|
[29, 22, 8],
|
||||||
|
],
|
||||||
|
'valid interval /, named array' => [
|
||||||
|
'2020/1/1',
|
||||||
|
'2020/1/30',
|
||||||
|
true,
|
||||||
|
['overall' => 29, 'weekday' => 22, 'weekend' => 8],
|
||||||
|
],
|
||||||
|
'valid interval -' => [
|
||||||
|
'2020-1-1',
|
||||||
|
'2020-1-30',
|
||||||
|
false,
|
||||||
|
[29, 22, 8],
|
||||||
|
],
|
||||||
|
'valid interval switched' => [
|
||||||
|
'2020/1/30',
|
||||||
|
'2020/1/1',
|
||||||
|
false,
|
||||||
|
[28, 0, 0],
|
||||||
|
],
|
||||||
|
'valid interval with time' => [
|
||||||
|
'2020/1/1 12:12:12',
|
||||||
|
'2020/1/30 13:13:13',
|
||||||
|
false,
|
||||||
|
[28, 21, 8],
|
||||||
|
],
|
||||||
|
'invalid dates' => [
|
||||||
|
'abc',
|
||||||
|
'xyz',
|
||||||
|
false,
|
||||||
|
[0, 0, 0]
|
||||||
|
],
|
||||||
|
// this test will take a long imte
|
||||||
|
'out of bound dates' => [
|
||||||
|
'1900-1-1',
|
||||||
|
'9999-12-31',
|
||||||
|
false,
|
||||||
|
[2958463,2113189,845274],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function dateRangeHasWeekendProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'no weekend' => [
|
||||||
|
'2023-07-03',
|
||||||
|
'2023-07-04',
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'start weekend sat' => [
|
||||||
|
'2023-07-01',
|
||||||
|
'2023-07-04',
|
||||||
|
true
|
||||||
|
],
|
||||||
|
'start weekend sun' => [
|
||||||
|
'2023-07-02',
|
||||||
|
'2023-07-04',
|
||||||
|
true
|
||||||
|
],
|
||||||
|
'end weekend sat' => [
|
||||||
|
'2023-07-03',
|
||||||
|
'2023-07-08',
|
||||||
|
true
|
||||||
|
],
|
||||||
|
'end weekend sun' => [
|
||||||
|
'2023-07-03',
|
||||||
|
'2023-07-09',
|
||||||
|
true
|
||||||
|
],
|
||||||
|
'long period > 6 days' => [
|
||||||
|
'2023-07-03',
|
||||||
|
'2023-07-27',
|
||||||
|
true
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* date string convert test
|
||||||
|
*
|
||||||
|
* @covers ::dateStringFormat
|
||||||
|
* @dataProvider timestampProvider
|
||||||
|
* @testdox dateStringFormat $input (microtime $flag) will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param int|float $input
|
||||||
|
* @param bool $flag
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testDateStringFormat(
|
||||||
|
$input,
|
||||||
|
bool $flag_show_micro,
|
||||||
|
bool $flag_micro_as_float,
|
||||||
|
string $expected
|
||||||
|
): void {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\DateTime::dateStringFormat(
|
||||||
|
$input,
|
||||||
|
$flag_show_micro,
|
||||||
|
$flag_micro_as_float
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* interval convert test
|
||||||
|
*
|
||||||
|
* @covers ::timeStringFormat
|
||||||
|
* @dataProvider intervalProvider
|
||||||
|
* @testdox timeStringFormat $input (microtime $flag) will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param int|float $input
|
||||||
|
* @param bool $flag
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testTimeStringFormat($input, bool $flag, string $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\DateTime::timeStringFormat($input, $flag)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::stringToTime
|
||||||
|
* @dataProvider reverseIntervalProvider
|
||||||
|
* @testdox stringToTime $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|int|float $input
|
||||||
|
* @param string|int|float $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testStringToTime($input, $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\DateTime::stringToTime($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::checkDate
|
||||||
|
* @dataProvider dateProvider
|
||||||
|
* @testdox checkDate $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCheckDate(string $input, bool $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\DateTime::checkDate($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::checkDateTime
|
||||||
|
* @dataProvider dateTimeProvider
|
||||||
|
* @testdox checkDateTime $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCheckDateTime(string $input, bool $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\DateTime::checkDateTime($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::compareDate
|
||||||
|
* @dataProvider dateCompareProvider
|
||||||
|
* @testdox compareDate $input_a compared to $input_b will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input_a
|
||||||
|
* @param string $input_b
|
||||||
|
* @param int|bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCompareDate(string $input_a, string $input_b, $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\DateTime::compareDate($input_a, $input_b)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::compareDateTime
|
||||||
|
* @dataProvider dateTimeCompareProvider
|
||||||
|
* @testdox compareDateTime $input_a compared to $input_b will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input_a
|
||||||
|
* @param string $input_b
|
||||||
|
* @param int|bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCompareDateTime(string $input_a, string $input_b, $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\DateTime::compareDateTime($input_a, $input_b)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::calcDaysInterval
|
||||||
|
* @dataProvider daysIntervalProvider
|
||||||
|
* @testdox calcDaysInterval $input_a compared to $input_b will be $expected [$_dataName]
|
||||||
|
* @medium
|
||||||
|
*
|
||||||
|
* @param string $input_a
|
||||||
|
* @param string $input_b
|
||||||
|
* @param bool $flag
|
||||||
|
* @param array $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCalcDaysInterval(
|
||||||
|
string $input_a,
|
||||||
|
string $input_b,
|
||||||
|
bool $flag,
|
||||||
|
$expected
|
||||||
|
): void {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\DateTime::calcDaysInterval($input_a, $input_b, $flag)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function weekdayNumberProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'0 invalid' => [0, null, 'Inv',],
|
||||||
|
'0 invalid long' => [0, true, 'Invalid',],
|
||||||
|
'1 short' => [1, null, 'Mon',],
|
||||||
|
'1 long' => [1, true, 'Monday',],
|
||||||
|
'2 short' => [2, null, 'Tue',],
|
||||||
|
'2 long' => [2, true, 'Tuesday',],
|
||||||
|
'3 short' => [3, null, 'Wed',],
|
||||||
|
'3 long' => [3, true, 'Wednesday',],
|
||||||
|
'4 short' => [4, null, 'Thu',],
|
||||||
|
'4 long' => [4, true, 'Thursday',],
|
||||||
|
'5 short' => [5, null, 'Fri',],
|
||||||
|
'5 long' => [5, true, 'Friday',],
|
||||||
|
'6 short' => [6, null, 'Sat',],
|
||||||
|
'6 long' => [6, true, 'Saturday',],
|
||||||
|
'7 short' => [7, null, 'Sun',],
|
||||||
|
'7 long' => [7, true, 'Sunday',],
|
||||||
|
'8 invalid' => [8, null, 'Inv',],
|
||||||
|
'8 invalid long' => [8, true, 'Invalid',],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* int weekday number to string weekday
|
||||||
|
*
|
||||||
|
* @covers ::setWeekdayNameFromIsoDow
|
||||||
|
* @dataProvider weekdayNumberProvider
|
||||||
|
* @testdox weekdayListProvider $input (short $flag) will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param int $input
|
||||||
|
* @param bool|null $flag
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetWeekdayNameFromIsoDow(
|
||||||
|
int $input,
|
||||||
|
?bool $flag,
|
||||||
|
string $expected
|
||||||
|
): void {
|
||||||
|
if ($flag === null) {
|
||||||
|
$output = \CoreLibs\Combined\DateTime::setWeekdayNameFromIsoDow($input);
|
||||||
|
} else {
|
||||||
|
$output = \CoreLibs\Combined\DateTime::setWeekdayNameFromIsoDow($input, $flag);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$output
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function weekdayDateProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'invalid date' => ['2022-02-31', -1],
|
||||||
|
'1: monday' => ['2022-07-25', 1],
|
||||||
|
'2: tuesday' => ['2022-07-26', 2],
|
||||||
|
'3: wednesday' => ['2022-07-27', 3],
|
||||||
|
'4: thursday' => ['2022-07-28', 4],
|
||||||
|
'5: friday' => ['2022-07-29', 5],
|
||||||
|
'6: saturday' => ['2022-07-30', 6],
|
||||||
|
'7: sunday' => ['2022-07-31', 7],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* date to weekday number
|
||||||
|
*
|
||||||
|
* @covers ::setWeekdayNumberFromDate
|
||||||
|
* @dataProvider weekdayDateProvider
|
||||||
|
* @testdox setWeekdayNumberFromDate $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param int $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetWeekdayNumberFromDate(
|
||||||
|
string $input,
|
||||||
|
int $expected
|
||||||
|
): void {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\DateTime::setWeekdayNumberFromDate($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function weekdayDateNameProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'invalid date short' => ['2022-02-31', null, 'Inv'],
|
||||||
|
'invalid date long' => ['2022-02-31', true, 'Invalid'],
|
||||||
|
'Mon short' => ['2022-07-25', null, 'Mon'],
|
||||||
|
'Monday long' => ['2022-07-25', true, 'Monday'],
|
||||||
|
'Tue short' => ['2022-07-26', null, 'Tue'],
|
||||||
|
'Tuesday long' => ['2022-07-26', true, 'Tuesday'],
|
||||||
|
'Wed short' => ['2022-07-27', null, 'Wed'],
|
||||||
|
'Wednesday long' => ['2022-07-27', true, 'Wednesday'],
|
||||||
|
'Thu short' => ['2022-07-28', null, 'Thu'],
|
||||||
|
'Thursday long' => ['2022-07-28', true, 'Thursday'],
|
||||||
|
'Fri short' => ['2022-07-29', null, 'Fri'],
|
||||||
|
'Friday long' => ['2022-07-29', true, 'Friday'],
|
||||||
|
'Sat short' => ['2022-07-30', null, 'Sat'],
|
||||||
|
'Saturday long' => ['2022-07-30', true, 'Saturday'],
|
||||||
|
'Sun short' => ['2022-07-31', null, 'Sun'],
|
||||||
|
'Sunday long' => ['2022-07-31', true, 'Sunday'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* date to weekday name
|
||||||
|
*
|
||||||
|
* @covers ::setWeekdayNameFromDate
|
||||||
|
* @dataProvider weekdayDateNameProvider
|
||||||
|
* @testdox setWeekdayNameFromDate $input (short $flag) will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param bool|null $flag
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetWeekdayNameFromDate(
|
||||||
|
string $input,
|
||||||
|
?bool $flag,
|
||||||
|
string $expected
|
||||||
|
): void {
|
||||||
|
if ($flag === null) {
|
||||||
|
$output = \CoreLibs\Combined\DateTime::setWeekdayNameFromDate($input);
|
||||||
|
} else {
|
||||||
|
$output = \CoreLibs\Combined\DateTime::setWeekdayNameFromDate($input, $flag);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$output
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::dateRangeHasWeekend
|
||||||
|
* @dataProvider dateRangeHasWeekendProvider
|
||||||
|
* @testdox dateRangeHasWeekend $start_date and $end_date are expected weekend $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $start_date
|
||||||
|
* @param string $end_date
|
||||||
|
* @param bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testDateRangeHasWeekend(
|
||||||
|
string $start_date,
|
||||||
|
string $end_date,
|
||||||
|
bool $expected
|
||||||
|
): void {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\DateTime::dateRangeHasWeekend($start_date, $end_date)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -16,7 +16,6 @@ use PHPUnit\Framework\TestCase;
|
|||||||
*/
|
*/
|
||||||
final class CoreLibsConvertByteTest extends TestCase
|
final class CoreLibsConvertByteTest extends TestCase
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
@@ -24,7 +23,31 @@ final class CoreLibsConvertByteTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function byteProvider(): array
|
public function byteProvider(): array
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* 0: input string
|
||||||
|
* 1: default flags
|
||||||
|
* 2: BYTE_FORMAT_SI
|
||||||
|
* 3: BYTE_FORMAT_NOSPACE
|
||||||
|
* 4: BYTE_FORMAT_ADJUST
|
||||||
|
* 5: BYTE_FORMAT_SI | BYTE_FORMAT_NOSPACE
|
||||||
|
*/
|
||||||
return [
|
return [
|
||||||
|
'string number' => [
|
||||||
|
0 => '1024',
|
||||||
|
1 => '1 KB',
|
||||||
|
2 => '1.02 KiB',
|
||||||
|
3 => '1KB',
|
||||||
|
4 => '1.00 KB',
|
||||||
|
5 => '1.02KiB',
|
||||||
|
],
|
||||||
|
'invalud string number' => [
|
||||||
|
0 => '1024 MB',
|
||||||
|
1 => '1024 MB',
|
||||||
|
2 => '1024 MB',
|
||||||
|
3 => '1024 MB',
|
||||||
|
4 => '1024 MB',
|
||||||
|
5 => '1024 MB',
|
||||||
|
],
|
||||||
'negative number' => [
|
'negative number' => [
|
||||||
0 => -123123123,
|
0 => -123123123,
|
||||||
1 => '-117.42 MB',
|
1 => '-117.42 MB',
|
||||||
@@ -217,6 +240,41 @@ final class CoreLibsConvertByteTest extends TestCase
|
|||||||
\CoreLibs\Convert\Byte::stringByteFormat($input, \CoreLibs\Convert\Byte::BYTE_FORMAT_SI)
|
\CoreLibs\Convert\Byte::stringByteFormat($input, \CoreLibs\Convert\Byte::BYTE_FORMAT_SI)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exceptions tests
|
||||||
|
*
|
||||||
|
* @covers ::humanReadableByteFormat
|
||||||
|
* @testWith [99]
|
||||||
|
* @testdox Test exception for humanReadableByteFormat with flag $flag
|
||||||
|
*
|
||||||
|
* @param int $flag
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testHumanReadableByteFormatException(int $flag): void
|
||||||
|
{
|
||||||
|
$this->expectException(\Exception::class);
|
||||||
|
\CoreLibs\Convert\Byte::humanReadableByteFormat(12, $flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exceptions tests
|
||||||
|
* can only be 4, try 1,2 and over
|
||||||
|
*
|
||||||
|
* @covers ::stringByteFormat
|
||||||
|
* @testWith [1]
|
||||||
|
* [2]
|
||||||
|
* [99]
|
||||||
|
* @testdox Test exception for stringByteFormat with flag $flag
|
||||||
|
*
|
||||||
|
* @param int $flag
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testStringByteFormatException(int $flag): void
|
||||||
|
{
|
||||||
|
$this->expectException(\Exception::class);
|
||||||
|
\CoreLibs\Convert\Byte::stringByteFormat(12, $flag);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
@@ -122,6 +122,8 @@ final class CoreLibsConvertColorsTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public function rgb2hslAndhsbList(): array
|
public function rgb2hslAndhsbList(): array
|
||||||
{
|
{
|
||||||
|
// if hsb_from or hsl_from is set, this will be used in hsb/hsl convert
|
||||||
|
// hsb_rgb is used for adjusted rgb valus due to round error to in
|
||||||
return [
|
return [
|
||||||
'valid gray' => [
|
'valid gray' => [
|
||||||
'rgb' => [12, 12, 12],
|
'rgb' => [12, 12, 12],
|
||||||
@@ -137,6 +139,16 @@ final class CoreLibsConvertColorsTest extends TestCase
|
|||||||
'hsl' => [211.6, 90.5, 41.2],
|
'hsl' => [211.6, 90.5, 41.2],
|
||||||
'valid' => true,
|
'valid' => true,
|
||||||
],
|
],
|
||||||
|
// hsg/hsl with 360 which is seen as 0
|
||||||
|
'valid color hue 360' => [
|
||||||
|
'rgb' => [200, 10, 10],
|
||||||
|
'hsb' => [0, 95, 78.0],
|
||||||
|
'hsb_from' => [360, 95, 78.0],
|
||||||
|
'hsb_rgb' => [199, 10, 10], // should be rgb, but rounding error
|
||||||
|
'hsl' => [0.0, 90.5, 41.2],
|
||||||
|
'hsl_from' => [360.0, 90.5, 41.2],
|
||||||
|
'valid' => true,
|
||||||
|
],
|
||||||
// invalid values
|
// invalid values
|
||||||
'invalid color' => [
|
'invalid color' => [
|
||||||
'rgb' => [-12, 300, 12],
|
'rgb' => [-12, 300, 12],
|
||||||
@@ -176,9 +188,9 @@ final class CoreLibsConvertColorsTest extends TestCase
|
|||||||
$list = [];
|
$list = [];
|
||||||
foreach ($this->rgb2hslAndhsbList() as $name => $values) {
|
foreach ($this->rgb2hslAndhsbList() as $name => $values) {
|
||||||
$list[$name . ', hsb to rgb'] = [
|
$list[$name . ', hsb to rgb'] = [
|
||||||
0 => $values['hsb'][0],
|
0 => $values['hsb_from'][0] ?? $values['hsb'][0],
|
||||||
1 => $values['hsb'][1],
|
1 => $values['hsb_from'][1] ?? $values['hsb'][1],
|
||||||
2 => $values['hsb'][2],
|
2 => $values['hsb_from'][2] ?? $values['hsb'][2],
|
||||||
3 => $values['valid'] ? $values['hsb_rgb'] : false
|
3 => $values['valid'] ? $values['hsb_rgb'] : false
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -214,9 +226,9 @@ final class CoreLibsConvertColorsTest extends TestCase
|
|||||||
$list = [];
|
$list = [];
|
||||||
foreach ($this->rgb2hslAndhsbList() as $name => $values) {
|
foreach ($this->rgb2hslAndhsbList() as $name => $values) {
|
||||||
$list[$name . ', hsl to rgb'] = [
|
$list[$name . ', hsl to rgb'] = [
|
||||||
0 => $values['hsl'][0],
|
0 => $values['hsl_from'][0] ?? $values['hsl'][0],
|
||||||
1 => $values['hsl'][1],
|
1 => $values['hsl_from'][1] ?? $values['hsl'][1],
|
||||||
2 => $values['hsl'][2],
|
2 => $values['hsl_from'][2] ?? $values['hsl'][2],
|
||||||
3 => $values['valid'] ? $values['rgb'] : false
|
3 => $values['valid'] ? $values['rgb'] : false
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -382,6 +394,27 @@ final class CoreLibsConvertColorsTest extends TestCase
|
|||||||
\CoreLibs\Convert\Colors::hsl2rgb($input_h, $input_s, $input_l)
|
\CoreLibs\Convert\Colors::hsl2rgb($input_h, $input_s, $input_l)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* edge case check hsl/hsb and hue 360 (= 0)
|
||||||
|
*
|
||||||
|
* @covers ::hsl2rgb
|
||||||
|
* @covers ::hsb2rgb
|
||||||
|
* @testdox hsl2rgb/hsb2rgb hue 360 valid check
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testHslHsb360hue(): void
|
||||||
|
{
|
||||||
|
$this->assertNotFalse(
|
||||||
|
\CoreLibs\Convert\Colors::hsl2rgb(360.0, 90.5, 41.2),
|
||||||
|
'HSL to RGB with 360 hue'
|
||||||
|
);
|
||||||
|
$this->assertNotFalse(
|
||||||
|
\CoreLibs\Convert\Colors::hsb2rgb(360, 95, 78.0),
|
||||||
|
'HSB to RGB with 360 hue'
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
652
4dev/tests/Convert/CoreLibsConvertSetVarTypeNullTest.php
Normal file
652
4dev/tests/Convert/CoreLibsConvertSetVarTypeNullTest.php
Normal file
@@ -0,0 +1,652 @@
|
|||||||
|
<?php // phpcs:disable Generic.Files.LineLength
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use CoreLibs\Convert\SetVarTypeNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Convert\Strings
|
||||||
|
* @coversDefaultClass \CoreLibs\Convert\SetVarTypeNull
|
||||||
|
* @testdox \CoreLibs\Convert\SetVarTypeNull method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsConvertSetVarTypeNullTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function varSetTypeStringProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 1: default (null default)
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'empty string' => [
|
||||||
|
'',
|
||||||
|
null,
|
||||||
|
''
|
||||||
|
],
|
||||||
|
'filled string' => [
|
||||||
|
'string',
|
||||||
|
null,
|
||||||
|
'string'
|
||||||
|
],
|
||||||
|
'valid string, override set' => [
|
||||||
|
'string',
|
||||||
|
'override',
|
||||||
|
'string'
|
||||||
|
],
|
||||||
|
'int, no override' => [
|
||||||
|
1,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
],
|
||||||
|
'int, override set' => [
|
||||||
|
1,
|
||||||
|
'not int',
|
||||||
|
'not int'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* @covers ::setStr
|
||||||
|
* @dataProvider varSetTypeStringProvider
|
||||||
|
* @testdox setStr $input with override $default will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param string|null $default
|
||||||
|
* @param string|null $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetString(mixed $input, ?string $default, ?string $expected): void
|
||||||
|
{
|
||||||
|
$set_var = SetVarTypeNull::setStr($input, $default);
|
||||||
|
if ($expected !== null) {
|
||||||
|
$this->assertIsString($set_var);
|
||||||
|
} else {
|
||||||
|
$this->assertNull($set_var);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$set_var
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function varMakeTypeStringProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 1: default (null default)
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'empty string' => [
|
||||||
|
'',
|
||||||
|
null,
|
||||||
|
''
|
||||||
|
],
|
||||||
|
'filled string' => [
|
||||||
|
'string',
|
||||||
|
null,
|
||||||
|
'string'
|
||||||
|
],
|
||||||
|
'valid string, override set' => [
|
||||||
|
'string',
|
||||||
|
'override',
|
||||||
|
'string'
|
||||||
|
],
|
||||||
|
'int, no override' => [
|
||||||
|
1,
|
||||||
|
null,
|
||||||
|
'1'
|
||||||
|
],
|
||||||
|
'int, override set' => [
|
||||||
|
1,
|
||||||
|
'not int',
|
||||||
|
'1'
|
||||||
|
],
|
||||||
|
'float, no override' => [
|
||||||
|
1.5,
|
||||||
|
null,
|
||||||
|
'1.5'
|
||||||
|
],
|
||||||
|
// all the strange things here
|
||||||
|
'function, override set' => [
|
||||||
|
$foo = function () {
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
'function',
|
||||||
|
'function'
|
||||||
|
],
|
||||||
|
'function, no override' => [
|
||||||
|
$foo = function () {
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
],
|
||||||
|
'hex value, override set' => [
|
||||||
|
0x55,
|
||||||
|
'hex',
|
||||||
|
'85'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* @covers ::makeStr
|
||||||
|
* @dataProvider varMakeTypeStringProvider
|
||||||
|
* @testdox makeStr $input with override $default will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param string|null $default
|
||||||
|
* @param string|null $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMakeString(mixed $input, ?string $default, ?string $expected): void
|
||||||
|
{
|
||||||
|
$set_var = SetVarTypeNull::makeStr($input, $default);
|
||||||
|
if ($expected !== null) {
|
||||||
|
$this->assertIsString($set_var);
|
||||||
|
} else {
|
||||||
|
$this->assertNull($set_var);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$set_var
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function varSetTypeIntProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 1: default (null default)
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'int' => [
|
||||||
|
1,
|
||||||
|
null,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
'int, override set' => [
|
||||||
|
1,
|
||||||
|
-1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
'string, no override' => [
|
||||||
|
'string',
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
],
|
||||||
|
'string, override' => [
|
||||||
|
'string',
|
||||||
|
-1,
|
||||||
|
-1
|
||||||
|
],
|
||||||
|
'float' => [
|
||||||
|
1.5,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* @covers ::setInt
|
||||||
|
* @dataProvider varSetTypeIntProvider
|
||||||
|
* @testdox setInt $input with override $default will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param int|null $default
|
||||||
|
* @param int|null $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetInt(mixed $input, ?int $default, ?int $expected): void
|
||||||
|
{
|
||||||
|
$set_var = SetVarTypeNull::setInt($input, $default);
|
||||||
|
if ($expected !== null) {
|
||||||
|
$this->assertIsInt($set_var);
|
||||||
|
} else {
|
||||||
|
$this->assertNull($set_var);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$set_var
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function varMakeTypeIntProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 1: default (null default)
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'int' => [
|
||||||
|
1,
|
||||||
|
null,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
'int, override set' => [
|
||||||
|
1,
|
||||||
|
-1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
'string, no override' => [
|
||||||
|
'string',
|
||||||
|
null,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
'string, override' => [
|
||||||
|
'string',
|
||||||
|
-1,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
'float' => [
|
||||||
|
1.5,
|
||||||
|
null,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
// all the strange things here
|
||||||
|
'function, override set' => [
|
||||||
|
$foo = function () {
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
-1,
|
||||||
|
-1
|
||||||
|
],
|
||||||
|
'function, no override ' => [
|
||||||
|
$foo = function () {
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
],
|
||||||
|
'hex value, override set' => [
|
||||||
|
0x55,
|
||||||
|
-1,
|
||||||
|
85
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* @covers ::makeInt
|
||||||
|
* @dataProvider varMakeTypeIntProvider
|
||||||
|
* @testdox makeInt $input with override $default will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param int|null $default
|
||||||
|
* @param int|null $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMakeInt(mixed $input, ?int $default, ?int $expected): void
|
||||||
|
{
|
||||||
|
$set_var = SetVarTypeNull::makeInt($input, $default);
|
||||||
|
if ($expected !== null) {
|
||||||
|
$this->assertIsInt($set_var);
|
||||||
|
} else {
|
||||||
|
$this->assertNull($set_var);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$set_var
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function varSetTypeFloatProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 1: default (null default)
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'float' => [
|
||||||
|
1.5,
|
||||||
|
null,
|
||||||
|
1.5
|
||||||
|
],
|
||||||
|
'float, override set' => [
|
||||||
|
1.5,
|
||||||
|
-1.5,
|
||||||
|
1.5
|
||||||
|
],
|
||||||
|
'string, no override' => [
|
||||||
|
'string',
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
],
|
||||||
|
'string, override' => [
|
||||||
|
'string',
|
||||||
|
1.5,
|
||||||
|
1.5
|
||||||
|
],
|
||||||
|
'int' => [
|
||||||
|
1,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* @covers ::setFloat
|
||||||
|
* @dataProvider varSetTypeFloatProvider
|
||||||
|
* @testdox setFloat $input with override $default will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param float|null $default
|
||||||
|
* @param float|null $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetFloat(mixed $input, ?float $default, ?float $expected): void
|
||||||
|
{
|
||||||
|
$set_var = SetVarTypeNull::setFloat($input, $default);
|
||||||
|
if ($expected !== null) {
|
||||||
|
$this->assertIsFloat($set_var);
|
||||||
|
} else {
|
||||||
|
$this->assertNull($set_var);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$set_var
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function varMakeTypeFloatProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 1: default (null default)
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'float' => [
|
||||||
|
1.5,
|
||||||
|
null,
|
||||||
|
1.5
|
||||||
|
],
|
||||||
|
'float, override set' => [
|
||||||
|
1.5,
|
||||||
|
-1.5,
|
||||||
|
1.5
|
||||||
|
],
|
||||||
|
'string, no override' => [
|
||||||
|
'string',
|
||||||
|
null,
|
||||||
|
0.0
|
||||||
|
],
|
||||||
|
'string, override' => [
|
||||||
|
'string',
|
||||||
|
1.5,
|
||||||
|
0.0
|
||||||
|
],
|
||||||
|
'int' => [
|
||||||
|
1,
|
||||||
|
null,
|
||||||
|
1.0
|
||||||
|
],
|
||||||
|
// all the strange things here
|
||||||
|
'function, override set' => [
|
||||||
|
$foo = function () {
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
-1.0,
|
||||||
|
-1.0
|
||||||
|
],
|
||||||
|
// all the strange things here
|
||||||
|
'function, no override' => [
|
||||||
|
$foo = function () {
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
],
|
||||||
|
'hex value, override set' => [
|
||||||
|
0x55,
|
||||||
|
-1,
|
||||||
|
85.0
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* @covers ::makeFloat
|
||||||
|
* @dataProvider varMakeTypeFloatProvider
|
||||||
|
* @testdox makeFloat $input with override $default will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param float|null $default
|
||||||
|
* @param float|null $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMakeFloat(mixed $input, ?float $default, ?float $expected): void
|
||||||
|
{
|
||||||
|
$set_var = SetVarTypeNull::makeFloat($input, $default);
|
||||||
|
if ($expected !== null) {
|
||||||
|
$this->assertIsFloat($set_var);
|
||||||
|
} else {
|
||||||
|
$this->assertNull($set_var);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$set_var
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function varSetTypeArrayProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 1: default (null default)
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'array, empty' => [
|
||||||
|
[],
|
||||||
|
null,
|
||||||
|
[]
|
||||||
|
],
|
||||||
|
'array, filled' => [
|
||||||
|
['array'],
|
||||||
|
null,
|
||||||
|
['array']
|
||||||
|
],
|
||||||
|
'string, no override' => [
|
||||||
|
'string',
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
],
|
||||||
|
'string, override' => [
|
||||||
|
'string',
|
||||||
|
['string'],
|
||||||
|
['string']
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* @covers ::setArray
|
||||||
|
* @dataProvider varSetTypeArrayProvider
|
||||||
|
* @testdox setArray $input with override $default will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param array|null $default
|
||||||
|
* @param array|null $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetArray(mixed $input, ?array $default, ?array $expected): void
|
||||||
|
{
|
||||||
|
$set_var = SetVarTypeNull::setArray($input, $default);
|
||||||
|
if ($expected !== null) {
|
||||||
|
$this->assertIsArray($set_var);
|
||||||
|
} else {
|
||||||
|
$this->assertNull($set_var);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$set_var
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function varSetTypeBoolProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 1: default (null default)
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'bool true' => [
|
||||||
|
true,
|
||||||
|
null,
|
||||||
|
true
|
||||||
|
],
|
||||||
|
'bool false' => [
|
||||||
|
false,
|
||||||
|
null,
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'string, no override' => [
|
||||||
|
'string',
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
],
|
||||||
|
'string, override' => [
|
||||||
|
'string',
|
||||||
|
true,
|
||||||
|
true
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* @covers ::setBool
|
||||||
|
* @dataProvider varSetTypeBoolProvider
|
||||||
|
* @testdox setBool $input with override $default will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param bool|null $default
|
||||||
|
* @param bool|null $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetBool(mixed $input, ?bool $default, ?bool $expected): void
|
||||||
|
{
|
||||||
|
$set_var = SetVarTypeNull::setBool($input, $default);
|
||||||
|
if ($expected !== null) {
|
||||||
|
$this->assertIsBool($set_var);
|
||||||
|
} else {
|
||||||
|
$this->assertNull($set_var);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$set_var
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function varMakeTypeBoolProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'true' => [
|
||||||
|
true,
|
||||||
|
true
|
||||||
|
],
|
||||||
|
'false' => [
|
||||||
|
false,
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'string on' => [
|
||||||
|
'on',
|
||||||
|
true
|
||||||
|
],
|
||||||
|
'string off' => [
|
||||||
|
'off',
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'invalid string' => [
|
||||||
|
'sulzenbacher',
|
||||||
|
null,
|
||||||
|
],
|
||||||
|
'invalid string, override' => [
|
||||||
|
'sulzenbacher',
|
||||||
|
null,
|
||||||
|
],
|
||||||
|
'array to default' => [
|
||||||
|
[],
|
||||||
|
false
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* @covers ::setBool
|
||||||
|
* @dataProvider varMakeTypeBoolProvider
|
||||||
|
* @testdox setBool $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param bool|null $default
|
||||||
|
* @param bool|null $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMakeBool(mixed $input, ?bool $expected): void
|
||||||
|
{
|
||||||
|
$set_var = SetVarTypeNull::makeBool($input);
|
||||||
|
if ($expected !== null) {
|
||||||
|
$this->assertIsBool($set_var);
|
||||||
|
} else {
|
||||||
|
$this->assertNull($set_var);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$set_var
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
632
4dev/tests/Convert/CoreLibsConvertSetVarTypeTest.php
Normal file
632
4dev/tests/Convert/CoreLibsConvertSetVarTypeTest.php
Normal file
@@ -0,0 +1,632 @@
|
|||||||
|
<?php // phpcs:disable Generic.Files.LineLength
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use CoreLibs\Convert\SetVarType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Convert\Strings
|
||||||
|
* @coversDefaultClass \CoreLibs\Convert\SetVarType
|
||||||
|
* @testdox \CoreLibs\Convert\SetVarType method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsConvertSetVarTypeTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function varSetTypeStringProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 1: default (null default)
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'empty string' => [
|
||||||
|
'',
|
||||||
|
null,
|
||||||
|
''
|
||||||
|
],
|
||||||
|
'filled string' => [
|
||||||
|
'string',
|
||||||
|
null,
|
||||||
|
'string'
|
||||||
|
],
|
||||||
|
'valid string, override set' => [
|
||||||
|
'string',
|
||||||
|
'override',
|
||||||
|
'string'
|
||||||
|
],
|
||||||
|
'int, no override' => [
|
||||||
|
1,
|
||||||
|
null,
|
||||||
|
''
|
||||||
|
],
|
||||||
|
'int, override set' => [
|
||||||
|
1,
|
||||||
|
'not int',
|
||||||
|
'not int'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* @covers ::setStr
|
||||||
|
* @dataProvider varSetTypeStringProvider
|
||||||
|
* @testdox setStr $input with override $default will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param string|null $default
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetString(mixed $input, ?string $default, string $expected): void
|
||||||
|
{
|
||||||
|
if ($default === null) {
|
||||||
|
$set_var = SetVarType::setStr($input);
|
||||||
|
} else {
|
||||||
|
$set_var = SetVarType::setStr($input, $default);
|
||||||
|
}
|
||||||
|
$this->assertIsString($set_var);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$set_var
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function varMakeTypeStringProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 1: default (null default)
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'empty string' => [
|
||||||
|
'',
|
||||||
|
null,
|
||||||
|
''
|
||||||
|
],
|
||||||
|
'filled string' => [
|
||||||
|
'string',
|
||||||
|
null,
|
||||||
|
'string'
|
||||||
|
],
|
||||||
|
'valid string, override set' => [
|
||||||
|
'string',
|
||||||
|
'override',
|
||||||
|
'string'
|
||||||
|
],
|
||||||
|
'int, no override' => [
|
||||||
|
1,
|
||||||
|
null,
|
||||||
|
'1'
|
||||||
|
],
|
||||||
|
'int, override set' => [
|
||||||
|
1,
|
||||||
|
'not int',
|
||||||
|
'1'
|
||||||
|
],
|
||||||
|
// all the strange things here
|
||||||
|
'function, override set' => [
|
||||||
|
$foo = function () {
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
'function',
|
||||||
|
'function'
|
||||||
|
],
|
||||||
|
'hex value, override set' => [
|
||||||
|
0x55,
|
||||||
|
'hex',
|
||||||
|
'85'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* @covers ::makeStr
|
||||||
|
* @dataProvider varMakeTypeStringProvider
|
||||||
|
* @testdox makeStr $input with override $default will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param string|null $default
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMakeString(mixed $input, ?string $default, string $expected): void
|
||||||
|
{
|
||||||
|
if ($default === null) {
|
||||||
|
$set_var = SetVarType::makeStr($input);
|
||||||
|
} else {
|
||||||
|
$set_var = SetVarType::makeStr($input, $default);
|
||||||
|
}
|
||||||
|
$this->assertIsString($set_var);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$set_var
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function varSetTypeIntProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 1: default (null default)
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'int' => [
|
||||||
|
1,
|
||||||
|
null,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
'int, override set' => [
|
||||||
|
1,
|
||||||
|
-1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
'string, no override' => [
|
||||||
|
'string',
|
||||||
|
null,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
'string, override' => [
|
||||||
|
'string',
|
||||||
|
-1,
|
||||||
|
-1
|
||||||
|
],
|
||||||
|
'float' => [
|
||||||
|
1.5,
|
||||||
|
null,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* @covers ::setInt
|
||||||
|
* @dataProvider varSetTypeIntProvider
|
||||||
|
* @testdox setInt $input with override $default will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param int|null $default
|
||||||
|
* @param int $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetInt(mixed $input, ?int $default, int $expected): void
|
||||||
|
{
|
||||||
|
if ($default === null) {
|
||||||
|
$set_var = SetVarType::setInt($input);
|
||||||
|
} else {
|
||||||
|
$set_var = SetVarType::setInt($input, $default);
|
||||||
|
}
|
||||||
|
$this->assertIsInt($set_var);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$set_var
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function varMakeTypeIntProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 1: default (null default)
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'int' => [
|
||||||
|
1,
|
||||||
|
null,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
'int, override set' => [
|
||||||
|
1,
|
||||||
|
-1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
'string, no override' => [
|
||||||
|
'string',
|
||||||
|
null,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
'string, override' => [
|
||||||
|
'string',
|
||||||
|
-1,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
'float' => [
|
||||||
|
1.5,
|
||||||
|
null,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
// all the strange things here
|
||||||
|
'function, override set' => [
|
||||||
|
$foo = function () {
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
-1,
|
||||||
|
-1
|
||||||
|
],
|
||||||
|
'hex value, override set' => [
|
||||||
|
0x55,
|
||||||
|
-1,
|
||||||
|
85
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* @covers ::makeInt
|
||||||
|
* @dataProvider varMakeTypeIntProvider
|
||||||
|
* @testdox makeInt $input with override $default will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param int|null $default
|
||||||
|
* @param int $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMakeInt(mixed $input, ?int $default, int $expected): void
|
||||||
|
{
|
||||||
|
if ($default === null) {
|
||||||
|
$set_var = SetVarType::makeInt($input);
|
||||||
|
} else {
|
||||||
|
$set_var = SetVarType::makeInt($input, $default);
|
||||||
|
}
|
||||||
|
$this->assertIsInt($set_var);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$set_var
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function varSetTypeFloatProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 1: default (null default)
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'float' => [
|
||||||
|
1.5,
|
||||||
|
null,
|
||||||
|
1.5
|
||||||
|
],
|
||||||
|
'float, override set' => [
|
||||||
|
1.5,
|
||||||
|
-1.5,
|
||||||
|
1.5
|
||||||
|
],
|
||||||
|
'string, no override' => [
|
||||||
|
'string',
|
||||||
|
null,
|
||||||
|
0.0
|
||||||
|
],
|
||||||
|
'string, override' => [
|
||||||
|
'string',
|
||||||
|
1.5,
|
||||||
|
1.5
|
||||||
|
],
|
||||||
|
'int' => [
|
||||||
|
1,
|
||||||
|
null,
|
||||||
|
0.0
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* @covers ::setFloat
|
||||||
|
* @dataProvider varSetTypeFloatProvider
|
||||||
|
* @testdox setFloat $input with override $default will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param float|null $default
|
||||||
|
* @param float $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetFloat(mixed $input, ?float $default, float $expected): void
|
||||||
|
{
|
||||||
|
if ($default === null) {
|
||||||
|
$set_var = SetVarType::setFloat($input);
|
||||||
|
} else {
|
||||||
|
$set_var = SetVarType::setFloat($input, $default);
|
||||||
|
}
|
||||||
|
$this->assertIsFloat($set_var);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$set_var
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function varMakeTypeFloatProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 1: default (null default)
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'float' => [
|
||||||
|
1.5,
|
||||||
|
null,
|
||||||
|
1.5
|
||||||
|
],
|
||||||
|
'float, override set' => [
|
||||||
|
1.5,
|
||||||
|
-1.5,
|
||||||
|
1.5
|
||||||
|
],
|
||||||
|
'string, no override' => [
|
||||||
|
'string',
|
||||||
|
null,
|
||||||
|
0.0
|
||||||
|
],
|
||||||
|
'string, override' => [
|
||||||
|
'string',
|
||||||
|
1.5,
|
||||||
|
0.0
|
||||||
|
],
|
||||||
|
'int' => [
|
||||||
|
1,
|
||||||
|
null,
|
||||||
|
1.0
|
||||||
|
],
|
||||||
|
// all the strange things here
|
||||||
|
'function, override set' => [
|
||||||
|
$foo = function () {
|
||||||
|
return '';
|
||||||
|
},
|
||||||
|
-1.0,
|
||||||
|
-1.0
|
||||||
|
],
|
||||||
|
'hex value, override set' => [
|
||||||
|
0x55,
|
||||||
|
-1,
|
||||||
|
85.0
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* @covers ::makeFloat
|
||||||
|
* @dataProvider varMakeTypeFloatProvider
|
||||||
|
* @testdox makeFloat $input with override $default will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param float|null $default
|
||||||
|
* @param float $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMakeFloat(mixed $input, ?float $default, float $expected): void
|
||||||
|
{
|
||||||
|
if ($default === null) {
|
||||||
|
$set_var = SetVarType::makeFloat($input);
|
||||||
|
} else {
|
||||||
|
$set_var = SetVarType::makeFloat($input, $default);
|
||||||
|
}
|
||||||
|
$this->assertIsFloat($set_var);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$set_var
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function varSetTypeArrayProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 1: default (null default)
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'array, empty' => [
|
||||||
|
[],
|
||||||
|
null,
|
||||||
|
[]
|
||||||
|
],
|
||||||
|
'array, filled' => [
|
||||||
|
['array'],
|
||||||
|
null,
|
||||||
|
['array']
|
||||||
|
],
|
||||||
|
'string, no override' => [
|
||||||
|
'string',
|
||||||
|
null,
|
||||||
|
[]
|
||||||
|
],
|
||||||
|
'string, override' => [
|
||||||
|
'string',
|
||||||
|
['string'],
|
||||||
|
['string']
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* @covers ::setArray
|
||||||
|
* @dataProvider varSetTypeArrayProvider
|
||||||
|
* @testdox setArray $input with override $default will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param array|null $default
|
||||||
|
* @param array $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetArray(mixed $input, ?array $default, array $expected): void
|
||||||
|
{
|
||||||
|
if ($default === null) {
|
||||||
|
$set_var = SetVarType::setArray($input);
|
||||||
|
} else {
|
||||||
|
$set_var = SetVarType::setArray($input, $default);
|
||||||
|
}
|
||||||
|
$this->assertIsArray($set_var);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$set_var
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function varSetTypeBoolProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 1: default (null default)
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'bool true' => [
|
||||||
|
true,
|
||||||
|
null,
|
||||||
|
true
|
||||||
|
],
|
||||||
|
'bool false' => [
|
||||||
|
false,
|
||||||
|
null,
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'string, no override' => [
|
||||||
|
'string',
|
||||||
|
null,
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'string, override' => [
|
||||||
|
'string',
|
||||||
|
true,
|
||||||
|
true
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* @covers ::setBool
|
||||||
|
* @dataProvider varSetTypeBoolProvider
|
||||||
|
* @testdox setBool $input with override $default will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param bool|null $default
|
||||||
|
* @param bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetBool(mixed $input, ?bool $default, bool $expected): void
|
||||||
|
{
|
||||||
|
if ($default === null) {
|
||||||
|
$set_var = SetVarType::setBool($input);
|
||||||
|
} else {
|
||||||
|
$set_var = SetVarType::setBool($input, $default);
|
||||||
|
}
|
||||||
|
$this->assertIsBool($set_var);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$set_var
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function varMakeTypeBoolProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'true' => [
|
||||||
|
true,
|
||||||
|
null,
|
||||||
|
true
|
||||||
|
],
|
||||||
|
'false' => [
|
||||||
|
false,
|
||||||
|
null,
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'string on' => [
|
||||||
|
'on',
|
||||||
|
null,
|
||||||
|
true
|
||||||
|
],
|
||||||
|
'string off' => [
|
||||||
|
'off',
|
||||||
|
null,
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'invalid string' => [
|
||||||
|
'sulzenbacher',
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
],
|
||||||
|
'invalid string, override' => [
|
||||||
|
'sulzenbacher',
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
],
|
||||||
|
'array to default' => [
|
||||||
|
[],
|
||||||
|
null,
|
||||||
|
false
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* @covers ::setBool
|
||||||
|
* @dataProvider varMakeTypeBoolProvider
|
||||||
|
* @testdox setBool $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param bool|null $default
|
||||||
|
* @param bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMakeBool(mixed $input, ?bool $default, bool $expected): void
|
||||||
|
{
|
||||||
|
if ($default === null) {
|
||||||
|
$set_var = SetVarType::makeBool($input);
|
||||||
|
} else {
|
||||||
|
$set_var = SetVarType::makeBool($input, $default);
|
||||||
|
}
|
||||||
|
$this->assertIsBool($set_var);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$set_var
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
261
4dev/tests/Convert/CoreLibsConvertStringsTest.php
Normal file
261
4dev/tests/Convert/CoreLibsConvertStringsTest.php
Normal file
@@ -0,0 +1,261 @@
|
|||||||
|
<?php // phpcs:disable Generic.Files.LineLength
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Convert\Strings
|
||||||
|
* @coversDefaultClass \CoreLibs\Convert\Strings
|
||||||
|
* @testdox \CoreLibs\Convert\Strings method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsConvertStringsTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function splitFormatStringProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input
|
||||||
|
// 1: format
|
||||||
|
// 2: split characters as string, null for default
|
||||||
|
// 3: expected
|
||||||
|
return [
|
||||||
|
'all empty string' => [
|
||||||
|
'',
|
||||||
|
'',
|
||||||
|
null,
|
||||||
|
''
|
||||||
|
],
|
||||||
|
'empty input string' => [
|
||||||
|
'',
|
||||||
|
'2-2',
|
||||||
|
null,
|
||||||
|
''
|
||||||
|
],
|
||||||
|
'empty format string string' => [
|
||||||
|
'1234',
|
||||||
|
'',
|
||||||
|
null,
|
||||||
|
'1234'
|
||||||
|
],
|
||||||
|
'string format match' => [
|
||||||
|
'1234',
|
||||||
|
'2-2',
|
||||||
|
null,
|
||||||
|
'12-34'
|
||||||
|
],
|
||||||
|
'string format trailing match' => [
|
||||||
|
'1234',
|
||||||
|
'2-2-',
|
||||||
|
null,
|
||||||
|
'12-34'
|
||||||
|
],
|
||||||
|
'string format leading match' => [
|
||||||
|
'1234',
|
||||||
|
'-2-2',
|
||||||
|
null,
|
||||||
|
'12-34'
|
||||||
|
],
|
||||||
|
'string format double inside match' => [
|
||||||
|
'1234',
|
||||||
|
'2--2',
|
||||||
|
null,
|
||||||
|
'12--34',
|
||||||
|
],
|
||||||
|
'string format short first' => [
|
||||||
|
'1',
|
||||||
|
'2-2',
|
||||||
|
null,
|
||||||
|
'1'
|
||||||
|
],
|
||||||
|
'string format match first' => [
|
||||||
|
'12',
|
||||||
|
'2-2',
|
||||||
|
null,
|
||||||
|
'12'
|
||||||
|
],
|
||||||
|
'string format short second' => [
|
||||||
|
'123',
|
||||||
|
'2-2',
|
||||||
|
null,
|
||||||
|
'12-3'
|
||||||
|
],
|
||||||
|
'string format too long' => [
|
||||||
|
'1234567',
|
||||||
|
'2-2',
|
||||||
|
null,
|
||||||
|
'12-34-567'
|
||||||
|
],
|
||||||
|
'string format invalid format string' => [
|
||||||
|
'1234',
|
||||||
|
'2_2',
|
||||||
|
null,
|
||||||
|
'1234'
|
||||||
|
],
|
||||||
|
'different split character' => [
|
||||||
|
'1234',
|
||||||
|
'2_2',
|
||||||
|
'_',
|
||||||
|
'12_34'
|
||||||
|
],
|
||||||
|
'mixed split characters' => [
|
||||||
|
'123456',
|
||||||
|
'2-2_2',
|
||||||
|
'-_',
|
||||||
|
'12-34_56'
|
||||||
|
],
|
||||||
|
'length mixed' => [
|
||||||
|
'ABCD12345568ABC13',
|
||||||
|
'2-4_5-2#4',
|
||||||
|
'-_#',
|
||||||
|
'AB-CD12_34556-8A#BC13'
|
||||||
|
],
|
||||||
|
'split with split chars in string' => [
|
||||||
|
'12-34',
|
||||||
|
'2-2',
|
||||||
|
null,
|
||||||
|
'12--3-4'
|
||||||
|
],
|
||||||
|
'mutltibyte string' => [
|
||||||
|
'あいうえ',
|
||||||
|
'2-2',
|
||||||
|
null,
|
||||||
|
'あいうえ'
|
||||||
|
],
|
||||||
|
'mutltibyte split string' => [
|
||||||
|
'1234',
|
||||||
|
'2-2',
|
||||||
|
null,
|
||||||
|
'1234'
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* split format string
|
||||||
|
*
|
||||||
|
* @covers ::splitFormatString
|
||||||
|
* @dataProvider splitFormatStringProvider
|
||||||
|
* @testdox splitFormatString $input with format $format and splitters $split_characters will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $format
|
||||||
|
* @param string|null $split_characters
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSplitFormatString(
|
||||||
|
string $input,
|
||||||
|
string $format,
|
||||||
|
?string $split_characters,
|
||||||
|
string $expected
|
||||||
|
): void {
|
||||||
|
if ($split_characters === null) {
|
||||||
|
$output = \CoreLibs\Convert\Strings::splitFormatString(
|
||||||
|
$input,
|
||||||
|
$format
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$output = \CoreLibs\Convert\Strings::splitFormatString(
|
||||||
|
$input,
|
||||||
|
$format,
|
||||||
|
$split_characters
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$output
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function countSplitPartsProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'0 elements' => [
|
||||||
|
'',
|
||||||
|
null,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
'1 element' => [
|
||||||
|
'1',
|
||||||
|
null,
|
||||||
|
1,
|
||||||
|
],
|
||||||
|
'2 elements, trailing' => [
|
||||||
|
'1-2-',
|
||||||
|
null,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
'2 elements, leading' => [
|
||||||
|
'-1-2',
|
||||||
|
null,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
'2 elements, midde double' => [
|
||||||
|
'1--2',
|
||||||
|
null,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
'4 elements' => [
|
||||||
|
'1-2-3-4',
|
||||||
|
null,
|
||||||
|
4
|
||||||
|
],
|
||||||
|
'3 elemenst, other splitter' => [
|
||||||
|
'2-3_3',
|
||||||
|
'-_',
|
||||||
|
3
|
||||||
|
],
|
||||||
|
'illegal splitter' => [
|
||||||
|
'あsdf',
|
||||||
|
null,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* count split parts
|
||||||
|
*
|
||||||
|
* @covers ::countSplitParts
|
||||||
|
* @dataProvider countSplitPartsProvider
|
||||||
|
* @testdox countSplitParts $input with splitters $split_characters will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string|null $split_characters
|
||||||
|
* @param int $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCountSplitParts(
|
||||||
|
string $input,
|
||||||
|
?string $split_characters,
|
||||||
|
int $expected
|
||||||
|
): void {
|
||||||
|
if ($split_characters === null) {
|
||||||
|
$output = \CoreLibs\Convert\Strings::countSplitParts(
|
||||||
|
$input
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$output = \CoreLibs\Convert\Strings::countSplitParts(
|
||||||
|
$input,
|
||||||
|
$split_characters
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$output
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace tests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test class for Check\Password
|
|
||||||
* @coversDefaultClass \CoreLibs\Check\Password
|
|
||||||
* @testdox \CoreLibs\Check\Password method tests
|
|
||||||
*/
|
|
||||||
final class CoreLibsCheckPasswordTest extends TestCase
|
|
||||||
{
|
|
||||||
public function passwordProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'matching password' => ['test', 'test', true],
|
|
||||||
'not matching password' => ['test', 'not_test', false],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function passwordRehashProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'no rehash needed' => ['$2y$10$EgWJ2WE73DWi.hIyFRCdpejLXTvHbmTK3LEOclO1tAvXAXUNuUS4W', false],
|
|
||||||
'rehash needed' => ['9c42a1346e333a770904b2a2b37fa7d3', true],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::passwordVerify
|
|
||||||
* @covers ::passwordSet
|
|
||||||
* @dataProvider passwordProvider
|
|
||||||
* @testdox passwordSet $input compare to $input_hash: passwordVerify $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $input
|
|
||||||
* @param string $input_hash
|
|
||||||
* @param boolean $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testPasswordSetVerify(string $input, string $input_hash, bool $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Check\Password::passwordVerify($input, \CoreLibs\Check\Password::passwordSet($input_hash))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::passwordRehashCheck
|
|
||||||
* @dataProvider passwordRehashProvider
|
|
||||||
* @testdox passwordRehashCheck $input will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $input
|
|
||||||
* @param boolean $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testPasswordRehashCheck(string $input, bool $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Check\Password::passwordRehashCheck($input)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// __END__
|
|
||||||
@@ -1,630 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace tests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test class for Combined\DateTime
|
|
||||||
* @coversDefaultClass \CoreLibs\Combined\DateTime
|
|
||||||
* @testdox \CoreLibs\Combined\DateTime method tests
|
|
||||||
*/
|
|
||||||
final class CoreLibsCombinedDateTimeTest extends TestCase
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* timestamps
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function timestampProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'valid timestamp no microtime' => [
|
|
||||||
1641515890,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
'2022-01-07 09:38:10',
|
|
||||||
],
|
|
||||||
'valid timestamp with microtime' => [
|
|
||||||
1641515890,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
'2022-01-07 09:38:10',
|
|
||||||
],
|
|
||||||
'valid timestamp with microtime float' => [
|
|
||||||
1641515890,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
'2022-01-07 09:38:10',
|
|
||||||
],
|
|
||||||
'valid micro timestamp with microtime' => [
|
|
||||||
1641515890.123456,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
'2022-01-07 09:38:10 1235ms',
|
|
||||||
],
|
|
||||||
'valid micro timestamp with microtime float' => [
|
|
||||||
1641515890.123456,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
'2022-01-07 09:38:10.1235',
|
|
||||||
],
|
|
||||||
'valid micro timestamp no microtime' => [
|
|
||||||
1641515890.123456,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
'2022-01-07 09:38:10',
|
|
||||||
],
|
|
||||||
'invalid timestamp' => [
|
|
||||||
-123123,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
'1969-12-30 22:47:57',
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* interval for both directions
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function intervalProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'interval no microtime' => [
|
|
||||||
1641515890,
|
|
||||||
false,
|
|
||||||
'18999d 0h 38m 10s',
|
|
||||||
],
|
|
||||||
'interval with microtime' => [
|
|
||||||
1641515890,
|
|
||||||
true,
|
|
||||||
'18999d 0h 38m 10s',
|
|
||||||
],
|
|
||||||
'micro interval no microtime' => [
|
|
||||||
1641515890.123456,
|
|
||||||
false,
|
|
||||||
'18999d 0h 38m 10s',
|
|
||||||
],
|
|
||||||
'micro interval with microtime' => [
|
|
||||||
1641515890.123456,
|
|
||||||
true,
|
|
||||||
'18999d 0h 38m 10s 1235ms',
|
|
||||||
],
|
|
||||||
'negative interval no microtime' => [
|
|
||||||
-1641515890,
|
|
||||||
false,
|
|
||||||
'-18999d 0h 38m 10s',
|
|
||||||
],
|
|
||||||
// short for mini tests
|
|
||||||
'microtime only' => [
|
|
||||||
0.123456,
|
|
||||||
true,
|
|
||||||
'0s 1235ms',
|
|
||||||
],
|
|
||||||
'seconds only' => [
|
|
||||||
30.123456,
|
|
||||||
true,
|
|
||||||
'30s 1235ms',
|
|
||||||
],
|
|
||||||
'minutes only' => [
|
|
||||||
90.123456,
|
|
||||||
true,
|
|
||||||
'1m 30s 1235ms',
|
|
||||||
],
|
|
||||||
'hours only' => [
|
|
||||||
3690.123456,
|
|
||||||
true,
|
|
||||||
'1h 1m 30s 1235ms',
|
|
||||||
],
|
|
||||||
'days only' => [
|
|
||||||
90090.123456,
|
|
||||||
true,
|
|
||||||
'1d 1h 1m 30s 1235ms',
|
|
||||||
],
|
|
||||||
'already set' => [
|
|
||||||
'1d 1h 1m 30s 1235ms',
|
|
||||||
true,
|
|
||||||
'1d 1h 1m 30s 1235ms',
|
|
||||||
],
|
|
||||||
'invalid data' => [
|
|
||||||
'xyz',
|
|
||||||
true,
|
|
||||||
'0s',
|
|
||||||
],
|
|
||||||
'out of bounds timestamp' => [
|
|
||||||
999999999999999,
|
|
||||||
false,
|
|
||||||
'1s'
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function reverseIntervalProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'interval no microtime' => [
|
|
||||||
'18999d 0h 38m 10s',
|
|
||||||
1641515890,
|
|
||||||
],
|
|
||||||
'micro interval with microtime' => [
|
|
||||||
'18999d 0h 38m 10s 1235ms',
|
|
||||||
1641515890.1235,
|
|
||||||
],
|
|
||||||
'micro interval with microtime' => [
|
|
||||||
'18999d 0h 38m 10s 1234567890ms',
|
|
||||||
1641515890.1234567,
|
|
||||||
],
|
|
||||||
'negative interval no microtime' => [
|
|
||||||
'-18999d 0h 38m 10s',
|
|
||||||
-1641515890,
|
|
||||||
],
|
|
||||||
// short for mini tests
|
|
||||||
'microtime only' => [
|
|
||||||
'0s 1235ms',
|
|
||||||
0.1235,
|
|
||||||
],
|
|
||||||
'seconds only' => [
|
|
||||||
'30s 1235ms',
|
|
||||||
30.1235,
|
|
||||||
],
|
|
||||||
'minutes only' => [
|
|
||||||
'1m 30s 1235ms',
|
|
||||||
90.1235,
|
|
||||||
],
|
|
||||||
'hours only' => [
|
|
||||||
'1h 1m 30s 1235ms',
|
|
||||||
3690.1235,
|
|
||||||
],
|
|
||||||
'days only' => [
|
|
||||||
'1d 1h 1m 30s 1235ms',
|
|
||||||
90090.1235,
|
|
||||||
],
|
|
||||||
'already set' => [
|
|
||||||
1641515890,
|
|
||||||
1641515890,
|
|
||||||
],
|
|
||||||
'invalid data' => [
|
|
||||||
'xyz',
|
|
||||||
'xyz',
|
|
||||||
],
|
|
||||||
'out of bound data' => [
|
|
||||||
'99999999999999999999d',
|
|
||||||
8.64E+24
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function dateProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'valid date with -' => [
|
|
||||||
'2021-12-12',
|
|
||||||
true,
|
|
||||||
],
|
|
||||||
'valid date with /' => [
|
|
||||||
'2021/12/12',
|
|
||||||
true,
|
|
||||||
],
|
|
||||||
'valid date time with -' => [
|
|
||||||
'2021-12-12 12:12:12',
|
|
||||||
true,
|
|
||||||
],
|
|
||||||
'invalid date' => [
|
|
||||||
'2021-31-31',
|
|
||||||
false,
|
|
||||||
],
|
|
||||||
'invalid date string' => [
|
|
||||||
'xyz',
|
|
||||||
false,
|
|
||||||
],
|
|
||||||
'out of bound date' => [
|
|
||||||
'9999-12-31',
|
|
||||||
true
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function dateTimeProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'valid date time with -' => [
|
|
||||||
'2021-12-12 12:12:12',
|
|
||||||
true,
|
|
||||||
],
|
|
||||||
'valid date time with /' => [
|
|
||||||
'2021/12/12 12:12:12',
|
|
||||||
true,
|
|
||||||
],
|
|
||||||
'vald date time with hour/min' => [
|
|
||||||
'2021/12/12 12:12',
|
|
||||||
true,
|
|
||||||
],
|
|
||||||
'valid date missing time' => [
|
|
||||||
'2021-12-12',
|
|
||||||
false,
|
|
||||||
],
|
|
||||||
'valid date invalid time string' => [
|
|
||||||
'2021-12-12 ab:cd',
|
|
||||||
false,
|
|
||||||
],
|
|
||||||
'invalid hour +' => [
|
|
||||||
'2021-12-12 35:12',
|
|
||||||
false,
|
|
||||||
],
|
|
||||||
'invalid hour -' => [
|
|
||||||
'2021-12-12 -12:12',
|
|
||||||
false,
|
|
||||||
],
|
|
||||||
'invalid minute +' => [
|
|
||||||
'2021-12-12 23:65:12',
|
|
||||||
false,
|
|
||||||
],
|
|
||||||
'invalid minute -' => [
|
|
||||||
'2021-12-12 23:-12:12',
|
|
||||||
false,
|
|
||||||
],
|
|
||||||
'invalid seconds +' => [
|
|
||||||
'2021-12-12 23:12:99',
|
|
||||||
false,
|
|
||||||
],
|
|
||||||
'invalid seconds -' => [
|
|
||||||
'2021-12-12 23:12:-12',
|
|
||||||
false,
|
|
||||||
],
|
|
||||||
'invalid seconds string' => [
|
|
||||||
'2021-12-12 23:12:ss',
|
|
||||||
false,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function dateCompareProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'first date smaller' => [
|
|
||||||
'2020-12-12',
|
|
||||||
'2021-12-12',
|
|
||||||
-1,
|
|
||||||
],
|
|
||||||
'dates equal' => [
|
|
||||||
'2020-12-12',
|
|
||||||
'2020-12-12',
|
|
||||||
0,
|
|
||||||
],
|
|
||||||
'second date smaller' => [
|
|
||||||
'2021-12-12',
|
|
||||||
'2020-12-12',
|
|
||||||
1
|
|
||||||
],
|
|
||||||
'dates equal with different time' => [
|
|
||||||
'2020-12-12 12:12:12',
|
|
||||||
'2020-12-12 13:13:13',
|
|
||||||
0,
|
|
||||||
],
|
|
||||||
'invalid dates --' => [
|
|
||||||
'--',
|
|
||||||
'--',
|
|
||||||
false
|
|
||||||
],
|
|
||||||
'empty dates' => [
|
|
||||||
'',
|
|
||||||
'',
|
|
||||||
false
|
|
||||||
],
|
|
||||||
'invalid dates' => [
|
|
||||||
'not a date',
|
|
||||||
'not a date either',
|
|
||||||
false,
|
|
||||||
],
|
|
||||||
'out of bound dates' => [
|
|
||||||
'1900-1-1',
|
|
||||||
'9999-12-31',
|
|
||||||
-1
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function dateTimeCompareProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'first date smaller no time' => [
|
|
||||||
'2020-12-12',
|
|
||||||
'2021-12-12',
|
|
||||||
-1,
|
|
||||||
],
|
|
||||||
'dates equal no timestamp' => [
|
|
||||||
'2020-12-12',
|
|
||||||
'2020-12-12',
|
|
||||||
0,
|
|
||||||
],
|
|
||||||
'second date smaller no timestamp' => [
|
|
||||||
'2021-12-12',
|
|
||||||
'2020-12-12',
|
|
||||||
1
|
|
||||||
],
|
|
||||||
'date equal first time smaller' => [
|
|
||||||
'2020-12-12 12:12:12',
|
|
||||||
'2020-12-12 13:13:13',
|
|
||||||
-1,
|
|
||||||
],
|
|
||||||
'date equal time equal' => [
|
|
||||||
'2020-12-12 12:12:12',
|
|
||||||
'2020-12-12 12:12:12',
|
|
||||||
0,
|
|
||||||
],
|
|
||||||
'date equal second time smaller' => [
|
|
||||||
'2020-12-12 13:13:13',
|
|
||||||
'2020-12-12 12:12:12',
|
|
||||||
1,
|
|
||||||
],
|
|
||||||
'valid date invalid time' => [
|
|
||||||
'2020-12-12 13:99:13',
|
|
||||||
'2020-12-12 12:12:99',
|
|
||||||
false,
|
|
||||||
],
|
|
||||||
'invalid datetimes --' => [
|
|
||||||
'--',
|
|
||||||
'--',
|
|
||||||
false,
|
|
||||||
],
|
|
||||||
'empty datetimess' => [
|
|
||||||
'',
|
|
||||||
'',
|
|
||||||
false,
|
|
||||||
],
|
|
||||||
'invalid datetimes' => [
|
|
||||||
'not a date',
|
|
||||||
'not a date either',
|
|
||||||
false,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function daysIntervalProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'valid interval /, not named array' => [
|
|
||||||
'2020/1/1',
|
|
||||||
'2020/1/30',
|
|
||||||
false,
|
|
||||||
[29, 22, 8],
|
|
||||||
],
|
|
||||||
'valid interval /, named array' => [
|
|
||||||
'2020/1/1',
|
|
||||||
'2020/1/30',
|
|
||||||
true,
|
|
||||||
['overall' => 29, 'weekday' => 22, 'weekend' => 8],
|
|
||||||
],
|
|
||||||
'valid interval -' => [
|
|
||||||
'2020-1-1',
|
|
||||||
'2020-1-30',
|
|
||||||
false,
|
|
||||||
[29, 22, 8],
|
|
||||||
],
|
|
||||||
'valid interval switched' => [
|
|
||||||
'2020/1/30',
|
|
||||||
'2020/1/1',
|
|
||||||
false,
|
|
||||||
[28, 0, 0],
|
|
||||||
],
|
|
||||||
'valid interval with time' => [
|
|
||||||
'2020/1/1 12:12:12',
|
|
||||||
'2020/1/30 13:13:13',
|
|
||||||
false,
|
|
||||||
[28, 21, 8],
|
|
||||||
],
|
|
||||||
'invalid dates' => [
|
|
||||||
'abc',
|
|
||||||
'xyz',
|
|
||||||
false,
|
|
||||||
[0, 0, 0]
|
|
||||||
],
|
|
||||||
// this test will take a long imte
|
|
||||||
'out of bound dates' => [
|
|
||||||
'1900-1-1',
|
|
||||||
'9999-12-31',
|
|
||||||
false,
|
|
||||||
[2958463,2113189,845274],
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* date string convert test
|
|
||||||
*
|
|
||||||
* @covers ::dateStringFormat
|
|
||||||
* @dataProvider timestampProvider
|
|
||||||
* @testdox dateStringFormat $input (microtime $flag) will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param int|float $input
|
|
||||||
* @param bool $flag
|
|
||||||
* @param string $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testDateStringFormat(
|
|
||||||
$input,
|
|
||||||
bool $flag_show_micro,
|
|
||||||
bool $flag_micro_as_float,
|
|
||||||
string $expected
|
|
||||||
): void {
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\DateTime::dateStringFormat(
|
|
||||||
$input,
|
|
||||||
$flag_show_micro,
|
|
||||||
$flag_micro_as_float
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* interval convert test
|
|
||||||
*
|
|
||||||
* @covers ::timeStringFormat
|
|
||||||
* @dataProvider intervalProvider
|
|
||||||
* @testdox timeStringFormat $input (microtime $flag) will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param int|float $input
|
|
||||||
* @param bool $flag
|
|
||||||
* @param string $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testTimeStringFormat($input, bool $flag, string $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\DateTime::timeStringFormat($input, $flag)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::stringToTime
|
|
||||||
* @dataProvider reverseIntervalProvider
|
|
||||||
* @testdox stringToTime $input will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string|int|float $input
|
|
||||||
* @param string|int|float $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testStringToTime($input, $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\DateTime::stringToTime($input)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::checkDate
|
|
||||||
* @dataProvider dateProvider
|
|
||||||
* @testdox checkDate $input will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $input
|
|
||||||
* @param bool $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testCheckDate(string $input, bool $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\DateTime::checkDate($input)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::checkDateTime
|
|
||||||
* @dataProvider dateTimeProvider
|
|
||||||
* @testdox checkDateTime $input will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $input
|
|
||||||
* @param bool $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testCheckDateTime(string $input, bool $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\DateTime::checkDateTime($input)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::compareDate
|
|
||||||
* @dataProvider dateCompareProvider
|
|
||||||
* @testdox compareDate $input_a compared to $input_b will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $input_a
|
|
||||||
* @param string $input_b
|
|
||||||
* @param int|bool $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testCompareDate(string $input_a, string $input_b, $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\DateTime::compareDate($input_a, $input_b)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::compareDateTime
|
|
||||||
* @dataProvider dateTimeCompareProvider
|
|
||||||
* @testdox compareDateTime $input_a compared to $input_b will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $input_a
|
|
||||||
* @param string $input_b
|
|
||||||
* @param int|bool $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testCompareDateTime(string $input_a, string $input_b, $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\DateTime::compareDateTime($input_a, $input_b)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::calcDaysInterval
|
|
||||||
* @dataProvider daysIntervalProvider
|
|
||||||
* @testdox calcDaysInterval $input_a compared to $input_b will be $expected [$_dataName]
|
|
||||||
* @medium
|
|
||||||
*
|
|
||||||
* @param string $input_a
|
|
||||||
* @param string $input_b
|
|
||||||
* @param bool $flag
|
|
||||||
* @param array $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testCalcDaysInterval(string $input_a, string $input_b, bool $flag, $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\DateTime::calcDaysInterval($input_a, $input_b, $flag)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// __END__
|
|
||||||
@@ -1,186 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace tests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test class for Create\Uids
|
|
||||||
* @coversDefaultClass \CoreLibs\Create\Uids
|
|
||||||
* @testdox \CoreLibs\Create\Uids method tests
|
|
||||||
*/
|
|
||||||
final class CoreLibsCreateUidsTest extends TestCase
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function uniqIdProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'md5 hash' => [
|
|
||||||
0 => 'md5',
|
|
||||||
1 => 32,
|
|
||||||
],
|
|
||||||
'sha256 hash' => [
|
|
||||||
0 => 'sha256',
|
|
||||||
1 => 64
|
|
||||||
],
|
|
||||||
'ripemd160 hash' => [
|
|
||||||
0 => 'ripemd160',
|
|
||||||
1 => 40
|
|
||||||
],
|
|
||||||
'adler32 hash' => [
|
|
||||||
0 => 'adler32',
|
|
||||||
1 => 8
|
|
||||||
],
|
|
||||||
'not in list hash but valid' => [
|
|
||||||
0 => 'sha3-512',
|
|
||||||
1 => strlen(hash('sha3-512', 'A'))
|
|
||||||
],
|
|
||||||
'default hash not set' => [
|
|
||||||
0 => null,
|
|
||||||
1 => 64,
|
|
||||||
],
|
|
||||||
'invalid name' => [
|
|
||||||
0 => 'iamnotavalidhash',
|
|
||||||
1 => 64,
|
|
||||||
],
|
|
||||||
'auto: ' . \CoreLibs\Create\Uids::DEFAULT_HASH => [
|
|
||||||
0 => \CoreLibs\Create\Uids::DEFAULT_HASH,
|
|
||||||
1 => strlen(hash(\CoreLibs\Create\Uids::DEFAULT_HASH, 'A'))
|
|
||||||
],
|
|
||||||
'auto: ' . \CoreLibs\Create\Uids::STANDARD_HASH_LONG => [
|
|
||||||
0 => \CoreLibs\Create\Uids::STANDARD_HASH_LONG,
|
|
||||||
1 => strlen(hash(\CoreLibs\Create\Uids::STANDARD_HASH_LONG, 'A'))
|
|
||||||
],
|
|
||||||
'auto: ' . \CoreLibs\Create\Uids::STANDARD_HASH_SHORT => [
|
|
||||||
0 => \CoreLibs\Create\Uids::STANDARD_HASH_SHORT,
|
|
||||||
1 => strlen(hash(\CoreLibs\Create\Uids::STANDARD_HASH_SHORT, 'A'))
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function uniqIdLongProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'uniq id long: ' . \CoreLibs\Create\Uids::STANDARD_HASH_LONG => [
|
|
||||||
strlen(hash(\CoreLibs\Create\Uids::STANDARD_HASH_LONG, 'A'))
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* must match 7e78fe0d-59b8-4637-af7f-e88d221a7d1e
|
|
||||||
*
|
|
||||||
* @covers ::uuidv4
|
|
||||||
* @testdox uuidv4 check that return is matching regex [$_dataName]
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testUuidv4(): void
|
|
||||||
{
|
|
||||||
$uuid = \CoreLibs\Create\Uids::uuidv4();
|
|
||||||
$this->assertMatchesRegularExpression(
|
|
||||||
'/^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$/',
|
|
||||||
$uuid
|
|
||||||
);
|
|
||||||
// $this->assertStringMatchesFormat(
|
|
||||||
// '%4s%4s-%4s-%4s-%4s-%4s%4s%4s',
|
|
||||||
// $uuid
|
|
||||||
// );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::uniqId
|
|
||||||
* @dataProvider uniqIdProvider
|
|
||||||
* @testdox uniqId $input will be length $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string|null $input
|
|
||||||
* @param string $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testUniqId(?string $input, int $expected): void
|
|
||||||
{
|
|
||||||
if ($input === null) {
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
strlen(\CoreLibs\Create\Uids::uniqId())
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
strlen(\CoreLibs\Create\Uids::uniqId($input))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Because we set a constant here, we can only run one test
|
|
||||||
* so we test invalid one to force check
|
|
||||||
*
|
|
||||||
* @covers ::uniqId
|
|
||||||
* @#dataProvider uniqIdProvider
|
|
||||||
* @testWith ["invalidhash", 64]
|
|
||||||
* @testdox uniqId use DEFAULT_HASH set $input with length $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testUnidIdDefaultHash(string $input, int $expected): void
|
|
||||||
{
|
|
||||||
define('DEFAULT_HASH', $input);
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
strlen(\CoreLibs\Create\Uids::uniqId())
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Short id, always 8 in length
|
|
||||||
*
|
|
||||||
* @covers ::uniqIdShort
|
|
||||||
* @testWith [8]
|
|
||||||
* @testdox uniqIdShort will be length $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param integer $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testUniqIdShort(int $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
strlen(\CoreLibs\Create\Uids::uniqIdShort())
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Long Id, length can change
|
|
||||||
*
|
|
||||||
* @covers ::uniqIdLong
|
|
||||||
* @dataProvider uniqIdLongProvider
|
|
||||||
* @testdox uniqIdLong will be length $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param integer $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testUniqIdLong(int $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
strlen(\CoreLibs\Create\Uids::uniqIdLong())
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// __END__
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,990 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace tests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
// TODO: setLogPer test log file written matches pattern
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test class for Debug\Logging
|
|
||||||
* @coversDefaultClass \CoreLibs\Debug\Logging
|
|
||||||
* @testdox \CoreLibs\Debug\Logging method tests
|
|
||||||
*/
|
|
||||||
final class CoreLibsDebugLoggingTest extends TestCase
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* test set for options BASIC
|
|
||||||
*
|
|
||||||
* 0: options
|
|
||||||
* - null for NOT set
|
|
||||||
* 1: expected
|
|
||||||
* 2: override
|
|
||||||
* override:
|
|
||||||
* - constant for COSNTANTS
|
|
||||||
* - global for _GLOBALS
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function optionsProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'log folder set' => [
|
|
||||||
[
|
|
||||||
'log_folder' => '/tmp'
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'log_folder' => '/tmp/',
|
|
||||||
'debug_all' => false,
|
|
||||||
'print_all' => false,
|
|
||||||
],
|
|
||||||
[]
|
|
||||||
],
|
|
||||||
'nothing set' => [
|
|
||||||
null,
|
|
||||||
[
|
|
||||||
'log_folder' => getcwd() . DIRECTORY_SEPARATOR,
|
|
||||||
'debug_all' => false,
|
|
||||||
'print_all' => false,
|
|
||||||
],
|
|
||||||
[]
|
|
||||||
],
|
|
||||||
'no options set, constant set' => [
|
|
||||||
null,
|
|
||||||
[
|
|
||||||
'log_folder' => str_replace('/configs', '', __DIR__)
|
|
||||||
. DIRECTORY_SEPARATOR . 'log/',
|
|
||||||
'debug_all' => false,
|
|
||||||
'print_all' => false,
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'constant' => [
|
|
||||||
'BASE' => str_replace('/configs', '', __DIR__)
|
|
||||||
. DIRECTORY_SEPARATOR,
|
|
||||||
'LOG' => 'log/'
|
|
||||||
]
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'standard test set' => [
|
|
||||||
[
|
|
||||||
'log_folder' => '/tmp',
|
|
||||||
'debug_all' => true,
|
|
||||||
'print_all' => true,
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'log_folder' => '/tmp/',
|
|
||||||
'debug_all' => true,
|
|
||||||
'print_all' => true,
|
|
||||||
],
|
|
||||||
[]
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* init logging class
|
|
||||||
*
|
|
||||||
* @dataProvider optionsProvider
|
|
||||||
* @testdox init test [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array|null $options
|
|
||||||
* @param array $expected
|
|
||||||
* @param array $override
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testClassInit(?array $options, array $expected, array $override): void
|
|
||||||
{
|
|
||||||
if (!empty($override['constant'])) {
|
|
||||||
foreach ($override['constant'] as $var => $value) {
|
|
||||||
define($var, $value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($options === null) {
|
|
||||||
$log = new \CoreLibs\Debug\Logging();
|
|
||||||
} else {
|
|
||||||
$log = new \CoreLibs\Debug\Logging($options);
|
|
||||||
}
|
|
||||||
// check that settings match
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected['log_folder'],
|
|
||||||
$log->getSetting('log_folder')
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected['debug_all'],
|
|
||||||
$log->getSetting('debug_output_all')
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected['print_all'],
|
|
||||||
$log->getSetting('print_output_all')
|
|
||||||
);
|
|
||||||
// print "LOG: " . $log->getSetting('log_folder') . "\n";
|
|
||||||
// print "DEBUG: " . $log->getSetting('debug_output_all') . "\n";
|
|
||||||
// print "PRINT: " . $log->getSetting('print_output_all') . "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* adds log ID settings based on basic options
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function logIdOptionsProvider(): array
|
|
||||||
{
|
|
||||||
// 0: options
|
|
||||||
// 1: expected
|
|
||||||
// 2: override
|
|
||||||
return [
|
|
||||||
'no log id set' => [
|
|
||||||
null,
|
|
||||||
[
|
|
||||||
'log_file_id' => ''
|
|
||||||
],
|
|
||||||
[]
|
|
||||||
],
|
|
||||||
// set log id manually afterwards
|
|
||||||
'set log id manually' => [
|
|
||||||
null,
|
|
||||||
[
|
|
||||||
'log_file_id' => '',
|
|
||||||
'set_log_file_id' => 'abc123',
|
|
||||||
],
|
|
||||||
[
|
|
||||||
// set post launch
|
|
||||||
'values' => [
|
|
||||||
'log_file_id' => 'abc123'
|
|
||||||
]
|
|
||||||
]
|
|
||||||
],
|
|
||||||
// set log id from options
|
|
||||||
'set log id via options' => [
|
|
||||||
[
|
|
||||||
'file_id' => 'abc456',
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'log_file_id' => 'abc456'
|
|
||||||
],
|
|
||||||
[]
|
|
||||||
],
|
|
||||||
// set log id from GLOBALS [DEPRECATED]
|
|
||||||
'set log id via globals' => [
|
|
||||||
null,
|
|
||||||
[
|
|
||||||
'log_file_id' => 'def123'
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'globals' => [
|
|
||||||
'LOG_FILE_ID' => 'def123'
|
|
||||||
]
|
|
||||||
]
|
|
||||||
],
|
|
||||||
// set log id from CONSTANT [DEPRECATED]
|
|
||||||
'set log id via constant' => [
|
|
||||||
null,
|
|
||||||
[
|
|
||||||
'log_file_id' => 'ghi123'
|
|
||||||
],
|
|
||||||
[
|
|
||||||
// reset global
|
|
||||||
'globals' => [
|
|
||||||
'LOG_FILE_ID' => null
|
|
||||||
],
|
|
||||||
'constant' => [
|
|
||||||
'LOG_FILE_ID' => 'ghi123'
|
|
||||||
]
|
|
||||||
]
|
|
||||||
],
|
|
||||||
// invalid, keep previous set
|
|
||||||
'invalid log id' => [
|
|
||||||
[
|
|
||||||
'file_id' => 'jkl456'
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'log_file_id' => 'jkl456',
|
|
||||||
'set_log_file_id' => 'jkl456',
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'values' => [
|
|
||||||
'log_file_id' => './#'
|
|
||||||
]
|
|
||||||
]
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* test the setting and getting of LogId
|
|
||||||
*
|
|
||||||
* @covers ::setLogId
|
|
||||||
* @dataProvider logIdOptionsProvider
|
|
||||||
* @testdox log id set/get tests [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array|null $options
|
|
||||||
* @param array $expected
|
|
||||||
* @param array $override
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testLogId(?array $options, array $expected, array $override): void
|
|
||||||
{
|
|
||||||
// we need to set with file_id option, globals LOG_FILE_ID, constant LOG_FILE_ID
|
|
||||||
if (!empty($override['constant'])) {
|
|
||||||
foreach ($override['constant'] as $var => $value) {
|
|
||||||
define($var, $value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!empty($override['globals'])) {
|
|
||||||
foreach ($override['globals'] as $var => $value) {
|
|
||||||
$GLOBALS[$var] = $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($options === null) {
|
|
||||||
$log = new \CoreLibs\Debug\Logging();
|
|
||||||
} else {
|
|
||||||
$log = new \CoreLibs\Debug\Logging($options);
|
|
||||||
}
|
|
||||||
// check current
|
|
||||||
$this->assertEquals(
|
|
||||||
$log->getLogId(),
|
|
||||||
$expected['log_file_id']
|
|
||||||
);
|
|
||||||
// we need to override now too
|
|
||||||
if (!empty($override['values'])) {
|
|
||||||
// check if we have values, set them post and assert
|
|
||||||
$log->setLogId($override['values']['log_file_id']);
|
|
||||||
$this->assertEquals(
|
|
||||||
$log->getLogId(),
|
|
||||||
$expected['set_log_file_id']
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function logLevelAllProvider(): array
|
|
||||||
{
|
|
||||||
// 0: type
|
|
||||||
// 1: flag
|
|
||||||
// 2: expected set
|
|
||||||
// 3: expected get
|
|
||||||
return [
|
|
||||||
'debug all true' => [
|
|
||||||
'debug',
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
],
|
|
||||||
'echo all true' => [
|
|
||||||
'echo',
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
],
|
|
||||||
'print all true' => [
|
|
||||||
'print',
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
],
|
|
||||||
'set invalid level' => [
|
|
||||||
'invalud',
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* check set/get for log level all flag
|
|
||||||
*
|
|
||||||
* @dataProvider logLevelAllProvider
|
|
||||||
* @testdox set/get all log level $type with flag $flag [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $type
|
|
||||||
* @param bool $flag
|
|
||||||
* @param bool $expected_set
|
|
||||||
* @param bool $expected_get
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testSetGetLogLevelAll(
|
|
||||||
string $type,
|
|
||||||
bool $flag,
|
|
||||||
bool $expected_set,
|
|
||||||
bool $expected_get
|
|
||||||
): void {
|
|
||||||
// neutral start with default
|
|
||||||
$log = new \CoreLibs\Debug\Logging();
|
|
||||||
// set and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$log->setLogLevelAll($type, $flag),
|
|
||||||
$expected_set
|
|
||||||
);
|
|
||||||
// get and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$log->getLogLevelAll($type),
|
|
||||||
$expected_get
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function logLevelProvider(): array
|
|
||||||
{
|
|
||||||
// 0: type
|
|
||||||
// 1: flag
|
|
||||||
// 2: debug on (array)
|
|
||||||
// 3: expected set
|
|
||||||
// 4: level
|
|
||||||
// 5: expected get
|
|
||||||
return [
|
|
||||||
'set debug on for level A,B,C and check full set' => [
|
|
||||||
'debug',
|
|
||||||
'on',
|
|
||||||
['A', 'B', 'C'],
|
|
||||||
true,
|
|
||||||
null,
|
|
||||||
[
|
|
||||||
'A' => true,
|
|
||||||
'B' => true,
|
|
||||||
'C' => true,
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'set debug off for level A,B,C and check A' => [
|
|
||||||
'debug',
|
|
||||||
'off',
|
|
||||||
['A', 'B', 'C'],
|
|
||||||
true,
|
|
||||||
'A',
|
|
||||||
true,
|
|
||||||
],
|
|
||||||
// set one to false
|
|
||||||
'set debug off for level A, B to false and check all' => [
|
|
||||||
'debug',
|
|
||||||
'off',
|
|
||||||
['A', 'B' => false],
|
|
||||||
true,
|
|
||||||
null,
|
|
||||||
[
|
|
||||||
'A' => true,
|
|
||||||
'B' => false,
|
|
||||||
],
|
|
||||||
],
|
|
||||||
// set invalid type
|
|
||||||
'set invalid level' => [
|
|
||||||
'invalid',
|
|
||||||
'',
|
|
||||||
[],
|
|
||||||
false,
|
|
||||||
null,
|
|
||||||
false
|
|
||||||
],
|
|
||||||
// set invalid flag
|
|
||||||
'set invalid on flag' => [
|
|
||||||
'print',
|
|
||||||
'invalid',
|
|
||||||
[],
|
|
||||||
false,
|
|
||||||
null,
|
|
||||||
false
|
|
||||||
],
|
|
||||||
// missing debug array set
|
|
||||||
'missing debug level array' => [
|
|
||||||
'print',
|
|
||||||
'off',
|
|
||||||
[],
|
|
||||||
false,
|
|
||||||
null,
|
|
||||||
[]
|
|
||||||
],
|
|
||||||
// set but check no existing
|
|
||||||
'set level but check no exisitng' => [
|
|
||||||
'print',
|
|
||||||
'on',
|
|
||||||
['A'],
|
|
||||||
true,
|
|
||||||
'C',
|
|
||||||
false
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* checks setting for per log info level
|
|
||||||
*
|
|
||||||
* @covers ::setLogLevel
|
|
||||||
* @dataProvider logLevelProvider
|
|
||||||
* @testdox set/get log level $type to $flag check with $level [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $type
|
|
||||||
* @param string $flag
|
|
||||||
* @param array $debug_on
|
|
||||||
* @param bool $expected_set
|
|
||||||
* @param string|null $level
|
|
||||||
* @param bool|array<mixed> $expected_get
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testSetGetLogLevel(
|
|
||||||
string $type,
|
|
||||||
string $flag,
|
|
||||||
array $debug_on,
|
|
||||||
bool $expected_set,
|
|
||||||
?string $level,
|
|
||||||
$expected_get
|
|
||||||
): void {
|
|
||||||
// neutral start with default
|
|
||||||
$log = new \CoreLibs\Debug\Logging();
|
|
||||||
// set
|
|
||||||
$this->assertEquals(
|
|
||||||
$log->setLogLevel($type, $flag, $debug_on),
|
|
||||||
$expected_set
|
|
||||||
);
|
|
||||||
// get, if level is null compare to?
|
|
||||||
$this->assertEquals(
|
|
||||||
$log->getLogLevel($type, $flag, $level),
|
|
||||||
$expected_get
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function logPerProvider(): array
|
|
||||||
{
|
|
||||||
// 0: type
|
|
||||||
// 1: set
|
|
||||||
// 2: expected set
|
|
||||||
// 3: expected get
|
|
||||||
return [
|
|
||||||
'level set true' => [
|
|
||||||
'level',
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
],
|
|
||||||
'class set true' => [
|
|
||||||
'class',
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
],
|
|
||||||
'page set true' => [
|
|
||||||
'page',
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
],
|
|
||||||
'run set true' => [
|
|
||||||
'run',
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
],
|
|
||||||
'set invalid type' => [
|
|
||||||
'invalid',
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* set and get per log
|
|
||||||
* for level/class/page/run flags
|
|
||||||
*
|
|
||||||
* @covers ::setLogPer
|
|
||||||
* @dataProvider logPerProvider
|
|
||||||
* @testdox set/get log per $type with $set [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $type
|
|
||||||
* @param boolean $set
|
|
||||||
* @param boolean $expected_set
|
|
||||||
* @param boolean $expected_get
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testSetGetLogPer(
|
|
||||||
string $type,
|
|
||||||
bool $set,
|
|
||||||
bool $expected_set,
|
|
||||||
bool $expected_get
|
|
||||||
): void {
|
|
||||||
// neutral start with default
|
|
||||||
$log = new \CoreLibs\Debug\Logging();
|
|
||||||
// set and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$log->setLogPer($type, $set),
|
|
||||||
$expected_set
|
|
||||||
);
|
|
||||||
// get and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$log->getLogPer($type),
|
|
||||||
$expected_get
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* set the print log file date part
|
|
||||||
*
|
|
||||||
* @covers ::setGetLogPrintFileDate
|
|
||||||
* @testWith [true, true, true]
|
|
||||||
* [false, false, false]
|
|
||||||
* @testdox set/get log file date to $input [$_dataName]
|
|
||||||
*
|
|
||||||
* @param boolean $input
|
|
||||||
* @param boolean $expected_set
|
|
||||||
* @param boolean $expected_get
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testSetGetLogPrintFileDate(bool $input, bool $expected_set, bool $expected_get): void
|
|
||||||
{
|
|
||||||
// neutral start with default
|
|
||||||
$log = new \CoreLibs\Debug\Logging();
|
|
||||||
// set and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$log->setGetLogPrintFileDate($input),
|
|
||||||
$expected_set
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
|
||||||
$log->setGetLogPrintFileDate(),
|
|
||||||
$expected_get
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function prArProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'simple array' => [
|
|
||||||
[
|
|
||||||
'A' => 'foobar'
|
|
||||||
],
|
|
||||||
"##HTMLPRE##Array\n(\n"
|
|
||||||
. " [A] => foobar\n"
|
|
||||||
. ")\n"
|
|
||||||
. "##/HTMLPRE##"
|
|
||||||
],
|
|
||||||
'empty array' => [
|
|
||||||
[],
|
|
||||||
"##HTMLPRE##Array\n(\n"
|
|
||||||
. ")\n"
|
|
||||||
. "##/HTMLPRE##"
|
|
||||||
],
|
|
||||||
'nested array' => [
|
|
||||||
[
|
|
||||||
'A' => [
|
|
||||||
'B' => 'bar'
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"##HTMLPRE##Array\n(\n"
|
|
||||||
. " [A] => Array\n"
|
|
||||||
. " (\n"
|
|
||||||
. " [B] => bar\n"
|
|
||||||
. " )\n"
|
|
||||||
. "\n"
|
|
||||||
. ")\n"
|
|
||||||
. "##/HTMLPRE##"
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* convert array to string with ## pre replace space holders
|
|
||||||
*
|
|
||||||
* @covers ::prAr
|
|
||||||
* @dataProvider prArProvider
|
|
||||||
* @testdox check prAr array to string conversion [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array $input
|
|
||||||
* @param string $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testPrAr(array $input, string $expected): void
|
|
||||||
{
|
|
||||||
$log = new \CoreLibs\Debug\Logging();
|
|
||||||
$this->assertEquals(
|
|
||||||
$log->prAr($input),
|
|
||||||
$expected
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function prBlProvider(): array
|
|
||||||
{
|
|
||||||
// 0: input flag (bool)
|
|
||||||
// 1: is true
|
|
||||||
// 2: is flase
|
|
||||||
// 3: epxected
|
|
||||||
return [
|
|
||||||
'true bool default' => [
|
|
||||||
true,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
'true'
|
|
||||||
],
|
|
||||||
'false bool default' => [
|
|
||||||
false,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
'false'
|
|
||||||
],
|
|
||||||
'true bool override' => [
|
|
||||||
true,
|
|
||||||
'ok',
|
|
||||||
'not ok',
|
|
||||||
'ok'
|
|
||||||
],
|
|
||||||
'false bool override' => [
|
|
||||||
false,
|
|
||||||
'ok',
|
|
||||||
'not ok',
|
|
||||||
'not ok'
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* check bool to string converter
|
|
||||||
*
|
|
||||||
* @covers ::prBl
|
|
||||||
* @dataProvider prBlProvider
|
|
||||||
* @testdox check prBl $input ($true/$false) is expected $false [$_dataName]
|
|
||||||
*
|
|
||||||
* @param bool $input
|
|
||||||
* @param string|null $true
|
|
||||||
* @param string|null $false
|
|
||||||
* @param string $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testPrBl(bool $input, ?string $true, ?string $false, string $expected): void
|
|
||||||
{
|
|
||||||
$log = new \CoreLibs\Debug\Logging();
|
|
||||||
$return = '';
|
|
||||||
if ($true === null && $false === null) {
|
|
||||||
$return = $log->prBl($input);
|
|
||||||
} elseif ($true !== null || $false !== null) {
|
|
||||||
$return = $log->prBl($input, $true ?? '', $false ?? '');
|
|
||||||
}
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
$return
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// from here are complex debug tests
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* 0: array $options
|
|
||||||
* 1: array $debug_msg
|
|
||||||
* 2: boolean $expected_debug
|
|
||||||
* 3: string $expected_file
|
|
||||||
* 4: string $expected_string_start
|
|
||||||
* 5: string $expected_string_contains
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function debugProvider(): array
|
|
||||||
{
|
|
||||||
// error message to pass in
|
|
||||||
$error_msg['A'] = [
|
|
||||||
'level' => 'A',
|
|
||||||
'string' => 'error msg',
|
|
||||||
'strip' => false,
|
|
||||||
'prefix' => '',
|
|
||||||
];
|
|
||||||
// file content to check
|
|
||||||
$file_msg['A'] = "{PHPUnit\TextUI\Command} <A> - error msg\n";
|
|
||||||
// string messages to check
|
|
||||||
$string_msg['A'] = [
|
|
||||||
's' => '<div style="text-align: left; padding: 5px; font-size: 10px; '
|
|
||||||
. 'font-family: sans-serif; border-top: 1px solid black; '
|
|
||||||
. 'border-bottom: 1px solid black; margin: 10px 0 10px 0; '
|
|
||||||
. 'background-color: white; color: black;">'
|
|
||||||
. '<div style="font-size: 12px;">{<span style="font-style: '
|
|
||||||
. 'italic; color: #928100;">PHPUnit\TextUI\Command</span>}'
|
|
||||||
. '</div><div style="font-size: 12px;">[<span style="font-style: '
|
|
||||||
. 'italic; color: #c56c00;">A</span>] </div><div>[<span '
|
|
||||||
. 'style="font-weight: bold; color: #5e8600;">',
|
|
||||||
'c' => 'PHPUnit\TextUI\Command</span>} - error msg</div><!--#BR#-->',
|
|
||||||
];
|
|
||||||
// array provider
|
|
||||||
return [
|
|
||||||
'A debug: on, print: on, echo: on' => [
|
|
||||||
[
|
|
||||||
'debug_all' => true,
|
|
||||||
'print_all' => true,
|
|
||||||
'echo_all' => true,
|
|
||||||
],
|
|
||||||
$error_msg['A'],
|
|
||||||
true,
|
|
||||||
$file_msg['A'],
|
|
||||||
$string_msg['A']['s'],
|
|
||||||
$string_msg['A']['c'],
|
|
||||||
],
|
|
||||||
'B debug: on, print: off, echo: on' => [
|
|
||||||
[
|
|
||||||
'debug_all' => true,
|
|
||||||
'print_all' => false,
|
|
||||||
'echo_all' => true,
|
|
||||||
],
|
|
||||||
$error_msg['A'],
|
|
||||||
true,
|
|
||||||
'',
|
|
||||||
$string_msg['A']['s'],
|
|
||||||
$string_msg['A']['c'],
|
|
||||||
],
|
|
||||||
'C debug: on, print: on, echo: off' => [
|
|
||||||
[
|
|
||||||
'debug_all' => true,
|
|
||||||
'print_all' => true,
|
|
||||||
'echo_all' => false,
|
|
||||||
],
|
|
||||||
$error_msg['A'],
|
|
||||||
true,
|
|
||||||
$file_msg['A'],
|
|
||||||
'',
|
|
||||||
'',
|
|
||||||
],
|
|
||||||
'D debug: on, print: off, echo: off' => [
|
|
||||||
[
|
|
||||||
'debug_all' => true,
|
|
||||||
'print_all' => false,
|
|
||||||
'echo_all' => false,
|
|
||||||
],
|
|
||||||
$error_msg['A'],
|
|
||||||
false,
|
|
||||||
'',
|
|
||||||
'',
|
|
||||||
''
|
|
||||||
],
|
|
||||||
'E debug: off, print: off, echo: off' => [
|
|
||||||
[
|
|
||||||
'debug_all' => false,
|
|
||||||
'print_all' => false,
|
|
||||||
'echo_all' => false,
|
|
||||||
],
|
|
||||||
$error_msg['A'],
|
|
||||||
false,
|
|
||||||
'',
|
|
||||||
'',
|
|
||||||
''
|
|
||||||
]
|
|
||||||
// TODO more tests with different error messages
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test debug flow
|
|
||||||
*
|
|
||||||
* @covers ::debug
|
|
||||||
* @dataProvider debugProvider
|
|
||||||
* @testdox check debug flow: $expected_debug [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array $options
|
|
||||||
* @param array $debug_msg
|
|
||||||
* @param boolean $expected_debug
|
|
||||||
* @param string $expected_file
|
|
||||||
* @param string $expected_string_start
|
|
||||||
* @param string $expected_string_contains
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testDebug(
|
|
||||||
array $options,
|
|
||||||
array $debug_msg,
|
|
||||||
bool $expected_debug,
|
|
||||||
string $expected_file,
|
|
||||||
string $expected_string_start,
|
|
||||||
string $expected_string_contains
|
|
||||||
): void {
|
|
||||||
// must run with below matrix
|
|
||||||
// level | debug | print | echo | debug() | printErrorMsg() | file
|
|
||||||
// A 1/1/1 | on | on | on | true | 'string' | on
|
|
||||||
// B 1/0/1 | on | off | on | true | 'string' | off
|
|
||||||
// C 1/1/0 | on | on | off | true | '' | on
|
|
||||||
// D 1/0/0 | on | off | off | false | '' | off
|
|
||||||
// E 0/1/1 | off | on | on | false | '' | off
|
|
||||||
// F 0/0/1 | off | off | on | false | '' | off
|
|
||||||
// G 0/1/0 | off | on | off | false | '' | off
|
|
||||||
// H 0/0/0 | off | off | off | false | '' | off
|
|
||||||
|
|
||||||
|
|
||||||
// * debug off
|
|
||||||
// return false on debug(),
|
|
||||||
// return false on writeErrorMsg()
|
|
||||||
// empty string on printErrorMsg
|
|
||||||
// * print off
|
|
||||||
// return true on debug(),
|
|
||||||
// return false on writeErrorMsg()
|
|
||||||
// empty string on printErrorMsg
|
|
||||||
// * echo off
|
|
||||||
// return true on debug(),
|
|
||||||
// empty string on printErrorMsg
|
|
||||||
// fillxed error_msg array
|
|
||||||
|
|
||||||
// overwrite any previous set from test
|
|
||||||
$options['file_id'] = 'TestDebug';
|
|
||||||
// set log folder to temp
|
|
||||||
$options['log_folder'] = '/tmp/';
|
|
||||||
// remove any files named /tmp/error_log_TestDebug*.log
|
|
||||||
array_map('unlink', glob($options['log_folder'] . 'error_msg_' . $options['file_id'] . '*.log'));
|
|
||||||
// init logger
|
|
||||||
$log = new \CoreLibs\Debug\Logging($options);
|
|
||||||
// * debug (A/B)
|
|
||||||
// NULL check for strip/prefix
|
|
||||||
$this->assertEquals(
|
|
||||||
$log->debug(
|
|
||||||
$debug_msg['level'],
|
|
||||||
$debug_msg['string'],
|
|
||||||
$debug_msg['strip'],
|
|
||||||
$debug_msg['prefix'],
|
|
||||||
),
|
|
||||||
$expected_debug
|
|
||||||
);
|
|
||||||
// * if print check data in log file
|
|
||||||
$log_file = $log->getLogFileName();
|
|
||||||
if (!empty($options['debug_all']) && !empty($options['print_all'])) {
|
|
||||||
// file name matching
|
|
||||||
$this->assertStringStartsWith(
|
|
||||||
$options['log_folder'] . 'error_msg_' . $options['file_id'],
|
|
||||||
$log_file,
|
|
||||||
);
|
|
||||||
// cotents check
|
|
||||||
if (!is_file($log_file)) {
|
|
||||||
$this->fail('error msg file not found: ' . $log_file);
|
|
||||||
} else {
|
|
||||||
$log_data = file_get_contents($log_file);
|
|
||||||
if ($log_data === null) {
|
|
||||||
$this->fail('error msg file not readable or not data: ' . $log_file);
|
|
||||||
}
|
|
||||||
// file content matching
|
|
||||||
$this->assertStringEndsWith(
|
|
||||||
$expected_file,
|
|
||||||
$log_data,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// there should be no file there
|
|
||||||
$this->assertEquals(
|
|
||||||
$log_file,
|
|
||||||
''
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// ** ECHO ON
|
|
||||||
$log_string = $log->printErrorMsg();
|
|
||||||
// * print
|
|
||||||
if (!empty($options['debug_all']) && !empty($options['echo_all'])) {
|
|
||||||
// print $log->printErrorMsg() . "\n";
|
|
||||||
// echo string must start with
|
|
||||||
$this->assertStringStartsWith(
|
|
||||||
$expected_string_start,
|
|
||||||
$log_string
|
|
||||||
);
|
|
||||||
// echo string must containt
|
|
||||||
$this->assertStringContainsString(
|
|
||||||
$expected_string_contains,
|
|
||||||
$log_string
|
|
||||||
);
|
|
||||||
// TODO: as printing directly is not really done anymore tests below are todo
|
|
||||||
// * get error msg (getErrorMsg)
|
|
||||||
// * merge error msg (mergeErrors)
|
|
||||||
// * print merged (printErrorMsg)
|
|
||||||
// * reset A (resetErrorMsg)
|
|
||||||
// * reset ALL (resetErrorMsg)
|
|
||||||
} else {
|
|
||||||
$this->assertEquals(
|
|
||||||
$log_string,
|
|
||||||
''
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: setLogUniqueId/getLogUniqueId
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function logUniqueIdProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'option set' => [
|
|
||||||
'option' => true,
|
|
||||||
'override' => false,
|
|
||||||
],
|
|
||||||
'direct set' => [
|
|
||||||
'option' => false,
|
|
||||||
'override' => false,
|
|
||||||
],
|
|
||||||
'override set' => [
|
|
||||||
'option' => false,
|
|
||||||
'override' => true,
|
|
||||||
],
|
|
||||||
'option and override set' => [
|
|
||||||
'option' => false,
|
|
||||||
'override' => true,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::setLogUniqueId
|
|
||||||
* @covers ::getLogUniqueId
|
|
||||||
* @dataProvider logUniqueIdProvider
|
|
||||||
* @testdox per run log id set test: option: $option, override: $override [$_dataName]
|
|
||||||
*
|
|
||||||
* @param bool $option
|
|
||||||
* @param bool $override
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testLogUniqueId(bool $option, bool $override): void
|
|
||||||
{
|
|
||||||
if ($option === true) {
|
|
||||||
$log = new \CoreLibs\Debug\Logging(['per_run' => $option]);
|
|
||||||
} else {
|
|
||||||
$log = new \CoreLibs\Debug\Logging();
|
|
||||||
$log->setLogUniqueId();
|
|
||||||
}
|
|
||||||
$per_run_id = $log->getLogUniqueId();
|
|
||||||
$this->assertMatchesRegularExpression(
|
|
||||||
"/^\d{4}-\d{2}-\d{2}_\d{6}_U_[a-z0-9]{8}$/",
|
|
||||||
$per_run_id,
|
|
||||||
'assert per log run id 1st'
|
|
||||||
);
|
|
||||||
if ($override === true) {
|
|
||||||
$log->setLogUniqueId(true);
|
|
||||||
$per_run_id_2nd = $log->getLogUniqueId();
|
|
||||||
$this->assertMatchesRegularExpression(
|
|
||||||
"/^\d{4}-\d{2}-\d{2}_\d{6}_U_[a-z0-9]{8}$/",
|
|
||||||
$per_run_id_2nd,
|
|
||||||
'assert per log run id 2nd'
|
|
||||||
);
|
|
||||||
$this->assertNotEquals(
|
|
||||||
$per_run_id,
|
|
||||||
$per_run_id_2nd,
|
|
||||||
'1st and 2nd don\'t match'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// __END__
|
|
||||||
@@ -1,464 +0,0 @@
|
|||||||
<?php // phpcs:disable Generic.Files.LineLength
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace tests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test class for Debug\Support
|
|
||||||
* @coversDefaultClass \CoreLibs\Debug\Support
|
|
||||||
* @testdox \CoreLibs\Debug\Support method tests
|
|
||||||
*/
|
|
||||||
final class CoreLibsDebugSupportTest extends TestCase
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function printTimeProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'default microtime' => [
|
|
||||||
0 => null,
|
|
||||||
1 => "/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{8}$/",
|
|
||||||
],
|
|
||||||
'microtime -1' => [
|
|
||||||
0 => -1,
|
|
||||||
1 => "/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{8}$/",
|
|
||||||
],
|
|
||||||
'microtime 0' => [
|
|
||||||
0 => 0,
|
|
||||||
1 => "/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/",
|
|
||||||
],
|
|
||||||
'microtime 4' => [
|
|
||||||
0 => 4,
|
|
||||||
1 => "/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{4}$/",
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function printArrayProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'empty array' => [
|
|
||||||
0 => [],
|
|
||||||
1 => "<pre>Array\n(\n)\n</pre>"
|
|
||||||
],
|
|
||||||
'simple array' => [
|
|
||||||
0 => ['a', 'b'],
|
|
||||||
1 => "<pre>Array\n(\n"
|
|
||||||
. " [0] => a\n"
|
|
||||||
. " [1] => b\n"
|
|
||||||
. ")\n</pre>"
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function printBoolProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'true input default' => [
|
|
||||||
0 => true,
|
|
||||||
1 => [],
|
|
||||||
2 => 'true'
|
|
||||||
],
|
|
||||||
'false input default' => [
|
|
||||||
0 => false,
|
|
||||||
1 => [],
|
|
||||||
2 => 'false'
|
|
||||||
],
|
|
||||||
'false input param name' => [
|
|
||||||
0 => false,
|
|
||||||
1 => [
|
|
||||||
'name' => 'param test'
|
|
||||||
],
|
|
||||||
2 => '<b>param test</b>: false'
|
|
||||||
],
|
|
||||||
'true input param name, true override' => [
|
|
||||||
0 => true,
|
|
||||||
1 => [
|
|
||||||
'name' => 'param test',
|
|
||||||
'true' => 'ok'
|
|
||||||
],
|
|
||||||
2 => '<b>param test</b>: ok'
|
|
||||||
],
|
|
||||||
'false input param name, true override, false override' => [
|
|
||||||
0 => false,
|
|
||||||
1 => [
|
|
||||||
'name' => 'param test',
|
|
||||||
'true' => 'ok',
|
|
||||||
'false' => 'not',
|
|
||||||
],
|
|
||||||
2 => '<b>param test</b>: not'
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function printToStringProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'string' => [
|
|
||||||
'a string',
|
|
||||||
null,
|
|
||||||
'a string',
|
|
||||||
],
|
|
||||||
'string with html chars, encode' => [
|
|
||||||
'a string with <> &',
|
|
||||||
true,
|
|
||||||
'a string with <> &',
|
|
||||||
],
|
|
||||||
'string with html chars' => [
|
|
||||||
'a string with <> &',
|
|
||||||
null,
|
|
||||||
'a string with <> &',
|
|
||||||
],
|
|
||||||
'a number' => [
|
|
||||||
1234,
|
|
||||||
null,
|
|
||||||
'1234',
|
|
||||||
],
|
|
||||||
'a float number' => [
|
|
||||||
1234.5678,
|
|
||||||
null,
|
|
||||||
'1234.5678',
|
|
||||||
],
|
|
||||||
'bool true' => [
|
|
||||||
true,
|
|
||||||
null,
|
|
||||||
'TRUE',
|
|
||||||
],
|
|
||||||
'bool false' => [
|
|
||||||
false,
|
|
||||||
null,
|
|
||||||
'FALSE',
|
|
||||||
],
|
|
||||||
'an array default' => [
|
|
||||||
['a', 'b'],
|
|
||||||
null,
|
|
||||||
"<pre>Array\n(\n"
|
|
||||||
. " [0] => a\n"
|
|
||||||
. " [1] => b\n"
|
|
||||||
. ")\n</pre>",
|
|
||||||
],
|
|
||||||
'an array, no html' => [
|
|
||||||
['a', 'b'],
|
|
||||||
true,
|
|
||||||
"##HTMLPRE##"
|
|
||||||
. "Array\n(\n"
|
|
||||||
. " [0] => a\n"
|
|
||||||
. " [1] => b\n"
|
|
||||||
. ")\n"
|
|
||||||
. "##/HTMLPRE##",
|
|
||||||
],
|
|
||||||
// resource
|
|
||||||
'a resource' => [
|
|
||||||
tmpfile(),
|
|
||||||
null,
|
|
||||||
'/^Resource id #\d+$/',
|
|
||||||
],
|
|
||||||
// object
|
|
||||||
'an object' => [
|
|
||||||
new \CoreLibs\Debug\Support(),
|
|
||||||
null,
|
|
||||||
'CoreLibs\Debug\Support',
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function debugStringProvider(): array
|
|
||||||
{
|
|
||||||
// 0: input string
|
|
||||||
// 1: replace
|
|
||||||
// 2: html flag
|
|
||||||
// 3: expected
|
|
||||||
return [
|
|
||||||
'null string, default' => [
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
'-'
|
|
||||||
],
|
|
||||||
'empty string, ... replace' => [
|
|
||||||
'',
|
|
||||||
'...',
|
|
||||||
null,
|
|
||||||
'...'
|
|
||||||
],
|
|
||||||
'filled string' => [
|
|
||||||
'some string',
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
'some string'
|
|
||||||
],
|
|
||||||
'string with html chars, encode' => [
|
|
||||||
'a string with <> &',
|
|
||||||
'-',
|
|
||||||
true,
|
|
||||||
'a string with <> &',
|
|
||||||
],
|
|
||||||
'string with html chars' => [
|
|
||||||
'a string with <> &',
|
|
||||||
'-',
|
|
||||||
null,
|
|
||||||
'a string with <> &',
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @cover ::printTime
|
|
||||||
* @dataProvider printTimeProvider
|
|
||||||
* @testdox printTime test with $microtime and match to regex [$_dataName]
|
|
||||||
*
|
|
||||||
* @param int|null $mircrotime
|
|
||||||
* @param string $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testPrintTime(?int $microtime, string $regex): void
|
|
||||||
{
|
|
||||||
if ($microtime === null) {
|
|
||||||
$this->assertMatchesRegularExpression(
|
|
||||||
$regex,
|
|
||||||
\CoreLibs\Debug\Support::printTime()
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$this->assertMatchesRegularExpression(
|
|
||||||
$regex,
|
|
||||||
\CoreLibs\Debug\Support::printTime($microtime)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @cover ::printAr
|
|
||||||
* @cover ::printArray
|
|
||||||
* @dataProvider printArrayProvider
|
|
||||||
* @testdox printAr/printArray $input will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array $input
|
|
||||||
* @param string $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testPrintAr(array $input, string $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Debug\Support::printAr($input),
|
|
||||||
'assert printAr'
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Debug\Support::printArray($input),
|
|
||||||
'assert printArray'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @cover ::printBool
|
|
||||||
* @dataProvider printBoolProvider
|
|
||||||
* @testdox printBool $input will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param bool $input
|
|
||||||
* @param array $params
|
|
||||||
* @param string $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testPrintBool(bool $input, array $params, string $expected): void
|
|
||||||
{
|
|
||||||
if (
|
|
||||||
isset($params['name']) &&
|
|
||||||
isset($params['true']) &&
|
|
||||||
isset($params['false'])
|
|
||||||
) {
|
|
||||||
$string = \CoreLibs\Debug\Support::printBool(
|
|
||||||
$input,
|
|
||||||
$params['name'],
|
|
||||||
$params['true'],
|
|
||||||
$params['false']
|
|
||||||
);
|
|
||||||
} elseif (isset($params['name']) && isset($params['true'])) {
|
|
||||||
$string = \CoreLibs\Debug\Support::printBool(
|
|
||||||
$input,
|
|
||||||
$params['name'],
|
|
||||||
$params['true']
|
|
||||||
);
|
|
||||||
} elseif (isset($params['name'])) {
|
|
||||||
$string = \CoreLibs\Debug\Support::printBool(
|
|
||||||
$input,
|
|
||||||
$params['name']
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$string = \CoreLibs\Debug\Support::printBool($input);
|
|
||||||
}
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
$string,
|
|
||||||
'assert printBool'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @cover ::printToString
|
|
||||||
* @dataProvider printToStringProvider
|
|
||||||
* @testdox printToString $input with $flag will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param mixed $input
|
|
||||||
* @param boolean|null $flag
|
|
||||||
* @param string $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testPrintToString($input, ?bool $flag, string $expected): void
|
|
||||||
{
|
|
||||||
if ($flag === null) {
|
|
||||||
// if expected starts with / and ends with / then this is a regex compare
|
|
||||||
if (substr($expected, 0, 1) == '/' && substr($expected, -1, 1) == '/') {
|
|
||||||
$this->assertMatchesRegularExpression(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Debug\Support::printToString($input)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Debug\Support::printToString($input)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Debug\Support::printToString($input, $flag)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @cover ::getCallerMethod
|
|
||||||
* @testWith ["testGetCallerMethod"]
|
|
||||||
* @testdox getCallerMethod check if it returns $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testGetCallerMethod(string $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Debug\Support::getCallerMethod()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @cover ::getCallerMethodList
|
|
||||||
* @testWith [["main", "run", "run", "run", "run", "run", "run", "runBare", "runTest", "testGetCallerMethodList"],["main", "run", "run", "run", "run", "run", "run", "run", "runBare", "runTest", "testGetCallerMethodList"]]
|
|
||||||
* @testdox getCallerMethodList check if it returns $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testGetCallerMethodList(array $expected, array $expected_group): void
|
|
||||||
{
|
|
||||||
$compare = \CoreLibs\Debug\Support::getCallerMethodList();
|
|
||||||
// if we direct call we have 10, if we call as folder we get 11
|
|
||||||
if (count($compare) == 10) {
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Debug\Support::getCallerMethodList(),
|
|
||||||
'assert expected 10'
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected_group,
|
|
||||||
\CoreLibs\Debug\Support::getCallerMethodList(),
|
|
||||||
'assert expected group'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @cover ::getCallerClass
|
|
||||||
* @testWith ["PHPUnit\\TextUI\\Command"]
|
|
||||||
* @testdox getCallerClass check if it returns $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testGetCallerClass(string $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Debug\Support::getCallerClass()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @cover ::debugString
|
|
||||||
* @dataProvider debugStringProvider
|
|
||||||
* @testdox debugString $input with replace $replace and html $flag will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string|null $input
|
|
||||||
* @param string|null $replace
|
|
||||||
* @param bool|null $flag
|
|
||||||
* @param string $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testDebugString(?string $input, ?string $replace, ?bool $flag, string $expected): void
|
|
||||||
{
|
|
||||||
if ($replace === null && $flag === null) {
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Debug\Support::debugString($input),
|
|
||||||
'assert all default'
|
|
||||||
);
|
|
||||||
} elseif ($flag === null) {
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Debug\Support::debugString($input, $replace),
|
|
||||||
'assert flag default'
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Debug\Support::debugString($input, $replace, $flag),
|
|
||||||
'assert all set'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// __END__
|
|
||||||
@@ -1,310 +0,0 @@
|
|||||||
<?php // phpcs:disable Generic.Files.LineLength
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace tests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test class for Language\GetLocale
|
|
||||||
*
|
|
||||||
* @coversDefaultClass \CoreLibs\Language\GetLocale
|
|
||||||
* @testdox \CoreLibs\Language\GetLocale method tests
|
|
||||||
*/
|
|
||||||
final class CoreLibsLanguageGetLocaleTest extends TestCase
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* set all constant variables that must be set before call
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public static function setUpBeforeClass(): void
|
|
||||||
{
|
|
||||||
// default web page encoding setting
|
|
||||||
if (!defined('DEFAULT_ENCODING')) {
|
|
||||||
define('DEFAULT_ENCODING', 'UTF-8');
|
|
||||||
}
|
|
||||||
if (!defined('DEFAULT_LOCALE')) {
|
|
||||||
// default lang + encoding
|
|
||||||
define('DEFAULT_LOCALE', 'en_US.UTF-8');
|
|
||||||
}
|
|
||||||
// site
|
|
||||||
if (!defined('SITE_ENCODING')) {
|
|
||||||
define('SITE_ENCODING', DEFAULT_ENCODING);
|
|
||||||
}
|
|
||||||
if (!defined('SITE_LOCALE')) {
|
|
||||||
define('SITE_LOCALE', DEFAULT_LOCALE);
|
|
||||||
}
|
|
||||||
// just set
|
|
||||||
if (!defined('BASE')) {
|
|
||||||
define('BASE', str_replace('/configs', '', __DIR__) . DIRECTORY_SEPARATOR);
|
|
||||||
}
|
|
||||||
if (!defined('INCLUDES')) {
|
|
||||||
define('INCLUDES', 'includes' . DIRECTORY_SEPARATOR);
|
|
||||||
}
|
|
||||||
if (!defined('LANG')) {
|
|
||||||
define('LANG', 'lang' . DIRECTORY_SEPARATOR);
|
|
||||||
}
|
|
||||||
if (!defined('LOCALE')) {
|
|
||||||
define('LOCALE', 'locale' . DIRECTORY_SEPARATOR);
|
|
||||||
}
|
|
||||||
if (!defined('CONTENT_PATH')) {
|
|
||||||
define('CONTENT_PATH', 'frontend' . DIRECTORY_SEPARATOR);
|
|
||||||
}
|
|
||||||
// array session
|
|
||||||
$_SESSION = [];
|
|
||||||
global $_SESSION;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* all the test data
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function setLocaleProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
// 0: locale
|
|
||||||
// 1: domain
|
|
||||||
// 2: encoding
|
|
||||||
// 3: path
|
|
||||||
// 4: SESSION: DEFAULT_LOCALE
|
|
||||||
// 5: SESSION: DEFAULT_CHARSET
|
|
||||||
// 6: expected array
|
|
||||||
'no params, all default constants' => [
|
|
||||||
// lang, domain, encoding, path
|
|
||||||
null, null, null, null,
|
|
||||||
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
|
||||||
null, null,
|
|
||||||
// return array
|
|
||||||
[
|
|
||||||
'locale' => 'en_US.UTF-8',
|
|
||||||
'lang' => 'en_US',
|
|
||||||
'domain' => 'frontend',
|
|
||||||
'encoding' => 'UTF-8',
|
|
||||||
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'no params, session charset and lang' => [
|
|
||||||
// lang, domain, encoding, path
|
|
||||||
null, null, null, null,
|
|
||||||
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
|
||||||
'ja_JP', 'UTF-8',
|
|
||||||
// return array
|
|
||||||
[
|
|
||||||
'locale' => 'ja_JP',
|
|
||||||
'lang' => 'ja_JP',
|
|
||||||
'domain' => 'frontend',
|
|
||||||
'encoding' => 'UTF-8',
|
|
||||||
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'no params, session charset and lang short' => [
|
|
||||||
// lang, domain, encoding, path
|
|
||||||
null, null, null, null,
|
|
||||||
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
|
||||||
'ja', 'UTF-8',
|
|
||||||
// return array
|
|
||||||
[
|
|
||||||
'locale' => 'ja',
|
|
||||||
'lang' => 'ja',
|
|
||||||
'domain' => 'frontend',
|
|
||||||
'encoding' => 'UTF-8',
|
|
||||||
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
|
||||||
],
|
|
||||||
],
|
|
||||||
// param lang (no sessions)
|
|
||||||
'locale param only, no sessions' => [
|
|
||||||
// lang, domain, encoding, path
|
|
||||||
'ja.UTF-8', null, null, null,
|
|
||||||
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
|
||||||
null, null,
|
|
||||||
// return array
|
|
||||||
[
|
|
||||||
'locale' => 'ja.UTF-8',
|
|
||||||
'lang' => 'ja',
|
|
||||||
'domain' => 'frontend',
|
|
||||||
'encoding' => 'UTF-8',
|
|
||||||
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
|
||||||
],
|
|
||||||
],
|
|
||||||
// different locale setting
|
|
||||||
'locale complex param only, no sessions' => [
|
|
||||||
// lang, domain, encoding, path
|
|
||||||
'ja_JP.SJIS', null, null, null,
|
|
||||||
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
|
||||||
null, null,
|
|
||||||
// return array
|
|
||||||
[
|
|
||||||
'locale' => 'ja_JP.SJIS',
|
|
||||||
'lang' => 'ja_JP',
|
|
||||||
'domain' => 'frontend',
|
|
||||||
'encoding' => 'SJIS',
|
|
||||||
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
|
||||||
],
|
|
||||||
],
|
|
||||||
// param lang and domain (no override)
|
|
||||||
'locale, domain params, no sessions' => [
|
|
||||||
// lang, domain, encoding, path
|
|
||||||
'ja.UTF-8', 'admin', null, null,
|
|
||||||
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
|
||||||
null, null,
|
|
||||||
// return array
|
|
||||||
[
|
|
||||||
'locale' => 'ja.UTF-8',
|
|
||||||
'lang' => 'ja',
|
|
||||||
'domain' => 'admin',
|
|
||||||
'encoding' => 'UTF-8',
|
|
||||||
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
|
||||||
],
|
|
||||||
],
|
|
||||||
// param lang and domain (no override)
|
|
||||||
'locale, domain, encoding params, no sessions' => [
|
|
||||||
// lang, domain, encoding, path
|
|
||||||
'ja.UTF-8', 'admin', 'UTF-8', null,
|
|
||||||
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
|
||||||
null, null,
|
|
||||||
// return array
|
|
||||||
[
|
|
||||||
'locale' => 'ja.UTF-8',
|
|
||||||
'lang' => 'ja',
|
|
||||||
'domain' => 'admin',
|
|
||||||
'encoding' => 'UTF-8',
|
|
||||||
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
|
||||||
],
|
|
||||||
],
|
|
||||||
// lang, domain, path (no override)
|
|
||||||
'locale, domain and path, no sessions' => [
|
|
||||||
// lang, domain, encoding, path
|
|
||||||
'ja.UTF-8', 'admin', '', __DIR__ . '/locale_other/',
|
|
||||||
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
|
||||||
null, null,
|
|
||||||
// return array
|
|
||||||
[
|
|
||||||
'locale' => 'ja.UTF-8',
|
|
||||||
'lang' => 'ja',
|
|
||||||
'domain' => 'admin',
|
|
||||||
'encoding' => 'UTF-8',
|
|
||||||
'path' => "/^\/(.*\/)?locale_other\/$/",
|
|
||||||
],
|
|
||||||
],
|
|
||||||
// all params set (no override)
|
|
||||||
'all parameter, no sessions' => [
|
|
||||||
// lang, domain, encoding, path
|
|
||||||
'ja', 'admin', 'UTF-8', __DIR__ . '/locale_other/',
|
|
||||||
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
|
||||||
null, null,
|
|
||||||
// return array
|
|
||||||
[
|
|
||||||
'locale' => 'ja',
|
|
||||||
'lang' => 'ja',
|
|
||||||
'domain' => 'admin',
|
|
||||||
'encoding' => 'UTF-8',
|
|
||||||
'path' => "/^\/(.*\/)?locale_other\/$/",
|
|
||||||
],
|
|
||||||
],
|
|
||||||
// param lang and domain (no override)
|
|
||||||
'long locale, domain, encoding params, no sessions' => [
|
|
||||||
// lang, domain, encoding, path
|
|
||||||
'de_CH.UTF-8@euro', 'admin', 'UTF-8', null,
|
|
||||||
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
|
||||||
null, null,
|
|
||||||
// return array
|
|
||||||
[
|
|
||||||
'locale' => 'de_CH.UTF-8@euro',
|
|
||||||
'lang' => 'de_CH',
|
|
||||||
'domain' => 'admin',
|
|
||||||
'encoding' => 'UTF-8',
|
|
||||||
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
|
||||||
],
|
|
||||||
],
|
|
||||||
// TODO invalid params (bad path) (no override)
|
|
||||||
// TODO param calls, but with override set
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::setLocale
|
|
||||||
* @dataProvider setLocaleProvider
|
|
||||||
* @testdox lang settings lang $language, domain $domain, encoding $encoding, path $path; session lang: $SESSION_DEFAULT_LOCALE, session char: $SESSION_DEFAULT_CHARSET [$_dataName]
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testsetLocale(
|
|
||||||
?string $language,
|
|
||||||
?string $domain,
|
|
||||||
?string $encoding,
|
|
||||||
?string $path,
|
|
||||||
?string $SESSION_DEFAULT_LOCALE,
|
|
||||||
?string $SESSION_DEFAULT_CHARSET,
|
|
||||||
array $expected
|
|
||||||
): void {
|
|
||||||
$return_lang_settings = [];
|
|
||||||
global $_SESSION;
|
|
||||||
// set override
|
|
||||||
if ($SESSION_DEFAULT_LOCALE !== null) {
|
|
||||||
$_SESSION['DEFAULT_LOCALE'] = $SESSION_DEFAULT_LOCALE;
|
|
||||||
}
|
|
||||||
if ($SESSION_DEFAULT_CHARSET !== null) {
|
|
||||||
$_SESSION['DEFAULT_CHARSET'] = $SESSION_DEFAULT_CHARSET;
|
|
||||||
}
|
|
||||||
// function call
|
|
||||||
if ($language === null && $domain === null && $encoding === null && $path === null) {
|
|
||||||
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale();
|
|
||||||
} elseif ($language !== null && $domain === null && $encoding === null && $path === null) {
|
|
||||||
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
|
|
||||||
$language
|
|
||||||
);
|
|
||||||
} elseif ($language !== null && $domain !== null && $encoding === null && $path === null) {
|
|
||||||
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
|
|
||||||
$language,
|
|
||||||
$domain
|
|
||||||
);
|
|
||||||
} elseif ($language !== null && $domain !== null && $encoding !== null && $path === null) {
|
|
||||||
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
|
|
||||||
$language,
|
|
||||||
$domain,
|
|
||||||
$encoding
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
|
|
||||||
$language,
|
|
||||||
$domain,
|
|
||||||
$encoding,
|
|
||||||
$path
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// print "RETURN: " . print_r($return_lang_settings, true) . "\n";
|
|
||||||
|
|
||||||
foreach (
|
|
||||||
[
|
|
||||||
'locale', 'lang', 'domain', 'encoding', 'path'
|
|
||||||
] as $key
|
|
||||||
) {
|
|
||||||
$value = $expected[$key];
|
|
||||||
if (strpos($value, "/") === 0) {
|
|
||||||
// this is regex
|
|
||||||
$this->assertMatchesRegularExpression(
|
|
||||||
$value,
|
|
||||||
$return_lang_settings[$key],
|
|
||||||
'assert regex failed for ' . $key
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
// assert equal
|
|
||||||
$this->assertEquals(
|
|
||||||
$value,
|
|
||||||
$return_lang_settings[$key],
|
|
||||||
'assert equal failed for ' . $key
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// unset all vars
|
|
||||||
$_SESSION = [];
|
|
||||||
unset($GLOBALS['OVERRIDE_LANG']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// __END__
|
|
||||||
@@ -22,12 +22,9 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public static function setUpBeforeClass(): void
|
public static function setUpBeforeClass(): void
|
||||||
{
|
{
|
||||||
self::$log = new \CoreLibs\Debug\Logging([
|
self::$log = new \CoreLibs\Logging\Logging([
|
||||||
'log_folder' => DIRECTORY_SEPARATOR . 'tmp',
|
'log_folder' => DIRECTORY_SEPARATOR . 'tmp',
|
||||||
'file_id' => 'CoreLibs-Create-Email-Test',
|
'log_file_id' => 'CoreLibs-Create-Email-Test',
|
||||||
'debug_all' => true,
|
|
||||||
'echo_all' => false,
|
|
||||||
'print_all' => true,
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,36 +38,56 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
// 0: email
|
// 0: email
|
||||||
// 1: name
|
// 1: name
|
||||||
// 2: encoding
|
// 2: encoding
|
||||||
// 3: expected
|
// 3: kv_folding
|
||||||
|
// 4: expected
|
||||||
return [
|
return [
|
||||||
'all empty' => [
|
'all empty' => [
|
||||||
'',
|
'',
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
|
null,
|
||||||
''
|
''
|
||||||
],
|
],
|
||||||
'email only' => [
|
'email only' => [
|
||||||
'test@test.com',
|
'test@test.com',
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
|
null,
|
||||||
'test@test.com'
|
'test@test.com'
|
||||||
],
|
],
|
||||||
'email and name' => [
|
'email and name' => [
|
||||||
'test@test.com',
|
'test@test.com',
|
||||||
'Test Name',
|
'Test Name',
|
||||||
null,
|
null,
|
||||||
|
null,
|
||||||
'"Test Name" <test@test.com>'
|
'"Test Name" <test@test.com>'
|
||||||
],
|
],
|
||||||
'name in mime encoded, default UTF-8' => [
|
'name in mime encoded, default UTF-8' => [
|
||||||
'test@test.com',
|
'test@test.com',
|
||||||
'日本語',
|
'日本語',
|
||||||
null,
|
null,
|
||||||
|
null,
|
||||||
'"=?UTF-8?B?5pel5pys6Kqe?=" <test@test.com>'
|
'"=?UTF-8?B?5pel5pys6Kqe?=" <test@test.com>'
|
||||||
],
|
],
|
||||||
|
'name in mime encoded with half width Katakana, default UTF-8' => [
|
||||||
|
'test@test.com',
|
||||||
|
'日本語カタカナパ',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'"=?UTF-8?B?5pel5pys6Kqe7722776A7722776F776K776f?=" <test@test.com>'
|
||||||
|
],
|
||||||
|
'name in mime encoded with half width Katakana, folding on, default UTF-8' => [
|
||||||
|
'test@test.com',
|
||||||
|
'日本語カタカナパ',
|
||||||
|
'UTF-8',
|
||||||
|
true,
|
||||||
|
'"=?UTF-8?B?5pel5pys6Kqe44Kr44K/44Kr44OK44OR?=" <test@test.com>'
|
||||||
|
],
|
||||||
'name in mime encoded, UTF-8 parameter' => [
|
'name in mime encoded, UTF-8 parameter' => [
|
||||||
'test@test.com',
|
'test@test.com',
|
||||||
'日本語',
|
'日本語',
|
||||||
'UTF-8',
|
'UTF-8',
|
||||||
|
null,
|
||||||
'"=?UTF-8?B?5pel5pys6Kqe?=" <test@test.com>'
|
'"=?UTF-8?B?5pel5pys6Kqe?=" <test@test.com>'
|
||||||
],
|
],
|
||||||
// does internal UTF-8 to ISO-2022-JP convert
|
// does internal UTF-8 to ISO-2022-JP convert
|
||||||
@@ -78,7 +95,25 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
'test@test.com',
|
'test@test.com',
|
||||||
'日本語',
|
'日本語',
|
||||||
'ISO-2022-JP',
|
'ISO-2022-JP',
|
||||||
'"=?ISO-2022-JP?B?GyRCRnxLXA==?=" <test@test.com>'
|
null,
|
||||||
|
'"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?=" <test@test.com>'
|
||||||
|
],
|
||||||
|
'encoding with half width Katakana in ISO-2022-JP' => [
|
||||||
|
'test@test.com',
|
||||||
|
'日本語カタカナパ',
|
||||||
|
'ISO-2022-JP',
|
||||||
|
null,
|
||||||
|
'"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhCPz8/Pz8/?=" <test@test.com>'
|
||||||
|
],
|
||||||
|
'encoding with half width Katakana, folding on in ISO-2022-JP' => [
|
||||||
|
'test@test.com',
|
||||||
|
'日本語カタカナパ',
|
||||||
|
'ISO-2022-JP',
|
||||||
|
true,
|
||||||
|
// was ok php 8.1
|
||||||
|
// '"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhCPz8/Pz8=?=" <test@test.com>'
|
||||||
|
// below ok php 8.1.12, 2022/12/9
|
||||||
|
'"=?ISO-2022-JP?B?GyRCRnxLXDhsGyhCPz8/Pz8/?=" <test@test.com>'
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -87,22 +122,30 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @dataProvider encodeEmailNameProvider
|
* @dataProvider encodeEmailNameProvider
|
||||||
* @testdox encode email $email, name $name, encoding $encoding will be $expected [$_dataName]
|
* @testdox encode email $email, name $name, encoding $encoding, folding $kv_folding will be $expected [$_dataName]
|
||||||
*
|
*
|
||||||
|
* @param string $email
|
||||||
|
* @param string|null $name
|
||||||
|
* @param string|null $encoding
|
||||||
|
* @param bool|null $kv_folding
|
||||||
|
* @param string $expected
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testEncodeEmailName(
|
public function testEncodeEmailName(
|
||||||
string $email,
|
string $email,
|
||||||
?string $name,
|
?string $name,
|
||||||
?string $encoding,
|
?string $encoding,
|
||||||
|
?bool $kv_folding,
|
||||||
string $expected
|
string $expected
|
||||||
): void {
|
): void {
|
||||||
if ($name === null && $encoding === null) {
|
if ($name === null && $encoding === null && $kv_folding === null) {
|
||||||
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email);
|
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email);
|
||||||
} elseif ($encoding === null) {
|
} elseif ($encoding === null && $kv_folding === null) {
|
||||||
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name);
|
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name);
|
||||||
} else {
|
} elseif ($kv_folding === null) {
|
||||||
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name, $encoding);
|
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name, $encoding);
|
||||||
|
} else {
|
||||||
|
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name, $encoding, $kv_folding);
|
||||||
}
|
}
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$expected,
|
$expected,
|
||||||
@@ -119,6 +162,7 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
// 4: array for to email
|
// 4: array for to email
|
||||||
// 5: replace content ([]/null)
|
// 5: replace content ([]/null)
|
||||||
// 6: encoding (UTF-8/null)
|
// 6: encoding (UTF-8/null)
|
||||||
|
// 7: kv_folding
|
||||||
// 8: return status
|
// 8: return status
|
||||||
// 9: expected content
|
// 9: expected content
|
||||||
return [
|
return [
|
||||||
@@ -130,6 +174,7 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
'to_email' => [],
|
'to_email' => [],
|
||||||
'replace' => null,
|
'replace' => null,
|
||||||
'encoding' => null,
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
'expected_status' => -1,
|
'expected_status' => -1,
|
||||||
'expected_content' => [],
|
'expected_content' => [],
|
||||||
],
|
],
|
||||||
@@ -141,9 +186,22 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
'to_email' => [],
|
'to_email' => [],
|
||||||
'replace' => null,
|
'replace' => null,
|
||||||
'encoding' => null,
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
'expected_status' => -2,
|
'expected_status' => -2,
|
||||||
'expected_content' => [],
|
'expected_content' => [],
|
||||||
],
|
],
|
||||||
|
'bad encoding, fail -3' => [
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => ['to@test.com'],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => 'IDONTEXISTENCODING',
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => -3,
|
||||||
|
'expected_content' => [],
|
||||||
|
],
|
||||||
'sending email 1' => [
|
'sending email 1' => [
|
||||||
'subject' => 'SUBJECT',
|
'subject' => 'SUBJECT',
|
||||||
'body' => 'BODY',
|
'body' => 'BODY',
|
||||||
@@ -154,6 +212,7 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
],
|
],
|
||||||
'replace' => null,
|
'replace' => null,
|
||||||
'encoding' => null,
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
'expected_status' => 2,
|
'expected_status' => 2,
|
||||||
'expected_content' => [
|
'expected_content' => [
|
||||||
[
|
[
|
||||||
@@ -176,6 +235,7 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
],
|
],
|
||||||
'replace' => null,
|
'replace' => null,
|
||||||
'encoding' => null,
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
'expected_status' => 2,
|
'expected_status' => 2,
|
||||||
'expected_content' => [
|
'expected_content' => [
|
||||||
[
|
[
|
||||||
@@ -188,6 +248,52 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
]
|
]
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
|
'sending email 1, encoded, with half width katakanata' => [
|
||||||
|
'subject' => 'SUBJECT 日本語カタカナパ',
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6Kqe7722776A7722776F776K776f?=',
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1, encoded, with half width katakanata, folding on' => [
|
||||||
|
'subject' => 'SUBJECT 日本語カタカナパ',
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'kv_folding' => true,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6Kqe44Kr44K/44Kr44OK44OR?=',
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
'sending email 1, encoded subject ISO-2022-JP' => [
|
'sending email 1, encoded subject ISO-2022-JP' => [
|
||||||
'subject' => 'SUBJECT 日本語',
|
'subject' => 'SUBJECT 日本語',
|
||||||
'body' => 'BODY 日本語',
|
'body' => 'BODY 日本語',
|
||||||
@@ -198,6 +304,7 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
],
|
],
|
||||||
'replace' => null,
|
'replace' => null,
|
||||||
'encoding' => 'ISO-2022-JP',
|
'encoding' => 'ISO-2022-JP',
|
||||||
|
'kv_folding' => null,
|
||||||
'expected_status' => 2,
|
'expected_status' => 2,
|
||||||
'expected_content' => [
|
'expected_content' => [
|
||||||
[
|
[
|
||||||
@@ -222,6 +329,7 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
],
|
],
|
||||||
'replace' => null,
|
'replace' => null,
|
||||||
'encoding' => null,
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
'expected_status' => 2,
|
'expected_status' => 2,
|
||||||
'expected_content' => [
|
'expected_content' => [
|
||||||
[
|
[
|
||||||
@@ -255,6 +363,7 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
'VAR' => 'bar',
|
'VAR' => 'bar',
|
||||||
],
|
],
|
||||||
'encoding' => null,
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
'expected_status' => 2,
|
'expected_status' => 2,
|
||||||
'expected_content' => [
|
'expected_content' => [
|
||||||
[
|
[
|
||||||
@@ -280,6 +389,7 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
'VAR' => 'bar',
|
'VAR' => 'bar',
|
||||||
],
|
],
|
||||||
'encoding' => null,
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
'expected_status' => 2,
|
'expected_status' => 2,
|
||||||
'expected_content' => [
|
'expected_content' => [
|
||||||
[
|
[
|
||||||
@@ -310,6 +420,7 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
'VAR' => 'bar',
|
'VAR' => 'bar',
|
||||||
],
|
],
|
||||||
'encoding' => null,
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
'expected_status' => 2,
|
'expected_status' => 2,
|
||||||
'expected_content' => [
|
'expected_content' => [
|
||||||
[
|
[
|
||||||
@@ -340,6 +451,7 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
'VAR' => 'bar',
|
'VAR' => 'bar',
|
||||||
],
|
],
|
||||||
'encoding' => null,
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
'expected_status' => 2,
|
'expected_status' => 2,
|
||||||
'expected_content' => [
|
'expected_content' => [
|
||||||
[
|
[
|
||||||
@@ -379,6 +491,7 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
'VAR' => 'bar',
|
'VAR' => 'bar',
|
||||||
],
|
],
|
||||||
'encoding' => null,
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
'expected_status' => 2,
|
'expected_status' => 2,
|
||||||
'expected_content' => [
|
'expected_content' => [
|
||||||
[
|
[
|
||||||
@@ -434,6 +547,7 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
'VAR' => 'bar',
|
'VAR' => 'bar',
|
||||||
],
|
],
|
||||||
'encoding' => null,
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
'expected_status' => 2,
|
'expected_status' => 2,
|
||||||
'expected_content' => [
|
'expected_content' => [
|
||||||
[
|
[
|
||||||
@@ -478,6 +592,7 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
* @param array $to_email
|
* @param array $to_email
|
||||||
* @param array|null $replace
|
* @param array|null $replace
|
||||||
* @param string|null $encoding
|
* @param string|null $encoding
|
||||||
|
* @param bool|null $kv_folding
|
||||||
* @param int $expected_status
|
* @param int $expected_status
|
||||||
* @param array $expected_content
|
* @param array $expected_content
|
||||||
* @return void
|
* @return void
|
||||||
@@ -490,6 +605,7 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
array $to_email,
|
array $to_email,
|
||||||
?array $replace,
|
?array $replace,
|
||||||
?string $encoding,
|
?string $encoding,
|
||||||
|
?bool $kv_folding,
|
||||||
int $expected_status,
|
int $expected_status,
|
||||||
array $expected_content
|
array $expected_content
|
||||||
): void {
|
): void {
|
||||||
@@ -499,10 +615,13 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
if ($encoding === null) {
|
if ($encoding === null) {
|
||||||
$encoding = 'UTF-8';
|
$encoding = 'UTF-8';
|
||||||
}
|
}
|
||||||
|
if ($kv_folding === null) {
|
||||||
|
$kv_folding = false;
|
||||||
|
}
|
||||||
// force new set for each run
|
// force new set for each run
|
||||||
self::$log->setLogUniqueId(true);
|
self::$log->setLogUniqueId(true);
|
||||||
// set on of unique log id
|
// set on of unique log id
|
||||||
self::$log->setLogPer('run', true);
|
self::$log->setLogFlag(\CoreLibs\Logging\Logger\Flag::per_run);
|
||||||
// init logger
|
// init logger
|
||||||
$status = \CoreLibs\Create\Email::sendEmail(
|
$status = \CoreLibs\Create\Email::sendEmail(
|
||||||
$subject,
|
$subject,
|
||||||
@@ -512,6 +631,7 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
$to_email,
|
$to_email,
|
||||||
$replace,
|
$replace,
|
||||||
$encoding,
|
$encoding,
|
||||||
|
$kv_folding,
|
||||||
true,
|
true,
|
||||||
self::$log
|
self::$log
|
||||||
);
|
);
|
||||||
@@ -523,7 +643,9 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
// assert content: must load JSON from log file
|
// assert content: must load JSON from log file
|
||||||
if ($status == 2) {
|
if ($status == 2) {
|
||||||
// open file, get last entry with 'SEND EMAIL JSON' key
|
// open file, get last entry with 'SEND EMAIL JSON' key
|
||||||
$file = file_get_contents(self::$log->getLogFileName());
|
$file = file_get_contents(
|
||||||
|
self::$log->getLogFolder() . self::$log->getLogFile()
|
||||||
|
);
|
||||||
if ($file !== false) {
|
if ($file !== false) {
|
||||||
// extract SEND EMAIL JSON line
|
// extract SEND EMAIL JSON line
|
||||||
$found = preg_match_all("/^.* <SEND EMAIL JSON> - (.*)$/m", $file, $matches);
|
$found = preg_match_all("/^.* <SEND EMAIL JSON> - (.*)$/m", $file, $matches);
|
||||||
@@ -567,12 +689,6 @@ final class CoreLibsCreateEmailTest extends TestCase
|
|||||||
$email['body'] ?? '',
|
$email['body'] ?? '',
|
||||||
'Email check: assert body'
|
'Email check: assert body'
|
||||||
);
|
);
|
||||||
/*
|
|
||||||
[header] [From] => test@test.com
|
|
||||||
[to] => test@test.com
|
|
||||||
[subject] => SUBJECT
|
|
||||||
[body] => BODY
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -181,7 +181,7 @@ final class CoreLibsCreateSessionTest extends TestCase
|
|||||||
string $type,
|
string $type,
|
||||||
array $mock_data,
|
array $mock_data,
|
||||||
string $expected,
|
string $expected,
|
||||||
string $expected_error,
|
string $expected_error
|
||||||
): void {
|
): void {
|
||||||
// override expected
|
// override expected
|
||||||
if ($type == 'd') {
|
if ($type == 'd') {
|
||||||
225
4dev/tests/Create/CoreLibsCreateUidsTest.php
Normal file
225
4dev/tests/Create/CoreLibsCreateUidsTest.php
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Create\Uids
|
||||||
|
* @coversDefaultClass \CoreLibs\Create\Uids
|
||||||
|
* @testdox \CoreLibs\Create\Uids method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsCreateUidsTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function uniqIdProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// number length
|
||||||
|
'too short' => [
|
||||||
|
0 => 1,
|
||||||
|
1 => 4,
|
||||||
|
2 => null
|
||||||
|
],
|
||||||
|
'valid length: 10' => [
|
||||||
|
0 => 10,
|
||||||
|
1 => 10,
|
||||||
|
2 => null
|
||||||
|
],
|
||||||
|
'valid length: 9, auto length' => [
|
||||||
|
0 => 9,
|
||||||
|
1 => 8,
|
||||||
|
2 => null
|
||||||
|
],
|
||||||
|
'valid length: 9, force length' => [
|
||||||
|
0 => 9,
|
||||||
|
1 => 9,
|
||||||
|
2 => true,
|
||||||
|
],
|
||||||
|
'very long: 512' => [
|
||||||
|
0 => 512,
|
||||||
|
1 => 512,
|
||||||
|
2 => null
|
||||||
|
],
|
||||||
|
// below is all legacy
|
||||||
|
'md5 hash' => [
|
||||||
|
0 => 'md5',
|
||||||
|
1 => 32,
|
||||||
|
2 => null
|
||||||
|
],
|
||||||
|
'sha256 hash' => [
|
||||||
|
0 => 'sha256',
|
||||||
|
1 => 64,
|
||||||
|
2 => null
|
||||||
|
],
|
||||||
|
'ripemd160 hash' => [
|
||||||
|
0 => 'ripemd160',
|
||||||
|
1 => 40,
|
||||||
|
2 => null
|
||||||
|
],
|
||||||
|
'adler32 hash' => [
|
||||||
|
0 => 'adler32',
|
||||||
|
1 => 8,
|
||||||
|
2 => null
|
||||||
|
],
|
||||||
|
'not in list, set default length' => [
|
||||||
|
0 => 'sha3-512',
|
||||||
|
1 => 64,
|
||||||
|
2 => null
|
||||||
|
],
|
||||||
|
'default hash not set' => [
|
||||||
|
0 => null,
|
||||||
|
1 => 64,
|
||||||
|
2 => null
|
||||||
|
],
|
||||||
|
'invalid name' => [
|
||||||
|
0 => 'iamnotavalidhash',
|
||||||
|
1 => 64,
|
||||||
|
2 => null
|
||||||
|
],
|
||||||
|
// auto calls
|
||||||
|
'auto: ' . \CoreLibs\Create\Uids::DEFAULT_UNNIQ_ID_LENGTH => [
|
||||||
|
0 => \CoreLibs\Create\Uids::DEFAULT_UNNIQ_ID_LENGTH,
|
||||||
|
1 => 64,
|
||||||
|
2 => null
|
||||||
|
],
|
||||||
|
'auto: ' . \CoreLibs\Create\Uids::STANDARD_HASH_LONG => [
|
||||||
|
0 => \CoreLibs\Create\Uids::STANDARD_HASH_LONG,
|
||||||
|
1 => strlen(hash(\CoreLibs\Create\Uids::STANDARD_HASH_LONG, 'A')),
|
||||||
|
2 => null
|
||||||
|
],
|
||||||
|
'auto: ' . \CoreLibs\Create\Uids::STANDARD_HASH_SHORT => [
|
||||||
|
0 => \CoreLibs\Create\Uids::STANDARD_HASH_SHORT,
|
||||||
|
1 => strlen(hash(\CoreLibs\Create\Uids::STANDARD_HASH_SHORT, 'A')),
|
||||||
|
2 => null
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function uniqIdLongProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'uniq id long: ' . \CoreLibs\Create\Uids::STANDARD_HASH_LONG => [
|
||||||
|
strlen(hash(\CoreLibs\Create\Uids::STANDARD_HASH_LONG, 'A'))
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* must match 7e78fe0d-59b8-4637-af7f-e88d221a7d1e
|
||||||
|
*
|
||||||
|
* @covers ::uuidv4
|
||||||
|
* @testdox uuidv4 check that return is matching regex [$_dataName]
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testUuidv4(): void
|
||||||
|
{
|
||||||
|
$uuid = \CoreLibs\Create\Uids::uuidv4();
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
'/^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$/',
|
||||||
|
$uuid
|
||||||
|
);
|
||||||
|
// $this->assertStringMatchesFormat(
|
||||||
|
// '%4s%4s-%4s-%4s-%4s-%4s%4s%4s',
|
||||||
|
// $uuid
|
||||||
|
// );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::uniqId
|
||||||
|
* @dataProvider uniqIdProvider
|
||||||
|
* @testdox uniqId $input will be length $expected (Force $flag) [$_dataName]
|
||||||
|
*
|
||||||
|
* @param int|string|null $input
|
||||||
|
* @param string $expected
|
||||||
|
* @param bool|null $flag
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testUniqId(int|string|null $input, int $expected, ?bool $flag): void
|
||||||
|
{
|
||||||
|
if ($input === null) {
|
||||||
|
$uniq_id_length = strlen(\CoreLibs\Create\Uids::uniqId());
|
||||||
|
} elseif ($flag === null) {
|
||||||
|
$uniq_id_length = strlen(\CoreLibs\Create\Uids::uniqId($input));
|
||||||
|
} else {
|
||||||
|
$uniq_id_length = strlen(\CoreLibs\Create\Uids::uniqId($input, $flag));
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$uniq_id_length
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Because we set a constant here, we can only run one test
|
||||||
|
* so we test invalid one to force check
|
||||||
|
*
|
||||||
|
* @covers ::uniqId
|
||||||
|
* @#dataProvider uniqIdProvider
|
||||||
|
* @testWith ["invalidhash", 64]
|
||||||
|
* @testdox uniqId use DEFAULT_HASH set $input with length $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testUnidIdDefaultHash(string $input, int $expected): void
|
||||||
|
{
|
||||||
|
define('DEFAULT_HASH', $input);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
strlen(\CoreLibs\Create\Uids::uniqId())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Short id, always 8 in length
|
||||||
|
*
|
||||||
|
* @covers ::uniqIdShort
|
||||||
|
* @testWith [8]
|
||||||
|
* @testdox uniqIdShort will be length $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param integer $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testUniqIdShort(int $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
strlen(\CoreLibs\Create\Uids::uniqIdShort())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Long Id, length can change
|
||||||
|
*
|
||||||
|
* @covers ::uniqIdLong
|
||||||
|
* @dataProvider uniqIdLongProvider
|
||||||
|
* @testdox uniqIdLong will be length $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param integer $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testUniqIdLong(int $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
strlen(\CoreLibs\Create\Uids::uniqIdLong())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
5209
4dev/tests/DB/CoreLibsDBIOTest.php
Normal file
5209
4dev/tests/DB/CoreLibsDBIOTest.php
Normal file
File diff suppressed because it is too large
Load Diff
1085
4dev/tests/Debug/CoreLibsDebugLoggingLegacyTest.php
Normal file
1085
4dev/tests/Debug/CoreLibsDebugLoggingLegacyTest.php
Normal file
File diff suppressed because it is too large
Load Diff
663
4dev/tests/Debug/CoreLibsDebugSupportTest.php
Normal file
663
4dev/tests/Debug/CoreLibsDebugSupportTest.php
Normal file
@@ -0,0 +1,663 @@
|
|||||||
|
<?php // phpcs:disable Generic.Files.LineLength
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use CoreLibs\Debug\Support;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Debug\Support
|
||||||
|
* @coversDefaultClass \CoreLibs\Debug\Support
|
||||||
|
* @testdox \CoreLibs\Debug\Support method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsDebugSupportTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function printTimeProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'default microtime' => [
|
||||||
|
0 => null,
|
||||||
|
1 => "/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{8}$/",
|
||||||
|
],
|
||||||
|
'microtime -1' => [
|
||||||
|
0 => -1,
|
||||||
|
1 => "/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{8}$/",
|
||||||
|
],
|
||||||
|
'microtime 0' => [
|
||||||
|
0 => 0,
|
||||||
|
1 => "/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/",
|
||||||
|
],
|
||||||
|
'microtime 4' => [
|
||||||
|
0 => 4,
|
||||||
|
1 => "/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{4}$/",
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::printTime
|
||||||
|
* @dataProvider printTimeProvider
|
||||||
|
* @testdox printTime test with $microtime and match to regex [$_dataName]
|
||||||
|
*
|
||||||
|
* @param int|null $mircrotime
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testPrintTime(?int $microtime, string $regex): void
|
||||||
|
{
|
||||||
|
if ($microtime === null) {
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$regex,
|
||||||
|
Support::printTime()
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$regex,
|
||||||
|
Support::printTime($microtime)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function printArrayProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'empty array' => [
|
||||||
|
0 => [],
|
||||||
|
1 => "<pre>Array\n(\n)\n</pre>",
|
||||||
|
2 => "Array\n(\n)\n",
|
||||||
|
],
|
||||||
|
'simple array' => [
|
||||||
|
0 => ['a', 'b'],
|
||||||
|
1 => "<pre>Array\n(\n"
|
||||||
|
. " [0] => a\n"
|
||||||
|
. " [1] => b\n"
|
||||||
|
. ")\n</pre>",
|
||||||
|
2 => "Array\n(\n"
|
||||||
|
. " [0] => a\n"
|
||||||
|
. " [1] => b\n"
|
||||||
|
. ")\n",
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::printAr
|
||||||
|
* @cover ::printArray
|
||||||
|
* @dataProvider printArrayProvider
|
||||||
|
* @testdox printAr/printArray $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param array $input
|
||||||
|
* @param string $expected
|
||||||
|
* @param string $expected_strip
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testPrintAr(array $input, string $expected, string $expected_strip): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::printAr($input),
|
||||||
|
'assert printAr'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::printArray($input),
|
||||||
|
'assert printArray'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_strip,
|
||||||
|
Support::prAr($input),
|
||||||
|
'assert prAr'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function printBoolProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'true input default' => [
|
||||||
|
0 => true,
|
||||||
|
1 => [],
|
||||||
|
2 => 'true',
|
||||||
|
3 => 'true',
|
||||||
|
],
|
||||||
|
'false input default' => [
|
||||||
|
0 => false,
|
||||||
|
1 => [],
|
||||||
|
2 => 'false',
|
||||||
|
3 => 'false'
|
||||||
|
],
|
||||||
|
'false input param name' => [
|
||||||
|
0 => false,
|
||||||
|
1 => [
|
||||||
|
'name' => 'param test'
|
||||||
|
],
|
||||||
|
2 => '<b>param test</b>: false',
|
||||||
|
3 => 'false'
|
||||||
|
],
|
||||||
|
'true input param name, true override' => [
|
||||||
|
0 => true,
|
||||||
|
1 => [
|
||||||
|
'name' => 'param test',
|
||||||
|
'true' => 'ok',
|
||||||
|
],
|
||||||
|
2 => '<b>param test</b>: ok',
|
||||||
|
3 => 'ok',
|
||||||
|
],
|
||||||
|
'false input param name, true override, false override' => [
|
||||||
|
0 => false,
|
||||||
|
1 => [
|
||||||
|
'name' => 'param test',
|
||||||
|
'true' => 'ok',
|
||||||
|
'false' => 'not',
|
||||||
|
],
|
||||||
|
2 => '<b>param test</b>: not',
|
||||||
|
3 => 'not'
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::printBool
|
||||||
|
* @dataProvider printBoolProvider
|
||||||
|
* @testdox printBool $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param bool $input
|
||||||
|
* @param array $params
|
||||||
|
* @param string $expected
|
||||||
|
* @param string $expected_strip
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testPrintBool(bool $input, array $params, string $expected, string $expected_strip): void
|
||||||
|
{
|
||||||
|
if (
|
||||||
|
isset($params['name']) &&
|
||||||
|
isset($params['true']) &&
|
||||||
|
isset($params['false'])
|
||||||
|
) {
|
||||||
|
$string = Support::printBool(
|
||||||
|
$input,
|
||||||
|
$params['name'],
|
||||||
|
$params['true'],
|
||||||
|
$params['false']
|
||||||
|
);
|
||||||
|
$string_strip = Support::prBl(
|
||||||
|
$input,
|
||||||
|
$params['true'],
|
||||||
|
$params['false']
|
||||||
|
);
|
||||||
|
} elseif (isset($params['name']) && isset($params['true'])) {
|
||||||
|
$string = Support::printBool(
|
||||||
|
$input,
|
||||||
|
$params['name'],
|
||||||
|
$params['true']
|
||||||
|
);
|
||||||
|
$string_strip = Support::prBl(
|
||||||
|
$input,
|
||||||
|
$params['true'],
|
||||||
|
);
|
||||||
|
} elseif (isset($params['name'])) {
|
||||||
|
$string = Support::printBool(
|
||||||
|
$input,
|
||||||
|
$params['name']
|
||||||
|
);
|
||||||
|
$string_strip = Support::prBl(
|
||||||
|
$input
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$string = Support::printBool($input);
|
||||||
|
$string_strip = Support::prBl($input);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$string,
|
||||||
|
'assert printBool'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_strip,
|
||||||
|
$string_strip,
|
||||||
|
'assert prBl'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function printToStringProvider(): array
|
||||||
|
{
|
||||||
|
// 0: unput
|
||||||
|
// 1: html flag (only for strings and arry)
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'null' => [
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'NULL',
|
||||||
|
],
|
||||||
|
'string' => [
|
||||||
|
'a string',
|
||||||
|
null,
|
||||||
|
'a string',
|
||||||
|
],
|
||||||
|
'string with html chars, encode' => [
|
||||||
|
'a string with <> &',
|
||||||
|
true,
|
||||||
|
'a string with <> &',
|
||||||
|
],
|
||||||
|
'string with html chars' => [
|
||||||
|
'a string with <> &',
|
||||||
|
null,
|
||||||
|
'a string with <> &',
|
||||||
|
],
|
||||||
|
'a number' => [
|
||||||
|
1234,
|
||||||
|
null,
|
||||||
|
'1234',
|
||||||
|
],
|
||||||
|
'a float number' => [
|
||||||
|
1234.5678,
|
||||||
|
null,
|
||||||
|
'1234.5678',
|
||||||
|
],
|
||||||
|
'bool true' => [
|
||||||
|
true,
|
||||||
|
null,
|
||||||
|
'TRUE',
|
||||||
|
],
|
||||||
|
'bool false' => [
|
||||||
|
false,
|
||||||
|
null,
|
||||||
|
'FALSE',
|
||||||
|
],
|
||||||
|
'an array default' => [
|
||||||
|
['a', 'b'],
|
||||||
|
null,
|
||||||
|
"<pre>Array\n(\n"
|
||||||
|
. " [0] => a\n"
|
||||||
|
. " [1] => b\n"
|
||||||
|
. ")\n</pre>",
|
||||||
|
],
|
||||||
|
'an array, no html' => [
|
||||||
|
['a', 'b'],
|
||||||
|
true,
|
||||||
|
"Array\n(\n"
|
||||||
|
. " [0] => a\n"
|
||||||
|
. " [1] => b\n"
|
||||||
|
. ")\n",
|
||||||
|
],
|
||||||
|
// resource
|
||||||
|
'a resource' => [
|
||||||
|
tmpfile(),
|
||||||
|
null,
|
||||||
|
'/^Resource id #\d+$/',
|
||||||
|
],
|
||||||
|
// object
|
||||||
|
'an object' => [
|
||||||
|
new \CoreLibs\Debug\Support(),
|
||||||
|
null,
|
||||||
|
'CoreLibs\Debug\Support',
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::printToString
|
||||||
|
* @dataProvider printToStringProvider
|
||||||
|
* @testdox printToString $input with $flag will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input anything
|
||||||
|
* @param boolean|null $flag html flag, only for string and array
|
||||||
|
* @param string $expected always string
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testPrintToString(mixed $input, ?bool $flag, string $expected): void
|
||||||
|
{
|
||||||
|
if ($flag === null) {
|
||||||
|
// if expected starts with / and ends with / then this is a regex compare
|
||||||
|
if (
|
||||||
|
substr($expected, 0, 1) == '/' &&
|
||||||
|
substr($expected, -1, 1) == '/'
|
||||||
|
) {
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$expected,
|
||||||
|
Support::printToString($input)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::printToString($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::printToString($input, $flag)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function providerDumpExportVar(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'string' => [
|
||||||
|
'input' => 'string',
|
||||||
|
'flag' => null,
|
||||||
|
'expected_dump' => 'string(6) "string"' . "\n",
|
||||||
|
'expected_export' => "<pre>'string'</pre>",
|
||||||
|
],
|
||||||
|
'string, no html' => [
|
||||||
|
'input' => 'string',
|
||||||
|
'flag' => true,
|
||||||
|
'expected_dump' => 'string(6) "string"' . "\n",
|
||||||
|
'expected_export' => "'string'",
|
||||||
|
],
|
||||||
|
// int
|
||||||
|
'int' => [
|
||||||
|
'input' => 6,
|
||||||
|
'flag' => null,
|
||||||
|
'expected_dump' => 'int(6)' . "\n",
|
||||||
|
'expected_export' => "<pre>6</pre>",
|
||||||
|
],
|
||||||
|
// float
|
||||||
|
'float' => [
|
||||||
|
'input' => 1.6,
|
||||||
|
'flag' => null,
|
||||||
|
'expected_dump' => 'float(1.6)' . "\n",
|
||||||
|
'expected_export' => "<pre>1.6</pre>",
|
||||||
|
],
|
||||||
|
// bool
|
||||||
|
'bool' => [
|
||||||
|
'input' => true,
|
||||||
|
'flag' => null,
|
||||||
|
'expected_dump' => 'bool(true)' . "\n",
|
||||||
|
'expected_export' => "<pre>true</pre>",
|
||||||
|
],
|
||||||
|
// array
|
||||||
|
'array' => [
|
||||||
|
'input' => ['string', true],
|
||||||
|
'flag' => null,
|
||||||
|
'expected_dump' => "array(2) {\n"
|
||||||
|
. " [0]=>\n"
|
||||||
|
. " string(6) \"string\"\n"
|
||||||
|
. " [1]=>\n"
|
||||||
|
. " bool(true)\n"
|
||||||
|
. "}\n",
|
||||||
|
'expected_export' => "<pre>array (\n"
|
||||||
|
. " 0 => 'string',\n"
|
||||||
|
. " 1 => true,\n"
|
||||||
|
. ")</pre>",
|
||||||
|
],
|
||||||
|
// more
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::dumpVar
|
||||||
|
* @cover ::exportVar
|
||||||
|
* @dataProvider providerDumpExportVar
|
||||||
|
* @testdox dump/exportVar $input with $flag will be $expected_dump / $expected_export [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param bool|null $flag
|
||||||
|
* @param string $expected_dump
|
||||||
|
* @param string $expected_export
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testDumpExportVar(mixed $input, ?bool $flag, string $expected_dump, string $expected_export): void
|
||||||
|
{
|
||||||
|
if ($flag === null) {
|
||||||
|
$dump = Support::dumpVar($input);
|
||||||
|
$export = Support::exportVar($input);
|
||||||
|
} else {
|
||||||
|
$dump = Support::dumpVar($input, $flag);
|
||||||
|
$export = Support::exportVar($input, $flag);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_dump,
|
||||||
|
$dump,
|
||||||
|
'assert dumpVar'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_export,
|
||||||
|
$export,
|
||||||
|
'assert dumpVar'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::getCallerFileLine
|
||||||
|
* @testWith ["vendor/phpunit/phpunit/src/Framework/TestCase.php:"]
|
||||||
|
* @testdox getCallerFileLine check based on regex /[\w\-\/]/vendor/phpunit/phpunit/src/Framework/TestCase.php:\d+ [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetCallerFileLine(): void
|
||||||
|
{
|
||||||
|
// regex prefix with path "/../" and then fixed vendor + \d+
|
||||||
|
$regex = "/^\/[\w\-\/]+\/vendor\/phpunit\/phpunit\/src\/Framework\/TestCase.php:\d+$/";
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$regex,
|
||||||
|
Support::getCallerFileLine()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::getCallerMethod
|
||||||
|
* @testWith ["testGetCallerMethod"]
|
||||||
|
* @testdox getCallerMethod check if it returns $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetCallerMethod(string $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::getCallerMethod()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::getCallerMethodList
|
||||||
|
* @testWith [["main", "run", "run", "run", "run", "run", "run", "runBare", "runTest", "testGetCallerMethodList"]]
|
||||||
|
* @testdox getCallerMethodList check if it returns $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param array $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetCallerMethodList(array $expected): void
|
||||||
|
{
|
||||||
|
$compare = Support::getCallerMethodList();
|
||||||
|
// 10: legact
|
||||||
|
// 11: direct
|
||||||
|
// 12: full call
|
||||||
|
switch (count($compare)) {
|
||||||
|
case 10:
|
||||||
|
// add nothing
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::getCallerMethodList(),
|
||||||
|
'assert expected 10'
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
// add one "run" before "runBare"
|
||||||
|
// array_splice(
|
||||||
|
// $expected,
|
||||||
|
// 7,
|
||||||
|
// 0,
|
||||||
|
// ['run']
|
||||||
|
// );
|
||||||
|
array_splice(
|
||||||
|
$expected,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
['include']
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::getCallerMethodList(),
|
||||||
|
'assert expected 11'
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
// add two "run" before "runBare"
|
||||||
|
array_splice(
|
||||||
|
$expected,
|
||||||
|
7,
|
||||||
|
0,
|
||||||
|
['run']
|
||||||
|
);
|
||||||
|
array_splice(
|
||||||
|
$expected,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
['include']
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::getCallerMethodList(),
|
||||||
|
'assert expected 12'
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::getCallerClass
|
||||||
|
* @testWith ["PHPUnit\\TextUI\\Command"]
|
||||||
|
* @testdox getCallerClass check if it returns $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetCallerClass(string $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::getCallerClass()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function debugStringProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input string
|
||||||
|
// 1: replace
|
||||||
|
// 2: html flag
|
||||||
|
// 3: expected
|
||||||
|
return [
|
||||||
|
'null string, default' => [
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'-'
|
||||||
|
],
|
||||||
|
'empty string, ... replace' => [
|
||||||
|
'',
|
||||||
|
'...',
|
||||||
|
null,
|
||||||
|
'...'
|
||||||
|
],
|
||||||
|
'filled string' => [
|
||||||
|
'some string',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'some string'
|
||||||
|
],
|
||||||
|
'string with html chars, encode' => [
|
||||||
|
'a string with <> &',
|
||||||
|
'-',
|
||||||
|
true,
|
||||||
|
'a string with <> &',
|
||||||
|
],
|
||||||
|
'string with html chars' => [
|
||||||
|
'a string with <> &',
|
||||||
|
'-',
|
||||||
|
null,
|
||||||
|
'a string with <> &',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::debugString
|
||||||
|
* @dataProvider debugStringProvider
|
||||||
|
* @testdox debugString $input with replace $replace and html $flag will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|null $input
|
||||||
|
* @param string|null $replace
|
||||||
|
* @param bool|null $flag
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testDebugString(?string $input, ?string $replace, ?bool $flag, string $expected): void
|
||||||
|
{
|
||||||
|
if ($replace === null && $flag === null) {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::debugString($input),
|
||||||
|
'assert all default'
|
||||||
|
);
|
||||||
|
} elseif ($flag === null) {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::debugString($input, $replace),
|
||||||
|
'assert flag default'
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::debugString($input, $replace, $flag),
|
||||||
|
'assert all set'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
3
4dev/tests/Debug/log/.gitignore
vendored
Normal file
3
4dev/tests/Debug/log/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
*log
|
||||||
|
*LOG
|
||||||
|
!.gitignore
|
||||||
@@ -77,21 +77,24 @@ final class CoreLibsGetDotEnvTest extends TestCase
|
|||||||
'file' => 'cannot_read.env',
|
'file' => 'cannot_read.env',
|
||||||
'status' => 2,
|
'status' => 2,
|
||||||
'content' => [],
|
'content' => [],
|
||||||
'chmod' => '000',
|
// 0000
|
||||||
|
'chmod' => '100000',
|
||||||
],
|
],
|
||||||
'empty file' => [
|
'empty file' => [
|
||||||
'folder' => __DIR__ . DIRECTORY_SEPARATOR . 'dotenv',
|
'folder' => __DIR__ . DIRECTORY_SEPARATOR . 'dotenv',
|
||||||
'file' => 'empty.env',
|
'file' => 'empty.env',
|
||||||
'status' => 1,
|
'status' => 1,
|
||||||
'content' => [],
|
'content' => [],
|
||||||
'chmod' => null,
|
// 0664
|
||||||
|
'chmod' => '100664',
|
||||||
],
|
],
|
||||||
'override all' => [
|
'override all' => [
|
||||||
'folder' => __DIR__ . DIRECTORY_SEPARATOR . 'dotenv',
|
'folder' => __DIR__ . DIRECTORY_SEPARATOR . 'dotenv',
|
||||||
'file' => 'test.env',
|
'file' => 'test.env',
|
||||||
'status' => 0,
|
'status' => 0,
|
||||||
'content' => $dot_env_content,
|
'content' => $dot_env_content,
|
||||||
'chmod' => null,
|
// 0664
|
||||||
|
'chmod' => '100664',
|
||||||
],
|
],
|
||||||
'override directory' => [
|
'override directory' => [
|
||||||
'folder' => __DIR__ . DIRECTORY_SEPARATOR . 'dotenv',
|
'folder' => __DIR__ . DIRECTORY_SEPARATOR . 'dotenv',
|
||||||
@@ -124,6 +127,16 @@ final class CoreLibsGetDotEnvTest extends TestCase
|
|||||||
array $expected_env,
|
array $expected_env,
|
||||||
?string $chmod
|
?string $chmod
|
||||||
): void {
|
): void {
|
||||||
|
if (
|
||||||
|
!empty($chmod) &&
|
||||||
|
$chmod == '100000' &&
|
||||||
|
getmyuid() == 0
|
||||||
|
) {
|
||||||
|
$this->markTestSkipped(
|
||||||
|
"Skip cannot read file test because run user is root"
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
// if we have file + chmod set
|
// if we have file + chmod set
|
||||||
$old_chmod = null;
|
$old_chmod = null;
|
||||||
if (
|
if (
|
||||||
@@ -134,6 +147,20 @@ final class CoreLibsGetDotEnvTest extends TestCase
|
|||||||
$old_chmod = fileperms($folder . DIRECTORY_SEPARATOR . $file);
|
$old_chmod = fileperms($folder . DIRECTORY_SEPARATOR . $file);
|
||||||
chmod($folder . DIRECTORY_SEPARATOR . $file, octdec($chmod));
|
chmod($folder . DIRECTORY_SEPARATOR . $file, octdec($chmod));
|
||||||
}
|
}
|
||||||
|
$message = '\CoreLibs\Get\DotEnv is deprecated in favor for '
|
||||||
|
. 'composer package gullevek\dotenv which is a copy of this';
|
||||||
|
// convert E_USER_DEPRECATED to a exception
|
||||||
|
set_error_handler(
|
||||||
|
static function (int $errno, string $errstr): never {
|
||||||
|
throw new \Exception($errstr, $errno);
|
||||||
|
},
|
||||||
|
E_USER_DEPRECATED
|
||||||
|
);
|
||||||
|
// tests are never run -> deprecated
|
||||||
|
if (is_file($folder . DIRECTORY_SEPARATOR . $file)) {
|
||||||
|
chmod($folder . DIRECTORY_SEPARATOR . $file, 0664);
|
||||||
|
}
|
||||||
|
$this->expectExceptionMessage($message);
|
||||||
if ($folder !== null && $file !== null) {
|
if ($folder !== null && $file !== null) {
|
||||||
$status = DotEnv::readEnvFile($folder, $file);
|
$status = DotEnv::readEnvFile($folder, $file);
|
||||||
} elseif ($folder !== null) {
|
} elseif ($folder !== null) {
|
||||||
@@ -141,6 +168,7 @@ final class CoreLibsGetDotEnvTest extends TestCase
|
|||||||
} else {
|
} else {
|
||||||
$status = DotEnv::readEnvFile();
|
$status = DotEnv::readEnvFile();
|
||||||
}
|
}
|
||||||
|
restore_error_handler();
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$status,
|
$status,
|
||||||
$expected_status,
|
$expected_status,
|
||||||
@@ -153,8 +181,9 @@ final class CoreLibsGetDotEnvTest extends TestCase
|
|||||||
'Assert _ENV correct'
|
'Assert _ENV correct'
|
||||||
);
|
);
|
||||||
// if we have file and chmod unset
|
// if we have file and chmod unset
|
||||||
if ($old_chmod !== null) {
|
print "Write mode: $old_chmod\n";
|
||||||
chmod($folder . DIRECTORY_SEPARATOR . $file, $old_chmod);
|
if ($old_chmod !== null && $chmod == '100000') {
|
||||||
|
chmod($folder . DIRECTORY_SEPARATOR . $file, 0664);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -67,17 +67,17 @@ final class CoreLibsGetSystemTest extends TestCase
|
|||||||
'original set' => [
|
'original set' => [
|
||||||
0 => null,
|
0 => null,
|
||||||
1 => 'NOHOST',
|
1 => 'NOHOST',
|
||||||
2 => 'NOPORT',
|
2 => 0,
|
||||||
],
|
],
|
||||||
'override set no port' => [
|
'override set no port' => [
|
||||||
0 => 'foo.org',
|
0 => 'foo.org',
|
||||||
1 => 'foo.org',
|
1 => 'foo.org',
|
||||||
2 => '80'
|
2 => 80
|
||||||
],
|
],
|
||||||
'override set with port' => [
|
'override set with port' => [
|
||||||
0 => 'foo.org:443',
|
0 => 'foo.org:443',
|
||||||
1 => 'foo.org',
|
1 => 'foo.org',
|
||||||
2 => '443'
|
2 => 443
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -99,7 +99,7 @@ final class CoreLibsGetSystemTest extends TestCase
|
|||||||
1 => 'phpunit',
|
1 => 'phpunit',
|
||||||
2 => 'phpunit',
|
2 => 'phpunit',
|
||||||
// NOTE: this can change, so it is a regex check
|
// NOTE: this can change, so it is a regex check
|
||||||
3 => "/^(\/?.*\/?)?www\/vendor\/bin\/phpunit$/",
|
3 => "/^(\/?.*\/?)?vendor\/bin\/phpunit$/",
|
||||||
],
|
],
|
||||||
'some path with extension' => [
|
'some path with extension' => [
|
||||||
0 => '/some/path/to/file.txt',
|
0 => '/some/path/to/file.txt',
|
||||||
@@ -138,10 +138,10 @@ final class CoreLibsGetSystemTest extends TestCase
|
|||||||
*
|
*
|
||||||
* @param string|null $input
|
* @param string|null $input
|
||||||
* @param string $expected_host
|
* @param string $expected_host
|
||||||
* @param string $expected_port
|
* @param int $expected_port
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testGetHostNanme(?string $input, string $expected_host, string $expected_port): void
|
public function testGetHostNanme(?string $input, string $expected_host, int $expected_port): void
|
||||||
{
|
{
|
||||||
// print "HOSTNAME: " . $_SERVER['HTTP_HOST'] . "<br>";
|
// print "HOSTNAME: " . $_SERVER['HTTP_HOST'] . "<br>";
|
||||||
// print "SERVER: " . print_r($_SERVER, true) . "\n";
|
// print "SERVER: " . print_r($_SERVER, true) . "\n";
|
||||||
568
4dev/tests/Language/CoreLibsLanguageGetLocaleTest.php
Normal file
568
4dev/tests/Language/CoreLibsLanguageGetLocaleTest.php
Normal file
@@ -0,0 +1,568 @@
|
|||||||
|
<?php // phpcs:disable Generic.Files.LineLength
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Language\GetLocale
|
||||||
|
*
|
||||||
|
* @coversDefaultClass \CoreLibs\Language\GetLocale
|
||||||
|
* @testdox \CoreLibs\Language\GetLocale method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsLanguageGetLocaleTest extends TestCase
|
||||||
|
{
|
||||||
|
public const SITE_ENCODING = 'UTF-8';
|
||||||
|
public const SITE_LOCALE = 'en_US.UTF-8';
|
||||||
|
public const SITE_DOMAIN = 'admin';
|
||||||
|
public const LOCALE_PATH = __DIR__ . DIRECTORY_SEPARATOR
|
||||||
|
. 'includes' . DIRECTORY_SEPARATOR
|
||||||
|
. 'locale' . DIRECTORY_SEPARATOR;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set all constant variables that must be set before call
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setUpBeforeClass(): void
|
||||||
|
{
|
||||||
|
// default web page encoding setting
|
||||||
|
/* if (!defined('DEFAULT_ENCODING')) {
|
||||||
|
define('DEFAULT_ENCODING', 'UTF-8');
|
||||||
|
}
|
||||||
|
if (!defined('DEFAULT_LOCALE')) {
|
||||||
|
// default lang + encoding
|
||||||
|
define('DEFAULT_LOCALE', 'en_US.UTF-8');
|
||||||
|
}
|
||||||
|
// site
|
||||||
|
if (!defined('SITE_ENCODING')) {
|
||||||
|
define('SITE_ENCODING', DEFAULT_ENCODING);
|
||||||
|
}
|
||||||
|
if (!defined('SITE_LOCALE')) {
|
||||||
|
define('SITE_LOCALE', DEFAULT_LOCALE);
|
||||||
|
} */
|
||||||
|
// just set
|
||||||
|
/* if (!defined('BASE')) {
|
||||||
|
define('BASE', str_replace('/configs', '', __DIR__) . DIRECTORY_SEPARATOR);
|
||||||
|
}
|
||||||
|
if (!defined('INCLUDES')) {
|
||||||
|
define('INCLUDES', 'includes' . DIRECTORY_SEPARATOR);
|
||||||
|
}
|
||||||
|
if (!defined('LANG')) {
|
||||||
|
define('LANG', 'lang' . DIRECTORY_SEPARATOR);
|
||||||
|
}
|
||||||
|
if (!defined('LOCALE')) {
|
||||||
|
define('LOCALE', 'locale' . DIRECTORY_SEPARATOR);
|
||||||
|
}
|
||||||
|
if (!defined('CONTENT_PATH')) {
|
||||||
|
define('CONTENT_PATH', 'frontend' . DIRECTORY_SEPARATOR);
|
||||||
|
} */
|
||||||
|
// array session
|
||||||
|
$_SESSION = [];
|
||||||
|
global $_SESSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* all the test data
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
/* public function setLocaleProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// 0: locale
|
||||||
|
// 1: domain
|
||||||
|
// 2: encoding
|
||||||
|
// 3: path
|
||||||
|
// 4: SESSION: DEFAULT_LOCALE
|
||||||
|
// 5: SESSION: DEFAULT_CHARSET
|
||||||
|
// 6: expected array
|
||||||
|
// 7: deprecation message
|
||||||
|
'no params, all default constants' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
null, null, null, null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'en_US.UTF-8',
|
||||||
|
'lang' => 'en_US',
|
||||||
|
'domain' => 'frontend',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
'setLocale: Unset $locale or unset SESSION locale is deprecated',
|
||||||
|
],
|
||||||
|
'no params, session charset and lang' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
null, null, null, null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
'ja_JP', 'UTF-8',
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja_JP',
|
||||||
|
'lang' => 'ja_JP',
|
||||||
|
'domain' => 'frontend',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
'setLocale: Unset $domain is deprecated'
|
||||||
|
],
|
||||||
|
'no params, session charset and lang short' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
null, null, null, null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
'ja', 'UTF-8',
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'frontend',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
'setLocale: Unset $domain is deprecated',
|
||||||
|
],
|
||||||
|
// param lang (no sessions)
|
||||||
|
'locale param only, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'ja.UTF-8', null, null, null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja.UTF-8',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'frontend',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
'setLocale: Unset $domain is deprecated',
|
||||||
|
],
|
||||||
|
// different locale setting
|
||||||
|
'locale complex param only, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'ja_JP.SJIS', null, null, null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja_JP.SJIS',
|
||||||
|
'lang' => 'ja_JP',
|
||||||
|
'domain' => 'frontend',
|
||||||
|
'encoding' => 'SJIS',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
'setLocale: Unset $domain is deprecated',
|
||||||
|
],
|
||||||
|
// param lang and domain (no override)
|
||||||
|
'locale, domain params, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'ja.UTF-8', 'admin', null, null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja.UTF-8',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
'setLocale: Unset $path is deprecated',
|
||||||
|
],
|
||||||
|
// param lang and domain (no override)
|
||||||
|
'locale, domain, encoding params, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'ja.UTF-8', 'admin', 'UTF-8', null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja.UTF-8',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
'setLocale: Unset $path is deprecated'
|
||||||
|
],
|
||||||
|
// lang, domain, path (no override)
|
||||||
|
'locale, domain and path, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'ja.UTF-8', 'admin', '', __DIR__ . '/locale_other/',
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja.UTF-8',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?locale_other\/$/",
|
||||||
|
],
|
||||||
|
null
|
||||||
|
],
|
||||||
|
// all params set (no override)
|
||||||
|
'all parameter, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'ja', 'admin', 'UTF-8', __DIR__ . '/locale_other/',
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?locale_other\/$/",
|
||||||
|
],
|
||||||
|
null
|
||||||
|
],
|
||||||
|
// param lang and domain (no override)
|
||||||
|
'long locale, domain, encoding params, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'de_CH.UTF-8@euro', 'admin', 'UTF-8', null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'de_CH.UTF-8@euro',
|
||||||
|
'lang' => 'de_CH',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
'setLocale: Unset $path is deprecated',
|
||||||
|
],
|
||||||
|
// TODO invalid params (bad path) (no override)
|
||||||
|
// TODO param calls, but with override set
|
||||||
|
];
|
||||||
|
} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::setLocale
|
||||||
|
* @dataProvider setLocaleProvider
|
||||||
|
* @testdox lang settings lang $language, domain $domain, encoding $encoding, path $path; session lang: $SESSION_DEFAULT_LOCALE, session char: $SESSION_DEFAULT_CHARSET [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|null $language
|
||||||
|
* @param string|null $domain
|
||||||
|
* @param string|null $encoding
|
||||||
|
* @param string|null $path
|
||||||
|
* @param string|null $SESSION_DEFAULT_LOCALE
|
||||||
|
* @param string|null $SESSION_DEFAULT_CHARSET
|
||||||
|
* @param array<mixed> $expected
|
||||||
|
* @param string|null $deprecation_message
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
/* public function testsetLocale(
|
||||||
|
?string $language,
|
||||||
|
?string $domain,
|
||||||
|
?string $encoding,
|
||||||
|
?string $path,
|
||||||
|
?string $SESSION_DEFAULT_LOCALE,
|
||||||
|
?string $SESSION_DEFAULT_CHARSET,
|
||||||
|
array $expected,
|
||||||
|
?string $deprecation_message
|
||||||
|
): void {
|
||||||
|
$return_lang_settings = [];
|
||||||
|
global $_SESSION;
|
||||||
|
// set override
|
||||||
|
if ($SESSION_DEFAULT_LOCALE !== null) {
|
||||||
|
$_SESSION['DEFAULT_LOCALE'] = $SESSION_DEFAULT_LOCALE;
|
||||||
|
}
|
||||||
|
if ($SESSION_DEFAULT_CHARSET !== null) {
|
||||||
|
$_SESSION['DEFAULT_CHARSET'] = $SESSION_DEFAULT_CHARSET;
|
||||||
|
}
|
||||||
|
if ($deprecation_message !== null) {
|
||||||
|
set_error_handler(
|
||||||
|
static function (int $errno, string $errstr): never {
|
||||||
|
throw new \Exception($errstr, $errno);
|
||||||
|
},
|
||||||
|
E_USER_DEPRECATED
|
||||||
|
);
|
||||||
|
// catch this with the message
|
||||||
|
$this->expectExceptionMessage($deprecation_message);
|
||||||
|
}
|
||||||
|
// function call
|
||||||
|
if (
|
||||||
|
$language === null && $domain === null &&
|
||||||
|
$encoding === null && $path === null
|
||||||
|
) {
|
||||||
|
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale();
|
||||||
|
} elseif (
|
||||||
|
$language !== null && $domain === null &&
|
||||||
|
$encoding === null && $path === null
|
||||||
|
) {
|
||||||
|
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
|
||||||
|
$language
|
||||||
|
);
|
||||||
|
} elseif (
|
||||||
|
$language !== null && $domain !== null &&
|
||||||
|
$encoding === null && $path === null
|
||||||
|
) {
|
||||||
|
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
|
||||||
|
$language,
|
||||||
|
$domain
|
||||||
|
);
|
||||||
|
} elseif (
|
||||||
|
$language !== null && $domain !== null &&
|
||||||
|
$encoding !== null && $path === null
|
||||||
|
) {
|
||||||
|
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
|
||||||
|
$language,
|
||||||
|
$domain,
|
||||||
|
$encoding
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
|
||||||
|
$language,
|
||||||
|
$domain,
|
||||||
|
$encoding,
|
||||||
|
$path
|
||||||
|
);
|
||||||
|
}
|
||||||
|
restore_error_handler();
|
||||||
|
// print "RETURN: " . print_r($return_lang_settings, true) . "\n";
|
||||||
|
|
||||||
|
foreach (
|
||||||
|
[
|
||||||
|
'locale', 'lang', 'domain', 'encoding', 'path'
|
||||||
|
] as $key
|
||||||
|
) {
|
||||||
|
$value = $expected[$key];
|
||||||
|
if (strpos($value, "/") === 0) {
|
||||||
|
// this is regex
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$value,
|
||||||
|
$return_lang_settings[$key],
|
||||||
|
'assert regex failed for ' . $key
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// assert equal
|
||||||
|
$this->assertEquals(
|
||||||
|
$value,
|
||||||
|
$return_lang_settings[$key],
|
||||||
|
'assert equal failed for ' . $key
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// unset all vars
|
||||||
|
$_SESSION = [];
|
||||||
|
unset($GLOBALS['OVERRIDE_LANG']);
|
||||||
|
} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* all the test data
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function setLocaleFromSessionProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// 0: locale
|
||||||
|
// 1: domain
|
||||||
|
// 2: encoding
|
||||||
|
// 3: path
|
||||||
|
// 4: SESSION: DEFAULT_LOCALE
|
||||||
|
// 5: SESSION: DEFAULT_CHARSET
|
||||||
|
// 5: SESSION: DEFAULT_DOMAIN
|
||||||
|
// 6: SESSION: LOCALE_PATH
|
||||||
|
// 6: expected array
|
||||||
|
// 7: deprecation message
|
||||||
|
'all session vars set' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
self::SITE_LOCALE, self::SITE_DOMAIN, self::SITE_ENCODING, self::LOCALE_PATH,
|
||||||
|
// SESSION SETTINGS: locale, charset, domain, path
|
||||||
|
'ja_JP.UTF-8', 'UTF-8', 'admin', __DIR__ . '/locale_other/',
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja_JP.UTF-8',
|
||||||
|
'lang' => 'ja_JP',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?locale_other\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// param lang and domain (no override)
|
||||||
|
'no session set, only parameters' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
self::SITE_LOCALE, self::SITE_DOMAIN, self::SITE_ENCODING, self::LOCALE_PATH,
|
||||||
|
// SESSION SETTINGS: locale, charset, domain, path
|
||||||
|
null, null, null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'en_US.UTF-8',
|
||||||
|
'lang' => 'en_US',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// special parse session check for locales
|
||||||
|
'all session vars set, short lang' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
self::SITE_LOCALE, self::SITE_DOMAIN, self::SITE_ENCODING, self::LOCALE_PATH,
|
||||||
|
// SESSION SETTINGS: locale, charset, domain, path
|
||||||
|
'ja', 'UTF-8', 'admin', __DIR__ . '/locale_other/',
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?locale_other\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// lang with modifier
|
||||||
|
// param lang and domain (no override)
|
||||||
|
'long locale, domain, encoding params, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
self::SITE_LOCALE, self::SITE_DOMAIN, self::SITE_ENCODING, self::LOCALE_PATH,
|
||||||
|
// SESSION SETTINGS: locale, charset, domain, path
|
||||||
|
'de_CH.UTF-8@euro', 'admin', 'UTF-8', __DIR__ . '/includes/locale/',
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'de_CH.UTF-8@euro',
|
||||||
|
'lang' => 'de_CH',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// missing session values check
|
||||||
|
// special parse session check for locales
|
||||||
|
'session missing encoding, set from parameters' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
self::SITE_LOCALE, self::SITE_DOMAIN, self::SITE_ENCODING, self::LOCALE_PATH,
|
||||||
|
// SESSION SETTINGS: locale, charset, domain, path
|
||||||
|
'ja', null, 'admin', __DIR__ . '/locale_other/',
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?locale_other\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// null return check for invalid entries
|
||||||
|
'no session set, only parameters, all invalid' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'###', '&&&&', '$$$$', 'foo_bar_path',
|
||||||
|
// SESSION SETTINGS: locale, charset, domain, path
|
||||||
|
null, null, null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => null,
|
||||||
|
'lang' => null,
|
||||||
|
'domain' => null,
|
||||||
|
'encoding' => null,
|
||||||
|
'path' => null,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// invalid session names, fall backup
|
||||||
|
'all session vars are invalid, fallback' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
self::SITE_LOCALE, self::SITE_DOMAIN, self::SITE_ENCODING, self::LOCALE_PATH,
|
||||||
|
// SESSION SETTINGS: locale, charset, domain, path
|
||||||
|
'###', '&&&&', '$$$$', 'foo_bar_path',
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'en_US.UTF-8',
|
||||||
|
'lang' => 'en_US',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::setLocale
|
||||||
|
* @dataProvider setLocaleFromSessionProvider
|
||||||
|
* @testdox lang settings lang $language, domain $domain, encoding $encoding, path $path; session lang: $SESSION_DEFAULT_LOCALE, session char: $SESSION_DEFAULT_CHARSET [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string| $language
|
||||||
|
* @param string| $domain
|
||||||
|
* @param string| $encoding
|
||||||
|
* @param string| $path
|
||||||
|
* @param string|null $SESSION_DEFAULT_LOCALE
|
||||||
|
* @param string|null $SESSION_DEFAULT_CHARSET
|
||||||
|
* @param string|null $SESSION_DEFAULT_DOMAIN
|
||||||
|
* @param string|null $SESSION_LOCALE_PATH
|
||||||
|
* @param array<mixed> $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testsetLocaleFromSession(
|
||||||
|
string $language,
|
||||||
|
string $domain,
|
||||||
|
string $encoding,
|
||||||
|
string $path,
|
||||||
|
?string $SESSION_DEFAULT_LOCALE,
|
||||||
|
?string $SESSION_DEFAULT_CHARSET,
|
||||||
|
?string $SESSION_DEFAULT_DOMAIN,
|
||||||
|
?string $SESSION_LOCALE_PATH,
|
||||||
|
array $expected,
|
||||||
|
): void {
|
||||||
|
$return_lang_settings = [];
|
||||||
|
global $_SESSION;
|
||||||
|
// set override
|
||||||
|
if ($SESSION_DEFAULT_LOCALE !== null) {
|
||||||
|
$_SESSION['DEFAULT_LOCALE'] = $SESSION_DEFAULT_LOCALE;
|
||||||
|
}
|
||||||
|
if ($SESSION_DEFAULT_CHARSET !== null) {
|
||||||
|
$_SESSION['DEFAULT_CHARSET'] = $SESSION_DEFAULT_CHARSET;
|
||||||
|
}
|
||||||
|
if ($SESSION_DEFAULT_DOMAIN !== null) {
|
||||||
|
$_SESSION['DEFAULT_DOMAIN'] = $SESSION_DEFAULT_DOMAIN;
|
||||||
|
}
|
||||||
|
if ($SESSION_LOCALE_PATH !== null) {
|
||||||
|
$_SESSION['LOCALE_PATH'] = $SESSION_LOCALE_PATH;
|
||||||
|
}
|
||||||
|
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocaleFromSession(
|
||||||
|
$language,
|
||||||
|
$domain,
|
||||||
|
$encoding,
|
||||||
|
$path
|
||||||
|
);
|
||||||
|
// print "RETURN: " . print_r($return_lang_settings, true) . "\n";
|
||||||
|
foreach (
|
||||||
|
[
|
||||||
|
'locale', 'lang', 'domain', 'encoding', 'path'
|
||||||
|
] as $key
|
||||||
|
) {
|
||||||
|
$value = $expected[$key];
|
||||||
|
if (
|
||||||
|
!empty($value) &&
|
||||||
|
strpos($value, "/") === 0
|
||||||
|
) {
|
||||||
|
// this is regex
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$value,
|
||||||
|
$return_lang_settings[$key] ?? '',
|
||||||
|
'assert regex failed for ' . $key
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// assert equal
|
||||||
|
$this->assertEquals(
|
||||||
|
$value,
|
||||||
|
$return_lang_settings[$key],
|
||||||
|
'assert equal failed for ' . $key
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// unset all vars
|
||||||
|
$_SESSION = [];
|
||||||
|
unset($GLOBALS['OVERRIDE_LANG']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -22,37 +22,16 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
*/
|
*/
|
||||||
public static function setUpBeforeClass(): void
|
public static function setUpBeforeClass(): void
|
||||||
{
|
{
|
||||||
// default web page encoding setting
|
// for deprecation test only, will be removed
|
||||||
if (!defined('DEFAULT_ENCODING')) {
|
|
||||||
define('DEFAULT_ENCODING', 'UTF-8');
|
|
||||||
}
|
|
||||||
if (!defined('DEFAULT_LOCALE')) {
|
|
||||||
// default lang + encoding
|
|
||||||
define('DEFAULT_LOCALE', 'en_US.UTF-8');
|
|
||||||
}
|
|
||||||
// site
|
|
||||||
if (!defined('SITE_ENCODING')) {
|
|
||||||
define('SITE_ENCODING', DEFAULT_ENCODING);
|
|
||||||
}
|
|
||||||
if (!defined('SITE_LOCALE')) {
|
|
||||||
define('SITE_LOCALE', DEFAULT_LOCALE);
|
|
||||||
}
|
|
||||||
// just set
|
|
||||||
if (!defined('BASE')) {
|
if (!defined('BASE')) {
|
||||||
define('BASE', str_replace('/configs', '', __DIR__) . DIRECTORY_SEPARATOR);
|
define('BASE', str_replace(DIRECTORY_SEPARATOR . 'configs', '', __DIR__) . DIRECTORY_SEPARATOR);
|
||||||
}
|
}
|
||||||
if (!defined('INCLUDES')) {
|
if (!defined('INCLUDES')) {
|
||||||
define('INCLUDES', 'includes' . DIRECTORY_SEPARATOR);
|
define('INCLUDES', 'includes' . DIRECTORY_SEPARATOR);
|
||||||
}
|
}
|
||||||
if (!defined('LANG')) {
|
|
||||||
define('LANG', 'lang' . DIRECTORY_SEPARATOR);
|
|
||||||
}
|
|
||||||
if (!defined('LOCALE')) {
|
if (!defined('LOCALE')) {
|
||||||
define('LOCALE', 'locale' . DIRECTORY_SEPARATOR);
|
define('LOCALE', 'locale' . DIRECTORY_SEPARATOR);
|
||||||
}
|
}
|
||||||
if (!defined('CONTENT_PATH')) {
|
|
||||||
define('CONTENT_PATH', 'frontend' . DIRECTORY_SEPARATOR);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -105,77 +84,163 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
// 0: locale
|
// 0: locale
|
||||||
// 1: domain
|
// 1: encoding
|
||||||
// 2: encoding
|
// 2: domain
|
||||||
// 3: path
|
// 3: path
|
||||||
// 4: locale expected
|
// 4: locale expected
|
||||||
// 5: locale set expected
|
// 5: locale set expected
|
||||||
// 6: domain exepcted
|
// 6: lang expected
|
||||||
// 7: context (null for none)
|
// 7: lang short expected
|
||||||
// 8: test string in
|
// 8: encoding expected
|
||||||
// 9: test translated
|
// 9: domain exepcted
|
||||||
|
// 10: context (null for none)
|
||||||
|
// 11: test string in
|
||||||
|
// 12: test translated
|
||||||
|
// 13: deprecation message (until removed)
|
||||||
// new style load
|
// new style load
|
||||||
'gettext load en' => [
|
'gettext load en' => [
|
||||||
'en_US.UTF-8',
|
'en_US.UTF-8',
|
||||||
|
'UTF-8',
|
||||||
'frontend',
|
'frontend',
|
||||||
__DIR__ . 'includes/locale/',
|
__DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR,
|
||||||
//
|
// 4, 5, 6, 7, 8, 9
|
||||||
'en_US.UTF-8',
|
'en_US.UTF-8',
|
||||||
'en_US',
|
'en_US',
|
||||||
|
'en_US',
|
||||||
|
'en',
|
||||||
|
'UTF-8',
|
||||||
'frontend',
|
'frontend',
|
||||||
|
// 10
|
||||||
null,
|
null,
|
||||||
|
// 11, 12
|
||||||
'Original',
|
'Original',
|
||||||
'Translated frontend en_US',
|
'Translated frontend en_US',
|
||||||
|
// 13
|
||||||
|
null,
|
||||||
],
|
],
|
||||||
'gettext load en' => [
|
'gettext load en' => [
|
||||||
'en_US.UTF-8',
|
'en_US.UTF-8',
|
||||||
|
'UTF-8',
|
||||||
'frontend',
|
'frontend',
|
||||||
__DIR__ . 'includes/locale/',
|
__DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR,
|
||||||
//
|
//
|
||||||
'en_US.UTF-8',
|
'en_US.UTF-8',
|
||||||
'en_US',
|
'en_US',
|
||||||
|
'en_US',
|
||||||
|
'en',
|
||||||
|
'UTF-8',
|
||||||
'frontend',
|
'frontend',
|
||||||
|
//
|
||||||
'context',
|
'context',
|
||||||
|
//
|
||||||
'Original',
|
'Original',
|
||||||
'Original context frontend en_US',
|
'Original context frontend en_US',
|
||||||
|
//
|
||||||
|
null,
|
||||||
],
|
],
|
||||||
'gettext load ja' => [
|
'gettext load ja' => [
|
||||||
'ja_JP.UTF-8',
|
'ja_JP.UTF-8',
|
||||||
|
'UTF-8',
|
||||||
'admin',
|
'admin',
|
||||||
__DIR__ . 'includes/locale/',
|
__DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR,
|
||||||
//
|
//
|
||||||
'ja_JP.UTF-8',
|
'ja_JP.UTF-8',
|
||||||
'ja_JP',
|
'ja_JP',
|
||||||
|
'ja_JP',
|
||||||
|
'ja',
|
||||||
|
'UTF-8',
|
||||||
'admin',
|
'admin',
|
||||||
|
//
|
||||||
null,
|
null,
|
||||||
|
//
|
||||||
'Original',
|
'Original',
|
||||||
'Translated admin ja_JP',
|
'Translated admin ja_JP',
|
||||||
|
//
|
||||||
|
null,
|
||||||
],
|
],
|
||||||
// mixed path and domain
|
// load short locale with different encoding
|
||||||
'mixed path and domain' => [
|
'gettext load short ja no encoding' => [
|
||||||
|
'ja',
|
||||||
|
'SJIS',
|
||||||
|
'admin',
|
||||||
|
__DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR,
|
||||||
|
//
|
||||||
|
'ja',
|
||||||
|
'ja',
|
||||||
|
'ja',
|
||||||
|
'ja',
|
||||||
|
'SJIS',
|
||||||
|
'admin',
|
||||||
|
//
|
||||||
|
null,
|
||||||
|
//
|
||||||
|
'Original',
|
||||||
|
'Translated admin ja_JP',
|
||||||
|
//
|
||||||
|
null,
|
||||||
|
],
|
||||||
|
// mixed path and domain [DEPRECATED]
|
||||||
|
'mixed path and domain [DEPRECATED]' => [
|
||||||
'en_US.UTF-8',
|
'en_US.UTF-8',
|
||||||
__DIR__ . 'includes/locale/',
|
'UTF-8',
|
||||||
|
__DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR,
|
||||||
'frontend',
|
'frontend',
|
||||||
//
|
//
|
||||||
'en_US.UTF-8',
|
'en_US.UTF-8',
|
||||||
'en_US',
|
'en_US',
|
||||||
|
'en_US',
|
||||||
|
'en',
|
||||||
|
'UTF-8',
|
||||||
'frontend',
|
'frontend',
|
||||||
|
//
|
||||||
'context',
|
'context',
|
||||||
|
//
|
||||||
'Original',
|
'Original',
|
||||||
'Original context frontend en_US',
|
'Original context frontend en_US',
|
||||||
|
//
|
||||||
|
'L10n constructor parameter switch is no longer supported. domain is 2nd, path is 3rd parameter'
|
||||||
|
],
|
||||||
|
// unset path
|
||||||
|
'unset path with locale and domain [DEPRECATED]' => [
|
||||||
|
'ja_JP.UTF-8',
|
||||||
|
'UTF-8',
|
||||||
|
'admin',
|
||||||
|
null,
|
||||||
|
//
|
||||||
|
'ja_JP.UTF-8',
|
||||||
|
'ja_JP',
|
||||||
|
'ja_JP',
|
||||||
|
'ja',
|
||||||
|
'UTF-8',
|
||||||
|
'admin',
|
||||||
|
//
|
||||||
|
null,
|
||||||
|
//
|
||||||
|
'Original',
|
||||||
|
'Translated admin ja_JP',
|
||||||
|
//
|
||||||
|
'Empty path parameter is no longer allowed if locale and domain are set',
|
||||||
],
|
],
|
||||||
// null set
|
// null set
|
||||||
'empty load new ' => [
|
'empty load new ' => [
|
||||||
'',
|
'',
|
||||||
'',
|
'',
|
||||||
'',
|
'',
|
||||||
|
'',
|
||||||
//
|
//
|
||||||
'',
|
'',
|
||||||
'',
|
'',
|
||||||
'',
|
'',
|
||||||
|
'',
|
||||||
|
'', // unset on empty call
|
||||||
|
'',
|
||||||
|
//
|
||||||
null,
|
null,
|
||||||
|
//
|
||||||
'Original',
|
'Original',
|
||||||
'Original',
|
'Original',
|
||||||
|
//
|
||||||
|
null,
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@@ -188,37 +253,62 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
* @testdox check l10n init with Locale $locale, Path $path, Domain $domain, Legacy: $legacy with $context [$_dataName]
|
* @testdox check l10n init with Locale $locale, Path $path, Domain $domain, Legacy: $legacy with $context [$_dataName]
|
||||||
*
|
*
|
||||||
* @param string|null $locale
|
* @param string|null $locale
|
||||||
|
* @param string|null $encoding
|
||||||
* @param string|null $domain
|
* @param string|null $domain
|
||||||
* @param string|null $path
|
* @param string|null $path
|
||||||
* @param string $locale_expected
|
* @param string $locale_expected
|
||||||
* @param string $locale_set_expected
|
* @param string $locale_set_expected
|
||||||
|
* @param string $lang_expected
|
||||||
|
* @param string $lang_short_expected
|
||||||
|
* @param string $encoding_expected
|
||||||
* @param string $domain_expected
|
* @param string $domain_expected
|
||||||
* @param ?string $context
|
* @param string|null $context
|
||||||
* @param string $original
|
* @param string $original
|
||||||
* @param string $translated
|
* @param string $translated
|
||||||
|
* @param string|null $deprecation_message
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testL10nObject(
|
public function testL10nObject(
|
||||||
?string $locale,
|
?string $locale,
|
||||||
|
?string $encoding,
|
||||||
?string $domain,
|
?string $domain,
|
||||||
?string $path,
|
?string $path,
|
||||||
string $locale_expected,
|
string $locale_expected,
|
||||||
string $locale_set_expected,
|
string $locale_set_expected,
|
||||||
|
string $lang_expected,
|
||||||
|
string $lang_short_expected,
|
||||||
|
string $encoding_expected,
|
||||||
string $domain_expected,
|
string $domain_expected,
|
||||||
?string $context,
|
?string $context,
|
||||||
string $original,
|
string $original,
|
||||||
string $translated
|
string $translated,
|
||||||
|
?string $deprecation_message
|
||||||
): void {
|
): void {
|
||||||
|
if ($deprecation_message !== null) {
|
||||||
|
set_error_handler(
|
||||||
|
static function (int $errno, string $errstr): never {
|
||||||
|
throw new \Exception($errstr, $errno);
|
||||||
|
},
|
||||||
|
E_USER_DEPRECATED
|
||||||
|
);
|
||||||
|
// catch this with the message
|
||||||
|
$this->expectExceptionMessage($deprecation_message);
|
||||||
|
}
|
||||||
if ($locale === null) {
|
if ($locale === null) {
|
||||||
$l10n = new \CoreLibs\Language\L10n();
|
$l10n = new \CoreLibs\Language\L10n();
|
||||||
} elseif ($domain === null) {
|
} elseif ($domain === null) {
|
||||||
|
// deprecated, locale + domain must be set, handled like empty calls
|
||||||
$l10n = new \CoreLibs\Language\L10n($locale);
|
$l10n = new \CoreLibs\Language\L10n($locale);
|
||||||
} elseif ($path === null) {
|
} elseif ($path === null) {
|
||||||
|
// deprecated, path must be set, will thow DEPRECATION error, handled like empty
|
||||||
$l10n = new \CoreLibs\Language\L10n($locale, $domain);
|
$l10n = new \CoreLibs\Language\L10n($locale, $domain);
|
||||||
} else {
|
} elseif ($encoding === null) {
|
||||||
|
// if encoding not found will be UTF-8
|
||||||
$l10n = new \CoreLibs\Language\L10n($locale, $domain, $path);
|
$l10n = new \CoreLibs\Language\L10n($locale, $domain, $path);
|
||||||
|
} else {
|
||||||
|
$l10n = new \CoreLibs\Language\L10n($locale, $domain, $path, $encoding);
|
||||||
}
|
}
|
||||||
// print "LOC: " . $locale . ", " . $l10n->getLocale() . ", " . $locale_expected . "\n";
|
restore_error_handler();
|
||||||
// print "MO: " . $l10n->getMoFile() . "\n";
|
// print "MO: " . $l10n->getMoFile() . "\n";
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$locale_expected,
|
$locale_expected,
|
||||||
@@ -248,6 +338,20 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
'Translated string assert failed in context: ' . $context
|
'Translated string assert failed in context: ' . $context
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
// test get locel as array
|
||||||
|
$locale = $l10n->getLocaleAsArray();
|
||||||
|
$this->assertEquals(
|
||||||
|
[
|
||||||
|
'locale' => $locale_expected,
|
||||||
|
'lang' => $lang_expected,
|
||||||
|
'lang_short' => $lang_short_expected,
|
||||||
|
'domain' => $domain_expected,
|
||||||
|
'encoding' => $encoding_expected,
|
||||||
|
'path' => $path
|
||||||
|
],
|
||||||
|
$locale,
|
||||||
|
'getLocaleAsArray mismatch'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// l10nReloadMOfile and getTranslator
|
// l10nReloadMOfile and getTranslator
|
||||||
@@ -283,7 +387,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
// set 0-2
|
// set 0-2
|
||||||
'en_US.UTF-8',
|
'en_US.UTF-8',
|
||||||
'frontend',
|
'frontend',
|
||||||
__DIR__ . 'includes/locale/',
|
__DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR,
|
||||||
// status 3
|
// status 3
|
||||||
false,
|
false,
|
||||||
// to translate 4
|
// to translate 4
|
||||||
@@ -296,7 +400,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
// set new 8-10
|
// set new 8-10
|
||||||
'ja_JP.UTF-8',
|
'ja_JP.UTF-8',
|
||||||
'frontend',
|
'frontend',
|
||||||
__DIR__ . 'includes/locale/',
|
__DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR,
|
||||||
// status new 11
|
// status new 11
|
||||||
false,
|
false,
|
||||||
// check new setter 12-14
|
// check new setter 12-14
|
||||||
@@ -322,7 +426,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
// set new 8-10
|
// set new 8-10
|
||||||
'en_US.UTF-8',
|
'en_US.UTF-8',
|
||||||
'frontend',
|
'frontend',
|
||||||
__DIR__ . 'includes/locale/',
|
__DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR,
|
||||||
// status new 11
|
// status new 11
|
||||||
false,
|
false,
|
||||||
// check new setter 12-14
|
// check new setter 12-14
|
||||||
@@ -387,12 +491,8 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
string $domain_expected_b,
|
string $domain_expected_b,
|
||||||
string $translated_b
|
string $translated_b
|
||||||
): void {
|
): void {
|
||||||
if ($locale === null) {
|
if ($locale === null || $domain === null || $path === null) {
|
||||||
$l10n = new \CoreLibs\Language\L10n();
|
$l10n = new \CoreLibs\Language\L10n();
|
||||||
} elseif ($domain === null) {
|
|
||||||
$l10n = new \CoreLibs\Language\L10n($locale);
|
|
||||||
} elseif ($path === null) {
|
|
||||||
$l10n = new \CoreLibs\Language\L10n($locale, $domain);
|
|
||||||
} else {
|
} else {
|
||||||
$l10n = new \CoreLibs\Language\L10n($locale, $domain, $path);
|
$l10n = new \CoreLibs\Language\L10n($locale, $domain, $path);
|
||||||
}
|
}
|
||||||
@@ -494,16 +594,16 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
// 0: locale
|
// 0: locale
|
||||||
// 1: path
|
// 1: domain
|
||||||
// 2: domain
|
// 2: path
|
||||||
// 3: context (null for none)
|
// 3: context (null for none)
|
||||||
// 4: single string
|
// 4: single string
|
||||||
// 5: plural string
|
// 5: plural string
|
||||||
// 6: array for each n value expected string
|
// 6: array for each n value expected string
|
||||||
'plural text en' => [
|
'plural text en' => [
|
||||||
'en_US',
|
'en_US',
|
||||||
__DIR__ . 'includes/locale/',
|
|
||||||
'admin',
|
'admin',
|
||||||
|
__DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR,
|
||||||
// context
|
// context
|
||||||
null,
|
null,
|
||||||
// text single/multi in
|
// text single/multi in
|
||||||
@@ -518,8 +618,8 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
],
|
],
|
||||||
'plural text context en' => [
|
'plural text context en' => [
|
||||||
'en_US',
|
'en_US',
|
||||||
__DIR__ . 'includes/locale/',
|
|
||||||
'admin',
|
'admin',
|
||||||
|
__DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR,
|
||||||
// context
|
// context
|
||||||
'context',
|
'context',
|
||||||
// text single/multi in
|
// text single/multi in
|
||||||
@@ -544,8 +644,8 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
* @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]
|
||||||
*
|
*
|
||||||
* @param string $locale
|
* @param string $locale
|
||||||
* @param string $path
|
|
||||||
* @param string $domain
|
* @param string $domain
|
||||||
|
* @param string $path
|
||||||
* @param ?string $context
|
* @param ?string $context
|
||||||
* @param string $original_single
|
* @param string $original_single
|
||||||
* @param string $original_plural
|
* @param string $original_plural
|
||||||
@@ -555,8 +655,8 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
public function testNgettext(
|
public function testNgettext(
|
||||||
// config 0-3
|
// config 0-3
|
||||||
string $locale,
|
string $locale,
|
||||||
string $path,
|
|
||||||
string $domain,
|
string $domain,
|
||||||
|
string $path,
|
||||||
// context string
|
// context string
|
||||||
?string $context,
|
?string $context,
|
||||||
// input strings
|
// input strings
|
||||||
@@ -565,7 +665,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
// expected
|
// expected
|
||||||
array $expected_strings
|
array $expected_strings
|
||||||
): void {
|
): void {
|
||||||
$l10n = new \CoreLibs\Language\L10n($locale, $path, $domain, false);
|
$l10n = new \CoreLibs\Language\L10n($locale, $domain, $path);
|
||||||
|
|
||||||
foreach ($expected_strings as $n => $expected) {
|
foreach ($expected_strings as $n => $expected) {
|
||||||
if (empty($context)) {
|
if (empty($context)) {
|
||||||
@@ -981,7 +1081,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
'standard en' => [
|
'standard en' => [
|
||||||
'en_US.UTF-8',
|
'en_US.UTF-8',
|
||||||
'frontend',
|
'frontend',
|
||||||
__DIR__ . 'includes/locale/',
|
__DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR,
|
||||||
'UTF-8',
|
'UTF-8',
|
||||||
'Original',
|
'Original',
|
||||||
'Translated frontend en_US',
|
'Translated frontend en_US',
|
||||||
@@ -989,7 +1089,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
'standard ja' => [
|
'standard ja' => [
|
||||||
'ja_JP.UTF-8',
|
'ja_JP.UTF-8',
|
||||||
'admin',
|
'admin',
|
||||||
__DIR__ . 'includes/locale/',
|
__DIR__ . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'locale' . DIRECTORY_SEPARATOR,
|
||||||
'UTF-8',
|
'UTF-8',
|
||||||
'Original',
|
'Original',
|
||||||
'Translated admin ja_JP',
|
'Translated admin ja_JP',
|
||||||
@@ -1030,6 +1130,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
|||||||
_textdomain($domain);
|
_textdomain($domain);
|
||||||
_bindtextdomain($domain, $path);
|
_bindtextdomain($domain, $path);
|
||||||
_bind_textdomain_codeset($domain, $encoding);
|
_bind_textdomain_codeset($domain, $encoding);
|
||||||
|
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
$translated,
|
$translated,
|
||||||
__($original),
|
__($original),
|
||||||
1
4dev/tests/Language/includes/locale/ja
Symbolic link
1
4dev/tests/Language/includes/locale/ja
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
ja_JP
|
||||||
847
4dev/tests/Logging/CoreLibsLoggingLoggingTest.php
Normal file
847
4dev/tests/Logging/CoreLibsLoggingLoggingTest.php
Normal file
@@ -0,0 +1,847 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use CoreLibs\Logging\Logger\Level;
|
||||||
|
use CoreLibs\Logging\Logger\Flag;
|
||||||
|
|
||||||
|
// TODO: setLogPer test log file written matches pattern
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Logging
|
||||||
|
* @coversDefaultClass \CoreLibs\Logging\Logging
|
||||||
|
* @testdox \CoreLibs\Logging\Logging method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsLoggingLoggingTest extends TestCase
|
||||||
|
{
|
||||||
|
private const LOG_FOLDER = __DIR__ . DIRECTORY_SEPARATOR . 'log' . DIRECTORY_SEPARATOR;
|
||||||
|
private const REGEX_BASE = "\[[\d\-\s\.:]+\]\s{1}" // date
|
||||||
|
. "\[[\w\.]+(:\d+)?\]\s{1}" // host:port
|
||||||
|
. "\[[\w\-\.\/]+:\d+\]\s{1}" // folder/file
|
||||||
|
. "\[\w+\]\s{1}" // run id
|
||||||
|
. "{[\w\\\\]+(::\w+)?}\s{1}"; // class
|
||||||
|
|
||||||
|
public static function tearDownAfterClass(): void
|
||||||
|
{
|
||||||
|
array_map('unlink', glob(self::LOG_FOLDER . '*.log'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test set for options BASIC
|
||||||
|
*
|
||||||
|
* 0: options
|
||||||
|
* - null for NOT set
|
||||||
|
* 1: expected
|
||||||
|
* 2: override
|
||||||
|
* override:
|
||||||
|
* - constant for COSNTANTS
|
||||||
|
* - global for _GLOBALS
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function optionsProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'log folder set' => [
|
||||||
|
'options' => [
|
||||||
|
'log_folder' => DIRECTORY_SEPARATOR . 'tmp',
|
||||||
|
'log_file_id' => 'testClassInit',
|
||||||
|
],
|
||||||
|
'expected' => [
|
||||||
|
'log_folder' => DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR,
|
||||||
|
'log_level' => Level::Debug,
|
||||||
|
'log_file_id' => 'testClassInit',
|
||||||
|
],
|
||||||
|
'override' => [],
|
||||||
|
],
|
||||||
|
// -> deprecation warning, log_folder must be set
|
||||||
|
'no log folder set' => [
|
||||||
|
'options' => [
|
||||||
|
'log_file_id' => 'testClassInit'
|
||||||
|
],
|
||||||
|
'expected' => [
|
||||||
|
'log_folder' => getcwd() . DIRECTORY_SEPARATOR,
|
||||||
|
'log_level' => Level::Debug,
|
||||||
|
'log_file_id' => 'testClassInit',
|
||||||
|
],
|
||||||
|
'override' => []
|
||||||
|
],
|
||||||
|
// -> upcoming deprecated
|
||||||
|
'file_id set but not log_file_id' => [
|
||||||
|
'options' => [
|
||||||
|
'log_folder' => DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR,
|
||||||
|
'file_id' => 'testClassInit',
|
||||||
|
],
|
||||||
|
'expected' => [
|
||||||
|
'log_folder' => DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR,
|
||||||
|
'log_level' => Level::Debug,
|
||||||
|
'log_file_id' => 'testClassInit',
|
||||||
|
],
|
||||||
|
'override' => [],
|
||||||
|
],
|
||||||
|
// both file_id and log_file_id set -> WARNING
|
||||||
|
'file_id and log_file_id set' => [
|
||||||
|
'options' => [
|
||||||
|
'log_folder' => DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR,
|
||||||
|
'file_id' => 'testClassInit',
|
||||||
|
'log_file_id' => 'testClassInit',
|
||||||
|
],
|
||||||
|
'expected' => [
|
||||||
|
'log_folder' => DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR,
|
||||||
|
'log_level' => Level::Debug,
|
||||||
|
'log_file_id' => 'testClassInit',
|
||||||
|
],
|
||||||
|
'override' => [],
|
||||||
|
],
|
||||||
|
// no log file id set -> error,
|
||||||
|
'nothing set' => [
|
||||||
|
'options' => [],
|
||||||
|
'expected' => [
|
||||||
|
'log_folder' => getcwd() . DIRECTORY_SEPARATOR,
|
||||||
|
'log_level' => Level::Debug,
|
||||||
|
'log_file_id' => 'NOHOST-0_PHPUnit-TextUI-Command',
|
||||||
|
],
|
||||||
|
'override' => []
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* init logging class
|
||||||
|
*
|
||||||
|
* @dataProvider optionsProvider
|
||||||
|
* @testdox init test [$_dataName]
|
||||||
|
*
|
||||||
|
* @param array $options
|
||||||
|
* @param array $expected
|
||||||
|
* @param array $override
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testClassInit(array $options, array $expected, array $override): void
|
||||||
|
{
|
||||||
|
if (!empty($override['constant'])) {
|
||||||
|
foreach ($override['constant'] as $var => $value) {
|
||||||
|
if (!defined($var)) {
|
||||||
|
define($var, $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// for deprecated no log_folder set
|
||||||
|
// if base is defined and it does have AAASetupData set
|
||||||
|
// change the log_folder "Debug" to "AAASetupData"
|
||||||
|
if (
|
||||||
|
defined('BASE') &&
|
||||||
|
strpos(BASE, DIRECTORY_SEPARATOR . 'AAASetupData') !== false
|
||||||
|
) {
|
||||||
|
$expected['log_folder'] = str_replace(
|
||||||
|
DIRECTORY_SEPARATOR . 'Debug',
|
||||||
|
DIRECTORY_SEPARATOR . 'AAASetupData',
|
||||||
|
$expected['log_folder']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if not log folder and constant set -> expect E_USER_DEPRECATION
|
||||||
|
if (!empty($override['constant']) && empty($options['log_folder'])) {
|
||||||
|
// the deprecation message
|
||||||
|
$deprecation_message = 'options: log_folder must be set. '
|
||||||
|
. 'Setting via BASE and LOG constants is deprecated';
|
||||||
|
// convert E_USER_DEPRECATED to a exception
|
||||||
|
set_error_handler(
|
||||||
|
static function (int $errno, string $errstr): never {
|
||||||
|
throw new \Exception($errstr, $errno);
|
||||||
|
},
|
||||||
|
E_USER_DEPRECATED
|
||||||
|
);
|
||||||
|
// catch this with the message
|
||||||
|
$this->expectExceptionMessage($deprecation_message);
|
||||||
|
}
|
||||||
|
// alert for log file id with globals
|
||||||
|
if (!empty($override['constant']) && empty($options['log_file_id'])) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
// alert for log file id and file id set
|
||||||
|
if (
|
||||||
|
!empty($options['log_file_id']) &&
|
||||||
|
!empty($options['file_id'])
|
||||||
|
) {
|
||||||
|
set_error_handler(
|
||||||
|
static function (int $errno, string $errstr): never {
|
||||||
|
throw new \InvalidArgumentException($errstr, $errno);
|
||||||
|
},
|
||||||
|
E_USER_WARNING
|
||||||
|
);
|
||||||
|
$error_message = 'options: "file_id" is deprecated use: "log_file_id".';
|
||||||
|
$this->expectExceptionMessage($error_message);
|
||||||
|
$this->expectException(\InvalidArgumentException::class);
|
||||||
|
set_error_handler(
|
||||||
|
static function (int $errno, string $errstr): never {
|
||||||
|
throw new \Exception($errstr, $errno);
|
||||||
|
},
|
||||||
|
E_USER_DEPRECATED
|
||||||
|
);
|
||||||
|
$this->expectException(\Exception::class);
|
||||||
|
// $error_message = 'options: both log_file_id and log_id are set at the same time, will use log_file_id';
|
||||||
|
// $this->expectExceptionMessage($error_message);
|
||||||
|
}
|
||||||
|
// empty log folder
|
||||||
|
if (empty($override['constant']) && empty($options['log_folder'])) {
|
||||||
|
$this->expectException(\InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionMessageMatches("/^Missing mandatory option: \"/");
|
||||||
|
} elseif (empty($options['log_file_id']) && !empty($options['file_id'])) {
|
||||||
|
// the deprecation message
|
||||||
|
$deprecation_message = 'options: "file_id" is deprecated use: "log_file_id".';
|
||||||
|
// convert E_USER_DEPRECATED to a exception
|
||||||
|
set_error_handler(
|
||||||
|
static function (int $errno, string $errstr): never {
|
||||||
|
throw new \Exception($errstr, $errno);
|
||||||
|
},
|
||||||
|
E_USER_DEPRECATED
|
||||||
|
);
|
||||||
|
// catch this with the message
|
||||||
|
$this->expectExceptionMessage($deprecation_message);
|
||||||
|
}
|
||||||
|
$log = new \CoreLibs\Logging\Logging($options);
|
||||||
|
// reset error handler
|
||||||
|
restore_error_handler();
|
||||||
|
// check that settings match
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected['log_folder'],
|
||||||
|
$log->getLogFolder(),
|
||||||
|
'log folder not matching'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected['log_file_id'],
|
||||||
|
$log->getLogFileId(),
|
||||||
|
'log file id not matching'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// test all setters/getters
|
||||||
|
|
||||||
|
// setLoggingLevel
|
||||||
|
// getLoggingLevel
|
||||||
|
// loggingLevelIsDebug
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::setLoggingLevel
|
||||||
|
* @covers ::getLoggingLevel
|
||||||
|
* @covers ::loggingLevelIsDebug
|
||||||
|
* @testdox setLoggingLevel set/get checks
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetLoggingLevel(): void
|
||||||
|
{
|
||||||
|
// valid that is not Debug
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testSetLoggingLevel',
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
'log_level' => Level::Info
|
||||||
|
]);
|
||||||
|
$this->assertEquals(
|
||||||
|
Level::Info,
|
||||||
|
$log->getLoggingLevel()
|
||||||
|
);
|
||||||
|
$this->assertFalse(
|
||||||
|
$log->loggingLevelIsDebug()
|
||||||
|
);
|
||||||
|
// not set, should be debug]
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testSetLoggingLevel',
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
]);
|
||||||
|
$this->assertEquals(
|
||||||
|
Level::Debug,
|
||||||
|
$log->getLoggingLevel()
|
||||||
|
);
|
||||||
|
$this->assertTrue(
|
||||||
|
$log->loggingLevelIsDebug()
|
||||||
|
);
|
||||||
|
// invalid, should be debug, will throw excpetion too
|
||||||
|
$this->expectException(\InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionMessage('Option: "log_level" is not of instance \CoreLibs\Logging\Logger\Level');
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testSetLoggingLevel',
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
'log_level' => 'I'
|
||||||
|
]);
|
||||||
|
$this->assertEquals(
|
||||||
|
Level::Debug,
|
||||||
|
$log->getLoggingLevel()
|
||||||
|
);
|
||||||
|
$this->assertTrue(
|
||||||
|
$log->loggingLevelIsDebug()
|
||||||
|
);
|
||||||
|
// set valid, then change
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testSetLoggingLevel',
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
'log_level' => Level::Info
|
||||||
|
]);
|
||||||
|
$this->assertEquals(
|
||||||
|
Level::Info,
|
||||||
|
$log->getLoggingLevel()
|
||||||
|
);
|
||||||
|
$log->setLoggingLevel(Level::Notice);
|
||||||
|
$this->assertEquals(
|
||||||
|
Level::Notice,
|
||||||
|
$log->getLoggingLevel()
|
||||||
|
);
|
||||||
|
// illegal logging level
|
||||||
|
$this->expectException(\Psr\Log\InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionMessageMatches("/^Level \"NotGood\" is not defined, use one of: /");
|
||||||
|
$log->setLoggingLevel('NotGood');
|
||||||
|
}
|
||||||
|
|
||||||
|
// setLogFileId
|
||||||
|
// getLogFileId
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::setLogFileId
|
||||||
|
* @covers ::getLogFileId
|
||||||
|
* @testdox setLogFileId set/get checks
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testLogFileId(): void
|
||||||
|
{
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testLogFileId',
|
||||||
|
'log_folder' => self::LOG_FOLDER
|
||||||
|
]);
|
||||||
|
// bad, keep same
|
||||||
|
$log->setLogFileId('$$##$%#$%&');
|
||||||
|
$this->assertEquals(
|
||||||
|
'testLogFileId',
|
||||||
|
$log->getLogFileId()
|
||||||
|
);
|
||||||
|
// good, change
|
||||||
|
$log->setLogFileId('validID');
|
||||||
|
$this->assertEquals(
|
||||||
|
'validID',
|
||||||
|
$log->getLogFileId()
|
||||||
|
);
|
||||||
|
// invalid on init
|
||||||
|
$this->expectException(\Psr\Log\InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionMessage('LogFileId: no log file id set');
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => '$$$"#"#$"#$',
|
||||||
|
'log_folder' => self::LOG_FOLDER
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// setLogUniqueId
|
||||||
|
// getLogUniqueId
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function logUniqueIdProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'option set' => [
|
||||||
|
'option' => true,
|
||||||
|
'override' => false,
|
||||||
|
],
|
||||||
|
'direct set' => [
|
||||||
|
'option' => false,
|
||||||
|
'override' => false,
|
||||||
|
],
|
||||||
|
'override set' => [
|
||||||
|
'option' => false,
|
||||||
|
'override' => true,
|
||||||
|
],
|
||||||
|
'option and override set' => [
|
||||||
|
'option' => false,
|
||||||
|
'override' => true,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::setLogUniqueId
|
||||||
|
* @covers ::getLogUniqueId
|
||||||
|
* @dataProvider logUniqueIdProvider
|
||||||
|
* @testdox per run log id set test: option: $option, override: $override [$_dataName]
|
||||||
|
*
|
||||||
|
* @param bool $option
|
||||||
|
* @param bool $override
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testLogUniqueId(bool $option, bool $override): void
|
||||||
|
{
|
||||||
|
if ($option === true) {
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testLogUniqueId',
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
'log_per_run' => $option
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testLogUniqueId',
|
||||||
|
'log_folder' => self::LOG_FOLDER
|
||||||
|
]);
|
||||||
|
$log->setLogUniqueId();
|
||||||
|
}
|
||||||
|
$per_run_id = $log->getLogUniqueId();
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
"/^\d{4}-\d{2}-\d{2}_\d{6}_U_[a-z0-9]{8}$/",
|
||||||
|
$per_run_id,
|
||||||
|
'assert per log run id 1st'
|
||||||
|
);
|
||||||
|
if ($override === true) {
|
||||||
|
$log->setLogUniqueId(true);
|
||||||
|
$per_run_id_2nd = $log->getLogUniqueId();
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
"/^\d{4}-\d{2}-\d{2}_\d{6}_U_[a-z0-9]{8}$/",
|
||||||
|
$per_run_id_2nd,
|
||||||
|
'assert per log run id 2nd'
|
||||||
|
);
|
||||||
|
$this->assertNotEquals(
|
||||||
|
$per_run_id,
|
||||||
|
$per_run_id_2nd,
|
||||||
|
'1st and 2nd don\'t match'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// setLogDate
|
||||||
|
// getLogDate
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::setLogDate
|
||||||
|
* @covers ::getLogDate
|
||||||
|
* @testdox setLogDate set/get checks
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetLogDate(): void
|
||||||
|
{
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testLogFileId',
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
'log_per_date' => true,
|
||||||
|
]);
|
||||||
|
$this->assertEquals(
|
||||||
|
date('Y-m-d'),
|
||||||
|
$log->getLogDate()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// setLogFlag
|
||||||
|
// getLogFlag
|
||||||
|
// unsetLogFlag
|
||||||
|
// getLogFlags
|
||||||
|
// Logger\Flag
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers Logger\Flag
|
||||||
|
* @testdox Logger\Flag enum test
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testLoggerFlag(): void
|
||||||
|
{
|
||||||
|
// logger flags to check that they exist
|
||||||
|
$flags = [
|
||||||
|
'all_off' => 0,
|
||||||
|
'per_run' => 1,
|
||||||
|
'per_date' => 2,
|
||||||
|
'per_group' => 4,
|
||||||
|
'per_page' => 8,
|
||||||
|
'per_class' => 16,
|
||||||
|
'per_level' => 32,
|
||||||
|
];
|
||||||
|
// from int -> return value
|
||||||
|
foreach ($flags as $name => $value) {
|
||||||
|
$this->assertEquals(
|
||||||
|
Flag::fromName($name),
|
||||||
|
Flag::fromValue($value)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::setLogFlag
|
||||||
|
* @covers ::getLogFlag
|
||||||
|
* @covers ::unsetLogFlag
|
||||||
|
* @covers ::getLogFlags
|
||||||
|
* @testdox setLogDate set/get checks
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetLogFlag(): void
|
||||||
|
{
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testSetLogFlag',
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
]);
|
||||||
|
// set valid log flag
|
||||||
|
$log->setLogFlag(Flag::per_run);
|
||||||
|
$this->assertTrue(
|
||||||
|
$log->getLogFlag(Flag::per_run)
|
||||||
|
);
|
||||||
|
// flags seum
|
||||||
|
$this->assertEquals(
|
||||||
|
Flag::per_run->value,
|
||||||
|
$log->getLogFlags(),
|
||||||
|
);
|
||||||
|
// unset valid log flag
|
||||||
|
$log->unsetLogFlag(Flag::per_run);
|
||||||
|
$this->assertFalse(
|
||||||
|
$log->getLogFlag(Flag::per_run)
|
||||||
|
);
|
||||||
|
// illegal Flags cannot be set, they will throw eerros onrun
|
||||||
|
|
||||||
|
// test multi set and sum is equals set
|
||||||
|
$log->setLogFlag(Flag::per_date);
|
||||||
|
$log->setLogFlag(Flag::per_group);
|
||||||
|
$this->assertEquals(
|
||||||
|
Flag::per_date->value + Flag::per_group->value,
|
||||||
|
$log->getLogFlags()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// setLogFolder
|
||||||
|
// getLogFolder
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::setLogFolder
|
||||||
|
* @covers ::getLogFolder
|
||||||
|
* @testdox setLogFolder set/get checks, init check
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetLogFolder(): void
|
||||||
|
{
|
||||||
|
// set to good folder
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testSetLogFolder',
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
]);
|
||||||
|
$this->assertEquals(
|
||||||
|
self::LOG_FOLDER,
|
||||||
|
$log->getLogFolder()
|
||||||
|
);
|
||||||
|
// set to a good other folder
|
||||||
|
$log->setLogFolder(DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR);
|
||||||
|
$this->assertEquals(
|
||||||
|
DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR,
|
||||||
|
$log->getLogFolder()
|
||||||
|
);
|
||||||
|
// good other folder with missing trailing slash
|
||||||
|
$log->setLogFolder(DIRECTORY_SEPARATOR . 'tmp');
|
||||||
|
$this->assertEquals(
|
||||||
|
DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR,
|
||||||
|
$log->getLogFolder()
|
||||||
|
);
|
||||||
|
// a bad folder -> last good folder
|
||||||
|
$log->setLogFolder('I-am-not existing');
|
||||||
|
$this->assertEquals(
|
||||||
|
DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR,
|
||||||
|
$log->getLogFolder()
|
||||||
|
);
|
||||||
|
// init with a bad folder
|
||||||
|
$this->expectException(\Psr\Log\InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionMessage('Folder: "I-am-bad" is not writeable for logging');
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testSetLogFolderInvalid',
|
||||||
|
'log_folder' => 'I-am-bad',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// getLogFile (no set, only correct after log run)
|
||||||
|
|
||||||
|
// setLogMaxFileSize
|
||||||
|
// getLogMaxFileSize
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::setLogMaxFileSize
|
||||||
|
* @covers ::getLogMaxFileSize
|
||||||
|
* @testdox setLogMaxFileSize set/get checks, init check
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetLogMaxFileSize(): void
|
||||||
|
{
|
||||||
|
// init set to 0
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testSetLogMaxFileSize',
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
]);
|
||||||
|
$this->assertEquals(
|
||||||
|
0,
|
||||||
|
$log->getLogMaxFileSize()
|
||||||
|
);
|
||||||
|
// set to new, valid size
|
||||||
|
$file_size = 200 * 1024;
|
||||||
|
$valid = $log->setLogMaxFileSize($file_size);
|
||||||
|
$this->assertTrue($valid);
|
||||||
|
$this->assertEquals(
|
||||||
|
$file_size,
|
||||||
|
$log->getLogMaxFileSize()
|
||||||
|
);
|
||||||
|
// invalid size, < 0, will be last and return false
|
||||||
|
$valid = $log->setLogMaxFileSize(-1);
|
||||||
|
$this->assertFalse($valid);
|
||||||
|
$this->assertEquals(
|
||||||
|
$file_size,
|
||||||
|
$log->getLogMaxFileSize()
|
||||||
|
);
|
||||||
|
// too small (< MIN_LOG_MAX_FILESIZE)
|
||||||
|
$valid = $log->setLogMaxFileSize($log::MIN_LOG_MAX_FILESIZE - 1);
|
||||||
|
$this->assertFalse($valid);
|
||||||
|
$this->assertEquals(
|
||||||
|
$file_size,
|
||||||
|
$log->getLogMaxFileSize()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// getOption (option params)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::getOption
|
||||||
|
* @testdox getOption checks
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetOption(): void
|
||||||
|
{
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testGetOption',
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
]);
|
||||||
|
$this->assertEquals(
|
||||||
|
self::LOG_FOLDER,
|
||||||
|
$log->getOption('log_folder')
|
||||||
|
);
|
||||||
|
// not found
|
||||||
|
$this->assertNull(
|
||||||
|
$log->getOption('I_do not exist')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// test all logger functions
|
||||||
|
// debug (special)
|
||||||
|
// info
|
||||||
|
// notice
|
||||||
|
// warning
|
||||||
|
// error
|
||||||
|
// critical
|
||||||
|
// alert
|
||||||
|
// emergency
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::debug
|
||||||
|
* @testdox debug checks
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testDebug(): void
|
||||||
|
{
|
||||||
|
// init logger
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testDebug',
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
]);
|
||||||
|
// clean all data in folder first
|
||||||
|
array_map('unlink', glob($log->getLogFolder() . $log->getLogFileId() . '*.log'));
|
||||||
|
|
||||||
|
$group_id = 'G';
|
||||||
|
$message = 'D';
|
||||||
|
$log_status = $log->debug($group_id, $message);
|
||||||
|
$this->assertTrue($log_status, 'debug write successful');
|
||||||
|
$file_content = file_get_contents(
|
||||||
|
$log->getLogFolder() . $log->getLogFile()
|
||||||
|
) ?: '';
|
||||||
|
$log_level = $log->getLoggingLevel()->getName();
|
||||||
|
// [2023-05-30 15:51:39.36128800] [NOHOST:0]
|
||||||
|
// [www/vendor/bin/phpunit] [7b9d0747] {PHPUnit\TextUI\Command}
|
||||||
|
// <DEBUG:G> D
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
"/" . self::REGEX_BASE
|
||||||
|
. "<$log_level:$group_id>\s{1}" // log level / group id
|
||||||
|
. "$message" // message
|
||||||
|
. "/",
|
||||||
|
$file_content
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function providerLoggingLevelWrite(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'info' => [
|
||||||
|
'message' => 'I',
|
||||||
|
'file_id' => Level::Info->name,
|
||||||
|
'level' => Level::Info
|
||||||
|
],
|
||||||
|
'notice' => [
|
||||||
|
'message' => 'N',
|
||||||
|
'file_id' => Level::Notice->name,
|
||||||
|
'level' => Level::Notice
|
||||||
|
],
|
||||||
|
'warning' => [
|
||||||
|
'message' => 'W',
|
||||||
|
'file_id' => Level::Warning->name,
|
||||||
|
'level' => Level::Warning
|
||||||
|
],
|
||||||
|
'error' => [
|
||||||
|
'message' => 'E',
|
||||||
|
'file_id' => Level::Error->name,
|
||||||
|
'level' => Level::Error
|
||||||
|
],
|
||||||
|
'crticial' => [
|
||||||
|
'message' => 'C',
|
||||||
|
'file_id' => Level::Critical->name,
|
||||||
|
'level' => Level::Critical
|
||||||
|
],
|
||||||
|
'alert' => [
|
||||||
|
'message' => 'A',
|
||||||
|
'file_id' => Level::Alert->name,
|
||||||
|
'level' => Level::Alert
|
||||||
|
],
|
||||||
|
'emergency' => [
|
||||||
|
'message' => 'Em',
|
||||||
|
'file_id' => Level::Emergency->name,
|
||||||
|
'level' => Level::Emergency
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::info
|
||||||
|
* @covers ::notice
|
||||||
|
* @covers ::warning
|
||||||
|
* @covers ::error
|
||||||
|
* @covers ::critical
|
||||||
|
* @covers ::alert
|
||||||
|
* @covers ::emergency
|
||||||
|
* @dataProvider providerLoggingLevelWrite
|
||||||
|
* @testdox logging level write checks for $level [$_dataName]
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testLoggingLevelWrite(string $message, string $file_id, Level $level): void
|
||||||
|
{
|
||||||
|
// init logger
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'test' . $file_id,
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
'log_level' => $level,
|
||||||
|
]);
|
||||||
|
// clean all data in folder first
|
||||||
|
array_map('unlink', glob($log->getLogFolder() . $log->getLogFileId() . '*.log'));
|
||||||
|
|
||||||
|
switch ($level->value) {
|
||||||
|
case 200:
|
||||||
|
$log_status = $log->info($message);
|
||||||
|
break;
|
||||||
|
case 250:
|
||||||
|
$log_status = $log->notice($message);
|
||||||
|
break;
|
||||||
|
case 300:
|
||||||
|
$log_status = $log->warning($message);
|
||||||
|
break;
|
||||||
|
case 400:
|
||||||
|
$log_status = $log->error($message);
|
||||||
|
break;
|
||||||
|
case 500:
|
||||||
|
$log_status = $log->critical($message);
|
||||||
|
break;
|
||||||
|
case 550:
|
||||||
|
$log_status = $log->alert($message);
|
||||||
|
break;
|
||||||
|
case 600:
|
||||||
|
$log_status = $log->emergency($message);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$this->assertTrue($log_status, 'log write successful');
|
||||||
|
$file_content = file_get_contents(
|
||||||
|
$log->getLogFolder() . $log->getLogFile()
|
||||||
|
) ?: '';
|
||||||
|
$log_level = $log->getLoggingLevel()->getName();
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
"/" . self::REGEX_BASE
|
||||||
|
. "<$log_level>\s{1}" // log level / group id
|
||||||
|
. "$message" // message
|
||||||
|
. "/",
|
||||||
|
$file_content,
|
||||||
|
'log message regex'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check log level that writer writes in correct level
|
||||||
|
// also that non debug ignores prefix/group
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::log
|
||||||
|
* @testdox log() general call test
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testLoggingLog(): void
|
||||||
|
{
|
||||||
|
// init logger
|
||||||
|
$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_file_id' => 'testLoggingLog',
|
||||||
|
'log_folder' => self::LOG_FOLDER,
|
||||||
|
'log_per_level' => true,
|
||||||
|
]);
|
||||||
|
$log_ok = $log->log(Level::Debug, 'DEBUG', group_id: 'GROUP_ID', prefix: 'PREFIX:');
|
||||||
|
$this->assertTrue($log_ok, 'assert ::log (debug) OK');
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->getLogFile(),
|
||||||
|
$log->getLogFileId() . '_DEBUG.log'
|
||||||
|
);
|
||||||
|
$log_ok = $log->log(Level::Info, 'INFO', group_id: 'GROUP_ID', prefix: 'PREFIX:');
|
||||||
|
$this->assertTrue($log_ok, 'assert ::log (info) OK');
|
||||||
|
$this->assertEquals(
|
||||||
|
$log->getLogFile(),
|
||||||
|
$log->getLogFileId() . '_INFO.log'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// must test flow:
|
||||||
|
// init normal
|
||||||
|
// log -> check file name
|
||||||
|
// set per date
|
||||||
|
// log -> check file name
|
||||||
|
// and same for per_run
|
||||||
|
|
||||||
|
// deprecated calls check?
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
3
4dev/tests/Logging/log/.gitignore
vendored
Normal file
3
4dev/tests/Logging/log/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
*log
|
||||||
|
*LOG
|
||||||
|
!.gitignore
|
||||||
73
4dev/tests/Security/CoreLibsSecurityPasswordTest.php
Normal file
73
4dev/tests/Security/CoreLibsSecurityPasswordTest.php
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Security\Password
|
||||||
|
* @coversDefaultClass \CoreLibs\Security\Password
|
||||||
|
* @testdox \CoreLibs\Security\Password method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsSecurityPasswordTest extends TestCase
|
||||||
|
{
|
||||||
|
public function passwordProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'matching password' => ['test', 'test', true],
|
||||||
|
'not matching password' => ['test', 'not_test', false],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function passwordRehashProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'no rehash needed' => ['$2y$10$EgWJ2WE73DWi.hIyFRCdpejLXTvHbmTK3LEOclO1tAvXAXUNuUS4W', false],
|
||||||
|
'rehash needed' => ['9c42a1346e333a770904b2a2b37fa7d3', true],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::passwordVerify
|
||||||
|
* @covers ::passwordSet
|
||||||
|
* @dataProvider passwordProvider
|
||||||
|
* @testdox passwordSet $input compare to $input_hash: passwordVerify $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $input_hash
|
||||||
|
* @param boolean $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testPasswordSetVerify(string $input, string $input_hash, bool $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Security\Password::passwordVerify($input, \CoreLibs\Security\Password::passwordSet($input_hash))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::passwordRehashCheck
|
||||||
|
* @dataProvider passwordRehashProvider
|
||||||
|
* @testdox passwordRehashCheck $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param boolean $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testPasswordRehashCheck(string $input, bool $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Security\Password::passwordRehashCheck($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
172
4dev/tests/Security/CoreLibsSecuritySymmetricEncryptionTest.php
Normal file
172
4dev/tests/Security/CoreLibsSecuritySymmetricEncryptionTest.php
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use CoreLibs\Security\CreateKey;
|
||||||
|
use CoreLibs\Security\SymmetricEncryption;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Security\SymmetricEncryption and Security\CreateKey
|
||||||
|
* @coversDefaultClass \CoreLibs\Security\SymmetricEncryption
|
||||||
|
* @testdox \CoreLibs\Security\SymmetricEncryption method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function providerEncryptDecryptSuccess(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'valid string' => [
|
||||||
|
'input' => 'I am a secret',
|
||||||
|
'expected' => 'I am a secret',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test encrypt/decrypt produce correct output
|
||||||
|
*
|
||||||
|
* @covers ::generateRandomKey
|
||||||
|
* @covers ::encrypt
|
||||||
|
* @covers ::decrypt
|
||||||
|
* @dataProvider providerEncryptDecryptSuccess
|
||||||
|
* @testdox encrypt/decrypt $input must be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testEncryptDecryptSuccess(string $input, string $expected): void
|
||||||
|
{
|
||||||
|
$key = CreateKey::generateRandomKey();
|
||||||
|
$encrypted = SymmetricEncryption::encrypt($input, $key);
|
||||||
|
$decrypted = SymmetricEncryption::decrypt($encrypted, $key);
|
||||||
|
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$decrypted
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function providerEncryptFailed(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'wrong decryption key' => [
|
||||||
|
'input' => 'I am a secret',
|
||||||
|
'excpetion_message' => 'Invalid Key'
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test decryption with wrong key
|
||||||
|
*
|
||||||
|
* @covers ::generateRandomKey
|
||||||
|
* @covers ::encrypt
|
||||||
|
* @covers ::decrypt
|
||||||
|
* @dataProvider providerEncryptFailed
|
||||||
|
* @testdox decrypt with wrong key $input throws $exception_message [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $exception_message
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testEncryptFailed(string $input, string $exception_message): void
|
||||||
|
{
|
||||||
|
$key = CreateKey::generateRandomKey();
|
||||||
|
$encrypted = SymmetricEncryption::encrypt($input, $key);
|
||||||
|
$wrong_key = CreateKey::generateRandomKey();
|
||||||
|
$this->expectExceptionMessage($exception_message);
|
||||||
|
SymmetricEncryption::decrypt($encrypted, $wrong_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function providerWrongKey(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'not hex key' => [
|
||||||
|
'key' => 'not_a_hex_key',
|
||||||
|
'exception_message' => 'Invalid hex key'
|
||||||
|
],
|
||||||
|
'too short hex key' => [
|
||||||
|
'key' => '1cabd5cba9e042f12522f4ff2de5c31d233b',
|
||||||
|
'excpetion_message' => 'Key is not the correct size (must be '
|
||||||
|
. 'SODIUM_CRYPTO_SECRETBOX_KEYBYTES bytes long).'
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test invalid key provided to decrypt or encrypt
|
||||||
|
*
|
||||||
|
* @covers ::encrypt
|
||||||
|
* @covers ::decrypt
|
||||||
|
* @dataProvider providerWrongKey
|
||||||
|
* @testdox wrong key $key throws $exception_message [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $key
|
||||||
|
* @param string $exception_message
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testWrongKey(string $key, string $exception_message): void
|
||||||
|
{
|
||||||
|
$this->expectExceptionMessage($exception_message);
|
||||||
|
SymmetricEncryption::encrypt('test', $key);
|
||||||
|
// we must encrypt valid thing first so we can fail with the wrong kjey
|
||||||
|
$enc_key = CreateKey::generateRandomKey();
|
||||||
|
$encrypted = SymmetricEncryption::encrypt('test', $enc_key);
|
||||||
|
$this->expectExceptionMessage($exception_message);
|
||||||
|
SymmetricEncryption::decrypt($encrypted, $key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function providerWrongCiphertext(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'too short ciphertext' => [
|
||||||
|
'input' => 'short',
|
||||||
|
'exception_message' => 'Invalid ciphertext (too short)'
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::decrypt
|
||||||
|
* @dataProvider providerWrongCiphertext
|
||||||
|
* @testdox too short ciphertext $input throws $exception_message [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $exception_message
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testWrongCiphertext(string $input, string $exception_message): void
|
||||||
|
{
|
||||||
|
$key = CreateKey::generateRandomKey();
|
||||||
|
$this->expectExceptionMessage($exception_message);
|
||||||
|
SymmetricEncryption::decrypt($input, $key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
34
4dev/tests/Template/CoreLibsTemplateHtmlBuilderBlockTest.php
Normal file
34
4dev/tests/Template/CoreLibsTemplateHtmlBuilderBlockTest.php
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use CoreLibs\Template\HtmlBuilder\Block;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Template\HtmlBuilder\Block
|
||||||
|
* @coversDefaultClass \CoreLibs\Template\HtmlBuilder\Block
|
||||||
|
* @testdox \CoreLibs\Template\HtmlBuilder\Block method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsTemplateHtmlBuilderBlockTest extends TestCase
|
||||||
|
{
|
||||||
|
public function testCreateBlock(): void
|
||||||
|
{
|
||||||
|
$el = Block::cel('div', 'id', 'content', ['css'], ['onclick' => 'foo();']);
|
||||||
|
$this->assertEquals(
|
||||||
|
'<div id="id" class="css" onclick="foo();">content</div>',
|
||||||
|
Block::buildHtml($el)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ael
|
||||||
|
// aelx|addSub
|
||||||
|
// resetSub
|
||||||
|
// acssel/rcssel/scssel
|
||||||
|
// buildHtml
|
||||||
|
// buildHtmlFromList|printHtmlFromArray
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
546
4dev/tests/Template/CoreLibsTemplateHtmlBuilderElementTest.php
Normal file
546
4dev/tests/Template/CoreLibsTemplateHtmlBuilderElementTest.php
Normal file
@@ -0,0 +1,546 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use CoreLibs\Template\HtmlBuilder\Element;
|
||||||
|
use CoreLibs\Template\HtmlBuilder\General\Error;
|
||||||
|
use CoreLibs\Template\HtmlBuilder\General\HtmlBuilderExcpetion;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Template\HtmlBuilder\Element
|
||||||
|
* @coversDefaultClass \CoreLibs\Template\HtmlBuilder\Element
|
||||||
|
* @testdox \CoreLibs\Template\HtmlBuilder\Element method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsTemplateHtmlBuilderElementTest extends TestCase
|
||||||
|
{
|
||||||
|
public function providerCreateElements(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'simple div' => [
|
||||||
|
'tag' => 'div',
|
||||||
|
'id' => 'id',
|
||||||
|
'content' => 'content',
|
||||||
|
'css' => ['css'],
|
||||||
|
'options' => ['onclick' => 'foo();'],
|
||||||
|
'expected' => '<div id="id" class="css" onclick="foo();">content</div>'
|
||||||
|
],
|
||||||
|
'simple input' => [
|
||||||
|
'tag' => 'input',
|
||||||
|
'id' => 'id',
|
||||||
|
'content' => null,
|
||||||
|
'css' => ['css'],
|
||||||
|
'options' => ['name' => 'name', 'onclick' => 'foo();'],
|
||||||
|
'expected' => '<input id="id" name="name" class="css" onclick="foo();">'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::Element
|
||||||
|
* @covers ::buildHtml
|
||||||
|
* @covers ::getTag
|
||||||
|
* @covers ::getId
|
||||||
|
* @covers ::getContent
|
||||||
|
* @covers ::getOptions
|
||||||
|
* @covers ::getCss
|
||||||
|
* @dataProvider providerCreateElements
|
||||||
|
* @testdox create single new Element test [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $tag
|
||||||
|
* @param string|null $id
|
||||||
|
* @param string|null $content
|
||||||
|
* @param array|null $css
|
||||||
|
* @param array|null $options
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCreateElement(
|
||||||
|
string $tag,
|
||||||
|
?string $id,
|
||||||
|
?string $content,
|
||||||
|
?array $css,
|
||||||
|
?array $options,
|
||||||
|
string $expected
|
||||||
|
): void {
|
||||||
|
$el = new Element($tag, $id ?? '', $content ?? '', $css ?? [], $options ?? []);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$el->buildHtml(),
|
||||||
|
'element creation failed'
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals(
|
||||||
|
$tag,
|
||||||
|
$el->getTag(),
|
||||||
|
'get tag failed'
|
||||||
|
);
|
||||||
|
|
||||||
|
if ($id !== null) {
|
||||||
|
$this->assertEquals(
|
||||||
|
$id,
|
||||||
|
$el->getId(),
|
||||||
|
'get id failed'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if ($content !== null) {
|
||||||
|
$this->assertEquals(
|
||||||
|
$content,
|
||||||
|
$el->getContent(),
|
||||||
|
'get content failed'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if ($css !== null) {
|
||||||
|
$this->assertEquals(
|
||||||
|
$css,
|
||||||
|
$el->getCss(),
|
||||||
|
'get css failed'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if ($options !== null) {
|
||||||
|
$this->assertEquals(
|
||||||
|
$options,
|
||||||
|
$el->getOptions(),
|
||||||
|
'get options failed'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (!empty($options['name'])) {
|
||||||
|
$this->assertEquals(
|
||||||
|
$options['name'],
|
||||||
|
$el->getName(),
|
||||||
|
'get name failed'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* css add/remove
|
||||||
|
*
|
||||||
|
* @cover ::getCss
|
||||||
|
* @cover ::addCss
|
||||||
|
* @cover ::removeCss
|
||||||
|
* @testdox test handling of adding and removing css classes
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCssHandling(): void
|
||||||
|
{
|
||||||
|
$el = new Element('div', 'css-test', 'CSS content');
|
||||||
|
$this->assertEqualsCanonicalizing(
|
||||||
|
[],
|
||||||
|
$el->getCss(),
|
||||||
|
'check empty css'
|
||||||
|
);
|
||||||
|
$el->addCss('foo');
|
||||||
|
$this->assertEqualsCanonicalizing(
|
||||||
|
['foo'],
|
||||||
|
$el->getCss(),
|
||||||
|
'check added one css'
|
||||||
|
);
|
||||||
|
$el->removeCss('foo');
|
||||||
|
$this->assertEqualsCanonicalizing(
|
||||||
|
[],
|
||||||
|
$el->getCss(),
|
||||||
|
'check remove added css'
|
||||||
|
);
|
||||||
|
// add serveral
|
||||||
|
// remove some of them
|
||||||
|
$el->addCss('a', 'b', 'c');
|
||||||
|
$this->assertEqualsCanonicalizing(
|
||||||
|
['a', 'b', 'c'],
|
||||||
|
$el->getCss(),
|
||||||
|
'check added some css'
|
||||||
|
);
|
||||||
|
$el->removeCss('a', 'c');
|
||||||
|
// $this->assertArray
|
||||||
|
$this->assertEqualsCanonicalizing(
|
||||||
|
['b'],
|
||||||
|
$el->getCss(),
|
||||||
|
'check remove some css'
|
||||||
|
);
|
||||||
|
// chained add and remove
|
||||||
|
$el->addCss('a', 'b', 'c', 'd')->removeCss('b', 'd');
|
||||||
|
$this->assertEqualsCanonicalizing(
|
||||||
|
['a', 'c'],
|
||||||
|
$el->getCss(),
|
||||||
|
'check chain add remove some css'
|
||||||
|
);
|
||||||
|
$el->resetCss();
|
||||||
|
$this->assertEqualsCanonicalizing(
|
||||||
|
[],
|
||||||
|
$el->getCss(),
|
||||||
|
'check reset css'
|
||||||
|
);
|
||||||
|
// remove something that does not eixst
|
||||||
|
$el->addCss('exists');
|
||||||
|
$el->removeCss('not');
|
||||||
|
$this->assertEqualsCanonicalizing(
|
||||||
|
['exists'],
|
||||||
|
$el->getCss(),
|
||||||
|
'check remove not exitsing'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nested test
|
||||||
|
*
|
||||||
|
* @testdox nested test and loop assign detection
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testBuildNested(): void
|
||||||
|
{
|
||||||
|
Error::resetMessages();
|
||||||
|
$el = new Element('div', 'build-test');
|
||||||
|
$el_sub = new Element('div', 'sub-1');
|
||||||
|
$el->addSub($el_sub);
|
||||||
|
$this->assertEquals(
|
||||||
|
'<div id="build-test"><div id="sub-1"></div></div>',
|
||||||
|
$el->buildHtml(),
|
||||||
|
'nested build failed'
|
||||||
|
);
|
||||||
|
// this would create a loop, throws error
|
||||||
|
$this->expectException(HtmlBuilderExcpetion::class);
|
||||||
|
$this->expectExceptionMessage("Cannot assign Element to itself, this would create an infinite loop");
|
||||||
|
$el_sub->addSub($el_sub);
|
||||||
|
$this->assertEquals(
|
||||||
|
'<div id="sub-1"></div>',
|
||||||
|
$el_sub->buildHtml(),
|
||||||
|
'loop detection failed'
|
||||||
|
);
|
||||||
|
$this->assertTrue(
|
||||||
|
Error::hasError(),
|
||||||
|
'failed to throw error post loop detection'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
[[
|
||||||
|
'level' => 'Error',
|
||||||
|
'id' => '100',
|
||||||
|
'message' => 'Cannot assign Element to itself, this would create an infinite loop',
|
||||||
|
'context' => ['tag' => 'div', 'id' => 'sub-1']
|
||||||
|
]],
|
||||||
|
Error::getMessages(),
|
||||||
|
'check error is 100 failed'
|
||||||
|
);
|
||||||
|
// get sub
|
||||||
|
$this->assertEquals(
|
||||||
|
[$el_sub],
|
||||||
|
$el->getSub(),
|
||||||
|
'get sub failed'
|
||||||
|
);
|
||||||
|
// reset sub
|
||||||
|
$el->resetSub();
|
||||||
|
$this->assertEquals(
|
||||||
|
[],
|
||||||
|
$el->getSub(),
|
||||||
|
'reset sub failed'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @testdox updated nested connection
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testNestedChangeContent(): void
|
||||||
|
{
|
||||||
|
$el = new Element('div', 'build-test');
|
||||||
|
$el_s_1 = new Element('div', 'sub-1');
|
||||||
|
$el_s_2 = new Element('div', 'sub-2');
|
||||||
|
$el_s_3 = new Element('div', 'sub-3');
|
||||||
|
$el_s_4 = new Element('div', 'sub-4');
|
||||||
|
|
||||||
|
$el->addSub($el_s_1, $el_s_2);
|
||||||
|
// only sub -1, -2
|
||||||
|
$this->assertEquals(
|
||||||
|
'<div id="build-test"><div id="sub-1"></div><div id="sub-2"></div></div>',
|
||||||
|
$el->buildHtml(),
|
||||||
|
'check basic nested'
|
||||||
|
);
|
||||||
|
|
||||||
|
// now add -3, -4 to both -1 and -2
|
||||||
|
$el_s_1->addSub($el_s_3, $el_s_4);
|
||||||
|
$el_s_2->addSub($el_s_3, $el_s_4);
|
||||||
|
$this->assertEquals(
|
||||||
|
'<div id="build-test"><div id="sub-1"><div id="sub-3"></div><div id="sub-4">'
|
||||||
|
. '</div></div><div id="sub-2"><div id="sub-3"></div><div id="sub-4"></div>'
|
||||||
|
. '</div></div>',
|
||||||
|
$el->buildHtml(),
|
||||||
|
'check nested added'
|
||||||
|
);
|
||||||
|
|
||||||
|
// now add some css to el_s_3, will update in both sets
|
||||||
|
$el_s_3->addCss('red');
|
||||||
|
$this->assertEquals(
|
||||||
|
'<div id="build-test"><div id="sub-1"><div id="sub-3" class="red"></div><div id="sub-4">'
|
||||||
|
. '</div></div><div id="sub-2"><div id="sub-3" class="red"></div><div id="sub-4"></div>'
|
||||||
|
. '</div></div>',
|
||||||
|
$el->buildHtml(),
|
||||||
|
'check nested u@dated'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @testdox test change tag/id/content
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testChangeElementData(): void
|
||||||
|
{
|
||||||
|
$el = new Element('div', 'id', 'Content');
|
||||||
|
// content change
|
||||||
|
$this->assertEquals(
|
||||||
|
'Content',
|
||||||
|
$el->getContent(),
|
||||||
|
'set content'
|
||||||
|
);
|
||||||
|
$el->setContent('New Content');
|
||||||
|
$this->assertEquals(
|
||||||
|
'New Content',
|
||||||
|
$el->getContent(),
|
||||||
|
'changed content'
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals(
|
||||||
|
'div',
|
||||||
|
$el->getTag(),
|
||||||
|
'set tag'
|
||||||
|
);
|
||||||
|
$el->setTag('span');
|
||||||
|
$this->assertEquals(
|
||||||
|
'span',
|
||||||
|
$el->getTag(),
|
||||||
|
'changed tag'
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertEquals(
|
||||||
|
'id',
|
||||||
|
$el->getId(),
|
||||||
|
'set id'
|
||||||
|
);
|
||||||
|
$el->setId('id-2');
|
||||||
|
$this->assertEquals(
|
||||||
|
'id-2',
|
||||||
|
$el->getId(),
|
||||||
|
'changed id'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @testdox test change options
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testChangeOptions(): void
|
||||||
|
{
|
||||||
|
$el = new Element('button', 'id', 'Action', ['css'], ['value' => '3']);
|
||||||
|
$this->assertEquals(
|
||||||
|
['value' => '3'],
|
||||||
|
$el->getOptions(),
|
||||||
|
'set option'
|
||||||
|
);
|
||||||
|
$el->setOptions([
|
||||||
|
'value' => '2'
|
||||||
|
]);
|
||||||
|
$this->assertEquals(
|
||||||
|
['value' => '2'],
|
||||||
|
$el->getOptions(),
|
||||||
|
'changed option'
|
||||||
|
);
|
||||||
|
// add a new one
|
||||||
|
$el->setOptions([
|
||||||
|
'Foo' => 'bar',
|
||||||
|
'Moo' => 'cow'
|
||||||
|
]);
|
||||||
|
$this->assertEquals(
|
||||||
|
[
|
||||||
|
'value' => '2',
|
||||||
|
'Foo' => 'bar',
|
||||||
|
'Moo' => 'cow'
|
||||||
|
],
|
||||||
|
$el->getOptions(),
|
||||||
|
'changed option'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// build output
|
||||||
|
// build from array list
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @testdox build element tree from object
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testBuildHtmlObject(): void
|
||||||
|
{
|
||||||
|
// build a simple block
|
||||||
|
// div -> div -> button
|
||||||
|
// -> div -> span
|
||||||
|
// -> div -> input
|
||||||
|
$el = new Element('div', 'master', '', ['master']);
|
||||||
|
$el->addSub(
|
||||||
|
Element::addElement(
|
||||||
|
new Element('div', 'div-button', '', ['dv-bt']),
|
||||||
|
new Element('button', 'button-id', 'Click me', ['bt-red'], [
|
||||||
|
'OnClick' => 'action();',
|
||||||
|
'value' => 'click',
|
||||||
|
'type' => 'button'
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
Element::addElement(
|
||||||
|
new Element('div', 'div-span', '', ['dv-sp']),
|
||||||
|
new Element('span', 'span-id', 'Big important message<br>other', ['red']),
|
||||||
|
),
|
||||||
|
Element::addElement(
|
||||||
|
new Element('div', 'div-input', '', ['dv-in']),
|
||||||
|
new Element('input', 'input-id', '', ['in-blue'], [
|
||||||
|
'OnClick' => 'otherAction();',
|
||||||
|
'value' => 'Touch',
|
||||||
|
'type' => 'button'
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'<div id="master" class="master">'
|
||||||
|
. '<div id="div-button" class="dv-bt">'
|
||||||
|
. '<button id="button-id" name="button-id" class="bt-red" OnClick="action();" '
|
||||||
|
. 'value="click" type="button">Click me</button>'
|
||||||
|
. '</div>'
|
||||||
|
. '<div id="div-span" class="dv-sp">'
|
||||||
|
. '<span id="span-id" class="red">Big important message<br>other</span>'
|
||||||
|
. '</div>'
|
||||||
|
. '<div id="div-input" class="dv-in">'
|
||||||
|
. '<input id="input-id" name="input-id" '
|
||||||
|
. 'class="in-blue" OnClick="otherAction();" value="Touch" type="button">'
|
||||||
|
. '</div>'
|
||||||
|
. '</div>',
|
||||||
|
$el->buildHtml()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @testdox build elements from array list
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testbuildHtmlArray(): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
'<div id="id-1">A</div>'
|
||||||
|
. '<div id="id-2">B</div>'
|
||||||
|
. '<div id="id-3">C</div>',
|
||||||
|
Element::buildHtmlFromList([
|
||||||
|
new Element('div', 'id-1', 'A'),
|
||||||
|
new Element('div', 'id-2', 'B'),
|
||||||
|
new Element('div', 'id-3', 'C'),
|
||||||
|
])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @testdox check for invalid tag detection, possible invalid id, possible invalid css
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testInvalidElement(): void
|
||||||
|
{
|
||||||
|
Error::resetMessages();
|
||||||
|
$this->expectException(HtmlBuilderExcpetion::class);
|
||||||
|
$this->expectExceptionMessage("Could not create Element");
|
||||||
|
$el = new Element('');
|
||||||
|
$this->assertTrue(
|
||||||
|
Error::hasError(),
|
||||||
|
'failed to set error invalid tag detection'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
[[
|
||||||
|
'level' => 'Error',
|
||||||
|
'id' => '201',
|
||||||
|
'message' => 'invalid or empty tag',
|
||||||
|
'context' => ['tag' => '']
|
||||||
|
]],
|
||||||
|
Error::getMessages(),
|
||||||
|
'check error message failed'
|
||||||
|
);
|
||||||
|
|
||||||
|
// if we set invalid tag
|
||||||
|
$el = new Element('div');
|
||||||
|
$this->expectException(HtmlBuilderExcpetion::class);
|
||||||
|
$this->expectExceptionMessageMatches("/^Invalid or empty tag: /");
|
||||||
|
$this->expectExceptionMessage("Invalid or empty tag: 123123");
|
||||||
|
$el->setTag('123123');
|
||||||
|
$this->assertTrue(
|
||||||
|
Error::hasError(),
|
||||||
|
'failed to set error invalid tag detection'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
[[
|
||||||
|
'level' => 'Error',
|
||||||
|
'id' => '201',
|
||||||
|
'message' => 'invalid or empty tag',
|
||||||
|
'context' => ['tag' => '']
|
||||||
|
]],
|
||||||
|
Error::getMessages(),
|
||||||
|
'check error message failed'
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// invalid id (warning)
|
||||||
|
Error::resetMessages();
|
||||||
|
$el = new Element('div', '-$a15');
|
||||||
|
$this->assertTrue(
|
||||||
|
Error::hasWarning(),
|
||||||
|
'failed to set warning invalid id detection'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
[[
|
||||||
|
'level' => 'Warning',
|
||||||
|
'id' => '202',
|
||||||
|
'message' => 'possible invalid id',
|
||||||
|
'context' => ['id' => '-$a15', 'tag' => 'div']
|
||||||
|
]],
|
||||||
|
Error::getMessages(),
|
||||||
|
'check error message failed'
|
||||||
|
);
|
||||||
|
|
||||||
|
// invalid name
|
||||||
|
Error::resetMessages();
|
||||||
|
$el = new Element('div', 'valid', '', [], ['name' => '-$asdf&']);
|
||||||
|
$this->assertTrue(
|
||||||
|
Error::hasWarning(),
|
||||||
|
'failed to set warning invalid name detection'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
[[
|
||||||
|
'level' => 'Warning',
|
||||||
|
'id' => '203',
|
||||||
|
'message' => 'possible invalid name',
|
||||||
|
'context' => ['name' => '-$asdf&', 'id' => 'valid', 'tag' => 'div']
|
||||||
|
]],
|
||||||
|
Error::getMessages(),
|
||||||
|
'check error message failed'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// static add element
|
||||||
|
// print object/array
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use CoreLibs\Template\HtmlBuilder\StringReplace;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Template\HtmlBuilder\StringReplace
|
||||||
|
* @coversDefaultClass \CoreLibs\Template\HtmlBuilder\StringReplace
|
||||||
|
* @testdox \CoreLibs\Template\HtmlBuilder\StringReplace method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsTemplateHtmlBuilderStringReplaceTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::replaceData
|
||||||
|
* @testdox test basic replaceData
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testReplaceData(): void
|
||||||
|
{
|
||||||
|
$html_block = <<<HTML
|
||||||
|
<div id="{ID}" class="{CSS}">
|
||||||
|
{CONTENT}
|
||||||
|
</div>
|
||||||
|
HTML;
|
||||||
|
|
||||||
|
$this->assertEquals(
|
||||||
|
<<<HTML
|
||||||
|
<div id="block-id" class="blue,red">
|
||||||
|
Some content here<br>with bla bla inside
|
||||||
|
</div>
|
||||||
|
HTML,
|
||||||
|
StringReplace::replaceData(
|
||||||
|
$html_block,
|
||||||
|
[
|
||||||
|
'ID' => 'block-id',
|
||||||
|
'CSS' => join(',', ['blue', 'red']),
|
||||||
|
'{CONTENT}' => 'Some content here<br>with bla bla inside',
|
||||||
|
]
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @testdox replaceData error
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
/* public function testReplaceDataErrors(): void
|
||||||
|
{
|
||||||
|
$this->expectException(HtmlBuilderExcpetion::class);
|
||||||
|
$this->expectExceptionMessage("Replace and content array count differ");
|
||||||
|
StringReplace::replaceData('<span>{FOO}</span>', ['{FOO}', '{BAR}'], ['foo']);
|
||||||
|
} */
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -1 +0,0 @@
|
|||||||
test.env
|
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
-- 2022/6/17 update edit_user with login uid
|
||||||
|
|
||||||
|
-- !!! COPY TABLE ARRAY FOLDER !!!
|
||||||
|
|
||||||
|
-- the login uid, at least 32 chars
|
||||||
|
ALTER TABLE edit_user ADD login_user_id VARCHAR UNIQUE;
|
||||||
|
-- CREATE UNIQUE INDEX edit_user_login_user_id_key ON edit_user (login_user_id) WHERE login_user_id IS NOT NULL;
|
||||||
|
-- ALTER TABLE edit_user ADD CONSTRAINT edit_user_login_user_id_key UNIQUE (login_user_id);
|
||||||
|
-- when above uid was set
|
||||||
|
ALTER TABLE edit_user ADD login_user_id_set_date TIMESTAMP WITHOUT TIME ZONE;
|
||||||
|
ALTER TABLE edit_user ADD login_user_id_last_revalidate TIMESTAMP WITHOUT TIME ZONE;
|
||||||
|
-- if set, from/until when the above uid is valid
|
||||||
|
ALTER TABLE edit_user ADD login_user_id_valid_from TIMESTAMP WITHOUT TIME ZONE;
|
||||||
|
ALTER TABLE edit_user ADD login_user_id_valid_until TIMESTAMP WITHOUT TIME ZONE;
|
||||||
|
-- user must login to revalidated login id after set days, 0 for forever
|
||||||
|
ALTER TABLE edit_user ADD login_user_id_revalidate_after INTERVAL;
|
||||||
|
-- lock for login user id, but still allow normal login
|
||||||
|
ALTER TABLE edit_user ADD login_user_id_locked SMALLINT NOT NULL DEFAULT 0;
|
||||||
|
|
||||||
|
-- disable login before date
|
||||||
|
ALTER TABLE edit_user ADD lock_until TIMESTAMP WITHOUT TIME ZONE;
|
||||||
|
-- disable login after date
|
||||||
|
ALTER TABLE edit_user ADD lock_after TIMESTAMP WITHOUT TIME ZONE;
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION set_login_user_id_set_date()
|
||||||
|
RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
BEGIN
|
||||||
|
-- if new is not null/empty
|
||||||
|
-- and old one is null or old one different new one
|
||||||
|
-- set NOW()
|
||||||
|
-- if new one is NULL
|
||||||
|
-- set NULL
|
||||||
|
IF
|
||||||
|
NEW.login_user_id IS NOT NULL AND NEW.login_user_id <> '' AND
|
||||||
|
(OLD.login_user_id IS NULL OR NEW.login_user_id <> OLD.login_user_id)
|
||||||
|
THEN
|
||||||
|
NEW.login_user_id_set_date = NOW();
|
||||||
|
NEW.login_user_id_last_revalidate = NOW();
|
||||||
|
ELSIF NEW.login_user_id IS NULL OR NEW.login_user_id = '' THEN
|
||||||
|
NEW.login_user_id_set_date = NULL;
|
||||||
|
NEW.login_user_id_last_revalidate = NULL;
|
||||||
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
|
|
||||||
|
CREATE TRIGGER trg_edit_user_set_login_user_id_set_date
|
||||||
|
BEFORE INSERT OR UPDATE ON edit_user
|
||||||
|
FOR EACH ROW EXECUTE PROCEDURE set_login_user_id_set_date();
|
||||||
|
|
||||||
|
-- __END__
|
||||||
22
4dev/update/20220906_edit_acl_update/20220906_readme.md
Normal file
22
4dev/update/20220906_edit_acl_update/20220906_readme.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# Files to be changed
|
||||||
|
|
||||||
|
Change: Update Generate\Form to use ACL for form creation (basic)
|
||||||
|
Date: 2022/9/6
|
||||||
|
|
||||||
|
## File List
|
||||||
|
|
||||||
|
```sh
|
||||||
|
includes/table_arrays/array_edit_pages.php
|
||||||
|
includes/table_arrays/array_edit_users.php
|
||||||
|
includes/templates/admin/edit_body.tpl
|
||||||
|
includes/templates/admin/edit_elements.tpl
|
||||||
|
includes/templates/admin/edit_load.tpl
|
||||||
|
includes/templates/admin/edit_new.tpl
|
||||||
|
includes/templates/admin/edit_save_delete.tpl
|
||||||
|
includes/edit_base.php
|
||||||
|
lib/CoreLibs/ACL/Login.php
|
||||||
|
lib/CoreLibs/DB/Extended/ArrayIO.php
|
||||||
|
lib/CoreLibs/Convert/MimeEncode.php
|
||||||
|
lib/CoreLibs/Create/Email.php
|
||||||
|
lib/CoreLibs/Output/Form/Generate.php
|
||||||
|
```
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# Files to be changed
|
||||||
|
|
||||||
|
Change: Update edit_page and template/css
|
||||||
|
Date: 2023/1/6
|
||||||
|
|
||||||
|
## Detail
|
||||||
|
|
||||||
|
* add stripes to sub table entries (edit.css)
|
||||||
|
* fix cellspacing and cellpadding in sub tables (edit_element.tpl)
|
||||||
|
* doctype added (edit_order.tpl)
|
||||||
|
* code clean up in edit base, move to class system (edit_base.php)
|
||||||
|
|
||||||
|
## File List
|
||||||
|
|
||||||
|
```sh
|
||||||
|
includes/templates/admin/edit_elements.tpl
|
||||||
|
includes/templates/admin/edit_order.tpl
|
||||||
|
includes/edit_base.php
|
||||||
|
layout/admin/css/edit.css
|
||||||
|
```
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
-- Fixes for column types
|
||||||
|
|
||||||
|
-- edit group
|
||||||
|
ALTER TABLE edit_group ALTER name TYPE VARCHAR;
|
||||||
|
-- edit language
|
||||||
|
ALTER TABLE edit_language ALTER short_name TYPE VARCHAR;
|
||||||
|
ALTER TABLE edit_language ALTER long_name TYPE VARCHAR;
|
||||||
|
ALTER TABLE edit_language ALTER iso_name TYPE VARCHAR;
|
||||||
|
-- edit menu group
|
||||||
|
ALTER TABLE edit_menu_group ALTER name TYPE VARCHAR;
|
||||||
|
ALTER TABLE edit_menu_group ALTER flag TYPE VARCHAR;
|
||||||
|
-- edit page
|
||||||
|
ALTER TABLE edit_page ALTER filename TYPE VARCHAR;
|
||||||
|
ALTER TABLE edit_page ALTER name TYPE VARCHAR;
|
||||||
|
-- edit query string
|
||||||
|
ALTER TABLE edit_query_string ALTER name TYPE VARCHAR;
|
||||||
|
ALTER TABLE edit_query_string ALTER value TYPE VARCHAR;
|
||||||
|
-- edit scheme
|
||||||
|
ALTER TABLE edit_scheme ALTER name TYPE VARCHAR;
|
||||||
|
ALTER TABLE edit_scheme ALTER header_color TYPE VARCHAR;
|
||||||
|
ALTER TABLE edit_scheme ALTER css_file TYPE VARCHAR;
|
||||||
|
ALTER TABLE edit_scheme ALTER template TYPE VARCHAR;
|
||||||
|
-- edit visible group
|
||||||
|
ALTER TABLE edit_visible_group ALTER name TYPE VARCHAR;
|
||||||
|
ALTER TABLE edit_visible_group ALTER flag TYPE VARCHAR;
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
-- Fix for edit_schemes.php DB settings
|
||||||
|
|
||||||
|
-- will not change file name only visual name
|
||||||
|
UPDATE edit_page SET name = 'Edit Schemas' WHERE filename = 'edit_schemes.php';
|
||||||
|
|
||||||
|
-- will change BOTH, must have file name renamed too
|
||||||
|
UPDATE edit_page SET name = 'Edit Schemas', filename = 'edit_schemas.php' WHERE filename = 'edit_schemes.php';
|
||||||
@@ -1,29 +1,35 @@
|
|||||||
# Upgrade to Version 6
|
# Upgrade to Version 6
|
||||||
|
|
||||||
* remove old `lib/CoreLibs` and copy the new over
|
* remove old `lib/CoreLibs` and copy the new over
|
||||||
* copy `config/config.php`
|
* copy `config/config.php`
|
||||||
* install composer if not installed `composer init` and `composer install`
|
* install composer if not installed `composer init` and `composer install`
|
||||||
* update composer.json
|
* update composer.json
|
||||||
```json
|
|
||||||
|
```json
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"classmap": [
|
"classmap": [
|
||||||
"lib/"
|
"lib/"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
```
|
```
|
||||||
|
|
||||||
Run to update autoloader list
|
Run to update autoloader list
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
composer dump-autoload
|
composer dump-autoload
|
||||||
```
|
```
|
||||||
|
|
||||||
* copy `includes/edit_base.inc`
|
* copy `includes/edit_base.inc`
|
||||||
* add session start in the top header block where the `header()` calls are
|
* add session start in the top header block where the `header()` calls are
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// start session
|
// start session
|
||||||
CoreLibs\Create\Session::startSession();
|
CoreLibs\Create\Session::startSession();
|
||||||
```
|
```
|
||||||
* update all header calls if needed to add new log type call
|
|
||||||
```php
|
* update all header calls if needed to add new log type call
|
||||||
|
|
||||||
|
```php
|
||||||
// create logger
|
// create logger
|
||||||
$log = new CoreLibs\Debug\Logging([
|
$log = new CoreLibs\Debug\Logging([
|
||||||
'log_folder' => BASE . LOG,
|
'log_folder' => BASE . LOG,
|
||||||
@@ -34,17 +40,23 @@ $log = new CoreLibs\Debug\Logging([
|
|||||||
'print_all' => $PRINT_ALL ?? false,
|
'print_all' => $PRINT_ALL ?? false,
|
||||||
]);
|
]);
|
||||||
```
|
```
|
||||||
* add a db class
|
|
||||||
|
* add a db class
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// db config with logger
|
// db config with logger
|
||||||
$db = new CoreLibs\DB\IO(DB_CONFIG, $log);
|
$db = new CoreLibs\DB\IO(DB_CONFIG, $log);
|
||||||
```
|
```
|
||||||
* login class needs to have db and logger added
|
|
||||||
|
* login class needs to have db and logger added
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// login & page access check
|
// login & page access check
|
||||||
$login = new CoreLibs\ACL\Login($db, $log);
|
$login = new CoreLibs\ACL\Login($db, $log);
|
||||||
```
|
```
|
||||||
|
|
||||||
* update language class
|
* update language class
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// pre auto detect language after login
|
// pre auto detect language after login
|
||||||
$locale = \CoreLibs\Language\GetLocale::setLocale();
|
$locale = \CoreLibs\Language\GetLocale::setLocale();
|
||||||
@@ -55,35 +67,46 @@ $l10n = new \CoreLibs\Language\L10n(
|
|||||||
$locale['path'],
|
$locale['path'],
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
* smarty needs language
|
* smarty needs language
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$smarty = new CoreLibs\Template\SmartyExtend($l10n, $locale);
|
$smarty = new CoreLibs\Template\SmartyExtend($l10n, $locale);
|
||||||
```
|
```
|
||||||
|
|
||||||
* admin backend also needs logger
|
* admin backend also needs logger
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$cms = new CoreLibs\Admin\Backend($db, $log, $l10n, $locale);
|
$cms = new CoreLibs\Admin\Backend($db, $log, $l10n, $locale);
|
||||||
```
|
```
|
||||||
|
|
||||||
* update and `$cms` or similar calls so db is in `$cms->db->...` and log are in `$cms->log->...`
|
* update and `$cms` or similar calls so db is in `$cms->db->...` and log are in `$cms->log->...`
|
||||||
* update all `config.*.php` files where needed
|
* update all `config.*.php` files where needed
|
||||||
* check config.master.php for `BASE_NAME` and `G_TITLE` and set them in the `.env` file so the `config.master.php` can be copied as os
|
* check config.master.php for `BASE_NAME` and `G_TITLE` and set them in the `.env` file so the `config.master.php` can be copied as os
|
||||||
* If not doable, see changed below in `config.master.php` must remove old auto loder and `FLASH` constant at least
|
* If not doable, see changed below in `config.master.php` must remove old auto loder and `FLASH` constant at least
|
||||||
|
|
||||||
**REMOVE:**
|
**REMOVE:**
|
||||||
|
|
||||||
```php
|
```php
|
||||||
/************* AUTO LOADER *******************/
|
/************* AUTO LOADER *******************/
|
||||||
// read auto loader
|
// read auto loader
|
||||||
require BASE . LIB . 'autoloader.php';
|
require BASE . LIB . 'autoloader.php';
|
||||||
```
|
```
|
||||||
|
|
||||||
**UPDATE:**
|
**UPDATE:**
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// po langs [DEPRECAED: use LOCALE]
|
// po langs [DEPRECAED: use LOCALE]
|
||||||
define('LANG', 'lang' . DIRECTORY_SEPARATOR);
|
define('LANG', 'lang' . DIRECTORY_SEPARATOR);
|
||||||
// po locale file
|
// po locale file
|
||||||
define('LOCALE', 'locale' . DIRECTORY_SEPARATOR);
|
define('LOCALE', 'locale' . DIRECTORY_SEPARATOR);
|
||||||
```
|
```
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// SSL host name
|
// SSL host name
|
||||||
// define('SSL_HOST', $_ENV['SSL_HOST'] ?? '');
|
// define('SSL_HOST', $_ENV['SSL_HOST'] ?? '');
|
||||||
```
|
```
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// define full regex
|
// define full regex
|
||||||
define('PASSWORD_REGEX', "/^"
|
define('PASSWORD_REGEX', "/^"
|
||||||
@@ -93,11 +116,13 @@ define('PASSWORD_REGEX', "/^"
|
|||||||
. (defined('PASSWORD_SPECIAL') ? PASSWORD_SPECIAL : '')
|
. (defined('PASSWORD_SPECIAL') ? PASSWORD_SPECIAL : '')
|
||||||
. "[A-Za-z\d" . PASSWORD_SPECIAL_RANGE . "]{" . PASSWORD_MIN_LENGTH . "," . PASSWORD_MAX_LENGTH . "}$/");
|
. "[A-Za-z\d" . PASSWORD_SPECIAL_RANGE . "]{" . PASSWORD_MIN_LENGTH . "," . PASSWORD_MAX_LENGTH . "}$/");
|
||||||
```
|
```
|
||||||
|
|
||||||
```php
|
```php
|
||||||
/************* LAYOUT WIDTHS *************/
|
/************* LAYOUT WIDTHS *************/
|
||||||
define('PAGE_WIDTH', '100%');
|
define('PAGE_WIDTH', '100%');
|
||||||
define('CONTENT_WIDTH', '100%');
|
define('CONTENT_WIDTH', '100%');
|
||||||
```
|
```
|
||||||
|
|
||||||
```php
|
```php
|
||||||
/************* OVERALL CONTROL NAMES *************/
|
/************* OVERALL CONTROL NAMES *************/
|
||||||
// BELOW has HAS to be changed
|
// BELOW has HAS to be changed
|
||||||
@@ -105,6 +130,7 @@ define('CONTENT_WIDTH', '100%');
|
|||||||
// only alphanumeric characters, strip all others
|
// only alphanumeric characters, strip all others
|
||||||
define('BASE_NAME', preg_replace('/[^A-Za-z0-9]/', '', $_ENV['BASE_NAME'] ?? ''));
|
define('BASE_NAME', preg_replace('/[^A-Za-z0-9]/', '', $_ENV['BASE_NAME'] ?? ''));
|
||||||
```
|
```
|
||||||
|
|
||||||
```php
|
```php
|
||||||
/************* LANGUAGE / ENCODING *******/
|
/************* LANGUAGE / ENCODING *******/
|
||||||
// default lang + encoding
|
// default lang + encoding
|
||||||
@@ -112,6 +138,7 @@ define('DEFAULT_LOCALE', 'en_US.UTF-8');
|
|||||||
// default web page encoding setting
|
// default web page encoding setting
|
||||||
define('DEFAULT_ENCODING', 'UTF-8');
|
define('DEFAULT_ENCODING', 'UTF-8');
|
||||||
```
|
```
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// BAIL ON MISSING DB CONFIG:
|
// BAIL ON MISSING DB CONFIG:
|
||||||
// we have either no db selction for this host but have db config entries
|
// we have either no db selction for this host but have db config entries
|
||||||
@@ -131,34 +158,43 @@ if (
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// remove SITE_LANG
|
// remove SITE_LANG
|
||||||
define('SITE_LOCALE', $SITE_CONFIG[HOST_NAME]['site_locale'] ?? DEFAULT_LOCALE);
|
define('SITE_LOCALE', $SITE_CONFIG[HOST_NAME]['site_locale'] ?? DEFAULT_LOCALE);
|
||||||
define('SITE_ENCODING', $SITE_CONFIG[HOST_NAME]['site_encoding'] ?? DEFAULT_ENCODING);
|
define('SITE_ENCODING', $SITE_CONFIG[HOST_NAME]['site_encoding'] ?? DEFAULT_ENCODING);
|
||||||
```
|
```
|
||||||
|
|
||||||
```php
|
```php
|
||||||
/************* GENERAL PAGE TITLE ********/
|
/************* GENERAL PAGE TITLE ********/
|
||||||
define('G_TITLE', $_ENV['G_TITLE'] ?? '');
|
define('G_TITLE', $_ENV['G_TITLE'] ?? '');
|
||||||
```
|
```
|
||||||
|
|
||||||
* move all login passweords into the `.env` file in the `configs/` folder
|
* move all login passweords into the `.env` file in the `configs/` folder
|
||||||
in the `.env` file
|
in the `.env` file
|
||||||
```
|
|
||||||
|
```sql
|
||||||
DB_NAME.TEST=some_database
|
DB_NAME.TEST=some_database
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
In the config then
|
In the config then
|
||||||
|
|
||||||
```php
|
```php
|
||||||
'db_name' => $_ENV['DB_NAME.TEST'] ?? '',
|
'db_name' => $_ENV['DB_NAME.TEST'] ?? '',
|
||||||
```
|
```
|
||||||
|
|
||||||
* config.host.php update
|
* config.host.php update
|
||||||
must add site_locale (site_lang + site_encoding)
|
must add site_locale (site_lang + site_encoding)
|
||||||
remove site_lang
|
remove site_lang
|
||||||
|
|
||||||
```php
|
```php
|
||||||
// lang + encoding
|
// lang + encoding
|
||||||
'site_locale' => 'en_US.UTF-8',
|
'site_locale' => 'en_US.UTF-8',
|
||||||
// site language
|
// site language
|
||||||
'site_encoding' => 'UTF-8',
|
'site_encoding' => 'UTF-8',
|
||||||
```
|
```
|
||||||
|
|
||||||
* copy `layout/admin/javascript/edit.jq.js`
|
* copy `layout/admin/javascript/edit.jq.js`
|
||||||
* check other javacsript files if needed (`edit.jq.js`)
|
* check other javacsript files if needed (`edit.jq.js`)
|
||||||
|
|
||||||
|
|||||||
66
README.md
66
README.md
@@ -2,19 +2,19 @@
|
|||||||
|
|
||||||
## Code Standard
|
## Code Standard
|
||||||
|
|
||||||
* Uses PSR-12
|
* Uses PSR-12
|
||||||
* tab indent instead of 4 spaces indent
|
* tab indent instead of 4 spaces indent
|
||||||
* Warning at 120 character length, error at 240 character length
|
|
||||||
|
|
||||||
## General information
|
## General information
|
||||||
|
|
||||||
Base PHP class files to setup any project
|
Base PHP class files to setup any project
|
||||||
* login
|
|
||||||
* database wrapper
|
* login
|
||||||
* basic helper class for debugging and other features
|
* database wrapper
|
||||||
* admin/frontend split
|
* basic helper class for debugging and other features
|
||||||
* domain controlled database/settings split
|
* admin/frontend split
|
||||||
* dynamic layout groups
|
* domain controlled database/settings split
|
||||||
|
* dynamic layout groups
|
||||||
|
|
||||||
## NOTE
|
## NOTE
|
||||||
|
|
||||||
@@ -23,9 +23,9 @@ There are three branches:
|
|||||||
### master
|
### master
|
||||||
|
|
||||||
The active branch, which is the namespace branch.
|
The active branch, which is the namespace branch.
|
||||||
Currently compatible with PHP 7.4 and 8.0
|
Compatible with PHP 8.1 or higher
|
||||||
|
|
||||||
### legacy
|
### legacy (deprecated)
|
||||||
|
|
||||||
The old non namepsace format layout.
|
The old non namepsace format layout.
|
||||||
This is fully deprecated and will no longer be maintaned.
|
This is fully deprecated and will no longer be maintaned.
|
||||||
@@ -38,18 +38,17 @@ Any current development is done here
|
|||||||
## Static checks
|
## Static checks
|
||||||
|
|
||||||
With phpstan (`4dev/checking/phpstan.sh`)
|
With phpstan (`4dev/checking/phpstan.sh`)
|
||||||
`phpstan`
|
`vendor/bin/phpstan`
|
||||||
|
|
||||||
With phan (`4dev/checking/phan.sh`)
|
With phan (`4dev/checking/phan.sh`)
|
||||||
`phan --progress-bar -C --analyze-twice`
|
`vendor/bin/phan --progress-bar -C --analyze-twice`
|
||||||
|
|
||||||
pslam is setup but not configured
|
pslam is setup but not configured
|
||||||
|
|
||||||
## Unit tests
|
## Unit tests
|
||||||
|
|
||||||
With phpunit (`4dev/checking/phpunit.sh`)
|
With phpunit (`4dev/checking/phpunit.sh`)
|
||||||
`phpunit -c $phpunit.xml 4dev/tests/`
|
`www/vendor/bin/phpunit -c $phpunit.xml 4dev/tests/`
|
||||||
|
|
||||||
|
|
||||||
## Other Notes
|
## Other Notes
|
||||||
|
|
||||||
@@ -58,29 +57,38 @@ With phpunit (`4dev/checking/phpunit.sh`)
|
|||||||
The following classes use _SESSION
|
The following classes use _SESSION
|
||||||
The main one is ACL\Login, this class will fail without a session started
|
The main one is ACL\Login, this class will fail without a session started
|
||||||
|
|
||||||
* \CoreLibs\ACL\Login
|
* \CoreLibs\ACL\Login
|
||||||
* \CoreLibs\Admin\Backend
|
* \CoreLibs\Admin\Backend
|
||||||
* \CoreLibs\Output\Form\Generate
|
* \CoreLibs\Output\Form\Generate
|
||||||
* \CoreLibs\Output\Form\Token
|
* \CoreLibs\Output\Form\Token
|
||||||
* \CoreLibs\Template\SmartyExtend
|
* \CoreLibs\Template\SmartyExtend
|
||||||
|
|
||||||
### Class extends
|
### Class extends
|
||||||
|
|
||||||
The following classes extend these classes
|
The following classes extend these classes
|
||||||
|
|
||||||
* \CoreLibs\ACL\Login extends \CoreLibs\DB\IO
|
* \CoreLibs\ACL\Login extends \CoreLibs\DB\IO
|
||||||
* \CoreLibs\Admin\Backend extends \CoreLibs\DB\IO
|
* \CoreLibs\Admin\Backend extends \CoreLibs\DB\IO
|
||||||
* \CoreLibs\DB\Extended\ArrayIO extends \CoreLibs\DB\IO
|
* \CoreLibs\DB\Extended\ArrayIO extends \CoreLibs\DB\IO
|
||||||
* \CoreLibs\Output\Form\Generate extends \CoreLibs\DB\Extended\ArrayIO
|
* \CoreLibs\Output\Form\Generate extends \CoreLibs\DB\Extended\ArrayIO
|
||||||
* \CoreLibs\Template\SmartyExtend extends SmartyBC
|
* \CoreLibs\Template\SmartyExtend extends SmartyBC
|
||||||
|
|
||||||
### Class used
|
### Class used
|
||||||
|
|
||||||
The following classes use the following classes
|
The following classes use the following classes
|
||||||
|
|
||||||
* \CoreLibs\ACL\Login uses \CoreLibs\Debug\Logger, \CoreLibs\Language\L10n
|
* \CoreLibs\ACL\Login uses \CoreLibs\Debug\Logging, \CoreLibs\Language\L10n
|
||||||
* \CoreLibs\DB\IO uses \CoreLibs\Debug\Logger, \CoreLibs\DB\SQL\PgSQL
|
* \CoreLibs\DB\IO uses \CoreLibs\Debug\Logging, \CoreLibs\DB\SQL\PgSQL
|
||||||
* \CoreLibs\Admin\Backend uses \CoreLibs\Debug\Logger, \CoreLibs\Language\L10n
|
* \CoreLibs\Admin\Backend uses \CoreLibs\Debug\Logging, \CoreLibs\Language\L10n
|
||||||
* \CoreLibs\Output\Form\Generate uses \CoreLibs\Debug\Logger, \CoreLibs\Language\L10n
|
* \CoreLibs\Output\Form\Generate uses \CoreLibs\Debug\Logging, \CoreLibs\Language\L10n
|
||||||
* \CoreLibs\Template\SmartyExtend uses \CoreLibs\Language\L10n
|
* \CoreLibs\Template\SmartyExtend uses \CoreLibs\Language\L10n
|
||||||
* \CoreLibs\Language\L10n uses FileReader, GetTextReader
|
* \CoreLibs\Language\L10n uses FileReader, GetTextReader
|
||||||
|
* \CoreLibs\Admin\EditBase uses \CoreLibs\Debug\Logging, \CoreLibs\Language\L10n
|
||||||
|
|
||||||
|
### Class internal load
|
||||||
|
|
||||||
|
Loads classes internal (not passed in, not extend)
|
||||||
|
|
||||||
|
* \CoreLibs\Admin\EditBase loads \CoreLibs\Template\SmartyExtend, \CoreLibs\Output\Form\Generate
|
||||||
|
* \CoreLibs\Output\From\Generate loads \CoreLibs\Debug\Logging, \CoreLibs\Language\L10n if not passed on
|
||||||
|
* \CoreLibs\Output\From\Generate loads \CoreLibs\Output\From\TableArrays
|
||||||
|
|||||||
16
ReadMe.composer-release.md
Normal file
16
ReadMe.composer-release.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# CoreLibs Composer release flow
|
||||||
|
|
||||||
|
- run local phan/phptan/phunit tests
|
||||||
|
- commit and sync to master branch
|
||||||
|
- create a version tag in master branch
|
||||||
|
- checkout development on CoreLibs-composer-all branch
|
||||||
|
- sync `php_libraries/trunk/www/lib/CoreLibs/*` to c`omposer-packages/CoreLibs-Composer-All/src/`
|
||||||
|
- if phpunit files have been changed/updated sync them to `composer-packages/CoreLibs-Composer-All/test/phpunit/`
|
||||||
|
- run phan/phpstan/phpunit tests in composer branch
|
||||||
|
- commit and sync to master
|
||||||
|
- create the same version tag as before in the trunk/master
|
||||||
|
- GITEA and GITLAB:
|
||||||
|
- Run `publish/publish.sh` script to create composer packages
|
||||||
|
- Composer Packagest local
|
||||||
|
- update pacakges.json file with new version and commit
|
||||||
|
- run `git pull egra-gitea master` on udon-core in `/var/www/html/composer/www`
|
||||||
22
composer.json
Normal file
22
composer.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"name": "egrajp/development-corelibs-dev",
|
||||||
|
"version": "dev-master",
|
||||||
|
"description": "CoreLibs: Development package",
|
||||||
|
"type": "library",
|
||||||
|
"require-dev": {
|
||||||
|
"phpstan/phpstan": "^1.10",
|
||||||
|
"phan/phan": "^5.4",
|
||||||
|
"phpstan/extension-installer": "^1.2",
|
||||||
|
"vimeo/psalm": "^5.7",
|
||||||
|
"phpstan/phpstan-deprecation-rules": "^1.1"
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"allow-plugins": {
|
||||||
|
"phpstan/extension-installer": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=8.1",
|
||||||
|
"psr/log": "^2.0 || ^3.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
2582
composer.lock
generated
Normal file
2582
composer.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user