Compare commits
215 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 | ||
|
|
0a6fdf1248 | ||
|
|
3220180d58 | ||
|
|
8c8f14ec74 | ||
|
|
643991c3fd | ||
|
|
c81c46d426 | ||
|
|
d97b173ee7 | ||
|
|
b61152f10e | ||
|
|
0c68ebe652 | ||
|
|
31d0cdb8ad | ||
|
|
0f823bd283 | ||
|
|
6385a48824 | ||
|
|
a754d897cf | ||
|
|
4600f8f7bf | ||
|
|
04e4fe46f2 | ||
|
|
c35d3c9324 | ||
|
|
e92a682a8c | ||
|
|
ea07e4b95b | ||
|
|
88178cb08d | ||
|
|
5d98be06be | ||
|
|
183cadb0fd | ||
|
|
2067a6fe1d | ||
|
|
f5b6c639fb | ||
|
|
cde29c0362 | ||
|
|
10234000b7 | ||
|
|
a63a50a412 | ||
|
|
59da10b649 | ||
|
|
b714de498f | ||
|
|
aa11937ab2 | ||
|
|
d64d5f081c | ||
|
|
3085b52714 | ||
|
|
9949a5ef7f | ||
|
|
74ba935e96 | ||
|
|
39a62ed59d | ||
|
|
1379cf1519 | ||
|
|
2d15b78d21 | ||
|
|
92ebdb4b9e | ||
|
|
a523a4e831 | ||
|
|
db8e17ae7c | ||
|
|
5b581c2ed6 | ||
|
|
1e734581d7 | ||
|
|
aecdda3557 | ||
|
|
2119b757b1 | ||
|
|
27087a0e0e | ||
|
|
2b689b666a | ||
|
|
63aeebdee0 | ||
|
|
51e700cd10 | ||
|
|
71a431d5aa | ||
|
|
6970e6221b | ||
|
|
831f3be1a8 | ||
|
|
f2aba8c466 | ||
|
|
f085ccaa38 | ||
|
|
6c3c1a908d | ||
|
|
388b90913a | ||
|
|
07aea9d7b2 | ||
|
|
edcdbee523 | ||
|
|
43b51895f0 | ||
|
|
d0e294ecf5 | ||
|
|
3c35341e8b | ||
|
|
daf1f9263c | ||
|
|
805c695d68 | ||
|
|
ffdd45e32a |
@@ -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.
|
||||||
|
|||||||
19
4dev/bin/create_mo.sh
Executable file
19
4dev/bin/create_mo.sh
Executable file
@@ -0,0 +1,19 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
BASE_FOLDER=$(dirname $(readlink -f $0))"/";
|
||||||
|
# Assume script is in 4dev/bin
|
||||||
|
base_folder="${BASE_FOLDER}../../www/";
|
||||||
|
|
||||||
|
# locale gettext po to mo translator master
|
||||||
|
for file in $(ls -1 ${base_folder}../4dev/locale/*.po); do
|
||||||
|
file=$(basename $file .po);
|
||||||
|
locale=$(echo "${file}" | cut -d "-" -f 1);
|
||||||
|
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
|
||||||
|
mkdir -p "${base_folder}/includes/locale/${locale}/LC_MESSAGES/";
|
||||||
|
fi;
|
||||||
|
msgfmt -o ${base_folder}/includes/locale/${locale}/LC_MESSAGES/${domain}.mo ${base_folder}../4dev/locale/${locale}-${domain}.po;
|
||||||
|
done;
|
||||||
|
|
||||||
|
# __END__
|
||||||
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,4 +1,46 @@
|
|||||||
|
#!/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
|
||||||
${base}www/vendor/bin/phpunit -c ${base}phpunit.xml ${base}4dev/tests/
|
# call with "t" to give verbose testdox output
|
||||||
|
# SUPPORTED: https://www.php.net/supported-versions.php
|
||||||
|
# call with php version number to force a certain php version
|
||||||
|
|
||||||
|
opt_testdox="";
|
||||||
|
if [ "${1}" = "t" ] || [ "${2}" = "t" ]; then
|
||||||
|
opt_testdox="--testdox";
|
||||||
|
fi;
|
||||||
|
php_bin="";
|
||||||
|
if [ ! -z "${1}" ]; then
|
||||||
|
case "${1}" in
|
||||||
|
# "7.3") php_bin="/usr/bin/php7.3 "; ;;
|
||||||
|
# "7.4") php_bin="/usr/bin/php7.4 "; ;;
|
||||||
|
# "8.0") php_bin="/usr/bin/php8.0 "; ;;
|
||||||
|
"8.1") php_bin="/usr/bin/php8.1 "; ;;
|
||||||
|
"8.2") php_bin="/usr/bin/php8.2 "; ;;
|
||||||
|
*) echo "Not support PHP: ${1}"; exit; ;;
|
||||||
|
esac;
|
||||||
|
fi;
|
||||||
|
if [ ! -z "${2}" ] && [ -z "${php_bin}" ]; then
|
||||||
|
case "${2}" in
|
||||||
|
# "7.3") php_bin="/usr/bin/php7.3 "; ;;
|
||||||
|
# "7.4") php_bin="/usr/bin/php7.4 "; ;;
|
||||||
|
# "8.0") php_bin="/usr/bin/php8.0 "; ;;
|
||||||
|
"8.1") php_bin="/usr/bin/php8.1 "; ;;
|
||||||
|
"8.2") php_bin="/usr/bin/php8.2 "; ;;
|
||||||
|
*) echo "Not support PHP: ${1}"; exit; ;;
|
||||||
|
esac;
|
||||||
|
fi;
|
||||||
|
|
||||||
|
phpunit_call="${php_bin}${base}www/vendor/bin/phpunit ${opt_testdox} -c ${base}phpunit.xml ${base}4dev/tests/";
|
||||||
|
|
||||||
|
${phpunit_call};
|
||||||
|
|
||||||
|
if [ ! -z "${php_bin}" ]; then
|
||||||
|
echo "CALLED WITH PHP: ${php_bin}"$(${php_bin} --version);
|
||||||
|
else
|
||||||
|
echo "Default PHP used: "$(php --version);
|
||||||
|
fi;
|
||||||
|
|
||||||
|
# __END__
|
||||||
|
|||||||
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__
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
|
# this list only holds edit_* related table data
|
||||||
# functions
|
# functions
|
||||||
function/set_uid.sql
|
|
||||||
function/set_generic.sql
|
|
||||||
function/random_string.sql
|
function/random_string.sql
|
||||||
function/set_edit_generic.sql
|
function/set_edit_generic.sql
|
||||||
function/edit_set_access_uid.sql
|
function/edit_access_set_uid.sql
|
||||||
|
function/edit_group_set_uid.sql
|
||||||
function/edit_log_partition_insert.sql
|
function/edit_log_partition_insert.sql
|
||||||
|
function/edit_user_set_login_user_id_set_date.sql
|
||||||
# generic tables
|
# generic tables
|
||||||
table/edit_temp_files.sql
|
table/edit_temp_files.sql
|
||||||
table/edit_generic.sql
|
table/edit_generic.sql
|
||||||
|
|||||||
@@ -6,20 +6,25 @@
|
|||||||
#exit;
|
#exit;
|
||||||
|
|
||||||
# if flagged 'y' then it will ask after each import to continue
|
# if flagged 'y' then it will ask after each import to continue
|
||||||
development='y';
|
development='n';
|
||||||
|
# do not import anything, just order flow output
|
||||||
test='n';
|
test='n';
|
||||||
input='';
|
# write to file do not write to DB directly
|
||||||
|
write='y';
|
||||||
# database connection info
|
# database connection info
|
||||||
db='<db name>';
|
db='<db name>';
|
||||||
host='<db host>';
|
host='<db host>';
|
||||||
user='<db user>';
|
user='<db user>';
|
||||||
schema="public";
|
schemas='public';
|
||||||
export PGPASSWORD='';
|
export PGPASSWORD='';
|
||||||
|
|
||||||
# log files
|
# log files
|
||||||
error_file="log/error";
|
error_file='log/error';
|
||||||
output_file="log/output";
|
output_file='log/output';
|
||||||
|
data_file='database_create_data.sql';
|
||||||
|
|
||||||
|
if [ "$write" = 'y' ]; then
|
||||||
|
rm -f "${data_file}";
|
||||||
|
fi;
|
||||||
if [ ! -f ORDER ]; then
|
if [ ! -f ORDER ]; then
|
||||||
echo "Could not find ORDER file";
|
echo "Could not find ORDER file";
|
||||||
exit;
|
exit;
|
||||||
@@ -40,14 +45,23 @@ while read file <&3; do
|
|||||||
if [ -f "$file" ]; then
|
if [ -f "$file" ]; then
|
||||||
for path in "$schemas"; do
|
for path in "$schemas"; do
|
||||||
echo "[+] WORK ON '${file}' @ '${path}'";
|
echo "[+] WORK ON '${file}' @ '${path}'";
|
||||||
|
# skip all on test
|
||||||
if [ "$test" = 'n' ]; then
|
if [ "$test" = 'n' ]; then
|
||||||
|
# write to file
|
||||||
|
if [ "$write" = 'y' ]; then
|
||||||
|
echo "-- START: ${file}" >> ${data_file};
|
||||||
|
cat "${file}" >> ${data_file};
|
||||||
|
echo "-- END: ${file}" >> ${data_file};
|
||||||
|
else
|
||||||
|
# write to DB
|
||||||
echo "=== START [$file] ===>" >> ${error_file};
|
echo "=== START [$file] ===>" >> ${error_file};
|
||||||
psql -U ${user} -h ${host} -f "${file}" ${db} 1>> ${output_file} 2>> ${error_file}
|
psql -U ${user} -h ${host} -f "${file}" ${db} 1>> ${output_file} 2>> ${error_file}
|
||||||
echo "=== END [$file] ===>" >> ${error_file};
|
echo "=== END [$file] ===>" >> ${error_file};
|
||||||
fi;
|
# next wait for dev
|
||||||
if [ "$development" = "y" ]; then
|
if [ "$development" = "y" ]; then
|
||||||
echo "Press 'y' to move to next. Press 'r' to reload last file. ^c to abort";
|
echo "Press 'y' to move to next. Press 'r' to reload last file. ^c to abort";
|
||||||
fi;
|
fi;
|
||||||
|
# loop run for reload on failed
|
||||||
while [ "$development" = "y" ] && [ "$input" != "y" ]; do
|
while [ "$development" = "y" ] && [ "$input" != "y" ]; do
|
||||||
read -ep "Continue (y|r|^c): " input;
|
read -ep "Continue (y|r|^c): " input;
|
||||||
if [ "$input" = "r" ]; then
|
if [ "$input" = "r" ]; then
|
||||||
@@ -60,6 +74,8 @@ while read file <&3; do
|
|||||||
fi;
|
fi;
|
||||||
done;
|
done;
|
||||||
input='';
|
input='';
|
||||||
|
fi;
|
||||||
|
fi;
|
||||||
done;
|
done;
|
||||||
elif [[ ${file::1} != "#" ]]; then
|
elif [[ ${file::1} != "#" ]]; then
|
||||||
echo "[!] COULD NOT FIND FILE: '${file}'";
|
echo "[!] COULD NOT FIND FILE: '${file}'";
|
||||||
|
|||||||
@@ -68,10 +68,11 @@ INSERT INTO edit_scheme (name, header_color, enabled) VALUES ('Visitor', 'B0C4B3
|
|||||||
INSERT INTO edit_scheme (name, header_color, enabled) VALUES ('User', '1E789E', 1);
|
INSERT INTO edit_scheme (name, header_color, enabled) VALUES ('User', '1E789E', 1);
|
||||||
|
|
||||||
-- edit language
|
-- edit language
|
||||||
|
-- short_name = locale without encoding
|
||||||
-- iso_name = encoding
|
-- iso_name = encoding
|
||||||
DELETE FROM edit_language;
|
DELETE FROM edit_language;
|
||||||
INSERT INTO edit_language (long_name, short_name, iso_name, order_number, enabled, lang_default) VALUES ('English', 'en_US', 'UTF-8', 1, 1, 1);
|
INSERT INTO edit_language (long_name, short_name, iso_name, order_number, enabled, lang_default) VALUES ('English', 'en_US', 'UTF-8', 1, 1, 1);
|
||||||
INSERT INTO edit_language (long_name, short_name, long_name, iso_name, order_number, enabled, lang_default) VALUES ('Japanese', 'ja_JP', 'UTF-8', 2, 1, 0);
|
INSERT INTO edit_language (long_name, short_name, iso_name, order_number, enabled, lang_default) VALUES ('Japanese', 'ja_JP', 'UTF-8', 2, 1, 0);
|
||||||
|
|
||||||
-- edit group
|
-- edit group
|
||||||
DELETE FROM edit_group;
|
DELETE FROM edit_group;
|
||||||
@@ -130,7 +131,7 @@ INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_
|
|||||||
-- inserts admin user so basic users can be created
|
-- inserts admin user so basic users can be created
|
||||||
DELETE FROM edit_user;
|
DELETE FROM edit_user;
|
||||||
INSERT INTO edit_user (username, password, enabled, debug, db_debug, email, protected, admin, edit_language_id, edit_group_id, edit_scheme_id, edit_access_right_id) VALUES ('admin', 'admin', 1, 1, 1, '', 1, 1,
|
INSERT INTO edit_user (username, password, enabled, debug, db_debug, email, protected, admin, edit_language_id, edit_group_id, edit_scheme_id, edit_access_right_id) VALUES ('admin', 'admin', 1, 1, 1, '', 1, 1,
|
||||||
(SELECT edit_language_id FROM edit_language WHERE short_name = 'en'),
|
(SELECT edit_language_id FROM edit_language WHERE short_name = 'en_US'),
|
||||||
(SELECT edit_group_id FROM edit_group WHERE name = 'Admin'),
|
(SELECT edit_group_id FROM edit_group WHERE name = 'Admin'),
|
||||||
(SELECT edit_scheme_id FROM edit_scheme WHERE name = 'Admin'),
|
(SELECT edit_scheme_id FROM edit_scheme WHERE name = 'Admin'),
|
||||||
(SELECT edit_access_right_id FROM edit_access_right WHERE type = 'admin')
|
(SELECT edit_access_right_id FROM edit_access_right WHERE type = 'admin')
|
||||||
|
|||||||
1031
4dev/database/database_create_data.sql
Normal file
1031
4dev/database/database_create_data.sql
Normal file
File diff suppressed because it is too large
Load Diff
28
4dev/database/function/edit_access_set_uid.sql
Normal file
28
4dev/database/function/edit_access_set_uid.sql
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
-- add uid add for edit_access table
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION set_edit_access_uid() RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
DECLARE
|
||||||
|
myrec RECORD;
|
||||||
|
v_uid VARCHAR;
|
||||||
|
BEGIN
|
||||||
|
-- skip if NEW.name is not set
|
||||||
|
IF NEW.name IS NOT NULL AND NEW.name <> '' THEN
|
||||||
|
-- use NEW.name as base, remove all spaces
|
||||||
|
-- name data is already unique, so we do not need to worry about this here
|
||||||
|
v_uid := REPLACE(NEW.name, ' ', '');
|
||||||
|
IF TG_OP = 'INSERT' THEN
|
||||||
|
-- always set
|
||||||
|
NEW.uid := v_uid;
|
||||||
|
ELSIF TG_OP = 'UPDATE' THEN
|
||||||
|
-- check if not set, then set
|
||||||
|
SELECT INTO myrec t.* FROM edit_access t WHERE edit_access_id = NEW.edit_access_id;
|
||||||
|
IF FOUND THEN
|
||||||
|
NEW.uid := v_uid;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
28
4dev/database/function/edit_group_set_uid.sql
Executable file
28
4dev/database/function/edit_group_set_uid.sql
Executable file
@@ -0,0 +1,28 @@
|
|||||||
|
-- add uid add for edit_group table
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION set_edit_group_uid() RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
DECLARE
|
||||||
|
myrec RECORD;
|
||||||
|
v_uid VARCHAR;
|
||||||
|
BEGIN
|
||||||
|
-- skip if NEW.name is not set
|
||||||
|
IF NEW.name IS NOT NULL AND NEW.name <> '' THEN
|
||||||
|
-- use NEW.name as base, remove all spaces
|
||||||
|
-- name data is already unique, so we do not need to worry about this here
|
||||||
|
v_uid := REPLACE(NEW.name, ' ', '');
|
||||||
|
IF TG_OP = 'INSERT' THEN
|
||||||
|
-- always set
|
||||||
|
NEW.uid := v_uid;
|
||||||
|
ELSIF TG_OP = 'UPDATE' THEN
|
||||||
|
-- check if not set, then set
|
||||||
|
SELECT INTO myrec t.* FROM edit_group t WHERE edit_group_id = NEW.edit_group_id;
|
||||||
|
IF FOUND THEN
|
||||||
|
NEW.uid := v_uid;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
-- add uid add for edit_access table
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION set_edit_access_uid() RETURNS TRIGGER AS
|
|
||||||
$$
|
|
||||||
DECLARE
|
|
||||||
myrec RECORD;
|
|
||||||
v_uid VARCHAR;
|
|
||||||
BEGIN
|
|
||||||
-- skip if NEW.name is not set
|
|
||||||
IF NEW.name IS NOT NULL AND NEW.name <> '' THEN
|
|
||||||
-- use NEW.name as base, remove all spaces
|
|
||||||
-- name data is already unique, so we do not need to worry about this here
|
|
||||||
v_uid := REPLACE(NEW.name, ' ', '');
|
|
||||||
IF TG_OP = 'INSERT' THEN
|
|
||||||
-- always set
|
|
||||||
NEW.uid := v_uid;
|
|
||||||
ELSIF TG_OP = 'UPDATE' THEN
|
|
||||||
-- check if not set, then set
|
|
||||||
SELECT INTO myrec t.* FROM edit_access t WHERE edit_access_id = NEW.edit_access_id;
|
|
||||||
IF FOUND THEN
|
|
||||||
NEW.uid := v_uid;
|
|
||||||
END IF;
|
|
||||||
END IF;
|
|
||||||
END IF;
|
|
||||||
RETURN NEW;
|
|
||||||
END;
|
|
||||||
$$
|
|
||||||
LANGUAGE 'plpgsql';
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
-- add uid add for edit_group table
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION set_edit_group_uid() RETURNS TRIGGER AS
|
|
||||||
$$
|
|
||||||
DECLARE
|
|
||||||
myrec RECORD;
|
|
||||||
v_uid VARCHAR;
|
|
||||||
BEGIN
|
|
||||||
-- skip if NEW.name is not set
|
|
||||||
IF NEW.name IS NOT NULL AND NEW.name <> '' THEN
|
|
||||||
-- use NEW.name as base, remove all spaces
|
|
||||||
-- name data is already unique, so we do not need to worry about this here
|
|
||||||
v_uid := REPLACE(NEW.name, ' ', '');
|
|
||||||
IF TG_OP = 'INSERT' THEN
|
|
||||||
-- always set
|
|
||||||
NEW.uid := v_uid;
|
|
||||||
ELSIF TG_OP = 'UPDATE' THEN
|
|
||||||
-- check if not set, then set
|
|
||||||
SELECT INTO myrec t.* FROM edit_group t WHERE edit_group_id = NEW.edit_group_id;
|
|
||||||
IF FOUND THEN
|
|
||||||
NEW.uid := v_uid;
|
|
||||||
END IF;
|
|
||||||
END IF;
|
|
||||||
END IF;
|
|
||||||
RETURN NEW;
|
|
||||||
END;
|
|
||||||
$$
|
|
||||||
LANGUAGE 'plpgsql';
|
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
-- set edit user login_user_id_set_date if login_user_id is set
|
||||||
|
-- NOW() if not empty
|
||||||
|
|
||||||
|
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';
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
-- create random string with length X
|
-- create random string with length X
|
||||||
|
|
||||||
CREATE FUNCTION random_string(randomLength int)
|
CREATE FUNCTION random_string(randomLength int)
|
||||||
RETURNS text AS $$
|
RETURNS text AS
|
||||||
|
$$
|
||||||
SELECT array_to_string(
|
SELECT array_to_string(
|
||||||
ARRAY(
|
ARRAY(
|
||||||
SELECT substring(
|
SELECT substring(
|
||||||
@@ -13,6 +14,7 @@ SELECT array_to_string(
|
|||||||
),
|
),
|
||||||
''
|
''
|
||||||
)
|
)
|
||||||
$$ LANGUAGE SQL
|
$$
|
||||||
|
LANGUAGE SQL
|
||||||
RETURNS NULL ON NULL INPUT
|
RETURNS NULL ON NULL INPUT
|
||||||
VOLATILE; -- LEAKPROOF;
|
VOLATILE; -- LEAKPROOF;
|
||||||
15
4dev/database/function/set_date.sql
Normal file
15
4dev/database/function/set_date.sql
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
-- adds the created or updated date tags
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION set_date()
|
||||||
|
RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
BEGIN
|
||||||
|
IF TG_OP = 'INSERT' THEN
|
||||||
|
NEW.date_created := 'now';
|
||||||
|
ELSIF TG_OP = 'UPDATE' THEN
|
||||||
|
NEW.date_updated := 'now';
|
||||||
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
@@ -1,15 +1,18 @@
|
|||||||
-- adds the created or updated date tags
|
-- adds the created or updated date tags
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION set_edit_generic() RETURNS TRIGGER AS '
|
CREATE OR REPLACE FUNCTION set_edit_generic()
|
||||||
|
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';
|
||||||
NEW.cuid := random_string(random_length);
|
NEW.cuid := random_string(random_length);
|
||||||
ELSIF TG_OP = ''UPDATE'' THEN
|
ELSIF TG_OP = 'UPDATE' THEN
|
||||||
NEW.date_updated := ''now'';
|
NEW.date_updated := 'now';
|
||||||
END IF;
|
END IF;
|
||||||
RETURN NEW;
|
RETURN NEW;
|
||||||
END;
|
END;
|
||||||
' LANGUAGE 'plpgsql';
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
-- adds the created or updated date tags
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION set_generic() RETURNS TRIGGER AS '
|
|
||||||
BEGIN
|
|
||||||
IF TG_OP = ''INSERT'' THEN
|
|
||||||
NEW.date_created := ''now'';
|
|
||||||
ELSIF TG_OP = ''UPDATE'' THEN
|
|
||||||
NEW.date_updated := ''now'';
|
|
||||||
END IF;
|
|
||||||
RETURN NEW;
|
|
||||||
END;
|
|
||||||
' LANGUAGE 'plpgsql';
|
|
||||||
21
4dev/database/function/set_generic_uid.sql
Normal file
21
4dev/database/function/set_generic_uid.sql
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
-- set generic with date and uid combined
|
||||||
|
-- don't use with set_generic/set_uid together
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION set_generic()
|
||||||
|
RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
|
DECLARE
|
||||||
|
random_length INT = 32; -- long for massive data
|
||||||
|
BEGIN
|
||||||
|
IF TG_OP = 'INSERT' THEN
|
||||||
|
NEW.date_created := 'now';
|
||||||
|
IF NEW.uid IS NULL THEN
|
||||||
|
NEW.uid := random_string(random_length);
|
||||||
|
END IF;
|
||||||
|
ELSIF TG_OP = 'UPDATE' THEN
|
||||||
|
NEW.date_updated := 'now';
|
||||||
|
END IF;
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
@@ -1,12 +1,15 @@
|
|||||||
-- adds the created or updated date tags
|
-- adds the created or updated date tags
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION set_uid() RETURNS TRIGGER AS '
|
CREATE OR REPLACE FUNCTION set_uid()
|
||||||
|
RETURNS TRIGGER AS
|
||||||
|
$$
|
||||||
DECLARE
|
DECLARE
|
||||||
random_length INT = 32; -- that should be long enough
|
random_length INT = 32; -- that should be long enough
|
||||||
BEGIN
|
BEGIN
|
||||||
IF TG_OP = ''INSERT'' THEN
|
IF TG_OP = 'INSERT' THEN
|
||||||
NEW.uid := random_string(random_length);
|
NEW.uid := random_string(random_length);
|
||||||
END IF;
|
END IF;
|
||||||
RETURN NEW;
|
RETURN NEW;
|
||||||
END;
|
END;
|
||||||
' LANGUAGE 'plpgsql';
|
$$
|
||||||
|
LANGUAGE 'plpgsql';
|
||||||
|
|||||||
@@ -2,15 +2,18 @@
|
|||||||
|
|
||||||
-- OLD, DEPRECATED, use set_generic.sql
|
-- OLD, DEPRECATED, use set_generic.sql
|
||||||
|
|
||||||
-- CREATE OR REPLACE FUNCTION set_generic() RETURNS TRIGGER AS '
|
-- CREATE OR REPLACE FUNCTION set_generic()
|
||||||
|
-- RETURNS TRIGGER AS
|
||||||
|
-- $$
|
||||||
-- BEGIN
|
-- BEGIN
|
||||||
-- IF TG_OP = ''INSERT'' THEN
|
-- IF TG_OP = 'INSERT' THEN
|
||||||
-- NEW.date_created := clock_timestamp();
|
-- NEW.date_created := clock_timestamp();
|
||||||
-- NEW.user_created := current_user;
|
-- NEW.user_created := current_user;
|
||||||
-- ELSIF TG_OP = ''UPDATE'' THEN
|
-- ELSIF TG_OP = 'UPDATE' THEN
|
||||||
-- NEW.date_updated := clock_timestamp();
|
-- NEW.date_updated := clock_timestamp();
|
||||||
-- NEW.user_updated := current_user;
|
-- NEW.user_updated := current_user;
|
||||||
-- END IF;
|
-- END IF;
|
||||||
-- RETURN NEW;
|
-- RETURN NEW;
|
||||||
-- END;
|
-- END;
|
||||||
-- ' LANGUAGE 'plpgsql';
|
-- $$
|
||||||
|
-- LANGUAGE 'plpgsql';
|
||||||
|
|||||||
@@ -14,3 +14,7 @@ CREATE TABLE edit_access_data (
|
|||||||
name VARCHAR,
|
name VARCHAR,
|
||||||
value VARCHAR
|
value VARCHAR
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|
||||||
|
-- create a unique index for each attached data block for each edit access can
|
||||||
|
-- only have ONE value;
|
||||||
|
CREATE UNIQUE INDEX edit_access_data_edit_access_id_name_ukey ON edit_access_data (edit_access_id, name);
|
||||||
|
|||||||
@@ -18,31 +18,82 @@ CREATE TABLE edit_user (
|
|||||||
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
edit_access_right_id INT NOT NULL,
|
edit_access_right_id INT NOT NULL,
|
||||||
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
-- username/password
|
||||||
deleted SMALLINT NOT NULL DEFAULT 0,
|
|
||||||
username VARCHAR UNIQUE,
|
username VARCHAR UNIQUE,
|
||||||
password VARCHAR,
|
password VARCHAR,
|
||||||
|
-- name block
|
||||||
first_name VARCHAR,
|
first_name VARCHAR,
|
||||||
last_name VARCHAR,
|
last_name VARCHAR,
|
||||||
first_name_furigana VARCHAR,
|
first_name_furigana VARCHAR,
|
||||||
last_name_furigana VARCHAR,
|
last_name_furigana VARCHAR,
|
||||||
|
-- email
|
||||||
|
email VARCHAR,
|
||||||
|
-- eanbled/deleted flag
|
||||||
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
deleted SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
-- general flags
|
||||||
|
strict SMALLINT DEFAULT 0,
|
||||||
|
locked SMALLINT DEFAULT 0,
|
||||||
|
protected SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
-- legacy, debug flags
|
||||||
debug SMALLINT NOT NULL DEFAULT 0,
|
debug SMALLINT NOT NULL DEFAULT 0,
|
||||||
db_debug SMALLINT NOT NULL DEFAULT 0,
|
db_debug SMALLINT NOT NULL DEFAULT 0,
|
||||||
email VARCHAR,
|
-- is admin user
|
||||||
protected SMALLINT NOT NULL DEFAULT 0,
|
|
||||||
admin SMALLINT NOT NULL DEFAULT 0,
|
admin SMALLINT NOT NULL DEFAULT 0,
|
||||||
|
-- last login log
|
||||||
last_login TIMESTAMP WITHOUT TIME ZONE,
|
last_login TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
-- login error
|
||||||
login_error_count INT DEFAULT 0,
|
login_error_count INT DEFAULT 0,
|
||||||
login_error_date_last TIMESTAMP WITHOUT TIME ZONE,
|
login_error_date_last TIMESTAMP WITHOUT TIME ZONE,
|
||||||
login_error_date_first TIMESTAMP WITHOUT TIME ZONE,
|
login_error_date_first TIMESTAMP WITHOUT TIME ZONE,
|
||||||
strict SMALLINT DEFAULT 0,
|
-- time locked
|
||||||
locked SMALLINT DEFAULT 0,
|
lock_until TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
lock_after TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
-- password change
|
||||||
password_change_date TIMESTAMP WITHOUT TIME ZONE, -- only when password is first set or changed
|
password_change_date TIMESTAMP WITHOUT TIME ZONE, -- only when password is first set or changed
|
||||||
password_change_interval INTERVAL, -- null if no change is needed, or d/m/y time interval
|
password_change_interval INTERVAL, -- null if no change is needed, or d/m/y time interval
|
||||||
password_reset_time TIMESTAMP WITHOUT TIME ZONE, -- when the password reset was requested
|
password_reset_time TIMESTAMP WITHOUT TIME ZONE, -- when the password reset was requested
|
||||||
password_reset_uid VARCHAR, -- the uid to access the password reset page
|
password_reset_uid VARCHAR, -- the uid to access the password reset page
|
||||||
|
-- _GET login id for direct login
|
||||||
|
login_user_id VARCHAR UNIQUE, -- the loginUserId, at least 32 chars
|
||||||
|
login_user_id_set_date TIMESTAMP WITHOUT TIME ZONE, -- when above uid was set
|
||||||
|
login_user_id_last_revalidate TIMESTAMP WITHOUT TIME ZONE, -- when the last login was done with user name and password
|
||||||
|
login_user_id_valid_from TIMESTAMP WITHOUT TIME ZONE, -- if set, from when the above uid is valid
|
||||||
|
login_user_id_valid_until TIMESTAMP WITHOUT TIME ZONE, -- if set, until when the above uid is valid
|
||||||
|
login_user_id_revalidate_after INTERVAL, -- user must login to revalidated loginUserId after set days, 0 for forever
|
||||||
|
login_user_id_locked SMALLINT DEFAULT 0, -- lock for loginUserId, but still allow normal login
|
||||||
|
-- additional ACL json block
|
||||||
additional_acl JSONB -- additional ACL as JSON string (can be set by other pages)
|
additional_acl JSONB -- additional ACL as JSON string (can be set by other pages)
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|
||||||
|
-- create unique index
|
||||||
|
-- CREATE UNIQUE INDEX edit_user_login_user_id_key ON edit_user (login_user_id) WHERE login_user_id IS NOT NULL;
|
||||||
|
|
||||||
|
COMMENT ON COLUMN edit_user.username IS 'Login username, must set';
|
||||||
|
COMMENT ON COLUMN edit_user.password IS 'Login password, must set';
|
||||||
|
COMMENT ON COLUMN edit_user.enabled IS 'Login is enabled (master switch)';
|
||||||
|
COMMENT ON COLUMN edit_user.deleted IS 'Login is deleted (master switch), overrides all other';
|
||||||
|
COMMENT ON COLUMN edit_user.strict IS 'If too many failed logins user will be locked, default off';
|
||||||
|
COMMENT ON COLUMN edit_user.locked IS 'Locked from too many wrong password logins';
|
||||||
|
COMMENT ON COLUMN edit_user.protected IS 'User can only be chnaged by admin user';
|
||||||
|
COMMENT ON COLUMN edit_user.debug IS 'Turn debug flag on (legacy)';
|
||||||
|
COMMENT ON COLUMN edit_user.db_debug IS 'Turn DB debug flag on (legacy)';
|
||||||
|
COMMENT ON COLUMN edit_user.admin IS 'If set, this user is SUPER admin';
|
||||||
|
COMMENT ON COLUMN edit_user.last_login IS 'Last succesfull login tiemstamp';
|
||||||
|
COMMENT ON COLUMN edit_user.login_error_count IS 'Number of failed logins, reset on successful login';
|
||||||
|
COMMENT ON COLUMN edit_user.login_error_date_last IS 'Last login error date';
|
||||||
|
COMMENT ON COLUMN edit_user.login_error_date_first IS 'First login error date, reset on successfull login';
|
||||||
|
COMMENT ON COLUMN edit_user.lock_until IS 'Account is locked until this date, <';
|
||||||
|
COMMENT ON COLUMN edit_user.lock_after IS 'Account is locked after this date, >';
|
||||||
|
COMMENT ON COLUMN edit_user.password_change_date IS 'Password was changed on';
|
||||||
|
COMMENT ON COLUMN edit_user.password_change_interval IS 'After how many days the password has to be changed';
|
||||||
COMMENT ON COLUMN edit_user.password_reset_time IS 'When the password reset was requested. For reset page uid valid check';
|
COMMENT ON COLUMN edit_user.password_reset_time IS 'When the password reset was requested. For reset page uid valid check';
|
||||||
COMMENT ON COLUMN edit_user.password_reset_uid IS 'Password reset page uid';
|
COMMENT ON COLUMN edit_user.password_reset_uid IS 'Password reset page uid, one time, invalid after reset successful or time out';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id IS 'Min 32 character UID to be used to login without password. Via GET/POST parameter';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_set_date IS 'loginUserId was set at what date';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_last_revalidate IS 'set when username/password login is done and loginUserId is set';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_valid_from IS 'loginUserId is valid from this date, >=';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_valid_until IS 'loginUserId is valid until this date, <=';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_revalidate_after IS 'If set to a number greater 0 then user must login after given amount of days to revalidate the loginUserId, set to 0 for valid forver';
|
||||||
|
COMMENT ON COLUMN edit_user.login_user_id_locked IS 'A separte lock flag for loginUserId, user can still login normal';
|
||||||
|
COMMENT ON COLUMN edit_user.additional_acl IS 'Additional Access Control List stored in JSON format';
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
-- AUTHOR: Clemens Schwaighofer
|
-- AUTHOR: Clemens Schwaighofer
|
||||||
-- DATE: 2005/07/05
|
-- DATE: 2005/07/05
|
||||||
-- DESCRIPTION:
|
-- DESCRIPTION:
|
||||||
-- cms tables; generic basic table
|
-- generic basic table with date and uid column
|
||||||
-- TABLE: generic
|
-- TABLE: generic
|
||||||
-- HISTORY:
|
-- HISTORY:
|
||||||
|
|
||||||
-- DROP TABLE edit_generic;
|
-- DROP TABLE generic;
|
||||||
CREATE TABLE generic (
|
CREATE TABLE generic (
|
||||||
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
||||||
date_updated TIMESTAMP WITHOUT TIME ZONE
|
date_updated TIMESTAMP WITHOUT TIME ZONE,
|
||||||
|
uid VARCHAR
|
||||||
);
|
);
|
||||||
|
|||||||
81
4dev/database/tests/20220622-01.edit_user-table-updates.sql
Normal file
81
4dev/database/tests/20220622-01.edit_user-table-updates.sql
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
--
|
||||||
|
SELECT
|
||||||
|
eu.cuid, eu.username,
|
||||||
|
eu.lock_until, eu.lock_after,
|
||||||
|
CASE WHEN (
|
||||||
|
(eu.lock_until IS NULL
|
||||||
|
OR (eu.lock_until IS NOT NULL AND NOW() >= eu.lock_until))
|
||||||
|
AND (eu.lock_after IS NULL
|
||||||
|
OR (eu.lock_after IS NOT NULL AND NOW() <= eu.lock_after))
|
||||||
|
) THEN 0::INT ELSE 1::INT END locked_period
|
||||||
|
FROM edit_user eu
|
||||||
|
WHERE eu.username = 'empty';
|
||||||
|
|
||||||
|
UPDATE edit_user SET
|
||||||
|
lock_until = NOW() + '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
UPDATE edit_user SET
|
||||||
|
lock_after = NOW() - '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
|
||||||
|
|
||||||
|
UPDATE edit_user SET
|
||||||
|
lock_until = NOW() - '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
UPDATE edit_user SET
|
||||||
|
lock_after = NOW() + '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
|
||||||
|
UPDATE edit_user SET lock_until = NULL, lock_after = NULL WHERE username = 'empty';
|
||||||
|
|
||||||
|
--
|
||||||
|
SELECT
|
||||||
|
eu.cuid, eu.username,
|
||||||
|
eu.login_user_id, login_user_id_set_date, eu.login_user_id_last_revalidate,
|
||||||
|
(eu.login_user_id_last_revalidate + eu.login_user_id_revalidate_after)::DATE AS reval_date, NOW()::DATE,
|
||||||
|
eu.login_user_id_valid_from, eu.login_user_id_valid_until,
|
||||||
|
eu.login_user_id_revalidate_after,
|
||||||
|
CASE WHEN (
|
||||||
|
(eu.login_user_id_valid_from IS NULL
|
||||||
|
OR (eu.login_user_id_valid_from IS NOT NULL AND NOW() >= eu.login_user_id_valid_from))
|
||||||
|
AND (eu.login_user_id_valid_until IS NULL
|
||||||
|
OR (eu.login_user_id_valid_until IS NOT NULL AND NOW() <= eu.login_user_id_valid_until))
|
||||||
|
) THEN 1::INT ELSE 0::INT END AS login_user_id_valid_date,
|
||||||
|
CASE WHEN eu.login_user_id_revalidate_after IS NOT NULL
|
||||||
|
AND eu.login_user_id_revalidate_after > '0 days'::INTERVAL
|
||||||
|
AND (eu.login_user_id_last_revalidate + eu.login_user_id_revalidate_after)::DATE <= NOW()::DATE
|
||||||
|
THEN 1::INT ELSE 0::INT END AS login_user_id_revalidate
|
||||||
|
FROM edit_user eu
|
||||||
|
WHERE eu.username = 'empty';
|
||||||
|
|
||||||
|
-- init
|
||||||
|
UPDATE edit_user SET login_user_id = random_string(5) WHERE username = 'empty';
|
||||||
|
|
||||||
|
-- outside valid
|
||||||
|
UPDATE edit_user SET
|
||||||
|
login_user_id_valid_from = NOW() - '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
UPDATE edit_user SET
|
||||||
|
login_user_id_valid_until = NOW() + '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
-- inside valid
|
||||||
|
UPDATE edit_user SET
|
||||||
|
login_user_id_valid_from = NOW() + '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
UPDATE edit_user SET
|
||||||
|
login_user_id_valid_until = NOW() - '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
|
||||||
|
-- revalidate must
|
||||||
|
UPDATE edit_user SET
|
||||||
|
login_user_id_last_revalidate = NOW() - '1 day'::interval,
|
||||||
|
login_user_id_revalidate_after = '1 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
-- revalidate not yet
|
||||||
|
UPDATE edit_user SET
|
||||||
|
login_user_id_last_revalidate = NOW(),
|
||||||
|
login_user_id_revalidate_after = '6 day'::interval
|
||||||
|
WHERE username = 'empty';
|
||||||
|
|
||||||
|
|
||||||
|
UPDATE edit_user SET login_user_id_set_date = NULL, login_user_id_last_revalidate = NULL, login_user_id_valid_from = NULL, login_user_id_valid_until = NULL, login_user_id_revalidate_after = NULL WHERE username = 'empty';
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_access ON edit_access;
|
-- DROP TRIGGER IF EXISTS trg_edit_access ON edit_access;
|
||||||
CREATE TRIGGER trg_edit_access
|
CREATE TRIGGER trg_edit_access
|
||||||
BEFORE INSERT OR UPDATE ON edit_access
|
BEFORE INSERT OR UPDATE ON edit_access
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|
||||||
DROP TRIGGER IF EXISTS trg_set_edit_access_uid ON edit_access;
|
-- DROP TRIGGER IF EXISTS trg_set_edit_access_uid ON edit_access;
|
||||||
CREATE TRIGGER trg_set_edit_access_uid
|
CREATE TRIGGER trg_set_edit_access_uid
|
||||||
BEFORE INSERT OR UPDATE ON edit_access
|
BEFORE INSERT OR UPDATE ON edit_access
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_access_uid();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_access_uid();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_access_data ON edit_access_data;
|
-- DROP TRIGGER IF EXISTS trg_edit_access_data ON edit_access_data;
|
||||||
CREATE TRIGGER trg_edit_access_data
|
CREATE TRIGGER trg_edit_access_data
|
||||||
BEFORE INSERT OR UPDATE ON edit_access_data
|
BEFORE INSERT OR UPDATE ON edit_access_data
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_access_right ON edit_access_right;
|
-- DROP TRIGGER IF EXISTS trg_edit_access_right ON edit_access_right;
|
||||||
CREATE TRIGGER trg_edit_access_right
|
CREATE TRIGGER trg_edit_access_right
|
||||||
BEFORE INSERT OR UPDATE ON edit_access_right
|
BEFORE INSERT OR UPDATE ON edit_access_right
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_access_user ON edit_access_user;
|
-- DROP TRIGGER IF EXISTS trg_edit_access_user ON edit_access_user;
|
||||||
CREATE TRIGGER trg_edit_access_user
|
CREATE TRIGGER trg_edit_access_user
|
||||||
BEFORE INSERT OR UPDATE ON edit_access_user
|
BEFORE INSERT OR UPDATE ON edit_access_user
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_group ON edit_group;
|
-- DROP TRIGGER IF EXISTS trg_edit_group ON edit_group;
|
||||||
CREATE TRIGGER trg_edit_group
|
CREATE TRIGGER trg_edit_group
|
||||||
BEFORE INSERT OR UPDATE ON edit_group
|
BEFORE INSERT OR UPDATE ON edit_group
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|
||||||
DROP TRIGGER IF EXISTS trg_set_edit_group_uid ON edit_group;
|
-- DROP TRIGGER IF EXISTS trg_set_edit_group_uid ON edit_group;
|
||||||
CREATE TRIGGER trg_set_edit_group_uid
|
CREATE TRIGGER trg_set_edit_group_uid
|
||||||
BEFORE INSERT OR UPDATE ON edit_group
|
BEFORE INSERT OR UPDATE ON edit_group
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_group_uid();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_group_uid();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_language ON edit_language;
|
-- DROP TRIGGER IF EXISTS trg_edit_language ON edit_language;
|
||||||
CREATE TRIGGER trg_edit_language
|
CREATE TRIGGER trg_edit_language
|
||||||
BEFORE INSERT OR UPDATE ON edit_language
|
BEFORE INSERT OR UPDATE ON edit_language
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_log ON edit_log;
|
-- DROP TRIGGER IF EXISTS trg_edit_log ON edit_log;
|
||||||
CREATE TRIGGER trg_edit_log
|
CREATE TRIGGER trg_edit_log
|
||||||
BEFORE INSERT OR UPDATE ON edit_log
|
BEFORE INSERT OR UPDATE ON edit_log
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|
||||||
DROP TRIGGER IF EXISTS trg_edit_log_insert_partition ON edit_log;
|
-- DROP TRIGGER IF EXISTS trg_edit_log_insert_partition ON edit_log;
|
||||||
CREATE TRIGGER trg_edit_log_insert_partition
|
CREATE TRIGGER trg_edit_log_insert_partition
|
||||||
BEFORE INSERT OR UPDATE ON edit_log
|
BEFORE INSERT OR UPDATE ON edit_log
|
||||||
FOR EACH ROW EXECUTE PROCEDURE edit_log_insert_trigger();
|
FOR EACH ROW EXECUTE PROCEDURE edit_log_insert_trigger();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_log_overflow ON edit_log_overflow;
|
-- DROP TRIGGER IF EXISTS trg_edit_log_overflow ON edit_log_overflow;
|
||||||
CREATE TRIGGER trg_edit_log_overflow
|
CREATE TRIGGER trg_edit_log_overflow
|
||||||
BEFORE INSERT OR UPDATE ON edit_log_overflow
|
BEFORE INSERT OR UPDATE ON edit_log_overflow
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_menu_group ON edit_menu_group;
|
-- DROP TRIGGER IF EXISTS trg_edit_menu_group ON edit_menu_group;
|
||||||
CREATE TRIGGER trg_edit_menu_group
|
CREATE TRIGGER trg_edit_menu_group
|
||||||
BEFORE INSERT OR UPDATE ON edit_menu_group
|
BEFORE INSERT OR UPDATE ON edit_menu_group
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_page ON edit_page;
|
-- DROP TRIGGER IF EXISTS trg_edit_page ON edit_page;
|
||||||
CREATE TRIGGER trg_edit_page
|
CREATE TRIGGER trg_edit_page
|
||||||
BEFORE INSERT OR UPDATE ON edit_page
|
BEFORE INSERT OR UPDATE ON edit_page
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_page_access ON edit_page_access;
|
-- DROP TRIGGER IF EXISTS trg_edit_page_access ON edit_page_access;
|
||||||
CREATE TRIGGER trg_edit_page_access
|
CREATE TRIGGER trg_edit_page_access
|
||||||
BEFORE INSERT OR UPDATE ON edit_page_access
|
BEFORE INSERT OR UPDATE ON edit_page_access
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_page_content ON edit_page_content;
|
-- DROP TRIGGER IF EXISTS trg_edit_page_content ON edit_page_content;
|
||||||
CREATE TRIGGER trg_edit_page_content
|
CREATE TRIGGER trg_edit_page_content
|
||||||
BEFORE INSERT OR UPDATE ON edit_page_content
|
BEFORE INSERT OR UPDATE ON edit_page_content
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_query_string ON edit_query_string;
|
-- DROP TRIGGER IF EXISTS trg_edit_query_string ON edit_query_string;
|
||||||
CREATE TRIGGER trg_edit_query_string
|
CREATE TRIGGER trg_edit_query_string
|
||||||
BEFORE INSERT OR UPDATE ON edit_query_string
|
BEFORE INSERT OR UPDATE ON edit_query_string
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_scheme ON edit_scheme;
|
-- DROP TRIGGER IF EXISTS trg_edit_scheme ON edit_scheme;
|
||||||
CREATE TRIGGER trg_edit_scheme
|
CREATE TRIGGER trg_edit_scheme
|
||||||
BEFORE INSERT OR UPDATE ON edit_scheme
|
BEFORE INSERT OR UPDATE ON edit_scheme
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,4 +1,9 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_user ON edit_user;
|
-- DROP TRIGGER IF EXISTS trg_edit_user ON edit_user;
|
||||||
CREATE TRIGGER trg_edit_user
|
CREATE TRIGGER trg_edit_user
|
||||||
BEFORE INSERT OR UPDATE ON edit_user
|
BEFORE INSERT OR UPDATE ON edit_user
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|
||||||
|
-- DROP TRIGGER IF EXISTS trg_edit_user_set_login_user_id_set_date ON edit_user;
|
||||||
|
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();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
DROP TRIGGER IF EXISTS trg_edit_visible_group ON edit_visible_group;
|
-- DROP TRIGGER IF EXISTS trg_edit_visible_group ON edit_visible_group;
|
||||||
CREATE TRIGGER trg_edit_visible_group
|
CREATE TRIGGER trg_edit_visible_group
|
||||||
BEFORE INSERT OR UPDATE ON edit_visible_group
|
BEFORE INSERT OR UPDATE ON edit_visible_group
|
||||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
-- update missing edit_* table data
|
|
||||||
|
|
||||||
ALTER TABLE edit_generic ADD cuid VARCHAR;
|
|
||||||
|
|
||||||
ALTER TABLE edit_access ADD enabled SMALLINT DEFAULT 0;
|
|
||||||
ALTER TABLE edit_access ADD protected SMALLINT DEFAULT 0;
|
|
||||||
|
|
||||||
ALTER TABLE edit_group ADD uid VARCHAR;
|
|
||||||
ALTER TABLE edit_group ADD deleted SMALLINT DEFAULT 0;
|
|
||||||
|
|
||||||
ALTER TABLE temp_files ADD folder VARCHAR;
|
|
||||||
ALTER TABLE edit_page ADD hostname VARCHAR;
|
|
||||||
|
|
||||||
ALTER TABLE edit_user ADD deleted SMALLINT DEFAULT 0;
|
|
||||||
@@ -25,7 +25,7 @@ declare(strict_types=1);
|
|||||||
* 1 for file loadable, but no data inside
|
* 1 for file loadable, but no data inside
|
||||||
* 2 for file not readable
|
* 2 for file not readable
|
||||||
* 3 for file not found
|
* 3 for file not found
|
||||||
* @deprecated V6 Use \CoreLibs\Get\ReadEnvFile::readEnvFile()
|
* @deprecated V6 Use \CoreLibs\Get\DotEnv::readEnvFile()
|
||||||
*/
|
*/
|
||||||
function readEnvFile(string $path = __DIR__, string $env_file = '.env'): int
|
function readEnvFile(string $path = __DIR__, string $env_file = '.env'): int
|
||||||
{
|
{
|
||||||
@@ -2,8 +2,7 @@
|
|||||||
# AUTHOR: Clemens Schwaighofer
|
# AUTHOR: Clemens Schwaighofer
|
||||||
# CREATED: 2005/08/09
|
# CREATED: 2005/08/09
|
||||||
# SHORT DESCRIPTION:
|
# SHORT DESCRIPTION:
|
||||||
# Backned English Messages file for gettext
|
# Backend English Messages file for gettext
|
||||||
# to craete: msgfmt -o <output.po> <input.mo>
|
|
||||||
# ********************************************************************/
|
# ********************************************************************/
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
|
|||||||
@@ -1,4 +1,9 @@
|
|||||||
# to craete: msgfmt -o <output.po> <input.mo>
|
# ********************************************************************
|
||||||
|
# AUTHOR: Clemens Schwaighofer
|
||||||
|
# CREATED: 2005/08/09
|
||||||
|
# SHORT DESCRIPTION:
|
||||||
|
# Frontend English Messages file for gettext
|
||||||
|
# ********************************************************************/
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
@@ -2,8 +2,7 @@
|
|||||||
# AUTHOR: Clemens Schwaighofer
|
# AUTHOR: Clemens Schwaighofer
|
||||||
# CREATED: 2018/03/28
|
# CREATED: 2018/03/28
|
||||||
# SHORT DESCRIPTION:
|
# SHORT DESCRIPTION:
|
||||||
# Backend Japanese Messages file for gettext
|
# Backend Japanese Messages file for gettext>
|
||||||
# to craete: msgfmt -o <output.po> <input.mo>
|
|
||||||
# ********************************************************************/
|
# ********************************************************************/
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
|
|||||||
@@ -1,4 +1,9 @@
|
|||||||
# to craete: msgfmt -o <output.po> <input.mo>
|
# ********************************************************************
|
||||||
|
# AUTHOR: Clemens Schwaighofer
|
||||||
|
# CREATED: 2005/08/09
|
||||||
|
# SHORT DESCRIPTION:
|
||||||
|
# Frontend Japanese Messages file for gettext
|
||||||
|
# ********************************************************************/
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
@@ -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/
|
||||||
2137
4dev/tests/ACL/CoreLibsACLLoginTest.php
Normal file
2137
4dev/tests/ACL/CoreLibsACLLoginTest.php
Normal file
File diff suppressed because it is too large
Load Diff
52
4dev/tests/ACL/CoreLibsACLLogin_database_prepare.sh
Executable file
52
4dev/tests/ACL/CoreLibsACLLogin_database_prepare.sh
Executable file
@@ -0,0 +1,52 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# note: there is currently no port selection, standard 5432 port is assumed
|
||||||
|
# note: we use the default in path postgresql commands and connect to whatever default DB is set
|
||||||
|
|
||||||
|
# PARAMETER 1: database data file to load
|
||||||
|
# PARAMETER 2: db user WHO MUST BE ABLE TO CREATE A DATABASE
|
||||||
|
# PARAMETER 3: db name
|
||||||
|
# PARAMETER 4: db host
|
||||||
|
# PARAMETER 5: print out for testing
|
||||||
|
|
||||||
|
load_sql="${1}";
|
||||||
|
# abort with 1 if we cannot find the file
|
||||||
|
if [ ! -f "${load_sql}" ]; then
|
||||||
|
echo 1;
|
||||||
|
exit 1;
|
||||||
|
fi;
|
||||||
|
db_user="${2}";
|
||||||
|
db_name="${3}";
|
||||||
|
db_host="${4}";
|
||||||
|
# empty db name or db user -> exit with 2
|
||||||
|
if [ -z "${db_user}" ] || [ -z "${db_name}" ] || [ -z "${db_host}" ]; then
|
||||||
|
echo 2;
|
||||||
|
exit 2;
|
||||||
|
fi;
|
||||||
|
# drop database, on error exit with 3
|
||||||
|
dropdb -U ${db_user} -h ${db_host} ${db_name} 2>&1;
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo 3;
|
||||||
|
exit 3;
|
||||||
|
fi;
|
||||||
|
# create database, on error exit with 4
|
||||||
|
createdb -U ${db_user} -O ${db_user} -h ${db_host} -E utf8 ${db_name} 2>&1;
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo 4;
|
||||||
|
exit 4;
|
||||||
|
fi;
|
||||||
|
# if error 5 thrown, test with enabled below
|
||||||
|
if [ ! -z "${5}" ]; then
|
||||||
|
psql -U ${db_user} -h ${db_host} -f ${load_sql} ${db_name};
|
||||||
|
else
|
||||||
|
# load data (redirect ALL error to null), on error exit with 5
|
||||||
|
psql -U ${db_user} -h ${db_host} -f ${load_sql} ${db_name} 2>&1 1>/dev/null 2>/dev/null;
|
||||||
|
fi;
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo 5;
|
||||||
|
exit 5;
|
||||||
|
fi;
|
||||||
|
echo 0;
|
||||||
|
exit 0;
|
||||||
|
|
||||||
|
# __END__
|
||||||
1031
4dev/tests/ACL/database/CoreLibsACLLogin_database_create_data.sql
Normal file
1031
4dev/tests/ACL/database/CoreLibsACLLogin_database_create_data.sql
Normal file
File diff suppressed because it is too large
Load Diff
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
1108
4dev/tests/Combined/CoreLibsCombinedArrayHandlerTest.php
Normal file
1108
4dev/tests/Combined/CoreLibsCombinedArrayHandlerTest.php
Normal file
File diff suppressed because it is too large
Load Diff
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__
|
||||||
@@ -13,7 +13,6 @@ use PHPUnit\Framework\TestCase;
|
|||||||
*/
|
*/
|
||||||
final class CoreLibsConvertJsonTest extends TestCase
|
final class CoreLibsConvertJsonTest extends TestCase
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* test list for json convert tests
|
* test list for json convert tests
|
||||||
*
|
*
|
||||||
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,46 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace tests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test class for ACL\Login
|
|
||||||
* @coversDefaultClass \CoreLibs\ACL\Login
|
|
||||||
* @testdox \CoreLibs\ACL\Login method tests
|
|
||||||
*/
|
|
||||||
final class CoreLibsACLLoginTest 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 ACL\Login Class tests
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testACLLogin()
|
|
||||||
{
|
|
||||||
$this->assertTrue(true, 'ACL Login Tests not implemented');
|
|
||||||
$this->markTestIncomplete(
|
|
||||||
'ACL\Login Tests have not yet been implemented'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// __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,785 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
// because we have long testdox lines
|
|
||||||
// phpcs:disable Generic.Files.LineLength
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace tests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test class for Combined\ArrayHandler
|
|
||||||
* @coversDefaultClass \CoreLibs\Combined\ArrayHandler
|
|
||||||
* @testdox \CoreLibs\Combined\ArrayHandler method tests
|
|
||||||
*/
|
|
||||||
final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
|
||||||
{
|
|
||||||
// we use that for all
|
|
||||||
public static $array = [
|
|
||||||
'a' => [
|
|
||||||
'b' => 'bar',
|
|
||||||
'c' => 'foo',
|
|
||||||
'same' => 'same',
|
|
||||||
3 => 'foobar',
|
|
||||||
'foobar' => 4,
|
|
||||||
'true' => true,
|
|
||||||
],
|
|
||||||
'd',
|
|
||||||
4,
|
|
||||||
'b',
|
|
||||||
'c' => 'test',
|
|
||||||
'same' => 'same',
|
|
||||||
'deep' => [
|
|
||||||
'sub' => [
|
|
||||||
'nested' => 'bar',
|
|
||||||
'same' => 'same',
|
|
||||||
'more' => 'test'
|
|
||||||
]
|
|
||||||
]
|
|
||||||
];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function arraySearchRecursiveProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'find value' => [
|
|
||||||
0 => 'bar',
|
|
||||||
1 => self::$array,
|
|
||||||
2 => null,
|
|
||||||
3 => ['a', 'b'],
|
|
||||||
],
|
|
||||||
'find value with key' => [
|
|
||||||
0 => 'bar',
|
|
||||||
1 => self::$array,
|
|
||||||
2 => 'nested',
|
|
||||||
3 => ['deep', 'sub', 'nested']
|
|
||||||
],
|
|
||||||
'not existing value' => [
|
|
||||||
0 => 'not exists',
|
|
||||||
1 => self::$array,
|
|
||||||
2 => null,
|
|
||||||
3 => [],
|
|
||||||
],
|
|
||||||
'find value int' => [
|
|
||||||
0 => 4,
|
|
||||||
1 => self::$array,
|
|
||||||
2 => null,
|
|
||||||
3 => ['a', 'foobar']
|
|
||||||
],
|
|
||||||
'find value int as string' => [
|
|
||||||
0 => '4',
|
|
||||||
1 => self::$array,
|
|
||||||
2 => null,
|
|
||||||
3 => []
|
|
||||||
],
|
|
||||||
'find value int as string with key' => [
|
|
||||||
0 => '4',
|
|
||||||
1 => self::$array,
|
|
||||||
2 => 'foobar',
|
|
||||||
3 => []
|
|
||||||
],
|
|
||||||
'first level value' => [
|
|
||||||
0 => 'd',
|
|
||||||
1 => self::$array,
|
|
||||||
2 => null,
|
|
||||||
4 => [0]
|
|
||||||
],
|
|
||||||
'find value, return int key' => [
|
|
||||||
0 => 'foobar',
|
|
||||||
1 => self::$array,
|
|
||||||
2 => null,
|
|
||||||
3 => ['a', 3]
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function arraySearchRecursiveAllProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'find value' => [
|
|
||||||
0 => 'bar',
|
|
||||||
1 => self::$array,
|
|
||||||
2 => null,
|
|
||||||
3 => true,
|
|
||||||
4 => [
|
|
||||||
'level' => -1,
|
|
||||||
'work' => [],
|
|
||||||
'found' => [
|
|
||||||
0 => ['a', 'b'],
|
|
||||||
1 => ['deep', 'sub', 'nested']
|
|
||||||
]
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'find value, new type' => [
|
|
||||||
0 => 'bar',
|
|
||||||
1 => self::$array,
|
|
||||||
2 => null,
|
|
||||||
3 => false,
|
|
||||||
4 => [
|
|
||||||
0 => ['a', 'b'],
|
|
||||||
1 => ['deep', 'sub', 'nested']
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'find value with key' => [
|
|
||||||
0 => 'bar',
|
|
||||||
1 => self::$array,
|
|
||||||
2 => 'nested',
|
|
||||||
3 => true,
|
|
||||||
4 => [
|
|
||||||
'level' => -1,
|
|
||||||
'work' => [],
|
|
||||||
'found' => [
|
|
||||||
0 => ['deep', 'sub', 'nested']
|
|
||||||
]
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'not existing value' => [
|
|
||||||
0 => 'not exists',
|
|
||||||
1 => self::$array,
|
|
||||||
2 => null,
|
|
||||||
3 => true,
|
|
||||||
4 => [
|
|
||||||
'level' => -1,
|
|
||||||
'work' => [],
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'not existing value, new type' => [
|
|
||||||
0 => 'not exists',
|
|
||||||
1 => self::$array,
|
|
||||||
2 => null,
|
|
||||||
3 => false,
|
|
||||||
4 => [],
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function arraySearchSimpleProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'key/value exist' => [
|
|
||||||
0 => self::$array,
|
|
||||||
1 => 'c',
|
|
||||||
2 => 'foo',
|
|
||||||
3 => false,
|
|
||||||
4 => true,
|
|
||||||
],
|
|
||||||
'key/value exists twice' => [
|
|
||||||
0 => self::$array,
|
|
||||||
1 => 'same',
|
|
||||||
2 => 'same',
|
|
||||||
3 => false,
|
|
||||||
4 => true,
|
|
||||||
],
|
|
||||||
'key/value not found' => [
|
|
||||||
0 => self::$array,
|
|
||||||
1 => 'not exists',
|
|
||||||
2 => 'not exists',
|
|
||||||
3 => false,
|
|
||||||
4 => false,
|
|
||||||
],
|
|
||||||
'key exists, value not' => [
|
|
||||||
0 => self::$array,
|
|
||||||
1 => 'b',
|
|
||||||
2 => 'not exists',
|
|
||||||
3 => false,
|
|
||||||
4 => false,
|
|
||||||
],
|
|
||||||
'key not, value exists' => [
|
|
||||||
0 => self::$array,
|
|
||||||
1 => 'not exists',
|
|
||||||
2 => 'bar',
|
|
||||||
3 => false,
|
|
||||||
4 => false,
|
|
||||||
],
|
|
||||||
'numeric key, value exists' => [
|
|
||||||
0 => self::$array,
|
|
||||||
1 => 0,
|
|
||||||
2 => 'd',
|
|
||||||
3 => false,
|
|
||||||
4 => true,
|
|
||||||
],
|
|
||||||
'numeric key as string, value exists' => [
|
|
||||||
0 => self::$array,
|
|
||||||
1 => '0',
|
|
||||||
2 => 'd',
|
|
||||||
3 => false,
|
|
||||||
4 => true,
|
|
||||||
],
|
|
||||||
'numeric key as string, value exists, strinct' => [
|
|
||||||
0 => self::$array,
|
|
||||||
1 => '0',
|
|
||||||
2 => 'd',
|
|
||||||
3 => true,
|
|
||||||
4 => false,
|
|
||||||
],
|
|
||||||
'key exists, value numeric' => [
|
|
||||||
0 => self::$array,
|
|
||||||
1 => 'foobar',
|
|
||||||
2 => 4,
|
|
||||||
3 => false,
|
|
||||||
4 => true,
|
|
||||||
],
|
|
||||||
'key exists, value numeric as string' => [
|
|
||||||
0 => self::$array,
|
|
||||||
1 => 'foobar',
|
|
||||||
2 => '4',
|
|
||||||
3 => false,
|
|
||||||
4 => true,
|
|
||||||
],
|
|
||||||
'key exists, value numeric as string, strict' => [
|
|
||||||
0 => self::$array,
|
|
||||||
1 => 'foobar',
|
|
||||||
2 => '4',
|
|
||||||
3 => true,
|
|
||||||
4 => false,
|
|
||||||
],
|
|
||||||
'key exists, value bool' => [
|
|
||||||
0 => self::$array,
|
|
||||||
1 => 'true',
|
|
||||||
2 => true,
|
|
||||||
3 => false,
|
|
||||||
4 => true,
|
|
||||||
],
|
|
||||||
'key exists, value bool as string' => [
|
|
||||||
0 => self::$array,
|
|
||||||
1 => 'true',
|
|
||||||
2 => 'true',
|
|
||||||
3 => false,
|
|
||||||
4 => true,
|
|
||||||
],
|
|
||||||
'key exists, value bool as string, strict' => [
|
|
||||||
0 => self::$array,
|
|
||||||
1 => 'true',
|
|
||||||
2 => 'true',
|
|
||||||
3 => true,
|
|
||||||
4 => false,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: create provider for n array merge
|
|
||||||
* provides array listing for the merge test
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function arrayMergeRecursiveProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function arrayCompareProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'one matching' => [
|
|
||||||
['a', 'b', 'c'],
|
|
||||||
['c', 'd', 'e'],
|
|
||||||
['a', 'b', 'd', 'e']
|
|
||||||
],
|
|
||||||
'all the same' => [
|
|
||||||
['a', 'b', 'c'],
|
|
||||||
['a', 'b', 'c'],
|
|
||||||
[]
|
|
||||||
],
|
|
||||||
'all different' => [
|
|
||||||
['a', 'b'],
|
|
||||||
['c', 'd'],
|
|
||||||
['a', 'b', 'c', 'd']
|
|
||||||
],
|
|
||||||
'empty arrays' => [
|
|
||||||
[],
|
|
||||||
[],
|
|
||||||
[]
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function inArrayAnyProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'all exist in haystack' => [
|
|
||||||
[1],
|
|
||||||
[1, 2, 3, 4],
|
|
||||||
[1]
|
|
||||||
],
|
|
||||||
'not all exist in haystack' => [
|
|
||||||
[1, 5],
|
|
||||||
[1, 2, 3, 4],
|
|
||||||
[1]
|
|
||||||
],
|
|
||||||
'none exist in haystack' => [
|
|
||||||
[5],
|
|
||||||
[1, 2, 3, 4],
|
|
||||||
false
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function genAssocArrayProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'non set' => [
|
|
||||||
[
|
|
||||||
0 => ['a' => 'a1', 'b' => 2],
|
|
||||||
1 => ['a' => 'a2', 'b' => 3],
|
|
||||||
2 => ['a' => '', 'b' => null],
|
|
||||||
],
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
[],
|
|
||||||
],
|
|
||||||
'key set' => [
|
|
||||||
[
|
|
||||||
0 => ['a' => 'a1', 'b' => 2],
|
|
||||||
1 => ['a' => 'a2', 'b' => 3],
|
|
||||||
2 => ['a' => '', 'b' => null],
|
|
||||||
],
|
|
||||||
'a',
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
['a1' => 0, 'a2' => 1],
|
|
||||||
],
|
|
||||||
'value set' => [
|
|
||||||
[
|
|
||||||
0 => ['a' => 'a1', 'b' => 2],
|
|
||||||
1 => ['a' => 'a2', 'b' => 3],
|
|
||||||
2 => ['a' => '', 'b' => null],
|
|
||||||
],
|
|
||||||
false,
|
|
||||||
'a',
|
|
||||||
false,
|
|
||||||
[0 => 'a1', 1 => 'a2', 2 => ''],
|
|
||||||
],
|
|
||||||
'key and value set, add empty, null' => [
|
|
||||||
[
|
|
||||||
0 => ['a' => 'a1', 'b' => 2],
|
|
||||||
1 => ['a' => 'a2', 'b' => 3],
|
|
||||||
2 => ['a' => '', 'b' => null],
|
|
||||||
],
|
|
||||||
'a',
|
|
||||||
'b',
|
|
||||||
false,
|
|
||||||
['a1' => 2, 'a2' => 3],
|
|
||||||
],
|
|
||||||
'key and value set, add empty' => [
|
|
||||||
[
|
|
||||||
0 => ['a' => 'a1', 'b' => 2],
|
|
||||||
1 => ['a' => 'a2', 'b' => 3],
|
|
||||||
2 => ['a' => '', 'b' => ''],
|
|
||||||
3 => ['a' => 'a4', 'b' => ''],
|
|
||||||
],
|
|
||||||
'a',
|
|
||||||
'b',
|
|
||||||
false,
|
|
||||||
['a1' => 2, 'a2' => 3, 'a4' => ''],
|
|
||||||
],
|
|
||||||
'key/value set, skip empty' => [
|
|
||||||
[
|
|
||||||
0 => ['a' => 'a1', 'b' => 2],
|
|
||||||
1 => ['a' => 'a2', 'b' => 3],
|
|
||||||
2 => ['a' => '', 'b' => null],
|
|
||||||
],
|
|
||||||
'a',
|
|
||||||
'b',
|
|
||||||
true,
|
|
||||||
['a1' => 2, 'a2' => 3],
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function flattenArrayProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'array key/value, single' => [
|
|
||||||
0 => ['a' => 'foo', 1 => 'bar', 'c' => 2],
|
|
||||||
1 => ['foo', 'bar', 2],
|
|
||||||
2 => ['a', 1, 'c'],
|
|
||||||
3 => ['a', 1, 'c'],
|
|
||||||
],
|
|
||||||
'array values, single' => [
|
|
||||||
0 => ['foo', 'bar', 2],
|
|
||||||
1 => ['foo', 'bar', 2],
|
|
||||||
2 => [0, 1, 2],
|
|
||||||
3 => [0, 1, 2],
|
|
||||||
],
|
|
||||||
'array key/value, multi' => [
|
|
||||||
0 => [
|
|
||||||
'a' => ['a1' => 'a1foo', 'a2' => 'a1bar'],
|
|
||||||
1 => 'bar',
|
|
||||||
'c' => [2, 3, 4],
|
|
||||||
'd' => [
|
|
||||||
'e' => [
|
|
||||||
'de1' => 'subfoo', 'de2' => 'subbar', 'a2' => 'a1bar'
|
|
||||||
]
|
|
||||||
]
|
|
||||||
],
|
|
||||||
1 => ['a1foo', 'a1bar', 'bar', 2, 3, 4, 'subfoo', 'subbar', 'a1bar'],
|
|
||||||
2 => ['a', 'a1', 'a2', 1, 'c', 0, 1, 2, 'd', 'e', 'de1', 'de2', 'a2'],
|
|
||||||
3 => ['a1', 'a2', 1, 0, 1, 2, 'de1', 'de2', 'a2'],
|
|
||||||
],
|
|
||||||
'array with double values' => [
|
|
||||||
0 => ['a', 'a', 'b'],
|
|
||||||
1 => ['a', 'a', 'b'],
|
|
||||||
2 => [0, 1, 2],
|
|
||||||
3 => [0, 1, 2],
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* use the flattenArrayProvider and replace 1 with 2 array pos
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function flattenArrayKeyProvider(): array
|
|
||||||
{
|
|
||||||
$list = [];
|
|
||||||
foreach ($this->flattenArrayProvider() as $key => $row) {
|
|
||||||
$list[$key] = [
|
|
||||||
$row[0],
|
|
||||||
$row[2],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
return $list;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* use the flattenArrayProvider and replace 1 with 3 array pos
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function flattenArrayKeyLeavesOnlyProvider(): array
|
|
||||||
{
|
|
||||||
$list = [];
|
|
||||||
foreach ($this->flattenArrayProvider() as $key => $row) {
|
|
||||||
$list[$key] = [
|
|
||||||
$row[0],
|
|
||||||
$row[3],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
return $list;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function arrayFlatForKeyProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'all present, single level' => [
|
|
||||||
0 => [
|
|
||||||
'a' => ['b1' => 'foo', 'a2' => 'a-foo'],
|
|
||||||
'b' => ['b1' => 'bar', 'a2' => 'b-foo'],
|
|
||||||
'c' => ['b1' => 'foobar', 'a2' => 'c-foo'],
|
|
||||||
],
|
|
||||||
1 => 'a2',
|
|
||||||
2 => [
|
|
||||||
'a' => 'a-foo',
|
|
||||||
'b' => 'b-foo',
|
|
||||||
'c' => 'c-foo',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'no sub arrays' => [
|
|
||||||
0 => ['a', 'b', 'c'],
|
|
||||||
1 => 'a',
|
|
||||||
2 => ['a', 'b', 'c'],
|
|
||||||
],
|
|
||||||
'sub arrays with missing' => [
|
|
||||||
0 => [
|
|
||||||
'a' => ['b1' => 'foo', 'a2' => 'a-foo'],
|
|
||||||
'b' => ['b1' => 'bar'],
|
|
||||||
'c' => ['b1' => 'foobar', 'a2' => 'c-foo'],
|
|
||||||
],
|
|
||||||
1 => 'a2',
|
|
||||||
2 => [
|
|
||||||
'a' => 'a-foo',
|
|
||||||
'b' => ['b1' => 'bar'],
|
|
||||||
'c' => 'c-foo',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'deep nested sub arrays' => [
|
|
||||||
0 => [
|
|
||||||
'a' => [
|
|
||||||
'b1' => 'foo',
|
|
||||||
'a2' => [
|
|
||||||
'text' => ['a-foo', 'a-bar'],
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'b' => [
|
|
||||||
'b1' => 'bar',
|
|
||||||
'a2' => [
|
|
||||||
'text' => 'b-foo',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
],
|
|
||||||
1 => 'a2',
|
|
||||||
2 => [
|
|
||||||
'a' => [
|
|
||||||
'text' => ['a-foo', 'a-bar'],
|
|
||||||
],
|
|
||||||
'b' => [
|
|
||||||
'text' => 'b-foo',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::arraySearchRecursive
|
|
||||||
* @dataProvider arraySearchRecursiveProvider
|
|
||||||
* @testdox arraySearchRecursive $needle (key $key_search_for) in $input and will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string|null $needle
|
|
||||||
* @param array $input
|
|
||||||
* @param string|null $key_search_for
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testArraySearchRecursive($needle, array $input, ?string $key_search_for, array $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\ArrayHandler::arraySearchRecursive($needle, $input, $key_search_for)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::arraySearchRecursiveAll
|
|
||||||
* @dataProvider arraySearchRecursiveAllProvider
|
|
||||||
* @testdox arraySearchRecursiveAll $needle (key $key_search_for) in $input and will be $expected (old: $flag) [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string|null $needle
|
|
||||||
* @param array $input
|
|
||||||
* @param string|null $key_search_for
|
|
||||||
* @param bool $flag
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testArraySearchRecursiveAll($needle, array $input, ?string $key_search_for, bool $flag, array $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\ArrayHandler::arraySearchRecursiveAll($needle, $input, $key_search_for, $flag)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::arraySearchSimple
|
|
||||||
* @dataProvider arraySearchSimpleProvider
|
|
||||||
* @testdox arraySearchSimple $input searched with key: $key / value: $value (strict: $flag) will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array $input
|
|
||||||
* @param string|int $key
|
|
||||||
* @param string|int $value
|
|
||||||
* @param bool $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testArraySearchSimple(array $input, $key, $value, bool $flag, bool $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\ArrayHandler::arraySearchSimple($input, $key, $value, $flag)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::arrayMergeRecursive
|
|
||||||
* @#dataProvider arrayMergeRecursiveProvider
|
|
||||||
* @testdox arrayMergeRecursive ... will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array $input nested array set as each parameter
|
|
||||||
* @param bool $flag
|
|
||||||
* @param bool|array $expected
|
|
||||||
* @return void
|
|
||||||
* array $input, bool $flag, $expected
|
|
||||||
*/
|
|
||||||
public function testArrayMergeRecursive(): void
|
|
||||||
{
|
|
||||||
$this->assertTrue(true, 'Implement proper test run');
|
|
||||||
$this->markTestIncomplete(
|
|
||||||
'testArrayMergeRecursive has not been implemented yet.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::arrayDiff
|
|
||||||
* @dataProvider arrayCompareProvider
|
|
||||||
* @testdox arrayDiff $input_a diff $input_b will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array $input_a
|
|
||||||
* @param array $input_b
|
|
||||||
* @param array $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testArrayDiff(array $input_a, array $input_b, array $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\ArrayHandler::arrayDiff($input_a, $input_b)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::inArrayAny
|
|
||||||
* @dataProvider inArrayAnyProvider
|
|
||||||
* @testdox inArrayAny needle $input_a in haystack $input_b will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array $input_a
|
|
||||||
* @param array $input_b
|
|
||||||
* @param array|bool $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testInArrayAny(array $input_a, array $input_b, $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\ArrayHandler::inArrayAny($input_a, $input_b)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::genAssocArray
|
|
||||||
* @dataProvider genAssocArrayProvider
|
|
||||||
* @testdox genAssocArray array $input with $key or $value and flag set only $flag will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array $input
|
|
||||||
* @param string|int|bool $key
|
|
||||||
* @param string|int|bool $value
|
|
||||||
* @param bool $flag
|
|
||||||
* @param array $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testGenAssocArray(array $input, $key, $value, bool $flag, array $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\ArrayHandler::genAssocArray($input, $key, $value, $flag)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::flattenArray
|
|
||||||
* @dataProvider flattenArrayProvider
|
|
||||||
* @testdox testFlattenArray array $input will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array $input
|
|
||||||
* @param array $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testFlattenyArray(array $input, array $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\ArrayHandler::flattenArray($input)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::flattenArrayKey
|
|
||||||
* @dataProvider flattenArrayKeyProvider
|
|
||||||
* @testdox flattenArrayKey array $input will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array $input
|
|
||||||
* @param array $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testFlattenArrayKey(array $input, array $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\ArrayHandler::flattenArrayKey($input)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::flattenArrayKeyLeavesOnly
|
|
||||||
* @dataProvider flattenArrayKeyLeavesOnlyProvider
|
|
||||||
* @testdox flattenArrayKeyLeavesOnly array $input will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array $input
|
|
||||||
* @param array $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testFlattenArrayKeyLeavesOnly(array $input, array $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\ArrayHandler::flattenArrayKeyLeavesOnly($input)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @covers ::arrayFlatForKey
|
|
||||||
* @dataProvider arrayFlatForKeyProvider
|
|
||||||
* @testdox arrayFlatForKey array $input will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param array $input
|
|
||||||
* @param array $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testArrayFlatForKey(array $input, $search, array $expected): void
|
|
||||||
{
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Combined\ArrayHandler::arrayFlatForKey($input, $search)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// __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,104 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace tests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test class for Create\Session
|
|
||||||
* @coversDefaultClass \CoreLibs\Create\Session
|
|
||||||
* @testdox \CoreLibs\Create\Session method tests
|
|
||||||
*/
|
|
||||||
final class CoreLibsCreateSessionTest extends TestCase
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function sessionProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'session parameter' => [
|
|
||||||
'sessionNameParameter',
|
|
||||||
'p',
|
|
||||||
'sessionNameParameter',
|
|
||||||
'/^\w+$/'
|
|
||||||
],
|
|
||||||
'session globals' => [
|
|
||||||
'sessionNameGlobals',
|
|
||||||
'g',
|
|
||||||
'sessionNameGlobals',
|
|
||||||
'/^\w+$/'
|
|
||||||
],
|
|
||||||
'session constant' => [
|
|
||||||
'sessionNameConstant',
|
|
||||||
'c',
|
|
||||||
'sessionNameConstant',
|
|
||||||
'/^\w+$/'
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
protected function setUp(): void
|
|
||||||
{
|
|
||||||
if (session_id()) {
|
|
||||||
session_destroy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @dataProvider sessionProvider
|
|
||||||
* @testdox startSession $input name for $type will be $expected_n with $expected_i [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $input
|
|
||||||
* @param string $type
|
|
||||||
* @param string|bool $expected_n
|
|
||||||
* @param string|bool $expected_i
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testStartSession(string $input, string $type, $expected_n, $expected_i): void
|
|
||||||
{
|
|
||||||
/* $session_id = '';
|
|
||||||
switch ($type) {
|
|
||||||
case 'p':
|
|
||||||
$session_id = \CoreLibs\Create\Session::startSession($input);
|
|
||||||
break;
|
|
||||||
case 'g':
|
|
||||||
$GLOBALS['SET_SESSION_NAME'] = $input;
|
|
||||||
$session_id = \CoreLibs\Create\Session::startSession();
|
|
||||||
break;
|
|
||||||
case 'c':
|
|
||||||
define('SET_SESSION_NAME', $input);
|
|
||||||
$session_id = \CoreLibs\Create\Session::startSession();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
$this->assertMatchesRegularExpression(
|
|
||||||
$expected_i,
|
|
||||||
(string)$session_id
|
|
||||||
);
|
|
||||||
$this->assertMatchesRegularExpression(
|
|
||||||
$expected_i,
|
|
||||||
(string)\CoreLibs\Create\Session::getSessionId()
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected_n,
|
|
||||||
\CoreLibs\Create\Session::getSessionName()
|
|
||||||
);
|
|
||||||
if ($type == 'g') {
|
|
||||||
unset($GLOBALS['SET_SESSION_NAME']);
|
|
||||||
} */
|
|
||||||
$this->markTestSkipped('No implementation for Create\Session. Cannot run session_start in CLI');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// __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,836 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace tests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test class for Debug\Logging
|
|
||||||
* @coversDefaultClass \CoreLibs\Debug\Logging
|
|
||||||
* @testdox \CoreLibs\Debug\Logging method tests
|
|
||||||
*/
|
|
||||||
final class CoreLibsDebugLoggingTest extends TestCase
|
|
||||||
{
|
|
||||||
public $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' => [
|
|
||||||
[
|
|
||||||
'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' => '/tmp/',
|
|
||||||
'debug_all' => false,
|
|
||||||
'print_all' => false,
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'constant' => [
|
|
||||||
'BASE' => '/tmp',
|
|
||||||
'LOG' => '/'
|
|
||||||
]
|
|
||||||
]
|
|
||||||
],
|
|
||||||
'standard test set' => [
|
|
||||||
[
|
|
||||||
'log_folder' => '/tmp',
|
|
||||||
'debug_all' => true,
|
|
||||||
'print_all' => true,
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'log_folder' => '/tmp/',
|
|
||||||
'debug_all' => true,
|
|
||||||
'print_all' => true,
|
|
||||||
],
|
|
||||||
[]
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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' => './#'
|
|
||||||
]
|
|
||||||
]
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function logLevelAllProvider(): array
|
|
||||||
{
|
|
||||||
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,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function logLevelProvider(): array
|
|
||||||
{
|
|
||||||
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
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function logPerProvider(): array
|
|
||||||
{
|
|
||||||
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,
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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##"
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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) {
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
} else {
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging($options);
|
|
||||||
}
|
|
||||||
// check that settings match
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected['log_folder'],
|
|
||||||
$this->log->getSetting('log_folder')
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected['debug_all'],
|
|
||||||
$this->log->getSetting('debug_output_all')
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected['print_all'],
|
|
||||||
$this->log->getSetting('print_output_all')
|
|
||||||
);
|
|
||||||
// print "LOG: " . $this->log->getSetting('log_folder') . "\n";
|
|
||||||
// print "DEBUG: " . $this->log->getSetting('debug_output_all') . "\n";
|
|
||||||
// print "PRINT: " . $this->log->getSetting('print_output_all') . "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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) {
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
} else {
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging($options);
|
|
||||||
}
|
|
||||||
// check current
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->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
|
|
||||||
$this->log->basicSetLogId($override['values']['log_file_id']);
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->getLogId(),
|
|
||||||
$expected['set_log_file_id']
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
// set and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->setLogLevelAll($type, $flag),
|
|
||||||
$expected_set
|
|
||||||
);
|
|
||||||
// get and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->getLogLevelAll($type),
|
|
||||||
$expected_get
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
// set
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->setLogLevel($type, $flag, $debug_on),
|
|
||||||
$expected_set
|
|
||||||
);
|
|
||||||
// get, if level is null compare to?
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->getLogLevel($type, $flag, $level),
|
|
||||||
$expected_get
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
// set and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->setLogPer($type, $set),
|
|
||||||
$expected_set
|
|
||||||
);
|
|
||||||
// get and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->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
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
// set and check
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->setGetLogPrintFileDate($input),
|
|
||||||
$expected_set
|
|
||||||
);
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->setGetLogPrintFileDate(),
|
|
||||||
$expected_get
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
|
||||||
{
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging();
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->log->prAr($input),
|
|
||||||
$expected
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// from here are complex debug tests
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
|
||||||
$this->log = new \CoreLibs\Debug\Logging($options);
|
|
||||||
// * debug (A/B)
|
|
||||||
// NULL check for strip/prefix
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->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 = $this->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 = $this->log->printErrorMsg();
|
|
||||||
// * print
|
|
||||||
if (!empty($options['debug_all']) && !empty($options['echo_all'])) {
|
|
||||||
// print $this->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,
|
|
||||||
''
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// __END__
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace tests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test class for Debug\RunningTime
|
|
||||||
* @coversDefaultClass \CoreLibs\Debug\RunningTime
|
|
||||||
* @testdox \CoreLibs\Debug\RunningTime method tests
|
|
||||||
*/
|
|
||||||
final class CoreLibsDebugRunningTimeTest extends TestCase
|
|
||||||
{
|
|
||||||
public function hrRunningTimeProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'default time' => [
|
|
||||||
0 => null,
|
|
||||||
1 => '/^\d{4}\.\d{1,}$/'
|
|
||||||
],
|
|
||||||
'nanoseconds' => [
|
|
||||||
0 => 'ns',
|
|
||||||
1 => '/^\d{10}$/'
|
|
||||||
],
|
|
||||||
'microseconds' => [
|
|
||||||
0 => 'ys',
|
|
||||||
1 => '/^\d{7}\.\d{1,}$/'
|
|
||||||
],
|
|
||||||
'milliseconds' => [
|
|
||||||
0 => 'ms',
|
|
||||||
1 => '/^\d{4}\.\d{1,}$/'
|
|
||||||
],
|
|
||||||
'seconds' => [
|
|
||||||
0 => 's',
|
|
||||||
1 => '/^\d{1}\.\d{4,}$/'
|
|
||||||
],
|
|
||||||
'invalid fallback to ms' => [
|
|
||||||
0 => 'invalid',
|
|
||||||
1 => '/^\d{4}\.\d{1,}$/'
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function runningTimeProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'run time test' => [
|
|
||||||
0 => '/^\d{1,}\.\d{1,}$/',
|
|
||||||
1 => '/^Start: \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} 0\.\d{8}, $/',
|
|
||||||
2 => '/^Start: \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} 0\.\d{8}, '
|
|
||||||
. 'End: \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} 0\.\d{8}, '
|
|
||||||
. 'Run: \d{1,}\.\d{1,} s$/'
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @cover ::hrRunningTime
|
|
||||||
* @dataProvider hrRunningTimeProvider
|
|
||||||
* @testdox hrRunningTime with $out_time matching $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string|null $out_time
|
|
||||||
* @param string $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testHrRunningTime(?string $out_time, string $expected): void
|
|
||||||
{
|
|
||||||
$start = \CoreLibs\Debug\RunningTime::hrRunningTime();
|
|
||||||
$this->assertEquals(
|
|
||||||
0,
|
|
||||||
$start
|
|
||||||
);
|
|
||||||
time_nanosleep(1, 500);
|
|
||||||
if ($out_time === null) {
|
|
||||||
$end = \CoreLibs\Debug\RunningTime::hrRunningTime();
|
|
||||||
} else {
|
|
||||||
$end = \CoreLibs\Debug\RunningTime::hrRunningTime($out_time);
|
|
||||||
}
|
|
||||||
// print "E: " . $end . "\n";
|
|
||||||
$this->assertMatchesRegularExpression(
|
|
||||||
$expected,
|
|
||||||
(string)$end
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @dataProvider runningTimeProvider
|
|
||||||
* @testdox runningTime matching return $expected_number and start $expected_start end $expected_end [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string $expected_number
|
|
||||||
* @param string $expected_start
|
|
||||||
* @param string $expected_end
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testRunningTime(string $expected_number, string $expected_start, string $expected_end): void
|
|
||||||
{
|
|
||||||
$start = \CoreLibs\Debug\RunningTime::runningTime(true);
|
|
||||||
// print "Start: " . $start . "\n";
|
|
||||||
$this->assertEquals(
|
|
||||||
0,
|
|
||||||
$start
|
|
||||||
);
|
|
||||||
// print "STRING: " . \CoreLibs\Debug\RunningTime::runningTimeString() . "\n";
|
|
||||||
$this->assertMatchesRegularExpression(
|
|
||||||
$expected_start,
|
|
||||||
\CoreLibs\Debug\RunningTime::runningTimeString()
|
|
||||||
);
|
|
||||||
time_nanosleep(1, 500);
|
|
||||||
$end = \CoreLibs\Debug\RunningTime::runningTime(true);
|
|
||||||
// print "Start: " . $end . "\n";
|
|
||||||
$this->assertMatchesRegularExpression(
|
|
||||||
$expected_number,
|
|
||||||
(string)$end
|
|
||||||
);
|
|
||||||
// print "STRING: " . \CoreLibs\Debug\RunningTime::runningTimeString() . "\n";
|
|
||||||
$this->assertMatchesRegularExpression(
|
|
||||||
$expected_end,
|
|
||||||
\CoreLibs\Debug\RunningTime::runningTimeString()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// __END__
|
|
||||||
@@ -1,326 +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 printArProvider(): 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 printToStringProvider(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'string' => [
|
|
||||||
'a string',
|
|
||||||
null,
|
|
||||||
'a string',
|
|
||||||
],
|
|
||||||
'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
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'null string, default' => [
|
|
||||||
0 => null,
|
|
||||||
1 => null,
|
|
||||||
2 => '-'
|
|
||||||
],
|
|
||||||
'empty string, ... replace' => [
|
|
||||||
0 => '',
|
|
||||||
1 => '...',
|
|
||||||
2 => '...'
|
|
||||||
],
|
|
||||||
'filled string' => [
|
|
||||||
0 => 'some string',
|
|
||||||
1 => null,
|
|
||||||
2 => 'some string'
|
|
||||||
]
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
|
||||||
* @dataProvider printArProvider
|
|
||||||
* @testdox printAr $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)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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()
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected_group,
|
|
||||||
\CoreLibs\Debug\Support::getCallerMethodList()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 will be $expected [$_dataName]
|
|
||||||
*
|
|
||||||
* @param string|null $input
|
|
||||||
* @param string|null $replace
|
|
||||||
* @param string $expected
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testDebugString(?string $input, ?string $replace, string $expected)
|
|
||||||
{
|
|
||||||
if ($replace === null) {
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Debug\Support::debugString($input)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$this->assertEquals(
|
|
||||||
$expected,
|
|
||||||
\CoreLibs\Debug\Support::debugString($input, $replace)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// __END__
|
|
||||||
@@ -1,291 +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
|
|
||||||
define('DEFAULT_ENCODING', 'UTF-8');
|
|
||||||
// default lang + encoding
|
|
||||||
define('DEFAULT_LOCALE', 'en_US.UTF-8');
|
|
||||||
// site
|
|
||||||
define('SITE_ENCODING', DEFAULT_ENCODING);
|
|
||||||
define('SITE_LOCALE', DEFAULT_LOCALE);
|
|
||||||
// just set
|
|
||||||
define('BASE', str_replace('/configs', '', __DIR__) . DIRECTORY_SEPARATOR);
|
|
||||||
define('INCLUDES', 'includes' . DIRECTORY_SEPARATOR);
|
|
||||||
define('LOCALE', 'locale' . DIRECTORY_SEPARATOR);
|
|
||||||
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__
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace tests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test class for Output\Form\Elements
|
|
||||||
* @coversDefaultClass \CoreLibs\Output\Form\Elements
|
|
||||||
* @testdox \CoreLibs\Output\Form\Elements method tests
|
|
||||||
*/
|
|
||||||
final class CoreLibsOutputFormElementsTest extends TestCase
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @testdox Output\Form\Elements Class tests
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testOutputFormElements()
|
|
||||||
{
|
|
||||||
$this->assertTrue(true, 'Output Form Elements Tests not implemented');
|
|
||||||
$this->markTestIncomplete(
|
|
||||||
'Output\Form\Elements Tests have not yet been implemented'
|
|
||||||
);
|
|
||||||
// $this->markTestSkipped('No implementation for Output\Form\Elements at the moment');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// __END__
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace tests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test class for Output\Form\Token
|
|
||||||
* @coversDefaultClass \CoreLibs\Output\Form\Token
|
|
||||||
* @testdox \CoreLibs\Output\Form\Token method tests
|
|
||||||
*/
|
|
||||||
final class CoreLibsOutputFormTokenTest extends TestCase
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @testdox Output\Form\Token Class tests
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testOutputFormToken()
|
|
||||||
{
|
|
||||||
$this->assertTrue(true, 'Output Form Token Tests not implemented');
|
|
||||||
$this->markTestIncomplete(
|
|
||||||
'Output\Form\Token Tests have not yet been implemented'
|
|
||||||
);
|
|
||||||
// $this->markTestSkipped('No implementation for Output\Form\Token at the moment');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// __END__
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace tests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test class for Output\Image
|
|
||||||
* @coversDefaultClass \CoreLibs\Output\Image
|
|
||||||
* @testdox \CoreLibs\Output\Image method tests
|
|
||||||
*/
|
|
||||||
final class CoreLibsOutputImageTest extends TestCase
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @testdox Output\Image Class tests
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testOutputImage()
|
|
||||||
{
|
|
||||||
$this->assertTrue(true, 'Output Image Tests not implemented');
|
|
||||||
$this->markTestIncomplete(
|
|
||||||
'Output\Image Tests have not yet been implemented'
|
|
||||||
);
|
|
||||||
// $this->markTestSkipped('No implementation for Output\Image at the moment');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// __END__
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace tests;
|
|
||||||
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test class for Output\Progressbar
|
|
||||||
* @coversDefaultClass \CoreLibs\Output\Progressbar
|
|
||||||
* @testdox \CoreLibs\Output\Progressbar method tests
|
|
||||||
*/
|
|
||||||
final class CoreLibsOutputProgressbarTest extends TestCase
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Undocumented function
|
|
||||||
*
|
|
||||||
* @testdox Output\Progressbar Class tests
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function testOutputProgressbar()
|
|
||||||
{
|
|
||||||
/* $this->assertTrue(true, 'Output Progressbar Tests not implemented');
|
|
||||||
$this->markTestIncomplete(
|
|
||||||
'Output\Progressbar Tests have not yet been implemented'
|
|
||||||
); */
|
|
||||||
$this->markTestSkipped('No implementation for Output\Progressbar at the moment');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// __END__
|
|
||||||
699
4dev/tests/Create/CoreLibsCreateEmailTest.php
Normal file
699
4dev/tests/Create/CoreLibsCreateEmailTest.php
Normal file
@@ -0,0 +1,699 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Create\Email
|
||||||
|
* @coversDefaultClass \CoreLibs\Create\Email
|
||||||
|
* @testdox \CoreLibs\Create\Email method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsCreateEmailTest extends TestCase
|
||||||
|
{
|
||||||
|
private static $log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* start DB conneciton, setup DB, etc
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setUpBeforeClass(): void
|
||||||
|
{
|
||||||
|
self::$log = new \CoreLibs\Logging\Logging([
|
||||||
|
'log_folder' => DIRECTORY_SEPARATOR . 'tmp',
|
||||||
|
'log_file_id' => 'CoreLibs-Create-Email-Test',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function encodeEmailNameProvider(): array
|
||||||
|
{
|
||||||
|
// 0: email
|
||||||
|
// 1: name
|
||||||
|
// 2: encoding
|
||||||
|
// 3: kv_folding
|
||||||
|
// 4: expected
|
||||||
|
return [
|
||||||
|
'all empty' => [
|
||||||
|
'',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
''
|
||||||
|
],
|
||||||
|
'email only' => [
|
||||||
|
'test@test.com',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'email and name' => [
|
||||||
|
'test@test.com',
|
||||||
|
'Test Name',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'"Test Name" <test@test.com>'
|
||||||
|
],
|
||||||
|
'name in mime encoded, default UTF-8' => [
|
||||||
|
'test@test.com',
|
||||||
|
'日本語',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'"=?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' => [
|
||||||
|
'test@test.com',
|
||||||
|
'日本語',
|
||||||
|
'UTF-8',
|
||||||
|
null,
|
||||||
|
'"=?UTF-8?B?5pel5pys6Kqe?=" <test@test.com>'
|
||||||
|
],
|
||||||
|
// does internal UTF-8 to ISO-2022-JP convert
|
||||||
|
'encoding in ISO-2022-JP' => [
|
||||||
|
'test@test.com',
|
||||||
|
'日本語',
|
||||||
|
'ISO-2022-JP',
|
||||||
|
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>'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @dataProvider encodeEmailNameProvider
|
||||||
|
* @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
|
||||||
|
*/
|
||||||
|
public function testEncodeEmailName(
|
||||||
|
string $email,
|
||||||
|
?string $name,
|
||||||
|
?string $encoding,
|
||||||
|
?bool $kv_folding,
|
||||||
|
string $expected
|
||||||
|
): void {
|
||||||
|
if ($name === null && $encoding === null && $kv_folding === null) {
|
||||||
|
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email);
|
||||||
|
} elseif ($encoding === null && $kv_folding === null) {
|
||||||
|
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name);
|
||||||
|
} elseif ($kv_folding === null) {
|
||||||
|
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name, $encoding);
|
||||||
|
} else {
|
||||||
|
$encoded_email = \CoreLibs\Create\Email::encodeEmailName($email, $name, $encoding, $kv_folding);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$encoded_email
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function sendEmailProvider(): array
|
||||||
|
{
|
||||||
|
// 0: subject
|
||||||
|
// 1: body
|
||||||
|
// 2: from email
|
||||||
|
// 3: from name ('')
|
||||||
|
// 4: array for to email
|
||||||
|
// 5: replace content ([]/null)
|
||||||
|
// 6: encoding (UTF-8/null)
|
||||||
|
// 7: kv_folding
|
||||||
|
// 8: return status
|
||||||
|
// 9: expected content
|
||||||
|
return [
|
||||||
|
'all empty, fail -1' => [
|
||||||
|
'subject' => '',
|
||||||
|
'body' => '',
|
||||||
|
'from_email' => '',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => -1,
|
||||||
|
'expected_content' => [],
|
||||||
|
],
|
||||||
|
'missing to entry, fail -2' => [
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => -2,
|
||||||
|
'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' => [
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1, encoded' => [
|
||||||
|
'subject' => 'SUBJECT 日本語',
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6Kqe?=',
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'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' => [
|
||||||
|
'subject' => 'SUBJECT 日本語',
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => 'ISO-2022-JP',
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT =?ISO-2022-JP?B?GyRCRnxLXDhsGyhC?=',
|
||||||
|
// body is stored as UTF-8 in log and here, so both must be translated
|
||||||
|
'body' => 'BODY 日本語',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 2' => [
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'e1@test.com',
|
||||||
|
'e2@test.com'
|
||||||
|
],
|
||||||
|
'replace' => null,
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'e1@test.com',
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'e2@test.com',
|
||||||
|
'subject' => 'SUBJECT',
|
||||||
|
'body' => 'BODY',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1: dynamic' => [
|
||||||
|
'subject' => 'SUBJECT {FOO}',
|
||||||
|
'body' => 'BODY {FOO} {VAR}',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo',
|
||||||
|
'VAR' => 'bar',
|
||||||
|
],
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT foo',
|
||||||
|
'body' => 'BODY foo bar',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1: dynamic encoded' => [
|
||||||
|
'subject' => 'SUBJECT 日本語 {FOO}',
|
||||||
|
'body' => 'BODY 日本語 {FOO} {VAR}',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
'test@test.com'
|
||||||
|
],
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo',
|
||||||
|
'VAR' => 'bar',
|
||||||
|
],
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbw==?=',
|
||||||
|
'body' => 'BODY 日本語 foo bar',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1: dynamic, to override' => [
|
||||||
|
'subject' => 'SUBJECT {FOO}',
|
||||||
|
'body' => 'BODY {FOO} {VAR}',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
[
|
||||||
|
'email' => 'test@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo to'
|
||||||
|
]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo',
|
||||||
|
'VAR' => 'bar',
|
||||||
|
],
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT foo to',
|
||||||
|
'body' => 'BODY foo to bar',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 1: dynamic, to override encoded' => [
|
||||||
|
'subject' => 'SUBJECT 日本語 {FOO}',
|
||||||
|
'body' => 'BODY 日本語 {FOO} {VAR}',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
[
|
||||||
|
'email' => 'test@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo to'
|
||||||
|
]
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo',
|
||||||
|
'VAR' => 'bar',
|
||||||
|
],
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 'test@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbyB0bw==?=',
|
||||||
|
'body' => 'BODY 日本語 foo to bar',
|
||||||
|
]
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 3: dynamic, to mixed override' => [
|
||||||
|
'subject' => 'SUBJECT {FOO}',
|
||||||
|
'body' => 'BODY {FOO} {VAR}',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
[
|
||||||
|
'email' => 't1@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo to 1'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'email' => 't2@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo to 2'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'email' => 't3@test.com',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo',
|
||||||
|
'VAR' => 'bar',
|
||||||
|
],
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 't1@test.com',
|
||||||
|
'subject' => 'SUBJECT foo to 1',
|
||||||
|
'body' => 'BODY foo to 1 bar',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 't2@test.com',
|
||||||
|
'subject' => 'SUBJECT foo to 2',
|
||||||
|
'body' => 'BODY foo to 2 bar',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 't3@test.com',
|
||||||
|
'subject' => 'SUBJECT foo',
|
||||||
|
'body' => 'BODY foo bar',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'sending email 3: dynamic, to mixed override encoded' => [
|
||||||
|
'subject' => 'SUBJECT 日本語 {FOO}',
|
||||||
|
'body' => 'BODY 日本語 {FOO} {VAR}',
|
||||||
|
'from_email' => 'test@test.com',
|
||||||
|
'from_name' => '',
|
||||||
|
'to_email' => [
|
||||||
|
[
|
||||||
|
'email' => 't1@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo to 1'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'email' => 't2@test.com',
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo to 2'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'email' => 't3@test.com',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'replace' => [
|
||||||
|
'FOO' => 'foo',
|
||||||
|
'VAR' => 'bar',
|
||||||
|
],
|
||||||
|
'encoding' => null,
|
||||||
|
'kv_folding' => null,
|
||||||
|
'expected_status' => 2,
|
||||||
|
'expected_content' => [
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 't1@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbyB0byAx?=',
|
||||||
|
'body' => 'BODY 日本語 foo to 1 bar',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 't2@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbyB0byAy?=',
|
||||||
|
'body' => 'BODY 日本語 foo to 2 bar',
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'header' => [
|
||||||
|
'From' => 'test@test.com'
|
||||||
|
],
|
||||||
|
'to' => 't3@test.com',
|
||||||
|
'subject' => 'SUBJECT =?UTF-8?B?5pel5pys6KqeIGZvbw==?=',
|
||||||
|
'body' => 'BODY 日本語 foo bar',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @dataProvider sendEmailProvider
|
||||||
|
* @testdox email sending with expected status $expected_status [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $subject
|
||||||
|
* @param string $body
|
||||||
|
* @param string $from_email
|
||||||
|
* @param string $from_name
|
||||||
|
* @param array $to_email
|
||||||
|
* @param array|null $replace
|
||||||
|
* @param string|null $encoding
|
||||||
|
* @param bool|null $kv_folding
|
||||||
|
* @param int $expected_status
|
||||||
|
* @param array $expected_content
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSendEmail(
|
||||||
|
string $subject,
|
||||||
|
string $body,
|
||||||
|
string $from_email,
|
||||||
|
string $from_name,
|
||||||
|
array $to_email,
|
||||||
|
?array $replace,
|
||||||
|
?string $encoding,
|
||||||
|
?bool $kv_folding,
|
||||||
|
int $expected_status,
|
||||||
|
array $expected_content
|
||||||
|
): void {
|
||||||
|
if ($replace === null) {
|
||||||
|
$replace = [];
|
||||||
|
}
|
||||||
|
if ($encoding === null) {
|
||||||
|
$encoding = 'UTF-8';
|
||||||
|
}
|
||||||
|
if ($kv_folding === null) {
|
||||||
|
$kv_folding = false;
|
||||||
|
}
|
||||||
|
// force new set for each run
|
||||||
|
self::$log->setLogUniqueId(true);
|
||||||
|
// set on of unique log id
|
||||||
|
self::$log->setLogFlag(\CoreLibs\Logging\Logger\Flag::per_run);
|
||||||
|
// init logger
|
||||||
|
$status = \CoreLibs\Create\Email::sendEmail(
|
||||||
|
$subject,
|
||||||
|
$body,
|
||||||
|
$from_email,
|
||||||
|
$from_name,
|
||||||
|
$to_email,
|
||||||
|
$replace,
|
||||||
|
$encoding,
|
||||||
|
$kv_folding,
|
||||||
|
true,
|
||||||
|
self::$log
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_status,
|
||||||
|
$status,
|
||||||
|
'Assert sending status'
|
||||||
|
);
|
||||||
|
// assert content: must load JSON from log file
|
||||||
|
if ($status == 2) {
|
||||||
|
// open file, get last entry with 'SEND EMAIL JSON' key
|
||||||
|
$file = file_get_contents(
|
||||||
|
self::$log->getLogFolder() . self::$log->getLogFile()
|
||||||
|
);
|
||||||
|
if ($file !== false) {
|
||||||
|
// extract SEND EMAIL JSON line
|
||||||
|
$found = preg_match_all("/^.* <SEND EMAIL JSON> - (.*)$/m", $file, $matches);
|
||||||
|
// print "Found: $found | EMAIL: " . print_r($matches, true) . "\n";
|
||||||
|
if (!empty($matches[1])) {
|
||||||
|
foreach ($matches[1] as $pos => $email_json) {
|
||||||
|
$email = \CoreLibs\Convert\Json::jsonConvertToArray($email_json);
|
||||||
|
// print "EMAIL: " . print_r($email, true) . "\n";
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_content[$pos]['header']['From'] ?? 'MISSING FROM',
|
||||||
|
$email['header']['From'] ?? '',
|
||||||
|
'Email check: assert header from'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'text/plain; charset=' . $encoding ?? 'UTF-8',
|
||||||
|
$email['header']['Content-type'] ?? '',
|
||||||
|
'Email check: assert header content type'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
'1.0',
|
||||||
|
$email['header']['MIME-Version'] ?? '',
|
||||||
|
'Email check: assert header mime version'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_content[$pos]['to'] ?? 'MISSING TO',
|
||||||
|
$email['to'] ?? '',
|
||||||
|
'Email check: assert to'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_content[$pos]['subject'] ?? 'MISSING SUBJECT',
|
||||||
|
$email['subject'] ?? '',
|
||||||
|
'Email check: assert subject'
|
||||||
|
);
|
||||||
|
// body must be translated back to encoding if encoding is not UTF-8
|
||||||
|
$this->assertEquals(
|
||||||
|
$encoding != 'UTF-8' ?
|
||||||
|
mb_convert_encoding($expected_content[$pos]['body'] ?? '', $encoding, 'UTF-8') :
|
||||||
|
$expected_content[$pos]['body'] ?? 'MISSING BODY',
|
||||||
|
$email['encoding'] != 'UTF-8' ?
|
||||||
|
mb_convert_encoding($email['body'] ?? '', $email['encoding'], 'UTF-8') :
|
||||||
|
$email['body'] ?? '',
|
||||||
|
'Email check: assert body'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
@@ -13,7 +13,11 @@ use PHPUnit\Framework\TestCase;
|
|||||||
*/
|
*/
|
||||||
final class CoreLibsCreateHashTest extends TestCase
|
final class CoreLibsCreateHashTest extends TestCase
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
public function hashData(): array
|
public function hashData(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
472
4dev/tests/Create/CoreLibsCreateSessionTest.php
Normal file
472
4dev/tests/Create/CoreLibsCreateSessionTest.php
Normal file
@@ -0,0 +1,472 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use PHPUnit\Framework\MockObject\MockObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Create\Session
|
||||||
|
* @coversDefaultClass \CoreLibs\Create\Session
|
||||||
|
* @testdox \CoreLibs\Create\Session method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsCreateSessionTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function sessionProvider(): array
|
||||||
|
{
|
||||||
|
// 0: session name as parameter or for GLOBAL value
|
||||||
|
// 1: type p: parameter, g: global, d: php.ini default
|
||||||
|
// 2: mock data as array
|
||||||
|
// checkCliStatus: true/false,
|
||||||
|
// getSessionStatus: PHP_SESSION_DISABLED for abort,
|
||||||
|
// PHP_SESSION_NONE/ACTIVE for ok
|
||||||
|
// setSessionName: true/false,
|
||||||
|
// checkActiveSession: true/false, [1st call, 2nd call]
|
||||||
|
// getSessionId: string or false
|
||||||
|
// 3: exepcted name (session)
|
||||||
|
// 4: expected error string
|
||||||
|
return [
|
||||||
|
'session parameter' => [
|
||||||
|
'sessionNameParameter',
|
||||||
|
'p',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => true,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
|
'sessionNameParameter',
|
||||||
|
''
|
||||||
|
],
|
||||||
|
'session globals' => [
|
||||||
|
'sessionNameGlobals',
|
||||||
|
'g',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => true,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
|
'sessionNameGlobals',
|
||||||
|
''
|
||||||
|
],
|
||||||
|
'session name default' => [
|
||||||
|
'',
|
||||||
|
'd',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => true,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
''
|
||||||
|
],
|
||||||
|
// error checks
|
||||||
|
// 1: we are in cli
|
||||||
|
'on cli error' => [
|
||||||
|
'',
|
||||||
|
'd',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => true,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => true,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
'[SESSION] No sessions in php cli'
|
||||||
|
],
|
||||||
|
// 2: session disabled
|
||||||
|
'session disabled error' => [
|
||||||
|
'',
|
||||||
|
'd',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_DISABLED,
|
||||||
|
'setSessionName' => true,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
'[SESSION] Sessions are disabled'
|
||||||
|
],
|
||||||
|
// 3: invalid session name: string
|
||||||
|
'invalid name chars error' => [
|
||||||
|
'1invalid$session#;',
|
||||||
|
'p',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => false,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
'[SESSION] Invalid session name: 1invalid$session#;'
|
||||||
|
],
|
||||||
|
// 3: invalid session name: only numbers
|
||||||
|
'invalid name numbers only error' => [
|
||||||
|
'123',
|
||||||
|
'p',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => false,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
'[SESSION] Invalid session name: 123'
|
||||||
|
],
|
||||||
|
// 3: invalid session name: invalid name short
|
||||||
|
// 3: invalid session name: too long (128)
|
||||||
|
// 4: failed to start session (2nd false on check active session)
|
||||||
|
'invalid name numbers only error' => [
|
||||||
|
'',
|
||||||
|
'd',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => true,
|
||||||
|
'checkActiveSession' => [false, false],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
'[SESSION] Failed to activate session'
|
||||||
|
],
|
||||||
|
// 5: get session id return false
|
||||||
|
'invalid name numbers only error' => [
|
||||||
|
'',
|
||||||
|
'd',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => true,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => false
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
'[SESSION] getSessionId did not return a session id'
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test session start
|
||||||
|
*
|
||||||
|
* @covers ::startSession
|
||||||
|
* @dataProvider sessionProvider
|
||||||
|
* @testdox startSession $input name for $type will be $expected (error: $expected_error) [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $type
|
||||||
|
* @param array<mixed> $mock_data
|
||||||
|
* @param string $expected
|
||||||
|
* @param string $expected_error
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testStartSession(
|
||||||
|
string $input,
|
||||||
|
string $type,
|
||||||
|
array $mock_data,
|
||||||
|
string $expected,
|
||||||
|
string $expected_error
|
||||||
|
): void {
|
||||||
|
// override expected
|
||||||
|
if ($type == 'd') {
|
||||||
|
$expected = ini_get('session.name');
|
||||||
|
}
|
||||||
|
/** @var \CoreLibs\Create\Session&MockObject $session_mock */
|
||||||
|
$session_mock = $this->createPartialMock(
|
||||||
|
\CoreLibs\Create\Session::class,
|
||||||
|
[
|
||||||
|
'checkCliStatus', 'getSessionStatus', 'checkActiveSession',
|
||||||
|
'setSessionName', 'startSessionCall', 'getSessionId',
|
||||||
|
'getSessionName'
|
||||||
|
]
|
||||||
|
);
|
||||||
|
// set return values based requested input values
|
||||||
|
// OK: true
|
||||||
|
// error: false
|
||||||
|
$session_mock->method('checkCliStatus')->willReturn($mock_data['checkCliStatus']);
|
||||||
|
// OK: PHP_SESSION_ACTIVE, PHP_SESSION_NONE
|
||||||
|
// error: PHP_SESSION_DISABLED
|
||||||
|
$session_mock->method('getSessionStatus')->willReturn($mock_data['getSessionStatus']);
|
||||||
|
// false: try start
|
||||||
|
// true: skip start
|
||||||
|
// note that on second call if false -> error
|
||||||
|
$session_mock->method('checkActiveSession')
|
||||||
|
->willReturnOnConsecutiveCalls(
|
||||||
|
$mock_data['checkActiveSession'][0],
|
||||||
|
$mock_data['checkActiveSession'][1],
|
||||||
|
);
|
||||||
|
// dummy set for session name
|
||||||
|
$session_mock->method('setSessionName')->with($input)->willReturn($mock_data['setSessionName']);
|
||||||
|
// set session name & return bsed on request data
|
||||||
|
$session_mock->method('getSessionName')->willReturn($expected);
|
||||||
|
// will not return anything
|
||||||
|
$session_mock->method('startSessionCall');
|
||||||
|
// in test case only return string
|
||||||
|
// false: will return false
|
||||||
|
$session_mock->method('getSessionId')->willReturn($mock_data['getSessionId']);
|
||||||
|
|
||||||
|
// regex for session id
|
||||||
|
$ression_id_regex = "/^\w+$/";
|
||||||
|
|
||||||
|
unset($GLOBALS['SET_SESSION_NAME']);
|
||||||
|
$session_id = '';
|
||||||
|
switch ($type) {
|
||||||
|
case 'p':
|
||||||
|
$session_id = $session_mock->startSession($input);
|
||||||
|
break;
|
||||||
|
case 'g':
|
||||||
|
$GLOBALS['SET_SESSION_NAME'] = $input;
|
||||||
|
$session_id = $session_mock->startSession();
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
$session_id = $session_mock->startSession();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// asert checks
|
||||||
|
if (!empty($session_id)) {
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$ression_id_regex,
|
||||||
|
(string)$session_id,
|
||||||
|
'session id regex from retrun'
|
||||||
|
);
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$ression_id_regex,
|
||||||
|
(string)$session_mock->getSessionId()
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$session_mock->getSessionName()
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// false checks
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_error,
|
||||||
|
$session_mock->getErrorStr(),
|
||||||
|
'error assert'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* provider for session name check
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function sessionNameProvider(): array
|
||||||
|
{
|
||||||
|
// 0: string for session
|
||||||
|
// 1: expected return as bool
|
||||||
|
return [
|
||||||
|
'valid name' => [
|
||||||
|
'abc',
|
||||||
|
true
|
||||||
|
],
|
||||||
|
'valid name longer' => [
|
||||||
|
'something-abc-123',
|
||||||
|
true
|
||||||
|
],
|
||||||
|
'invalid name' => [
|
||||||
|
'abc#abc',
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'only numbers' => [
|
||||||
|
'123',
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'longer than 128 chars' => [
|
||||||
|
'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
|
||||||
|
. 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
|
||||||
|
. 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz',
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'too short' => [
|
||||||
|
'',
|
||||||
|
false
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test valid session name
|
||||||
|
*
|
||||||
|
* @covers ::checkValidSessionName
|
||||||
|
* @dataProvider sessionNameProvider
|
||||||
|
* @testdox checkValidSessionName $input seessionn name is $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCheckValidSessionName(string $input, bool $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Create\Session::checkValidSessionName($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* provider for set/get tests
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function sessionDataProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'test' => [
|
||||||
|
'foo',
|
||||||
|
'bar',
|
||||||
|
'bar',
|
||||||
|
],
|
||||||
|
'int key test' => [
|
||||||
|
123,
|
||||||
|
'bar',
|
||||||
|
'bar',
|
||||||
|
],
|
||||||
|
// more complex value tests
|
||||||
|
'array values' => [
|
||||||
|
'array',
|
||||||
|
[1, 2, 3],
|
||||||
|
[1, 2, 3],
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* method call test
|
||||||
|
*
|
||||||
|
* @covers ::setS
|
||||||
|
* @covers ::getS
|
||||||
|
* @covers ::issetS
|
||||||
|
* @covers ::unsetS
|
||||||
|
* @dataProvider sessionDataProvider
|
||||||
|
* @testdox setS/getS/issetS/unsetS $name with $input is $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|int $name
|
||||||
|
* @param mixed $input
|
||||||
|
* @param mixed $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMethodSetGet($name, $input, $expected): void
|
||||||
|
{
|
||||||
|
$session = new \CoreLibs\Create\Session();
|
||||||
|
$session->setS($name, $input);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$session->getS($name),
|
||||||
|
'method set assert'
|
||||||
|
);
|
||||||
|
// isset true
|
||||||
|
$this->assertTrue(
|
||||||
|
$session->issetS($name),
|
||||||
|
'method isset assert ok'
|
||||||
|
);
|
||||||
|
$session->unsetS($name);
|
||||||
|
$this->assertEquals(
|
||||||
|
'',
|
||||||
|
$session->getS($name),
|
||||||
|
'method unset assert'
|
||||||
|
);
|
||||||
|
// iset false
|
||||||
|
$this->assertFalse(
|
||||||
|
$session->issetS($name),
|
||||||
|
'method isset assert false'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* magic call test
|
||||||
|
*
|
||||||
|
* @covers ::__set
|
||||||
|
* @covers ::__get
|
||||||
|
* @covers ::__isset
|
||||||
|
* @covers ::__unset
|
||||||
|
* @dataProvider sessionDataProvider
|
||||||
|
* @testdox __set/__get/__iseet/__unset $name with $input is $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|int $name
|
||||||
|
* @param mixed $input
|
||||||
|
* @param mixed $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMagicSetGet($name, $input, $expected): void
|
||||||
|
{
|
||||||
|
$session = new \CoreLibs\Create\Session();
|
||||||
|
$session->$name = $input;
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$session->$name,
|
||||||
|
'magic set assert'
|
||||||
|
);
|
||||||
|
// isset true
|
||||||
|
$this->assertTrue(
|
||||||
|
isset($session->$name),
|
||||||
|
'magic isset assert ok'
|
||||||
|
);
|
||||||
|
unset($session->$name);
|
||||||
|
$this->assertEquals(
|
||||||
|
'',
|
||||||
|
$session->$name,
|
||||||
|
'magic unset assert'
|
||||||
|
);
|
||||||
|
// isset true
|
||||||
|
$this->assertFalse(
|
||||||
|
isset($session->$name),
|
||||||
|
'magic isset assert false'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* unset all test
|
||||||
|
*
|
||||||
|
* @covers ::unsetAllS
|
||||||
|
* @testdox unsetAllS test
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testUnsetAll(): void
|
||||||
|
{
|
||||||
|
$test_values = [
|
||||||
|
'foo' => 'abc',
|
||||||
|
'bar' => '123'
|
||||||
|
];
|
||||||
|
$session = new \CoreLibs\Create\Session();
|
||||||
|
foreach ($test_values as $name => $value) {
|
||||||
|
$session->setS($name, $value);
|
||||||
|
// confirm set
|
||||||
|
$this->assertEquals(
|
||||||
|
$value,
|
||||||
|
$session->getS($name),
|
||||||
|
'set assert: ' . $name
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// unset all
|
||||||
|
$session->unsetAllS();
|
||||||
|
// check unset
|
||||||
|
foreach (array_keys($test_values) as $name) {
|
||||||
|
$this->assertEquals(
|
||||||
|
'',
|
||||||
|
$session->getS($name),
|
||||||
|
'unsert assert: ' . $name
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
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__
|
||||||
@@ -36,9 +36,9 @@ final class CoreLibsDBExtendedArrayIOTest extends TestCase
|
|||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function testDBIO()
|
public function testArrayDBIO()
|
||||||
{
|
{
|
||||||
$this->assertTrue(true, 'DB Extended ArrayIO Tests not implemented');
|
// $this->assertTrue(true, 'DB Extended ArrayIO Tests not implemented');
|
||||||
$this->markTestIncomplete(
|
$this->markTestIncomplete(
|
||||||
'DB\Extended\ArrayIO Tests have not yet been implemented'
|
'DB\Extended\ArrayIO Tests have not yet been implemented'
|
||||||
);
|
);
|
||||||
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
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user