Compare commits
342 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fe459aec80 | ||
|
|
de0ed058ca | ||
|
|
f90bd193d9 | ||
|
|
0e31180868 | ||
|
|
68c9164eaa | ||
|
|
c2389db1c9 | ||
|
|
f9558cd3aa | ||
|
|
ae3011fe22 | ||
|
|
9b9dfeac69 | ||
|
|
33cb05a002 | ||
|
|
ec110499a8 | ||
|
|
09839f3451 | ||
|
|
067e0aed5d | ||
|
|
545de5c4a1 | ||
|
|
2fe37bf92a | ||
|
|
cd81d15d9a | ||
|
|
8a33ee5c15 | ||
|
|
46e1419ef5 | ||
|
|
c441063437 | ||
|
|
5290d5f351 | ||
|
|
2635ccb82b | ||
|
|
4f2ac2ed1b | ||
|
|
5b8e4e4e3e | ||
|
|
53192da571 | ||
|
|
f29e915068 | ||
|
|
46bc5f2da6 | ||
|
|
d70182a84e | ||
|
|
7243f69826 | ||
|
|
1fc144e178 | ||
|
|
c383a7b7b7 | ||
|
|
69077c384c | ||
|
|
cfd49947ad | ||
|
|
6985dc4e9d | ||
|
|
5f2668b011 | ||
|
|
eba1ef9c59 | ||
|
|
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 | ||
|
|
316ca106fd | ||
|
|
fd9b201346 | ||
|
|
667dc4de8e | ||
|
|
fed67e990d | ||
|
|
c181a83b48 | ||
|
|
c830a32962 | ||
|
|
82bc99b181 | ||
|
|
556cabca38 | ||
|
|
6f4c5e36e6 | ||
|
|
a3c49e408a | ||
|
|
cc77d7e031 | ||
|
|
d553c1364f | ||
|
|
3f374a2cd7 | ||
|
|
9e99275db5 | ||
|
|
330e2baf39 | ||
|
|
5a81626e8c | ||
|
|
41cff5e3c6 | ||
|
|
e463f48ad4 | ||
|
|
f8ee6044f9 | ||
|
|
4b0e9b44c3 | ||
|
|
e5309b5dbc | ||
|
|
aad2e9b11b | ||
|
|
d6baf58231 | ||
|
|
c464a7d884 | ||
|
|
60613bf311 | ||
|
|
2a583e525c | ||
|
|
04b0476b4d | ||
|
|
13fb22385b | ||
|
|
b7f594e683 | ||
|
|
023ab6811d | ||
|
|
35a7229158 | ||
|
|
b075ee3dc5 | ||
|
|
dfbc2fee29 | ||
|
|
b13f84b7ed | ||
|
|
7d1d795b29 | ||
|
|
105e0d69a1 | ||
|
|
38903020fb | ||
|
|
40edbe271d | ||
|
|
a833b26322 | ||
|
|
3881a2a83d | ||
|
|
cf49bf72fa | ||
|
|
e3cf55efe5 | ||
|
|
a0a7389d3b | ||
|
|
42b961f35e | ||
|
|
fe13c24a13 | ||
|
|
714311cf85 | ||
|
|
9d79dd4af4 | ||
|
|
cae6d4c372 | ||
|
|
aafca0153f | ||
|
|
7a902b5681 | ||
|
|
780fdedcfd | ||
|
|
51a0276268 | ||
|
|
0dc57564c5 | ||
|
|
c8d7b308b3 | ||
|
|
f2c0ba737a | ||
|
|
de1cdfdd40 | ||
|
|
8267bcd8b8 | ||
|
|
0109a67b20 | ||
|
|
c584af8393 | ||
|
|
03f0de5026 | ||
|
|
6a139d3b7c | ||
|
|
2a697817fd | ||
|
|
f4e72dd7b1 | ||
|
|
974c0fb92f | ||
|
|
9a5f1d43cf | ||
|
|
33766e1e2d | ||
|
|
4a51f841c5 | ||
|
|
ad39a5b21f | ||
|
|
1bd45d8a8a | ||
|
|
13c0fcd869 | ||
|
|
cb63a3eaa9 | ||
|
|
4363f289fc | ||
|
|
7fd5062064 | ||
|
|
5452bffdb4 | ||
|
|
4bac10bb42 | ||
|
|
6001934d9c | ||
|
|
f622d59ed9 | ||
|
|
6147d28b37 | ||
|
|
f9072f64f1 | ||
|
|
0f38cb4f89 | ||
|
|
08bbc913a9 | ||
|
|
4c859ada01 | ||
|
|
58e61b8902 | ||
|
|
edfbe476c4 | ||
|
|
0907325a38 | ||
|
|
60b6fae33a | ||
|
|
0b7dba5e2f | ||
|
|
c1212d8116 | ||
|
|
5230cbf5d3 | ||
|
|
a6b42f243f | ||
|
|
736f822363 | ||
|
|
ffd1a86dcc |
@@ -26,6 +26,10 @@
|
|||||||
use Phan\Config;
|
use Phan\Config;
|
||||||
|
|
||||||
return [
|
return [
|
||||||
|
// "target_php_version" => "8.2",
|
||||||
|
"minimum_target_php_version" => "8.1",
|
||||||
|
// turn color on (-C)
|
||||||
|
"color_issue_messages_if_supported" => true,
|
||||||
// If true, missing properties will be created when
|
// If true, missing properties will be created when
|
||||||
// they are first seen. If false, we'll report an
|
// they are first seen. If false, we'll report an
|
||||||
// error message.
|
// error message.
|
||||||
@@ -36,7 +40,7 @@ return [
|
|||||||
"null_casts_as_any_type" => false,
|
"null_casts_as_any_type" => false,
|
||||||
|
|
||||||
// Backwards Compatibility Checking
|
// Backwards Compatibility Checking
|
||||||
'backward_compatibility_checks' => true,
|
'backward_compatibility_checks' => false,
|
||||||
|
|
||||||
// Run a quick version of checks that takes less
|
// Run a quick version of checks that takes less
|
||||||
// time
|
// time
|
||||||
@@ -46,6 +50,12 @@ return [
|
|||||||
// (0 is low severity, 5 is normal severity, 10 is critical)
|
// (0 is low severity, 5 is normal severity, 10 is critical)
|
||||||
"minimum_severity" => 0,
|
"minimum_severity" => 0,
|
||||||
|
|
||||||
|
// enable for dead code check
|
||||||
|
// this will spill out errors for all methods never called
|
||||||
|
// use after all is OK to try to find unused code blocks
|
||||||
|
// ignore recommended: PhanUnreferencedPublicMethod
|
||||||
|
// "dead_code_detection" => true,
|
||||||
|
|
||||||
// default false for include path check
|
// default false for include path check
|
||||||
"enable_include_path_checks" => true,
|
"enable_include_path_checks" => true,
|
||||||
"include_paths" => [
|
"include_paths" => [
|
||||||
@@ -85,11 +95,7 @@ return [
|
|||||||
// to parse, but not analyze
|
// to parse, but not analyze
|
||||||
"exclude_analysis_directory_list" => [
|
"exclude_analysis_directory_list" => [
|
||||||
'www/vendor',
|
'www/vendor',
|
||||||
// 'www/lib/FileUpload',
|
'www/tests',
|
||||||
'www/lib/pChart',
|
|
||||||
'www/lib/pChart2.1.4',
|
|
||||||
'www/lib/Smarty',
|
|
||||||
'www/lib/smarty-3.1.30',
|
|
||||||
'www/templates_c',
|
'www/templates_c',
|
||||||
'www/log',
|
'www/log',
|
||||||
'www/tmp',
|
'www/tmp',
|
||||||
@@ -110,15 +116,24 @@ 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-3.1.30/SmartyBC.class.php',
|
|
||||||
'www/lib/htmlMimeMail-2.5.1/HtmlMimeMailCreate.php',
|
|
||||||
],
|
],
|
||||||
|
|
||||||
// what not to show as problem
|
// what not to show as problem
|
||||||
'suppress_issue_types' => [
|
'suppress_issue_types' => [
|
||||||
// 'PhanUndeclaredMethod',
|
// 'PhanUndeclaredMethod',
|
||||||
'PhanEmptyFile',
|
'PhanEmptyFile',
|
||||||
|
// ignore unreferences public methods, etc here (for dead code check)
|
||||||
|
'PhanUnreferencedPublicMethod',
|
||||||
|
'PhanUnreferencedClass',
|
||||||
|
'PhanWriteOnlyPublicProperty',
|
||||||
|
'PhanUnreferencedConstant',
|
||||||
|
'PhanWriteOnlyPublicProperty',
|
||||||
|
'PhanReadOnlyPublicProperty',
|
||||||
|
// start ignore annotations
|
||||||
|
'PhanUnextractableAnnotationElementName',
|
||||||
|
'PhanUnextractableAnnotationSuffix',
|
||||||
|
// enum problems in comments
|
||||||
|
'PhanCommentObjectInClassConstantType'
|
||||||
],
|
],
|
||||||
|
|
||||||
// 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__
|
||||||
3
4dev/checking/phan.sh
Executable file
3
4dev/checking/phan.sh
Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
|
||||||
|
# must be run in ${base}www/
|
||||||
|
phan --progress-bar -C --analyze-twice
|
||||||
3
4dev/checking/phpstan.sh
Executable file
3
4dev/checking/phpstan.sh
Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
|
||||||
|
# must be run in ${base}www/
|
||||||
|
phpstan
|
||||||
46
4dev/checking/phpunit.sh
Executable file
46
4dev/checking/phpunit.sh
Executable file
@@ -0,0 +1,46 @@
|
|||||||
|
#!/bin/env bash
|
||||||
|
|
||||||
|
base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
|
||||||
|
# -c phpunit.xml
|
||||||
|
# --testdox
|
||||||
|
# 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__
|
||||||
@@ -1,21 +1,27 @@
|
|||||||
Install composer:
|
Install composer:
|
||||||
curl -sS https://getcomposer.org/installer | /usr/local/php-7.3-httpd-2.4/bin/php
|
# old
|
||||||
|
curl -sS https://getcomposer.org/installer | /usr/local/php-8.0-httpd-2.4/bin/php
|
||||||
|
# new (4 steps) https://getcomposer.org/download/
|
||||||
|
/usr/local/php-8.0-httpd-2.4/bin/php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
|
||||||
|
/usr/local/php-8.0-httpd-2.4/bin/php -r "if (hash_file('sha384', 'composer-setup.php') === '906a84df04cea2aa72f40b5f787e49f22d4c2f19492ac310e8cba5b96ac8b64115ac402c8cd292b8a03482574915d1a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
|
||||||
|
/usr/local/php-8.0-httpd-2.4/bin/php composer-setup.php
|
||||||
|
/usr/local/php-8.0-httpd-2.4/bin/php -r "unlink('composer-setup.php');
|
||||||
|
|
||||||
Update composer phar file
|
Update composer phar file
|
||||||
/usr/local/php-7.3-httpd-2.4/bin/php composer.phar selfupdate
|
/usr/local/php-8.0-httpd-2.4/bin/php composer.phar selfupdate
|
||||||
|
|
||||||
Install something:
|
Install something:
|
||||||
/usr/local/php-7.3-httpd-2.4/bin/php composer.phar require something/something
|
/usr/local/php-8.0-httpd-2.4/bin/php composer.phar require something/something
|
||||||
|
|
||||||
Update all installed:
|
Update all installed:
|
||||||
/usr/local/php-7.3-httpd-2.4/bin/php composer.phar update
|
/usr/local/php-8.0-httpd-2.4/bin/php composer.phar update
|
||||||
|
|
||||||
Or update only one package:
|
Or update only one package:
|
||||||
/usr/local/php-7.3-httpd-2.4/bin/php composer.phar something/something
|
/usr/local/php-8.0-httpd-2.4/bin/php composer.phar something/something
|
||||||
|
|
||||||
Install AWS SDK:
|
Install AWS SDK:
|
||||||
/usr/local/php-7.3-httpd-2.4/bin/php -d memory_limit=-1 composer.phar require aws/aws-sdk-php
|
/usr/local/php-8.0-httpd-2.4/bin/php -d memory_limit=-1 composer.phar require aws/aws-sdk-php
|
||||||
|
|
||||||
Install zipStream:
|
Install zipStream:
|
||||||
/usr/local/php-7.3-httpd-2.4/bin/php composer.phar require maennchen/zipstream-php
|
/usr/local/php-8.0-httpd-2.4/bin/php composer.phar require maennchen/zipstream-php
|
||||||
|
|
||||||
|
|||||||
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,9 +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
|
||||||
DELETE FROM edit_language;
|
DELETE FROM edit_language;
|
||||||
INSERT INTO edit_language (short_name, long_name, iso_name, order_number, enabled, lang_default) VALUES ('en', 'English', '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 (short_name, long_name, iso_name, order_number, enabled, lang_default) VALUES ('ja', 'Japanese', '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;
|
||||||
@@ -129,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);
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ CREATE TABLE edit_language (
|
|||||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||||
lang_default SMALLINT NOT NULL DEFAULT 0,
|
lang_default SMALLINT NOT NULL DEFAULT 0,
|
||||||
long_name VARCHAR,
|
long_name VARCHAR,
|
||||||
short_name VARCHAR,
|
short_name VARCHAR, -- en_US, en or en_US@latin without encoding
|
||||||
iso_name VARCHAR,
|
iso_name VARCHAR, -- should actually be encoding
|
||||||
order_number INT
|
order_number INT
|
||||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||||
|
|||||||
@@ -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,5 +1,10 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
// config.php reads auto loader and uses CoreLibs version of this
|
||||||
|
// DEPRECATED for here
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* parses .env file
|
* parses .env file
|
||||||
*
|
*
|
||||||
@@ -20,9 +25,15 @@
|
|||||||
* 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\DotEnv::readEnvFile()
|
||||||
*/
|
*/
|
||||||
function readEnvFile(string $path = __DIR__, string $env_file = '.env'): int
|
function readEnvFile(string $path = __DIR__, string $env_file = '.env'): int
|
||||||
{
|
{
|
||||||
|
trigger_error(
|
||||||
|
'Method readEnvFile() is deprecated, use '
|
||||||
|
. '\CoreLibs\Get\ReadEnvFile::readEnvFile()',
|
||||||
|
E_USER_DEPRECATED
|
||||||
|
);
|
||||||
// default -1;
|
// default -1;
|
||||||
$status = -1;
|
$status = -1;
|
||||||
$env_file_target = $path . DIRECTORY_SEPARATOR . $env_file;
|
$env_file_target = $path . DIRECTORY_SEPARATOR . $env_file;
|
||||||
@@ -42,7 +53,7 @@ function readEnvFile(string $path = __DIR__, string $env_file = '.env'): int
|
|||||||
$var = '';
|
$var = '';
|
||||||
while ($line = fgets($fp)) {
|
while ($line = fgets($fp)) {
|
||||||
// main match for variable = value part
|
// main match for variable = value part
|
||||||
if (preg_match("/^\s*([\w_]+)\s*=\s*((\"?).*)/", $line, $matches)) {
|
if (preg_match("/^\s*([\w_.]+)\s*=\s*((\"?).*)/", $line, $matches)) {
|
||||||
$var = $matches[1];
|
$var = $matches[1];
|
||||||
$value = $matches[2];
|
$value = $matches[2];
|
||||||
$quotes = $matches[3];
|
$quotes = $matches[3];
|
||||||
55
4dev/locale/Readme.md
Normal file
55
4dev/locale/Readme.md
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
# Translation files
|
||||||
|
|
||||||
|
## Source file name convetion
|
||||||
|
|
||||||
|
Locale Name . Domain . Encoding .po
|
||||||
|
|
||||||
|
## Name parte explenations
|
||||||
|
|
||||||
|
### Locale Name Examples
|
||||||
|
|
||||||
|
If underscore in name the long version is checked first, then the short version:
|
||||||
|
en_US@latin -> en_US -> en
|
||||||
|
|
||||||
|
* en
|
||||||
|
* en_US
|
||||||
|
* en_US.UTF-8
|
||||||
|
* en_US@latin
|
||||||
|
|
||||||
|
### Domain
|
||||||
|
|
||||||
|
For current case auto set CONTENT_PATH is used
|
||||||
|
|
||||||
|
* admin
|
||||||
|
* frontend
|
||||||
|
|
||||||
|
### Encoding
|
||||||
|
|
||||||
|
if not set UTF-8 is assumed. Any other utf8 encoding is changed to UTF-8
|
||||||
|
|
||||||
|
* UTF-8
|
||||||
|
* SJIS
|
||||||
|
* EUC
|
||||||
|
|
||||||
|
## File name example source
|
||||||
|
|
||||||
|
`ja-admin.po`
|
||||||
|
|
||||||
|
First part is LOCALE, second part is domain. Separator is `-`
|
||||||
|
|
||||||
|
## Folder layout
|
||||||
|
|
||||||
|
`includes/locale/ja/LC_MESSAGES/frontend.mo`
|
||||||
|
|
||||||
|
ALTERNATE LOCALE NAMES:
|
||||||
|
* ja
|
||||||
|
* ja_JP
|
||||||
|
* ja.UTF-8
|
||||||
|
* ja_JP.UTF-8
|
||||||
|
|
||||||
|
ja_JP.UTF-8: Locale Name
|
||||||
|
frontend: dmain (CONTENT_PATH)
|
||||||
|
|
||||||
|
## command
|
||||||
|
|
||||||
|
`msgfmt -o www/includes/locale/ja/LC_MESSAGES/frontend.mo 4dev/lang/ja.admin.po`
|
||||||
56
4dev/locale/en-admin.po
Normal file
56
4dev/locale/en-admin.po
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# ********************************************************************
|
||||||
|
# AUTHOR: Clemens Schwaighofer
|
||||||
|
# CREATED: 2005/08/09
|
||||||
|
# SHORT DESCRIPTION:
|
||||||
|
# Backend English Messages file for gettext
|
||||||
|
# ********************************************************************/
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: en.UTF-8 LC_MESSAGES admin\n"
|
||||||
|
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
||||||
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: clemens.schwaighofer@egplusww.co\n"
|
||||||
|
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
||||||
|
"Language: en\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
|
|
||||||
|
msgid "Year"
|
||||||
|
msgstr "Year"
|
||||||
|
|
||||||
|
msgid "Month"
|
||||||
|
msgstr "Month"
|
||||||
|
|
||||||
|
msgid "INPUT TEST"
|
||||||
|
msgstr "OUTPUT TEST ADMIN EN"
|
||||||
|
|
||||||
|
# testing multi
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi Admin en 0"
|
||||||
|
msgstr[1] "Multi Admin en 1"
|
||||||
|
msgstr[2] "Multi Admin en 2"
|
||||||
|
|
||||||
|
msgctxt "month name"
|
||||||
|
msgid "May"
|
||||||
|
msgstr "May Admin en"
|
||||||
|
|
||||||
|
msgctxt "month name"
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi Admin month en 0"
|
||||||
|
msgstr[1] "Multi Admin month en 1"
|
||||||
|
msgstr[2] "Multi Admin month en 2"
|
||||||
|
|
||||||
|
msgid "I should be translated"
|
||||||
|
msgstr "I should be translated: I WAS TRANSLATED"
|
||||||
|
|
||||||
|
msgid "Are we translated?"
|
||||||
|
msgstr "Are we translated? Yes, we are!"
|
||||||
|
|
||||||
|
msgid "Original with string: %1"
|
||||||
|
msgstr "Translated with: %1"
|
||||||
@@ -2,34 +2,28 @@
|
|||||||
# AUTHOR: Clemens Schwaighofer
|
# AUTHOR: Clemens Schwaighofer
|
||||||
# CREATED: 2005/08/09
|
# CREATED: 2005/08/09
|
||||||
# SHORT DESCRIPTION:
|
# SHORT DESCRIPTION:
|
||||||
# Backned English Messages file for gettext
|
# Frontend English Messages file for gettext
|
||||||
# to craete: msgfmt -o ja.mo messages_en.po
|
|
||||||
# HISTORY:
|
|
||||||
# ********************************************************************/
|
# ********************************************************************/
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Project Version\n"
|
"Project-Id-Version: en.UTF-8 LC_MESSAGES frontend\n"
|
||||||
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
||||||
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: clemens.schwaighofer@egplusww.co\n"
|
||||||
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
||||||
|
"Language: en\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||||
msgid "Year"
|
|
||||||
msgstr "Year"
|
|
||||||
|
|
||||||
msgid "Month"
|
|
||||||
msgstr "Month"
|
|
||||||
|
|
||||||
msgid "INPUT TEST"
|
msgid "INPUT TEST"
|
||||||
msgstr "OUTPUT TEST EN"
|
msgstr "OUTPUT TEST FRONTEND EN"
|
||||||
|
|
||||||
msgid "I should be translated"
|
msgid "single"
|
||||||
msgstr "I should be translated: I WAS TRANSLATED"
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi frontend en 0"
|
||||||
msgid "Are we translated?"
|
msgstr[1] "Multi frontend en 1"
|
||||||
msgstr "Are we translated? Yes, we are!"
|
msgstr[2] "Multi frontend en 2"
|
||||||
@@ -2,22 +2,22 @@
|
|||||||
# 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 ja.mo messages_ja.po
|
|
||||||
# HISTORY:
|
|
||||||
# ********************************************************************/
|
# ********************************************************************/
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: Project Version\n"
|
"Project-Id-Version: ja.UTF-8 LC_MESSAGES admin\n"
|
||||||
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
||||||
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: \n"
|
"Last-Translator: clemens.schwaighofer@egplusww.com\n"
|
||||||
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
||||||
|
"Language: ja\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||||
|
|
||||||
msgid "Yes"
|
msgid "Yes"
|
||||||
msgstr "はい"
|
msgstr "はい"
|
||||||
@@ -63,7 +63,25 @@ msgid "Sun"
|
|||||||
msgstr "日"
|
msgstr "日"
|
||||||
|
|
||||||
msgid "INPUT TEST"
|
msgid "INPUT TEST"
|
||||||
msgstr "OUTPUT TEST JA"
|
msgstr "OUTPUT TEST ADMIN JA"
|
||||||
|
|
||||||
|
# testing multi
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi Admin ja 0"
|
||||||
|
msgstr[1] "Multi Admin ja 1"
|
||||||
|
msgstr[2] "Multi Admin ja 2"
|
||||||
|
|
||||||
|
msgctxt "month name"
|
||||||
|
msgid "May"
|
||||||
|
msgstr "May Admin ja"
|
||||||
|
|
||||||
|
msgctxt "month name"
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi Admin month ja 0"
|
||||||
|
msgstr[1] "Multi Admin month ja 1"
|
||||||
|
msgstr[2] "Multi Admin month ja 2"
|
||||||
|
|
||||||
# login string
|
# login string
|
||||||
msgid "Hello %s"
|
msgid "Hello %s"
|
||||||
@@ -75,3 +93,5 @@ msgstr "「スマーティー」これは正しいです"
|
|||||||
msgid "Are we translated?"
|
msgid "Are we translated?"
|
||||||
msgstr "「クラス」これは翻訳です?"
|
msgstr "「クラス」これは翻訳です?"
|
||||||
|
|
||||||
|
msgid "Original with string: %1"
|
||||||
|
msgstr "%1と翻訳した"
|
||||||
29
4dev/locale/ja-frontend.po
Normal file
29
4dev/locale/ja-frontend.po
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# ********************************************************************
|
||||||
|
# AUTHOR: Clemens Schwaighofer
|
||||||
|
# CREATED: 2005/08/09
|
||||||
|
# SHORT DESCRIPTION:
|
||||||
|
# Frontend Japanese Messages file for gettext
|
||||||
|
# ********************************************************************/
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: ja.UTF-8 LC_MESSAGES frontend\n"
|
||||||
|
"Report-Msgid-Bugs-To: clemens.schwaighofer@egplusww.com\n"
|
||||||
|
"POT-Creation-Date: 2018-03-28 10:40+0900\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: clemens.schwaighofer@egplusww.com\n"
|
||||||
|
"Language-Team: E-GRAPHICS COMMUNICATIONS Japan <info.jp@egplusww.com>\n"
|
||||||
|
"Language: ja\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||||
|
|
||||||
|
msgid "INPUT TEST"
|
||||||
|
msgstr "OUTPUT TEST FRONTEND JA"
|
||||||
|
|
||||||
|
msgid "single"
|
||||||
|
msgid_plural "multi"
|
||||||
|
msgstr[0] "Multi frontend ja 0"
|
||||||
|
msgstr[1] "Multi frontend ja 1"
|
||||||
|
msgstr[2] "Multi frontend ja 2"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# create path
|
# create path
|
||||||
path=$(pwd)"/"$0;
|
path=$(pwd)"/"$0;
|
||||||
@@ -10,11 +10,20 @@ 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
|
||||||
|
chmod -R ug+rX ${LOCAL_DIR}/vender/
|
||||||
|
|
||||||
# for web (ika)
|
# for web (ika)
|
||||||
rm -f $tmpf_web;
|
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;
|
||||||
@@ -35,7 +44,6 @@ cat $tmpf_web;
|
|||||||
|
|
||||||
echo "($1) Syncing from $LOCAL_DIR/* to $TARGET_HOST_WEB:$REMOTE_WEB";
|
echo "($1) Syncing from $LOCAL_DIR/* to $TARGET_HOST_WEB:$REMOTE_WEB";
|
||||||
echo "You hav 5 seconds to abort (<ctrl> + c)";
|
echo "You hav 5 seconds to abort (<ctrl> + c)";
|
||||||
#c=0;until [ $c -eq 10 ];do echo -n "#"; sleep 1; c=`expr $c + 1`;done;
|
|
||||||
for ((i=5;i>=1;i--));
|
for ((i=5;i>=1;i--));
|
||||||
do
|
do
|
||||||
echo -n $i" ";
|
echo -n $i" ";
|
||||||
@@ -44,10 +52,10 @@ done;
|
|||||||
|
|
||||||
if [ "$1" = "live" ];
|
if [ "$1" = "live" ];
|
||||||
then
|
then
|
||||||
# ika sync
|
# live sync
|
||||||
rsync -Plzvrupt --stats --include ".htaccess" --exclude-from=$tmpf_web --delete -e ssh $LOCAL_DIR/* $TARGET_HOST_WEB:$REMOTE_WEB
|
rsync -Plzvrupt --stats --include ".htaccess" --exclude-from=$tmpf_web --delete -e ssh $LOCAL_DIR/* $TARGET_HOST_WEB:$REMOTE_WEB
|
||||||
else
|
else
|
||||||
# ika sync
|
# test sync
|
||||||
rsync -n -Plzvrupt --stats --include ".htaccess" --exclude-from=$tmpf_web --delete -e ssh $LOCAL_DIR/* $TARGET_HOST_WEB:$REMOTE_WEB
|
rsync -n -Plzvrupt --stats --include ".htaccess" --exclude-from=$tmpf_web --delete -e ssh $LOCAL_DIR/* $TARGET_HOST_WEB:$REMOTE_WEB
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
|
|||||||
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/
|
||||||
2143
4dev/tests/ACL/CoreLibsACLLoginTest.php
Normal file
2143
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
|
||||||
3
4dev/tests/ACL/log/.gitignore
vendored
Normal file
3
4dev/tests/ACL/log/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
*log
|
||||||
|
*LOG
|
||||||
|
!.gitignore
|
||||||
47
4dev/tests/Admin/CoreLibsAdminBackendTest.php
Normal file
47
4dev/tests/Admin/CoreLibsAdminBackendTest.php
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Admin\Backend
|
||||||
|
* @coversDefaultClass \CoreLibs\Admin\Backend
|
||||||
|
* @testdox \CoreLibs\Admin\Backend method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsAdminBackendTest 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\Backend Class tests
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testAdminBackend()
|
||||||
|
{
|
||||||
|
/* $this->assertTrue(true, 'ACL Login Tests not implemented');
|
||||||
|
$this->markTestIncomplete(
|
||||||
|
'ACL\Login Tests have not yet been implemented'
|
||||||
|
); */
|
||||||
|
$this->markTestSkipped('No implementation for Admin\Backend at the moment');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
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__
|
||||||
334
4dev/tests/Check/CoreLibsCheckColorsTest.php
Normal file
334
4dev/tests/Check/CoreLibsCheckColorsTest.php
Normal file
@@ -0,0 +1,334 @@
|
|||||||
|
<?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
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
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(\UnexpectedValueException::class);
|
||||||
|
\CoreLibs\Check\Colors::validateColor('#ffffff', $flag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
381
4dev/tests/Check/CoreLibsCheckEmailTest.php
Normal file
381
4dev/tests/Check/CoreLibsCheckEmailTest.php
Normal file
@@ -0,0 +1,381 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented class
|
||||||
|
* @coversDefaultClass \CoreLibs\Check\Email
|
||||||
|
* @testdox \CoreLibs\Check\Email method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsCheckEmailTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Array position to regex
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function emailRegexProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'get email regex invalid -1, will be 0' => [
|
||||||
|
-1,
|
||||||
|
"^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
||||||
|
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$"
|
||||||
|
],
|
||||||
|
'get email regex invalid 10, will be 0' => [
|
||||||
|
10,
|
||||||
|
"^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
||||||
|
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$"
|
||||||
|
],
|
||||||
|
'get email regex valid 1, will be 1' => [
|
||||||
|
1,
|
||||||
|
"@(.*)@(.*)"
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test regex level return
|
||||||
|
*
|
||||||
|
* @covers ::getEmailRegex
|
||||||
|
* @dataProvider emailRegexProvider
|
||||||
|
* @testdox getEmailRegex $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param int $input
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetEmailRegexReturn(int $input, string $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Check\Email::getEmailRegex($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* provides data for emailCheckProvider and emailCheckFullProvider
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function emailCheckList(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'valid email' => ['test@test.com', true, []],
|
||||||
|
'invalid empty email' => ['', false, [0, 2, 3, 4, 5]],
|
||||||
|
'invalid email' => ['-@-', false, [0, 3, 4, 5]],
|
||||||
|
'invalid email leading dot' => ['.test@test.com', false, [0, 2]],
|
||||||
|
'invalid email invalid domain' => ['test@t_est.com', false, [0, 3, 4]],
|
||||||
|
'invalid email double @' => ['test@@test.com', false, [0, 1]],
|
||||||
|
'invalid email double dot' => ['test@test..com', false, [0, 3, 6]],
|
||||||
|
'invalid email end with dot' => ['test@test.', false, [0, 3, 5, 7]],
|
||||||
|
'invalid email bad top level' => ['test@test.j', false, [0, 3, 5]],
|
||||||
|
'invalid email double @ and double dot' => ['test@@test..com', false, [0, 1, 3, 6]],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Valids or not valid email address
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function emailCheckProvider(): array
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($this->emailCheckList() as $key => $data) {
|
||||||
|
$list[$key] = [$data[0], $data[1]];
|
||||||
|
}
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::checkEmail
|
||||||
|
* @dataProvider emailCheckProvider
|
||||||
|
* @testdox checkEmail $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCheckEmail(string $input, bool $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Check\Email::checkEmail($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* this is like emailCheckProvider but it has the full detail errors
|
||||||
|
* All errors should be tetsed in testGetEmailRegexErrorMessage
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function emailCheckFullProvider(): array
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($this->emailCheckList() as $key => $data) {
|
||||||
|
$list[$key] = [$data[0], $data[2]];
|
||||||
|
}
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::checkEmailFull
|
||||||
|
* @dataProvider emailCheckFullProvider
|
||||||
|
* @testdox checkEmailFull $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param array $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCheckEmailFull(string $input, array $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEqualsCanonicalizing(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Check\Email::checkEmailFull($input, true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* error data returned for each error position
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function emailRegexErrorProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'error 0 will return general' => [
|
||||||
|
0,
|
||||||
|
[
|
||||||
|
'error' => 0,
|
||||||
|
'message' => 'Invalid email address',
|
||||||
|
'regex' => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
||||||
|
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'error 1 will return double @ error' => [
|
||||||
|
1,
|
||||||
|
[
|
||||||
|
'error' => 1,
|
||||||
|
'message' => 'Double @ mark in email address',
|
||||||
|
'regex' => "@(.*)@(.*)"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'error 2 will be invalid before @' => [
|
||||||
|
2,
|
||||||
|
[
|
||||||
|
'error' => 2,
|
||||||
|
'message' => 'Invalid email part before @ sign',
|
||||||
|
'regex' => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'error 3 will be invalid domain and top level' => [
|
||||||
|
3,
|
||||||
|
[
|
||||||
|
'error' => 3,
|
||||||
|
'message' => 'Invalid domain part after @ sign',
|
||||||
|
'regex' => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.([a-zA-Z]{2,}){1}$"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'error 4 will be invalid domain' => [
|
||||||
|
4,
|
||||||
|
[
|
||||||
|
'error' => 4,
|
||||||
|
'message' => 'Invalid domain name part',
|
||||||
|
'regex' => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\."
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'error 5 will be invalid domain top level only' => [
|
||||||
|
5,
|
||||||
|
[
|
||||||
|
'error' => 5,
|
||||||
|
'message' => 'Wrong domain top level part',
|
||||||
|
'regex' => "\.([a-zA-Z]{2,6}){1}$"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'error 6 will be domain double dot' => [
|
||||||
|
6,
|
||||||
|
[
|
||||||
|
'error' => 6,
|
||||||
|
'message' => 'Double consecutive dots in domain name (..)',
|
||||||
|
'regex' => "@(.*)\.{2,}"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'error 7 will domain ends with dot' => [
|
||||||
|
7,
|
||||||
|
[
|
||||||
|
'error' => 7,
|
||||||
|
'message' => 'Domain ends with a dot or is missing top level part',
|
||||||
|
'regex' => "@.*\.$"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::getEmailRegexErrorMessage
|
||||||
|
* @dataProvider emailRegexErrorProvider
|
||||||
|
* @testdox getEmailRegexErrorMessage $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param integer $input
|
||||||
|
* @param array $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetEmailRegexErrorMessage(int $input, array $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEqualsCanonicalizing(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Check\Email::getEmailRegexErrorMessage($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This holds all email type checks normal and short
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function emailTypeProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
['test@test.com', 'pc_html', 'pc'],
|
||||||
|
['test@docomo.ne.jp', 'keitai_docomo', 'docomo'],
|
||||||
|
['test@softbank.ne.jp', 'keitai_softbank', 'softbank'],
|
||||||
|
['test@i.softbank.ne.jp', 'smartphone_softbank_iphone', 'iphone'],
|
||||||
|
// TODO: add more test emails here
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns only normal email type checks
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function emailTypeProviderLong(): array
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($this->emailTypeProvider() as $set) {
|
||||||
|
$list['email ' . $set[0] . ' is valid and matches normal ' . $set[1]] = [$set[0], $set[1]];
|
||||||
|
}
|
||||||
|
$list['email is empty and not valid normal'] = ['', 'invalid'];
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* only short email type list
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function emailTypeProviderShort(): array
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($this->emailTypeProvider() as $set) {
|
||||||
|
$list['email ' . $set[0] . ' is valid and matches short ' . $set[2]] = [$set[0], $set[2]];
|
||||||
|
}
|
||||||
|
$list['email is empty and not valid short'] = ['', 'invalid'];
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::getEmailType
|
||||||
|
* @dataProvider emailTypeProviderLong
|
||||||
|
* @testdox getEmailType $input will be normal $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetEmailTypeNormal(string $input, string $expected)
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Check\Email::getEmailType($input, false)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::getEmailType
|
||||||
|
* @dataProvider emailTypeProviderShort
|
||||||
|
* @testdox getEmailType $input will be short $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetEmailTypeShort(string $input, string $expected)
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Check\Email::getEmailType($input, true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function emailProviderTypeLongToShort(): array
|
||||||
|
{
|
||||||
|
$mobile_email_type_short = [
|
||||||
|
'keitai_docomo' => 'docomo',
|
||||||
|
'keitai_kddi_ezweb' => 'kddi',
|
||||||
|
'keitai_kddi' => 'kddi',
|
||||||
|
'keitai_kddi_tu-ka' => 'kddi',
|
||||||
|
'keitai_kddi_sky' => 'kddi',
|
||||||
|
'keitai_softbank' => 'softbank',
|
||||||
|
'smartphone_softbank_iphone' => 'iphone',
|
||||||
|
'keitai_softbank_disney' => 'softbank',
|
||||||
|
'keitai_softbank_vodafone' => 'softbank',
|
||||||
|
'keitai_softbank_j-phone' => 'softbank',
|
||||||
|
'keitai_willcom' => 'willcom',
|
||||||
|
'keitai_willcom_pdx' => 'willcom',
|
||||||
|
'keitai_willcom_bandai' => 'willcom',
|
||||||
|
'keitai_willcom_pipopa' => 'willcom',
|
||||||
|
'keitai_willcom_ymobile' => 'willcom',
|
||||||
|
'keitai_willcom_emnet' => 'willcom',
|
||||||
|
'pc_html' => 'pc',
|
||||||
|
];
|
||||||
|
$list = [];
|
||||||
|
// use the static one
|
||||||
|
foreach ($mobile_email_type_short as $long => $short) {
|
||||||
|
$list[$long . ' matches to ' . $short] = [$long, $short];
|
||||||
|
}
|
||||||
|
// add invalid check
|
||||||
|
$list['Not found will be bool false'] = ['invalid', false];
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::getShortEmailType
|
||||||
|
* @dataProvider emailProviderTypeLongToShort
|
||||||
|
* @testdox getShortEmailType $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string|bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetShortEmailType(string $input, $expected)
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Check\Email::getShortEmailType($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
120
4dev/tests/Check/CoreLibsCheckEncodingTest.php
Normal file
120
4dev/tests/Check/CoreLibsCheckEncodingTest.php
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Check\Encoding
|
||||||
|
* @coversDefaultClass \CoreLibs\Check\Encoding
|
||||||
|
* @testdox \CoreLibs\Check\Encoding method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsCheckEncodingTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function checkConvertEncodingProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// 0: string to test
|
||||||
|
// 1: source encoding
|
||||||
|
// 2: target encoding
|
||||||
|
// 3: substitue character
|
||||||
|
// 4: false for ok, array with error list
|
||||||
|
'valid test UTF-8 to SJIS (default)' => [
|
||||||
|
'日本語',
|
||||||
|
'UTF-8',
|
||||||
|
'SJIS',
|
||||||
|
null,
|
||||||
|
false
|
||||||
|
],
|
||||||
|
'invalid test UTF-8 to SJIS (dots as code point)' => [
|
||||||
|
'❶',
|
||||||
|
'UTF-8',
|
||||||
|
'SJIS',
|
||||||
|
0x2234,
|
||||||
|
['❶']
|
||||||
|
],
|
||||||
|
'invalid test UTF-8 to SJIS (dots as string)' => [
|
||||||
|
'❶',
|
||||||
|
'UTF-8',
|
||||||
|
'SJIS',
|
||||||
|
'∴',
|
||||||
|
['❶']
|
||||||
|
],
|
||||||
|
'invalid test UTF-8 to SJIS (none)' => [
|
||||||
|
'❶',
|
||||||
|
'UTF-8',
|
||||||
|
'SJIS',
|
||||||
|
'none',
|
||||||
|
['❶']
|
||||||
|
],
|
||||||
|
'invalid test UTF-8 to SJIS (long)' => [
|
||||||
|
'❶',
|
||||||
|
'UTF-8',
|
||||||
|
'SJIS',
|
||||||
|
'long',
|
||||||
|
['❶']
|
||||||
|
],
|
||||||
|
'invalid test UTF-8 to SJIS (entity)' => [
|
||||||
|
'❶',
|
||||||
|
'UTF-8',
|
||||||
|
'SJIS',
|
||||||
|
'entity',
|
||||||
|
['❶']
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::checkConvertEncoding
|
||||||
|
* @dataProvider checkConvertEncodingProvider
|
||||||
|
* @testdox check encoding convert from $from_encoding to $to_encoding [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $from_encoding
|
||||||
|
* @param string $to_encoding
|
||||||
|
* @param string|int|null $error_char
|
||||||
|
* @param array|bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCheckConvertEncoding(
|
||||||
|
string $input,
|
||||||
|
string $from_encoding,
|
||||||
|
string $to_encoding,
|
||||||
|
$error_char,
|
||||||
|
$expected
|
||||||
|
): void {
|
||||||
|
$current_subsitute_character = mb_substitute_character();
|
||||||
|
if ($error_char !== null) {
|
||||||
|
\CoreLibs\Check\Encoding::setErrorChar($error_char);
|
||||||
|
if (!in_array($error_char, ['none', 'long', 'entity'])) {
|
||||||
|
$this->assertEquals(
|
||||||
|
\IntlChar::chr($error_char),
|
||||||
|
\CoreLibs\Check\Encoding::getErrorChar()
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(
|
||||||
|
$error_char,
|
||||||
|
\CoreLibs\Check\Encoding::getErrorChar()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$return = \CoreLibs\Check\Encoding::checkConvertEncoding($input, $from_encoding, $to_encoding);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$return
|
||||||
|
);
|
||||||
|
// reset after test
|
||||||
|
mb_substitute_character($current_subsitute_character);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
120
4dev/tests/Check/CoreLibsCheckFileTest.php
Normal file
120
4dev/tests/Check/CoreLibsCheckFileTest.php
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Check\File
|
||||||
|
* @coversDefaultClass \CoreLibs\Check\File
|
||||||
|
* @testdox \CoreLibs\Check\File method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsCheckFileTest extends TestCase
|
||||||
|
{
|
||||||
|
/** @var array<mixed> */
|
||||||
|
// private $files_list = [];
|
||||||
|
/** @var string */
|
||||||
|
private $base_folder = DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* main file list + data provider
|
||||||
|
*
|
||||||
|
* filename, file extension matching, lines in file, -1 for nothing
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function filesList(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
['filename.txt', 'txt', 5],
|
||||||
|
['filename.csv', 'csv', 15],
|
||||||
|
['filename.tsv', 'tsv', 0],
|
||||||
|
['file_does_not_exits', '', -1],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function filesExtensionProvider(): array
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($this->filesList() as $row) {
|
||||||
|
$list[$row[0] . ' must be extension ' . $row[1]] = [$row[0], $row[1]];
|
||||||
|
}
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function filesLinesProvider(): array
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($this->filesList() as $row) {
|
||||||
|
$list[$row[0] . ' must have ' . $row[2] . ' lines'] = [$row[0], $row[2]];
|
||||||
|
}
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests if file extension matches
|
||||||
|
*
|
||||||
|
* @covers ::getFilenameEnding
|
||||||
|
* @dataProvider filesExtensionProvider
|
||||||
|
* @testdox getFilenameEnding $input must be extension $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetFilenameEnding(string $input, string $expected): void
|
||||||
|
{
|
||||||
|
// getFilenameEnding
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Check\File::getFilenameEnding($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the file line read
|
||||||
|
*
|
||||||
|
* @covers ::getLinesFromFile
|
||||||
|
* @dataProvider filesLinesProvider
|
||||||
|
* @testdox getLinesFromFile $input must have $expected lines [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input file name
|
||||||
|
* @param int $expected lines in file
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetLinesFromFile(string $input, int $expected): void
|
||||||
|
{
|
||||||
|
// create file
|
||||||
|
if ($expected > -1) {
|
||||||
|
$file = $this->base_folder . $input;
|
||||||
|
$fp = fopen($file, 'w');
|
||||||
|
for ($i = 0; $i < $expected; $i++) {
|
||||||
|
fwrite($fp, 'This is row ' . ($i + 1) . PHP_EOL);
|
||||||
|
}
|
||||||
|
fclose($fp);
|
||||||
|
}
|
||||||
|
// test
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Check\File::getLinesFromFile($this->base_folder . $input)
|
||||||
|
);
|
||||||
|
// unlink file
|
||||||
|
if (is_file($this->base_folder . $input)) {
|
||||||
|
unlink($this->base_folder . $input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
73
4dev/tests/Check/CoreLibsCheckPhpVersionTest.php
Normal file
73
4dev/tests/Check/CoreLibsCheckPhpVersionTest.php
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Check\PHPVersion
|
||||||
|
* @coversDefaultClass \CoreLibs\Check\PHPVersion
|
||||||
|
* @testdox \CoreLibs\Check\PHPVersion method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsCheckPhpVersionTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* NOTE: The checks must be adapted to the PHP version or they will fail
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function phpVersionProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// min
|
||||||
|
'min 7' => ['7', '', true],
|
||||||
|
'min 7.4' => ['7.4', '', true],
|
||||||
|
'min 7.4.1' => ['7.4.1', '', true],
|
||||||
|
// NOTE: update if php version bigger than 10
|
||||||
|
'min 10' => ['10', '', false],
|
||||||
|
'min 10.0' => ['10.0', '', false],
|
||||||
|
'min 10.0.0' => ['10.0.0', '', false],
|
||||||
|
// min/max version, NOTE: update if php version bigger than 10
|
||||||
|
'min 7/max 10' => ['7', '10', true],
|
||||||
|
'min 7/max 10.0' => ['7', '10.0', true],
|
||||||
|
'min 7/max 10.0.0' => ['7', '10.0.0', true],
|
||||||
|
// min/max version
|
||||||
|
'min 5/max 7' => ['5', '7', false],
|
||||||
|
'min 5/max 7.4' => ['5', '7.4', false],
|
||||||
|
'min 5/max 7.4.1' => ['5', '7.4.1', false],
|
||||||
|
// max only
|
||||||
|
'max 7' => ['', '7', false],
|
||||||
|
'max 7.4' => ['', '7.4', false],
|
||||||
|
'max 7.4.1' => ['', '7.4.1', false],
|
||||||
|
// max over
|
||||||
|
'max 10' => ['', '10', true],
|
||||||
|
'max 10.0' => ['', '10.0', true],
|
||||||
|
'max 10.0.0' => ['', '10.0.0', true],
|
||||||
|
// TODO: add null tests
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::checkPHPVersion
|
||||||
|
* @dataProvider phpVersionProvider
|
||||||
|
* @testdox checkPHPVersion $input_min and $input_max will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input_min
|
||||||
|
* @param string $input_max
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCheckPHPVersion(string $input_min, string $input_max, bool $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Check\PhpVersion::checkPHPVersion($input_min, $input_max)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
1113
4dev/tests/Combined/CoreLibsCombinedArrayHandlerTest.php
Normal file
1113
4dev/tests/Combined/CoreLibsCombinedArrayHandlerTest.php
Normal file
File diff suppressed because it is too large
Load Diff
933
4dev/tests/Combined/CoreLibsCombinedDateTimeTest.php
Normal file
933
4dev/tests/Combined/CoreLibsCombinedDateTimeTest.php
Normal file
@@ -0,0 +1,933 @@
|
|||||||
|
<?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,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
],
|
||||||
|
'dates equal' => [
|
||||||
|
'2020-12-12',
|
||||||
|
'2020-12-12',
|
||||||
|
0,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
],
|
||||||
|
'second date smaller' => [
|
||||||
|
'2021-12-12',
|
||||||
|
'2020-12-12',
|
||||||
|
1,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
],
|
||||||
|
'dates equal with different time' => [
|
||||||
|
'2020-12-12 12:12:12',
|
||||||
|
'2020-12-12 13:13:13',
|
||||||
|
0,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
],
|
||||||
|
'invalid dates --' => [
|
||||||
|
'--',
|
||||||
|
'--',
|
||||||
|
false,
|
||||||
|
'UnexpectedValueException',
|
||||||
|
1,
|
||||||
|
],
|
||||||
|
'empty dates' => [
|
||||||
|
'',
|
||||||
|
'',
|
||||||
|
false,
|
||||||
|
'UnexpectedValueException',
|
||||||
|
1
|
||||||
|
],
|
||||||
|
'invalid dates' => [
|
||||||
|
'not a date',
|
||||||
|
'not a date either',
|
||||||
|
false,
|
||||||
|
'UnexpectedValueException',
|
||||||
|
2
|
||||||
|
],
|
||||||
|
'invalid end date' => [
|
||||||
|
'1990-01-01',
|
||||||
|
'not a date either',
|
||||||
|
false,
|
||||||
|
'UnexpectedValueException',
|
||||||
|
3
|
||||||
|
],
|
||||||
|
'out of bound dates' => [
|
||||||
|
'1900-1-1',
|
||||||
|
'9999-12-31',
|
||||||
|
-1,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function dateTimeCompareProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'first date smaller no time' => [
|
||||||
|
'2020-12-12',
|
||||||
|
'2021-12-12',
|
||||||
|
-1,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
],
|
||||||
|
'dates equal no timestamp' => [
|
||||||
|
'2020-12-12',
|
||||||
|
'2020-12-12',
|
||||||
|
0,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
],
|
||||||
|
'second date smaller no timestamp' => [
|
||||||
|
'2021-12-12',
|
||||||
|
'2020-12-12',
|
||||||
|
1,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
],
|
||||||
|
'date equal first time smaller' => [
|
||||||
|
'2020-12-12 12:12:12',
|
||||||
|
'2020-12-12 13:13:13',
|
||||||
|
-1,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
],
|
||||||
|
'date equal time equal' => [
|
||||||
|
'2020-12-12 12:12:12',
|
||||||
|
'2020-12-12 12:12:12',
|
||||||
|
0,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
],
|
||||||
|
'date equal second time smaller' => [
|
||||||
|
'2020-12-12 13:13:13',
|
||||||
|
'2020-12-12 12:12:12',
|
||||||
|
1,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
],
|
||||||
|
'valid date invalid time' => [
|
||||||
|
'2020-12-12 13:99:13',
|
||||||
|
'2020-12-12 12:12:99',
|
||||||
|
false,
|
||||||
|
'UnexpectedValueException',
|
||||||
|
2
|
||||||
|
],
|
||||||
|
'valid date invalid end time' => [
|
||||||
|
'2020-12-12 13:12:13',
|
||||||
|
'2020-12-12 12:12:99',
|
||||||
|
false,
|
||||||
|
'UnexpectedValueException',
|
||||||
|
3
|
||||||
|
],
|
||||||
|
'invalid datetimes --' => [
|
||||||
|
'--',
|
||||||
|
'--',
|
||||||
|
false,
|
||||||
|
'UnexpectedValueException',
|
||||||
|
1
|
||||||
|
],
|
||||||
|
'empty datetimess' => [
|
||||||
|
'',
|
||||||
|
'',
|
||||||
|
false,
|
||||||
|
'UnexpectedValueException',
|
||||||
|
1
|
||||||
|
],
|
||||||
|
'invalid date times' => [
|
||||||
|
'not a date',
|
||||||
|
'not a date either',
|
||||||
|
false,
|
||||||
|
'UnexpectedValueException',
|
||||||
|
2
|
||||||
|
],
|
||||||
|
'invalid end date time' => [
|
||||||
|
'1990-01-01 12:12:12',
|
||||||
|
'not a date either',
|
||||||
|
false,
|
||||||
|
'UnexpectedValueException',
|
||||||
|
3
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
* @param string|null $exception
|
||||||
|
* @param int|null $exception_code
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCompareDate(
|
||||||
|
string $input_a,
|
||||||
|
string $input_b,
|
||||||
|
int|bool $expected,
|
||||||
|
?string $exception,
|
||||||
|
?int $exception_code
|
||||||
|
): void {
|
||||||
|
if ($expected === false) {
|
||||||
|
$this->expectException($exception);
|
||||||
|
$this->expectExceptionCode($exception_code);
|
||||||
|
}
|
||||||
|
$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
|
||||||
|
* @param string|null $exception
|
||||||
|
* @param int|null $exception_code
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCompareDateTime(
|
||||||
|
string $input_a,
|
||||||
|
string $input_b,
|
||||||
|
int|bool $expected,
|
||||||
|
?string $exception,
|
||||||
|
?int $exception_code
|
||||||
|
): void {
|
||||||
|
if ($expected === false) {
|
||||||
|
$this->expectException($exception);
|
||||||
|
$this->expectExceptionCode($exception_code);
|
||||||
|
}
|
||||||
|
$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__
|
||||||
280
4dev/tests/Convert/CoreLibsConvertByteTest.php
Normal file
280
4dev/tests/Convert/CoreLibsConvertByteTest.php
Normal file
@@ -0,0 +1,280 @@
|
|||||||
|
<?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 Convert\Byte
|
||||||
|
* @coversDefaultClass \CoreLibs\Convert\Byte
|
||||||
|
* @testdox \CoreLibs\Convert\Byte method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsConvertByteTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return 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 [
|
||||||
|
'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' => [
|
||||||
|
0 => -123123123,
|
||||||
|
1 => '-117.42 MB',
|
||||||
|
2 => '-123.12 MiB',
|
||||||
|
3 => '-117.42MB',
|
||||||
|
4 => '-117.42 MB',
|
||||||
|
5 => '-123.12MiB',
|
||||||
|
],
|
||||||
|
'kilobyte minus one' => [
|
||||||
|
0 => 999999, // KB-1
|
||||||
|
1 => '976.56 KB',
|
||||||
|
2 => '1 MiB',
|
||||||
|
3 => '976.56KB',
|
||||||
|
4 => '976.56 KB',
|
||||||
|
5 => '1MiB',
|
||||||
|
],
|
||||||
|
'megabyte minus one' => [
|
||||||
|
0 => 999999999, // MB-1
|
||||||
|
1 => '953.67 MB',
|
||||||
|
2 => '1 GiB',
|
||||||
|
3 => '953.67MB',
|
||||||
|
4 => '953.67 MB',
|
||||||
|
5 => '1GiB',
|
||||||
|
],
|
||||||
|
'megabyte' => [
|
||||||
|
0 => 254779258,
|
||||||
|
1 => '242.98 MB',
|
||||||
|
2 => '254.78 MiB',
|
||||||
|
3 => '242.98MB',
|
||||||
|
4 => '242.98 MB',
|
||||||
|
5 => '254.78MiB',
|
||||||
|
],
|
||||||
|
'terabyte minus one' => [
|
||||||
|
0 => 999999999999999, // TB-1
|
||||||
|
1 => '909.49 TB',
|
||||||
|
2 => '1 PiB',
|
||||||
|
3 => '909.49TB',
|
||||||
|
4 => '909.49 TB',
|
||||||
|
5 => '1PiB',
|
||||||
|
],
|
||||||
|
'terabyte' => [
|
||||||
|
0 => 588795544887632, // TB-n
|
||||||
|
1 => '535.51 TB',
|
||||||
|
2 => '588.8 TiB',
|
||||||
|
3 => '535.51TB',
|
||||||
|
4 => '535.51 TB',
|
||||||
|
5 => '588.8TiB',
|
||||||
|
],
|
||||||
|
'petabyte minus one' => [
|
||||||
|
0 => 999999999999999999, // PB-1
|
||||||
|
1 => '888.18 PB',
|
||||||
|
2 => '1 EiB',
|
||||||
|
3 => '888.18PB',
|
||||||
|
4 => '888.18 PB',
|
||||||
|
5 => '1EiB',
|
||||||
|
],
|
||||||
|
'max int value' => [
|
||||||
|
0 => 9223372036854775807, // MAX INT
|
||||||
|
1 => '8 EB',
|
||||||
|
2 => '9.22 EiB',
|
||||||
|
3 => '8EB',
|
||||||
|
4 => '8.00 EB',
|
||||||
|
5 => '9.22EiB',
|
||||||
|
],
|
||||||
|
'exabyte minus 1' => [
|
||||||
|
0 => 999999999999999999999, // EB-1
|
||||||
|
1 => '867.36 EB',
|
||||||
|
2 => '1000 EiB',
|
||||||
|
3 => '867.36EB',
|
||||||
|
4 => '867.36 EB',
|
||||||
|
5 => '1000EiB',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function byteStringProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'negative number' => [
|
||||||
|
0 => '-117.42 MB',
|
||||||
|
1 => -123123794,
|
||||||
|
2 => -117420000,
|
||||||
|
],
|
||||||
|
'megabyte' => [
|
||||||
|
0 => '242.98 MB',
|
||||||
|
1 => 254782996,
|
||||||
|
2 => 242980000
|
||||||
|
],
|
||||||
|
'megabyte si' => [
|
||||||
|
0 => '254.78 MiB',
|
||||||
|
1 => 267156193,
|
||||||
|
2 => 254780000
|
||||||
|
],
|
||||||
|
'petabyte' => [
|
||||||
|
0 => '1 EiB',
|
||||||
|
1 => 1152921504606846976,
|
||||||
|
2 => 1000000000000000000,
|
||||||
|
],
|
||||||
|
'max int' => [
|
||||||
|
0 => '8 EB',
|
||||||
|
1 => -9223372036854775807 - 1,
|
||||||
|
2 => 8000000000000000000,
|
||||||
|
],
|
||||||
|
'exabyte, overflow' => [
|
||||||
|
0 => '867.36EB',
|
||||||
|
1 => 3873816255479021568,
|
||||||
|
2 => 363028535651074048,
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::humanReadableByteFormat
|
||||||
|
* @dataProvider byteProvider
|
||||||
|
* @testdox humanReadableByteFormat $input will be $expected, $expected_si SI, $expected_no_space no space, $expected_adjust adjust, $expected_si_no_space SI/no space [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|int|float $input
|
||||||
|
* @param string $expected
|
||||||
|
* @param string $expected_si
|
||||||
|
* @param string $expected_no_space
|
||||||
|
* @param string $expected_adjust
|
||||||
|
* @param string $expected_si_no_space
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testHumanReadableByteFormat(
|
||||||
|
$input,
|
||||||
|
string $expected,
|
||||||
|
string $expected_si,
|
||||||
|
string $expected_no_space,
|
||||||
|
string $expected_adjust,
|
||||||
|
string $expected_si_no_space
|
||||||
|
): void {
|
||||||
|
// 1024
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Convert\Byte::humanReadableByteFormat($input)
|
||||||
|
);
|
||||||
|
// 1000
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_si,
|
||||||
|
\CoreLibs\Convert\Byte::humanReadableByteFormat($input, \CoreLibs\Convert\Byte::BYTE_FORMAT_SI)
|
||||||
|
);
|
||||||
|
// no space
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_no_space,
|
||||||
|
\CoreLibs\Convert\Byte::humanReadableByteFormat($input, \CoreLibs\Convert\Byte::BYTE_FORMAT_NOSPACE)
|
||||||
|
);
|
||||||
|
// always 2 decimals
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_adjust,
|
||||||
|
\CoreLibs\Convert\Byte::humanReadableByteFormat($input, \CoreLibs\Convert\Byte::BYTE_FORMAT_ADJUST)
|
||||||
|
);
|
||||||
|
// combined si + no space
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_si_no_space,
|
||||||
|
\CoreLibs\Convert\Byte::humanReadableByteFormat(
|
||||||
|
$input,
|
||||||
|
\CoreLibs\Convert\Byte::BYTE_FORMAT_SI | \CoreLibs\Convert\Byte::BYTE_FORMAT_NOSPACE
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::stringByteFormat
|
||||||
|
* @dataProvider byteStringProvider
|
||||||
|
* @testdox stringByteFormat $input will be $expected and $expected_si SI [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|int|float $input
|
||||||
|
* @param string|int|float $expected
|
||||||
|
* @param string|int|float $expected_si
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testStringByteFormat($input, $expected, $expected_si): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Convert\Byte::stringByteFormat($input)
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_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__
|
||||||
503
4dev/tests/Convert/CoreLibsConvertColorsTest.php
Normal file
503
4dev/tests/Convert/CoreLibsConvertColorsTest.php
Normal file
@@ -0,0 +1,503 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Convert\Colors
|
||||||
|
* @coversDefaultClass \CoreLibs\Convert\Colors
|
||||||
|
* @testdox \CoreLibs\Convert\Colors method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsConvertColorsTest extends TestCase
|
||||||
|
{
|
||||||
|
// convert list
|
||||||
|
public static $colors = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rgb2hexColorProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'color' => [
|
||||||
|
0 => 10,
|
||||||
|
1 => 100,
|
||||||
|
2 => 200,
|
||||||
|
3 => '#0a64c8',
|
||||||
|
4 => '0a64c8'
|
||||||
|
],
|
||||||
|
'gray' => [
|
||||||
|
0 => 12,
|
||||||
|
1 => 12,
|
||||||
|
2 => 12,
|
||||||
|
3 => '#0c0c0c',
|
||||||
|
4 => '0c0c0c',
|
||||||
|
],
|
||||||
|
'black' => [
|
||||||
|
0 => 0,
|
||||||
|
1 => 0,
|
||||||
|
2 => 0,
|
||||||
|
3 => '#000000',
|
||||||
|
4 => '000000',
|
||||||
|
],
|
||||||
|
'white' => [
|
||||||
|
0 => 255,
|
||||||
|
1 => 255,
|
||||||
|
2 => 255,
|
||||||
|
3 => '#ffffff',
|
||||||
|
4 => 'ffffff',
|
||||||
|
],
|
||||||
|
'invalid color red & green' => [
|
||||||
|
0 => -12,
|
||||||
|
1 => 300,
|
||||||
|
2 => 12,
|
||||||
|
3 => false,
|
||||||
|
4 => false
|
||||||
|
],
|
||||||
|
'invalid color red ' => [
|
||||||
|
0 => -12,
|
||||||
|
1 => 12,
|
||||||
|
2 => 12,
|
||||||
|
3 => false,
|
||||||
|
4 => false
|
||||||
|
],
|
||||||
|
'invalid color green ' => [
|
||||||
|
0 => 12,
|
||||||
|
1 => -12,
|
||||||
|
2 => 12,
|
||||||
|
3 => false,
|
||||||
|
4 => false
|
||||||
|
],
|
||||||
|
'invalid color blue ' => [
|
||||||
|
0 => 12,
|
||||||
|
1 => 12,
|
||||||
|
2 => -12,
|
||||||
|
3 => false,
|
||||||
|
4 => false
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function hex2rgbColorProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'color' => [
|
||||||
|
0 => '#0a64c8',
|
||||||
|
1 => ['r' => 10, 'g' => 100, 'b' => 200],
|
||||||
|
2 => '10,100,200',
|
||||||
|
3 => ';',
|
||||||
|
4 => '10;100;200',
|
||||||
|
],
|
||||||
|
'gray, long' => [
|
||||||
|
0 => '0c0c0c',
|
||||||
|
1 => ['r' => 12, 'g' => 12, 'b' => 12],
|
||||||
|
2 => '12,12,12',
|
||||||
|
3 => ';',
|
||||||
|
4 => '12;12;12',
|
||||||
|
],
|
||||||
|
'gray, short' => [
|
||||||
|
0 => 'ccc',
|
||||||
|
1 => ['r' => 204, 'g' => 204, 'b' => 204],
|
||||||
|
2 => '204,204,204',
|
||||||
|
3 => ';',
|
||||||
|
4 => '204;204;204',
|
||||||
|
],
|
||||||
|
'hex string with #' => [
|
||||||
|
0 => '#0c0c0c',
|
||||||
|
1 => ['r' => 12, 'g' => 12, 'b' => 12],
|
||||||
|
2 => '12,12,12',
|
||||||
|
3 => ';',
|
||||||
|
4 => '12;12;12',
|
||||||
|
],
|
||||||
|
'a too long hex string' => [
|
||||||
|
0 => '#0c0c0c0c',
|
||||||
|
1 => false,
|
||||||
|
2 => false,
|
||||||
|
3 => ';',
|
||||||
|
4 => false,
|
||||||
|
],
|
||||||
|
'a too short hex string' => [
|
||||||
|
0 => '0c0c',
|
||||||
|
1 => false,
|
||||||
|
2 => false,
|
||||||
|
3 => ';',
|
||||||
|
4 => false,
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return 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 [
|
||||||
|
'valid gray' => [
|
||||||
|
'rgb' => [12, 12, 12],
|
||||||
|
'hsb' => [0, 0, 5],
|
||||||
|
'hsb_rgb' => [13, 13, 13], // should be rgb, but rounding in this
|
||||||
|
'hsl' => [0.0, 0.0, 4.7],
|
||||||
|
'valid' => true,
|
||||||
|
],
|
||||||
|
'valid color' => [
|
||||||
|
'rgb' => [10, 100, 200],
|
||||||
|
'hsb' => [212, 95, 78.0],
|
||||||
|
'hsb_rgb' => [10, 98, 199], // should be rgb, but rounding error
|
||||||
|
'hsl' => [211.6, 90.5, 41.2],
|
||||||
|
'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 color r/h/h low' => [
|
||||||
|
'rgb' => [-1, 12, 12],
|
||||||
|
'hsb' => [-1, 50, 50],
|
||||||
|
'hsl' => [-1, 50, 50],
|
||||||
|
'valid' => false,
|
||||||
|
],
|
||||||
|
'invalid color r/h/h high' => [
|
||||||
|
'rgb' => [256, 12, 12],
|
||||||
|
'hsb' => [361, 50, 50],
|
||||||
|
'hsl' => [361, 50, 50],
|
||||||
|
'valid' => false,
|
||||||
|
],
|
||||||
|
'invalid color g/s/s low' => [
|
||||||
|
'rgb' => [12, -1, 12],
|
||||||
|
'hsb' => [1, -1, 50],
|
||||||
|
'hsl' => [1, -1, 50],
|
||||||
|
'valid' => false,
|
||||||
|
],
|
||||||
|
'invalid color g/s/s high' => [
|
||||||
|
'rgb' => [12, 256, 12],
|
||||||
|
'hsb' => [1, 101, 50],
|
||||||
|
'hsl' => [1, 101, 50],
|
||||||
|
'valid' => false,
|
||||||
|
],
|
||||||
|
'invalid color b/b/l low' => [
|
||||||
|
'rgb' => [12, 12, -1],
|
||||||
|
'hsb' => [1, 50, -1],
|
||||||
|
'hsl' => [1, 50, -1],
|
||||||
|
'valid' => false,
|
||||||
|
],
|
||||||
|
'invalid color b/b/l high' => [
|
||||||
|
'rgb' => [12, 12, 256],
|
||||||
|
'hsb' => [1, 50, 101],
|
||||||
|
'hsl' => [1, 50, 101],
|
||||||
|
'valid' => false,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rgb2hsbColorProvider(): array
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($this->rgb2hslAndhsbList() as $name => $values) {
|
||||||
|
$list[$name . ', rgb to hsb'] = [
|
||||||
|
0 => $values['rgb'][0],
|
||||||
|
1 => $values['rgb'][1],
|
||||||
|
2 => $values['rgb'][2],
|
||||||
|
3 => $values['valid'] ? $values['hsb'] : false
|
||||||
|
];
|
||||||
|
}
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function hsb2rgbColorProvider(): array
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($this->rgb2hslAndhsbList() as $name => $values) {
|
||||||
|
$list[$name . ', hsb to rgb'] = [
|
||||||
|
0 => $values['hsb_from'][0] ?? $values['hsb'][0],
|
||||||
|
1 => $values['hsb_from'][1] ?? $values['hsb'][1],
|
||||||
|
2 => $values['hsb_from'][2] ?? $values['hsb'][2],
|
||||||
|
3 => $values['valid'] ? $values['hsb_rgb'] : false
|
||||||
|
];
|
||||||
|
}
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function rgb2hslColorProvider(): array
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($this->rgb2hslAndhsbList() as $name => $values) {
|
||||||
|
$list[$name . ', rgb to hsl'] = [
|
||||||
|
0 => $values['rgb'][0],
|
||||||
|
1 => $values['rgb'][1],
|
||||||
|
2 => $values['rgb'][2],
|
||||||
|
3 => $values['valid'] ? $values['hsl'] : false
|
||||||
|
];
|
||||||
|
}
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function hsl2rgbColorProvider(): array
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($this->rgb2hslAndhsbList() as $name => $values) {
|
||||||
|
$list[$name . ', hsl to rgb'] = [
|
||||||
|
0 => $values['hsl_from'][0] ?? $values['hsl'][0],
|
||||||
|
1 => $values['hsl_from'][1] ?? $values['hsl'][1],
|
||||||
|
2 => $values['hsl_from'][2] ?? $values['hsl'][2],
|
||||||
|
3 => $values['valid'] ? $values['rgb'] : false
|
||||||
|
];
|
||||||
|
}
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
* TODO: add cross convert check
|
||||||
|
*
|
||||||
|
* @covers ::rgb2hex
|
||||||
|
* @dataProvider rgb2hexColorProvider
|
||||||
|
* @testdox rgb2hex $input_r,$input_g,$input_b will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param int $input_r
|
||||||
|
* @param int $input_g
|
||||||
|
* @param int $input_b
|
||||||
|
* @param string|bool $expected_hash
|
||||||
|
* @param string|bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testRgb2hex(
|
||||||
|
int $input_r,
|
||||||
|
int $input_g,
|
||||||
|
int $input_b,
|
||||||
|
string|bool $expected_hash,
|
||||||
|
string|bool $expected
|
||||||
|
) {
|
||||||
|
// if expected hash is or expected is false, we need to check for
|
||||||
|
// LengthException
|
||||||
|
if ($expected_hash === false || $expected === false) {
|
||||||
|
$this->expectException(\LengthException::class);
|
||||||
|
}
|
||||||
|
// with #
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_hash,
|
||||||
|
\CoreLibs\Convert\Colors::rgb2hex($input_r, $input_g, $input_b)
|
||||||
|
);
|
||||||
|
// without #
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Convert\Colors::rgb2hex($input_r, $input_g, $input_b, false)
|
||||||
|
);
|
||||||
|
// cross convert must match
|
||||||
|
// $rgb = \CoreLibs\Convert\Colors::hex2rgb($expected_hash);
|
||||||
|
// if ($rgb === false) {
|
||||||
|
// $rgb = [
|
||||||
|
// 'r' => $input_r,
|
||||||
|
// 'g' => $input_g,
|
||||||
|
// 'b' => $input_b,
|
||||||
|
// ];
|
||||||
|
// }
|
||||||
|
// $this->assertEquals(
|
||||||
|
// $expected_hash,
|
||||||
|
// \CoreLibs\Convert\Colors::rgb2hex($rgb['r'], $rgb['g'], $rgb['b'])
|
||||||
|
// );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::hex2rgb
|
||||||
|
* @dataProvider hex2rgbColorProvider
|
||||||
|
* @testdox hex2rgb $input will be $expected, $expected_str str[,], $expected_str_sep str[$separator] [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param array|bool $expected
|
||||||
|
* @param string|bool $expected_str
|
||||||
|
* @param string $separator
|
||||||
|
* @param string|bool $expected_str_sep
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testHex2rgb(
|
||||||
|
string $input,
|
||||||
|
array|bool $expected,
|
||||||
|
string|bool $expected_str,
|
||||||
|
string $separator,
|
||||||
|
string|bool $expected_str_sep
|
||||||
|
): void {
|
||||||
|
if ($expected === false || $expected_str === false || $expected_str_sep === false) {
|
||||||
|
$hex_string = preg_replace("/[^0-9A-Fa-f]/", '', $input);
|
||||||
|
if (!is_string($hex_string)) {
|
||||||
|
$this->expectException(\InvalidArgumentException::class);
|
||||||
|
} else {
|
||||||
|
$this->expectException(\UnexpectedValueException::class);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Convert\Colors::hex2rgb($input)
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_str,
|
||||||
|
\CoreLibs\Convert\Colors::hex2rgb($input, true)
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_str_sep,
|
||||||
|
\CoreLibs\Convert\Colors::hex2rgb($input, true, $separator)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::rgb2hsb
|
||||||
|
* @dataProvider rgb2hsbColorProvider
|
||||||
|
* @testdox rgb2hsb $input_r,$input_g,$input_b will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param integer $input_r
|
||||||
|
* @param integer $input_g
|
||||||
|
* @param integer $input_b
|
||||||
|
* @param array|bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testRgb2hsb(int $input_r, int $input_g, int $input_b, array|bool $expected): void
|
||||||
|
{
|
||||||
|
if ($expected === false) {
|
||||||
|
$this->expectException(\LengthException::class);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Convert\Colors::rgb2hsb($input_r, $input_g, $input_b)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::hsb2rgb
|
||||||
|
* @dataProvider hsb2rgbColorProvider
|
||||||
|
* @testdox hsb2rgb $input_h,$input_s,$input_b will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param float $input_h
|
||||||
|
* @param float $input_s
|
||||||
|
* @param float $input_b
|
||||||
|
* @param array|bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testHsb2rgb(float $input_h, float $input_s, float $input_b, array|bool $expected): void
|
||||||
|
{
|
||||||
|
if ($expected === false) {
|
||||||
|
$this->expectException(\LengthException::class);
|
||||||
|
$expected = [];
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Convert\Colors::hsb2rgb($input_h, $input_s, $input_b)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::rgb2hsl
|
||||||
|
* @dataProvider rgb2hslColorProvider
|
||||||
|
* @testdox rgb2hsl $input_r,$input_g,$input_b will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param integer $input_r
|
||||||
|
* @param integer $input_g
|
||||||
|
* @param integer $input_b
|
||||||
|
* @param array|bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testRgb2hsl(int $input_r, int $input_g, int $input_b, array|bool $expected): void
|
||||||
|
{
|
||||||
|
if ($expected === false) {
|
||||||
|
$this->expectException(\LengthException::class);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Convert\Colors::rgb2hsl($input_r, $input_g, $input_b)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::hsl2rgb
|
||||||
|
* @dataProvider hsl2rgbColorProvider
|
||||||
|
* @testdox hsl2rgb $input_h,$input_s,$input_l will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param integer|float $input_h
|
||||||
|
* @param integer $input_s
|
||||||
|
* @param integer $input_l
|
||||||
|
* @param array|bool $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testHsl2rgb(int|float $input_h, float $input_s, float $input_l, array|bool $expected): void
|
||||||
|
{
|
||||||
|
if ($expected === false) {
|
||||||
|
$this->expectException(\LengthException::class);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\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->assertIsArray(
|
||||||
|
\CoreLibs\Convert\Colors::hsl2rgb(360.0, 90.5, 41.2),
|
||||||
|
'HSL to RGB with 360 hue'
|
||||||
|
);
|
||||||
|
$this->assertIsArray(
|
||||||
|
\CoreLibs\Convert\Colors::hsb2rgb(360, 95, 78.0),
|
||||||
|
'HSB to RGB with 360 hue'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
102
4dev/tests/Convert/CoreLibsConvertEncodingTest.php
Normal file
102
4dev/tests/Convert/CoreLibsConvertEncodingTest.php
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Convert\Encoding
|
||||||
|
* @coversDefaultClass \CoreLibs\Convert\Encoding
|
||||||
|
* @testdox \CoreLibs\Convert\Encoding method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsConvertEncodingTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function convertEncodingProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// 0: original string
|
||||||
|
// 1: target encoding
|
||||||
|
// 2: optional source encoding
|
||||||
|
// 3: auto check (not used)
|
||||||
|
// 4: expected string
|
||||||
|
// 5: expected string encoding
|
||||||
|
'simple from UTF-8 to SJIS' => [
|
||||||
|
'input string',
|
||||||
|
'SJIS',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'input string',
|
||||||
|
'SJIS'
|
||||||
|
],
|
||||||
|
'kanji from UTF-8 to SJIS' => [
|
||||||
|
'日本語',
|
||||||
|
'SJIS',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'日本語',
|
||||||
|
'SJIS'
|
||||||
|
],
|
||||||
|
'kanji from UTF-8 to SJIS with source' => [
|
||||||
|
'日本語',
|
||||||
|
'SJIS',
|
||||||
|
'UTF-8',
|
||||||
|
null,
|
||||||
|
'日本語',
|
||||||
|
'SJIS'
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::convertEncoding
|
||||||
|
* @dataProvider convertEncodingProvider
|
||||||
|
* @testdox convert encoding $target_encoding, source: $source_encoding, auto: $auto_check [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $target_encoding
|
||||||
|
* @param string $source_encoding
|
||||||
|
* @param bool $auto_check
|
||||||
|
* @param string $expected
|
||||||
|
* @param string $expected_encoding
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testConvertEncoding(
|
||||||
|
string $input,
|
||||||
|
string $target_encoding,
|
||||||
|
?string $source_encoding,
|
||||||
|
?bool $auto_check,
|
||||||
|
string $expected,
|
||||||
|
string $expected_encoding
|
||||||
|
): void {
|
||||||
|
if ($source_encoding === null and $auto_check === null) {
|
||||||
|
$string = \CoreLibs\Convert\Encoding::convertEncoding($input, $target_encoding);
|
||||||
|
} elseif ($auto_check === null) {
|
||||||
|
$string = \CoreLibs\Convert\Encoding::convertEncoding($input, $target_encoding, $source_encoding);
|
||||||
|
} else {
|
||||||
|
$string = \CoreLibs\Convert\Encoding::convertEncoding(
|
||||||
|
$input,
|
||||||
|
$target_encoding,
|
||||||
|
$source_encoding,
|
||||||
|
$auto_check
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// because we can't store encoding in here anyway
|
||||||
|
$target = mb_convert_encoding($expected, $expected_encoding, 'UTF-8');
|
||||||
|
// print "IN: $input, $target_encoding\n";
|
||||||
|
$this->assertEquals(
|
||||||
|
$target,
|
||||||
|
$string
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
188
4dev/tests/Convert/CoreLibsConvertHtmlTest.php
Normal file
188
4dev/tests/Convert/CoreLibsConvertHtmlTest.php
Normal file
@@ -0,0 +1,188 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Convert\Html
|
||||||
|
* @coversDefaultClass \CoreLibs\Convert\Html
|
||||||
|
* @testdox \CoreLibs\Convert\Html method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsConvertHtmlTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function htmlentProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'no conversion' => [
|
||||||
|
0 => 'I am some string',
|
||||||
|
1 => 'I am some string',
|
||||||
|
],
|
||||||
|
'conversion' => [
|
||||||
|
0 => 'I have special <> inside',
|
||||||
|
1 => 'I have special <> inside',
|
||||||
|
],
|
||||||
|
'skip number' => [
|
||||||
|
0 => 1234,
|
||||||
|
1 => 1234,
|
||||||
|
],
|
||||||
|
'utf8' => [
|
||||||
|
0 => '日本語 <>',
|
||||||
|
1 => '日本語 <>'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function removeLBProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'nothing replaced, default' => [
|
||||||
|
0 => 'I am some string',
|
||||||
|
1 => null,
|
||||||
|
2 => 'I am some string',
|
||||||
|
],
|
||||||
|
'string with \n replace -' => [
|
||||||
|
0 => "I am\nsome string",
|
||||||
|
1 => '-',
|
||||||
|
2 => 'I am-some string',
|
||||||
|
],
|
||||||
|
'string with \r replace _' => [
|
||||||
|
0 => "I am\rsome string",
|
||||||
|
1 => '_',
|
||||||
|
2 => 'I am_some string',
|
||||||
|
],
|
||||||
|
'string with \n\r, default' => [
|
||||||
|
0 => "I am\n\rsome string",
|
||||||
|
1 => null,
|
||||||
|
2 => 'I am some string',
|
||||||
|
],
|
||||||
|
'string with \n\r replae ##BR##' => [
|
||||||
|
0 => "I am\n\rsome string",
|
||||||
|
1 => '##BR##',
|
||||||
|
2 => 'I am##BR##some string',
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function checkedProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'haystack is a string and matching selected' => [
|
||||||
|
0 => 'string',
|
||||||
|
1 => 'string',
|
||||||
|
2 => \CoreLibs\Convert\Html::SELECTED,
|
||||||
|
3 => 'selected'
|
||||||
|
],
|
||||||
|
'haystack is a string and matching checked' => [
|
||||||
|
0 => 'string',
|
||||||
|
1 => 'string',
|
||||||
|
2 => \CoreLibs\Convert\Html::CHECKED,
|
||||||
|
3 => 'checked'
|
||||||
|
],
|
||||||
|
'haystack is a string and not matching' => [
|
||||||
|
0 => 'string',
|
||||||
|
1 => 'not matching',
|
||||||
|
2 => \CoreLibs\Convert\Html::CHECKED,
|
||||||
|
3 => null
|
||||||
|
],
|
||||||
|
'haystack is array and matching' => [
|
||||||
|
0 => ['a', 'b', 'c'],
|
||||||
|
1 => 'a',
|
||||||
|
2 => \CoreLibs\Convert\Html::SELECTED,
|
||||||
|
3 => 'selected'
|
||||||
|
],
|
||||||
|
'haystack is array and not matching' => [
|
||||||
|
0 => ['a', 'b', 'c'],
|
||||||
|
1 => 'not matching',
|
||||||
|
2 => \CoreLibs\Convert\Html::SELECTED,
|
||||||
|
3 => null
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::htmlent
|
||||||
|
* @dataProvider htmlentProvider
|
||||||
|
* @testdox htmlent $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param mixed $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testHtmlent($input, $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Convert\Html::htmlent($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::removeLB
|
||||||
|
* @dataProvider removeLBProvider
|
||||||
|
* @testdox removeLB $input with replace $replace will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string|null $replace
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testRemoveLB(string $input, ?string $replace, string $expected): void
|
||||||
|
{
|
||||||
|
if ($replace !== null) {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Convert\Html::removeLB($input, $replace)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Convert\Html::removeLB($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::checked
|
||||||
|
* @dataProvider checkedProvider
|
||||||
|
* @testdox checked find $needle in $haystack and return $type will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param array<mixed>|string $haystack
|
||||||
|
* @param string $needle
|
||||||
|
* @param integer $type
|
||||||
|
* @param string|null $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testChecked($haystack, string $needle, int $type, ?string $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Convert\Html::checked($haystack, $needle, $type)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
212
4dev/tests/Convert/CoreLibsConvertJsonTest.php
Normal file
212
4dev/tests/Convert/CoreLibsConvertJsonTest.php
Normal file
@@ -0,0 +1,212 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Check\Json
|
||||||
|
* @coversDefaultClass \CoreLibs\Convert\Json
|
||||||
|
* @testdox \CoreLibs\Convert\Json method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsConvertJsonTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* test list for json convert tests
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function jsonProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'valid json' => [
|
||||||
|
'{"m":2,"f":"sub_2"}',
|
||||||
|
false,
|
||||||
|
[
|
||||||
|
'm' => 2,
|
||||||
|
'f' => 'sub_2'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'empty json' => [
|
||||||
|
'',
|
||||||
|
false,
|
||||||
|
[]
|
||||||
|
],
|
||||||
|
'invalid json override' => [
|
||||||
|
'not valid',
|
||||||
|
true,
|
||||||
|
[
|
||||||
|
'not valid'
|
||||||
|
]
|
||||||
|
],
|
||||||
|
'invalid json' => [
|
||||||
|
'not valid',
|
||||||
|
false,
|
||||||
|
[]
|
||||||
|
],
|
||||||
|
'null json' => [
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
[]
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function jsonArrayProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'valid json' => [
|
||||||
|
[
|
||||||
|
'm' => 2,
|
||||||
|
'f' => 'sub_2'
|
||||||
|
],
|
||||||
|
'{"m":2,"f":"sub_2"}',
|
||||||
|
],
|
||||||
|
'empty json array' => [
|
||||||
|
[],
|
||||||
|
'[]'
|
||||||
|
],
|
||||||
|
'empty json hash' => [
|
||||||
|
['' => ''],
|
||||||
|
'{"":""}'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* json error list
|
||||||
|
*
|
||||||
|
* @return array<mixed> JSON error list
|
||||||
|
*/
|
||||||
|
public function jsonErrorProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'no error' => [
|
||||||
|
'{}',
|
||||||
|
JSON_ERROR_NONE, ''
|
||||||
|
],
|
||||||
|
'depth error' => [
|
||||||
|
'[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[['
|
||||||
|
. '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[['
|
||||||
|
. '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[['
|
||||||
|
. '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[['
|
||||||
|
. '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[['
|
||||||
|
. '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[['
|
||||||
|
. '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[['
|
||||||
|
. '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[['
|
||||||
|
. '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
|
||||||
|
. ']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
|
||||||
|
. ']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
|
||||||
|
. ']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
|
||||||
|
. ']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
|
||||||
|
. ']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
|
||||||
|
. ']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
|
||||||
|
. ']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
|
||||||
|
. ']]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'
|
||||||
|
. ']]]]',
|
||||||
|
JSON_ERROR_DEPTH, 'Maximum stack depth exceeded'
|
||||||
|
],
|
||||||
|
// 'state mismatch error' => [
|
||||||
|
// '{foo:}',
|
||||||
|
// JSON_ERROR_STATE_MISMATCH, 'Underflow or the modes mismatch'
|
||||||
|
// ],
|
||||||
|
// 'ctrl char error' => [
|
||||||
|
// ' {"data":"data","data":"data","data":"data","data":"data"}',
|
||||||
|
// JSON_ERROR_CTRL_CHAR, 'Unexpected control character found'
|
||||||
|
// ],
|
||||||
|
'syntax error' => [
|
||||||
|
'not valid',
|
||||||
|
JSON_ERROR_SYNTAX, 'Syntax error, malformed JSON'
|
||||||
|
],
|
||||||
|
// 'utf8 error' => [
|
||||||
|
// '{"invalid":"\xB1\x31"}',
|
||||||
|
// JSON_ERROR_UTF8, 'Malformed UTF-8 characters, possibly incorrectly encoded'
|
||||||
|
// ],
|
||||||
|
// 'invalid property' => [
|
||||||
|
// '{"\u0000":"abc"}',
|
||||||
|
// JSON_ERROR_INVALID_PROPERTY_NAME, 'A key starting with \u0000 character was in the string'
|
||||||
|
// ],
|
||||||
|
// 'utf-16 error' => [
|
||||||
|
// '',
|
||||||
|
// JSON_ERROR_UTF16, 'Single unpaired UTF-16 surrogate in unicode escape'
|
||||||
|
// ],
|
||||||
|
// 'unknown error' => [
|
||||||
|
// '',
|
||||||
|
// -999999, 'Unknown error'
|
||||||
|
// ]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test json convert states
|
||||||
|
*
|
||||||
|
* @covers ::jsonConvertToArray
|
||||||
|
* @dataProvider jsonProvider
|
||||||
|
* @testdox jsonConvertToArray $input (Override: $flag) will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|null $input
|
||||||
|
* @param bool $flag
|
||||||
|
* @param array<mixed> $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testJsonConvertToArray(?string $input, bool $flag, array $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Convert\Json::jsonConvertToArray($input, $flag)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test json error states
|
||||||
|
*
|
||||||
|
* @covers ::jsonGetLastError
|
||||||
|
* @dataProvider jsonErrorProvider
|
||||||
|
* @testdox jsonGetLastError $input will be $expected_i/$expected_s [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|null $input
|
||||||
|
* @param int $expected_i
|
||||||
|
* @param string $expected_s
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testJsonGetLastError(?string $input, int $expected_i, string $expected_s): void
|
||||||
|
{
|
||||||
|
\CoreLibs\Convert\Json::jsonConvertToArray($input);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_i,
|
||||||
|
\CoreLibs\Convert\Json::jsonGetLastError()
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_s,
|
||||||
|
\CoreLibs\Convert\Json::jsonGetLastError(true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::jsonConvertArrayTo
|
||||||
|
* @dataProvider jsonArrayProvider
|
||||||
|
* @testdox jsonConvertArrayTo $input (Override: $flag) will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param array<mixed> $input
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testJsonConvertArrayto(array $input, string $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Convert\Json::jsonConvertArrayTo($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
118
4dev/tests/Convert/CoreLibsConvertMathTest.php
Normal file
118
4dev/tests/Convert/CoreLibsConvertMathTest.php
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented class
|
||||||
|
* @coversDefaultClass \CoreLibs\Convert\Math
|
||||||
|
* @testdox \CoreLibs\Convert\Math method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsConvertMathTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function fceilProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'5.5 must be 6' => [5.5, 6],
|
||||||
|
'5.1234567890 with 5 must be 6' => [5.1234567890, 6],
|
||||||
|
'6 must be 6' => [6, 6]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::fceil
|
||||||
|
* @dataProvider fceilProvider
|
||||||
|
* @testdox fceil: Input $input must be $expected
|
||||||
|
*
|
||||||
|
* @param float $input
|
||||||
|
* @param int $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMathFceilValue(float $input, int $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Convert\Math::fceil($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function floorProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'5123456 with -3 must be 5123000' => [5123456, -3, 5123000],
|
||||||
|
'5123456 with -10 must be 5000000' => [5123456, -10, 5000000]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::floorp
|
||||||
|
* @dataProvider floorProvider
|
||||||
|
* @testdox floor: Input $input with cutoff $cutoff must be $expected
|
||||||
|
*
|
||||||
|
* @param int $input
|
||||||
|
* @param int $cutoff
|
||||||
|
* @param int $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMathFloorValue(int $input, int $cutoff, int $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Convert\Math::floorp($input, $cutoff)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function initNumericProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'5 must be 5' => [5, 5, 'int'],
|
||||||
|
'5.123 must be 5.123' => [5.123, 5.123, 'float'],
|
||||||
|
"'5' must be 5" => ['5', 5, 'string'],
|
||||||
|
"'5.123' must be 5.123" => ['5.123', 5.123, 'string'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::initNumeric
|
||||||
|
* @dataProvider initNumericProvider
|
||||||
|
* @testdox initNumeric: Input $info $input must match $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param int|float|string $input
|
||||||
|
* @param float $expected
|
||||||
|
* @param string $info
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMathInitNumericValue($input, float $expected, string $info): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Convert\Math::initNumeric($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
60
4dev/tests/Convert/CoreLibsConvertMimeAppNameTest.php
Normal file
60
4dev/tests/Convert/CoreLibsConvertMimeAppNameTest.php
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Convert\MimeAppName
|
||||||
|
* @coversDefaultClass \CoreLibs\Convert\MimeAppName
|
||||||
|
* @testdox \CoreLibs\Convert\MimeAppName method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsConvertMimeAppNameTest extends TestCase
|
||||||
|
{
|
||||||
|
|
||||||
|
public function mimeProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'find matching app' => [
|
||||||
|
0 => 'foo/bar',
|
||||||
|
1 => 'FooBar Application',
|
||||||
|
2 => 'FooBar Application',
|
||||||
|
],
|
||||||
|
'try to set empty mime type' => [
|
||||||
|
0 => '',
|
||||||
|
1 => 'Some app',
|
||||||
|
2 => 'Other file'
|
||||||
|
],
|
||||||
|
'try to set empty app name' => [
|
||||||
|
0 => 'some/app',
|
||||||
|
1 => '',
|
||||||
|
2 => 'Other file'
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::mimeGetAppName
|
||||||
|
* @covers ::mimeSetAppName
|
||||||
|
* @dataProvider mimeProvider
|
||||||
|
* @testdox mimeSetAppName set $mime with $app and will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $mime
|
||||||
|
* @param string $app
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMimeSetAppName(string $mime, string $app, string $expected): void
|
||||||
|
{
|
||||||
|
\CoreLibs\Convert\MimeAppName::mimeSetAppName($mime, $app);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Convert\MimeAppName::mimeGetAppName($mime)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
101
4dev/tests/Convert/CoreLibsConvertMimeEncodeTest.php
Normal file
101
4dev/tests/Convert/CoreLibsConvertMimeEncodeTest.php
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Convert\MimeEncode
|
||||||
|
* @coversDefaultClass \CoreLibs\Convert\MimeEncode
|
||||||
|
* @testdox \CoreLibs\Convert\MimeEncode method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsConvertMimeEncodeTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function mbMimeEncodeProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// 0: input string
|
||||||
|
// 1: encoding
|
||||||
|
// 2: expected
|
||||||
|
'standard UTF-8' => [
|
||||||
|
'Test string',
|
||||||
|
'UTF-8',
|
||||||
|
'Test string'
|
||||||
|
],
|
||||||
|
'long text UTF-8' => [
|
||||||
|
'The quick brown fox jumps over the lazy sheep that sleeps in the ravine '
|
||||||
|
. 'and has no idea what is going on here',
|
||||||
|
'UTF-8',
|
||||||
|
'The quick brown fox jumps over the lazy sheep that sleeps in the ravine '
|
||||||
|
. 'and has no idea what is going on here'
|
||||||
|
],
|
||||||
|
'standard with special chars UTF-8' => [
|
||||||
|
'This is ümläßtと漢字もカタカナ!!^$%&',
|
||||||
|
'UTF-8',
|
||||||
|
'This is =?UTF-8?B?w7xtbMOkw59044Go5ryi5a2X44KC44Kr44K/44Kr44OK77yBIV4k?='
|
||||||
|
. "\r\n"
|
||||||
|
. ' =?UTF-8?B?JQ==?=&'
|
||||||
|
],
|
||||||
|
'35 chars and space at the end UTF-8' => [
|
||||||
|
'12345678901234567890123456789012345 '
|
||||||
|
. 'is there a space?',
|
||||||
|
'UTF-8',
|
||||||
|
'12345678901234567890123456789012345 '
|
||||||
|
. 'is there a =?UTF-8?B?c3BhY2U/?='
|
||||||
|
],
|
||||||
|
'36 chars and space at the end UTF-8' => [
|
||||||
|
'123456789012345678901234567890123456 '
|
||||||
|
. 'is there a space?',
|
||||||
|
'UTF-8',
|
||||||
|
'123456789012345678901234567890123456 '
|
||||||
|
. 'is there a =?UTF-8?B?c3BhY2U/?='
|
||||||
|
],
|
||||||
|
'36 kanji and space UTF-8' => [
|
||||||
|
'カタカナカタカナかなカタカナカタカナかなカタカナカタカナかなカタカナカタ '
|
||||||
|
. 'is there a space?',
|
||||||
|
'UTF-8',
|
||||||
|
"=?UTF-8?B?44Kr44K/44Kr44OK44Kr44K/44Kr44OK44GL44Gq44Kr44K/44Kr44OK44Kr?=\r\n"
|
||||||
|
. " =?UTF-8?B?44K/44Kr44OK?=\r\n"
|
||||||
|
. " =?UTF-8?B?44GL44Gq44Kr44K/44Kr44OK44Kr44K/44Kr44OK44GL44Gq44Kr44K/44Kr?=\r\n"
|
||||||
|
. " =?UTF-8?B?44OK44Kr44K/?= is there a =?UTF-8?B?c3BhY2U/?="
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mb mime header encoding test
|
||||||
|
*
|
||||||
|
* @covers ::__mbMimeEncode
|
||||||
|
* @dataProvider mbMimeEncodeProvider
|
||||||
|
* @testdox mb encoding target $encoding [$_dataName]
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testUuMbMimeEncode(string $input, string $encoding, string $expected): void
|
||||||
|
{
|
||||||
|
// encode string first
|
||||||
|
$encoded = \CoreLibs\Convert\MimeEncode::__mbMimeEncode($input, $encoding);
|
||||||
|
// print "MIME: -" . $encoded . "-\n";
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$encoded
|
||||||
|
);
|
||||||
|
$decoded = mb_decode_mimeheader($encoded);
|
||||||
|
// print "INPUT : " . $input . "\n";
|
||||||
|
// print "DECODED: " . $decoded . "\n";
|
||||||
|
// back compare decoded
|
||||||
|
$this->assertEquals(
|
||||||
|
$input,
|
||||||
|
$decoded
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
657
4dev/tests/Convert/CoreLibsConvertSetVarTypeNullTest.php
Normal file
657
4dev/tests/Convert/CoreLibsConvertSetVarTypeNullTest.php
Normal file
@@ -0,0 +1,657 @@
|
|||||||
|
<?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,
|
||||||
|
'1'
|
||||||
|
],
|
||||||
|
'int, override set' => [
|
||||||
|
1,
|
||||||
|
'not int',
|
||||||
|
'1'
|
||||||
|
],
|
||||||
|
'array, override set' => [
|
||||||
|
[1, 2],
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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,
|
||||||
|
1.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|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__
|
||||||
637
4dev/tests/Convert/CoreLibsConvertSetVarTypeTest.php
Normal file
637
4dev/tests/Convert/CoreLibsConvertSetVarTypeTest.php
Normal file
@@ -0,0 +1,637 @@
|
|||||||
|
<?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,
|
||||||
|
'1'
|
||||||
|
],
|
||||||
|
'int, override set' => [
|
||||||
|
1,
|
||||||
|
'not int',
|
||||||
|
'1'
|
||||||
|
],
|
||||||
|
'array, override set' => [
|
||||||
|
[1, 2],
|
||||||
|
'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,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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,
|
||||||
|
1.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__
|
||||||
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__
|
||||||
212
4dev/tests/Create/CoreLibsCreateHashTest.php
Normal file
212
4dev/tests/Create/CoreLibsCreateHashTest.php
Normal file
@@ -0,0 +1,212 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Create\Hash
|
||||||
|
* @coversDefaultClass \CoreLibs\Create\Hash
|
||||||
|
* @testdox \CoreLibs\Create\Hash method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsCreateHashTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function hashData(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'any string' => [
|
||||||
|
'text' => 'Some String Text',
|
||||||
|
'crc32b_reverse' => 'c5c21d91', // crc32b (in revere)
|
||||||
|
'sha1Short' => '4d2bc9ba0', // sha1Short
|
||||||
|
// via hash
|
||||||
|
'crc32b' => '911dc2c5', // hash: crc32b
|
||||||
|
'adler32' => '31aa05f1', // hash: alder32
|
||||||
|
'fnv132' => '9df444f9', // hash: fnv132
|
||||||
|
'fnv1a32' => '2c5f91b9', // hash: fnv1a32
|
||||||
|
'joaat' => '50dab846', // hash: joaat
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function crc32bProvider(): array
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($this->hashData() as $name => $values) {
|
||||||
|
$list[$name . ' to crc32b reverse'] = [
|
||||||
|
0 => $values['text'],
|
||||||
|
1 => $values['crc32b_reverse'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function sha1ShortProvider(): array
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($this->hashData() as $name => $values) {
|
||||||
|
$list[$name . ' to sha1 short'] = [
|
||||||
|
0 => $values['text'],
|
||||||
|
1 => $values['crc32b_reverse'],
|
||||||
|
2 => $values['sha1Short'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test all hash functions
|
||||||
|
* NOTE: if we add new hash functions in the __hash method
|
||||||
|
* they need to be added here too (and in the master hashData array too)
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function hashProvider(): array
|
||||||
|
{
|
||||||
|
$list = [];
|
||||||
|
foreach ($this->hashData() as $name => $values) {
|
||||||
|
foreach ([null, 'crc32b', 'adler32', 'fnv132', 'fnv1a32', 'joaat'] as $_hash_type) {
|
||||||
|
// default value test
|
||||||
|
if ($_hash_type === null) {
|
||||||
|
$hash_type = \CoreLibs\Create\Hash::STANDARD_HASH_SHORT;
|
||||||
|
} else {
|
||||||
|
$hash_type = $_hash_type;
|
||||||
|
}
|
||||||
|
$list[$name . ' to ' . $hash_type] = [
|
||||||
|
0 => $values['text'],
|
||||||
|
1 => $_hash_type,
|
||||||
|
2 => $values[$hash_type]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $list;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function hashLongProvider(): array
|
||||||
|
{
|
||||||
|
$hash_source = 'Some String Text';
|
||||||
|
return [
|
||||||
|
'Long Hash check: ' . \CoreLibs\Create\Hash::STANDARD_HASH_LONG => [
|
||||||
|
$hash_source,
|
||||||
|
hash(\CoreLibs\Create\Hash::STANDARD_HASH_LONG, $hash_source)
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::__crc32b
|
||||||
|
* @dataProvider crc32bProvider
|
||||||
|
* @testdox __crc32b $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testCrc32b(string $input, string $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Create\Hash::__crc32b($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::__sha1Short
|
||||||
|
* @dataProvider sha1ShortProvider
|
||||||
|
* @testdox __sha1Short $input will be $expected (crc32b) and $expected_sha1 (sha1 short) [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSha1Short(string $input, string $expected, string $expected_sha1): void
|
||||||
|
{
|
||||||
|
// uses crc32b
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Create\Hash::__sha1Short($input)
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Create\Hash::__sha1Short($input, false)
|
||||||
|
);
|
||||||
|
// sha1 type
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_sha1,
|
||||||
|
\CoreLibs\Create\Hash::__sha1Short($input, true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::__hash
|
||||||
|
* @dataProvider hashProvider
|
||||||
|
* @testdox __hash $input with $hash_type will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string|null $hash_type
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testHash(string $input, ?string $hash_type, string $expected): void
|
||||||
|
{
|
||||||
|
if ($hash_type === null) {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Create\Hash::__hash($input)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Create\Hash::__hash($input, $hash_type)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::__hashLong
|
||||||
|
* @dataProvider hashLongProvider
|
||||||
|
* @testdox __hashLong $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testHashLong(string $input, string $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Create\Hash::__hashLong($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
205
4dev/tests/Create/CoreLibsCreateRandomKeyTest.php
Normal file
205
4dev/tests/Create/CoreLibsCreateRandomKeyTest.php
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Create\RandomKey
|
||||||
|
* @coversDefaultClass \CoreLibs\Create\RandomKey
|
||||||
|
* @testdox \CoreLibs\Create\RandomKey method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsCreateRandomKeyTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function keyLenghtProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'valid key length' => [
|
||||||
|
0 => 6,
|
||||||
|
1 => true,
|
||||||
|
2 => 6,
|
||||||
|
],
|
||||||
|
'negative key length' => [
|
||||||
|
0 => -1,
|
||||||
|
1 => false,
|
||||||
|
2 => 4,
|
||||||
|
],
|
||||||
|
'tpp big key length' => [
|
||||||
|
0 => 300,
|
||||||
|
1 => false,
|
||||||
|
2 => 4,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function randomKeyGenProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'default key length' => [
|
||||||
|
0 => null,
|
||||||
|
1 => 4
|
||||||
|
],
|
||||||
|
'set -1 key length default' => [
|
||||||
|
0 => -1,
|
||||||
|
1 => 4,
|
||||||
|
],
|
||||||
|
'set too large key length' => [
|
||||||
|
0 => 300,
|
||||||
|
1 => 4,
|
||||||
|
],
|
||||||
|
'set override key lenght' => [
|
||||||
|
0 => 6,
|
||||||
|
1 => 6,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function keepKeyLengthProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'set too large' => [
|
||||||
|
0 => 6,
|
||||||
|
1 => 300,
|
||||||
|
2 => 6,
|
||||||
|
],
|
||||||
|
'set too small' => [
|
||||||
|
0 => 8,
|
||||||
|
1 => -2,
|
||||||
|
2 => 8,
|
||||||
|
],
|
||||||
|
'change valid' => [
|
||||||
|
0 => 10,
|
||||||
|
1 => 6,
|
||||||
|
2 => 6,
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* run before each test and reset to default 4
|
||||||
|
*
|
||||||
|
* @before
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function resetKeyLength(): void
|
||||||
|
{
|
||||||
|
\CoreLibs\Create\RandomKey::setRandomKeyLength(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check that first length is 4
|
||||||
|
*
|
||||||
|
* @covers ::getRandomKeyLength
|
||||||
|
* @testWith [4]
|
||||||
|
* @testdox getRandomKeyLength on init will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param integer $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetRandomKeyLengthInit(int $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Create\RandomKey::getRandomKeyLength()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::setRandomKeyLength
|
||||||
|
* @covers ::getRandomKeyLength
|
||||||
|
* @dataProvider keyLenghtProvider
|
||||||
|
* @testdox setRandomKeyLength $input will be $expected, compare to $compare [$_dataName]
|
||||||
|
*
|
||||||
|
* @param integer $input
|
||||||
|
* @param boolean $expected
|
||||||
|
* @param integer $compare
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testSetRandomKeyLength(int $input, bool $expected, int $compare): void
|
||||||
|
{
|
||||||
|
// set
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Create\RandomKey::setRandomKeyLength($input)
|
||||||
|
);
|
||||||
|
// read test, if false, use compare check
|
||||||
|
if ($expected === false) {
|
||||||
|
$input = $compare;
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$input,
|
||||||
|
\CoreLibs\Create\RandomKey::getRandomKeyLength()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::randomKeyGeyn
|
||||||
|
* @dataProvider randomKeyGenProvider
|
||||||
|
* @testdox randomKeyGen use $input key length $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param integer|null $input
|
||||||
|
* @param integer $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testRandomKeyGen(?int $input, int $expected): void
|
||||||
|
{
|
||||||
|
if ($input === null) {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
strlen(\CoreLibs\Create\RandomKey::randomKeyGen())
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
strlen(\CoreLibs\Create\RandomKey::randomKeyGen($input))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check that if set to n and then invalid, it keeps the previous one
|
||||||
|
* or if second change valid, second will be shown
|
||||||
|
*
|
||||||
|
* @covers ::setRandomKeyLength
|
||||||
|
* @dataProvider keepKeyLengthProvider
|
||||||
|
* @testdox keep setRandomKeyLength set with $input_valid and then $input_invalid will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param integer $input_valid
|
||||||
|
* @param integer $input_invalid
|
||||||
|
* @param integer $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testKeepKeyLength(int $input_valid, int $input_invalid, int $expected): void
|
||||||
|
{
|
||||||
|
\CoreLibs\Create\RandomKey::setRandomKeyLength($input_valid);
|
||||||
|
\CoreLibs\Create\RandomKey::setRandomKeyLength($input_invalid);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Create\RandomKey::getRandomKeyLength()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
493
4dev/tests/Create/CoreLibsCreateSessionTest.php
Normal file
493
4dev/tests/Create/CoreLibsCreateSessionTest.php
Normal file
@@ -0,0 +1,493 @@
|
|||||||
|
<?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: Exception thrown on error
|
||||||
|
// 5: exception code, null for none
|
||||||
|
// 6: expected error string
|
||||||
|
return [
|
||||||
|
'session parameter' => [
|
||||||
|
'sessionNameParameter',
|
||||||
|
'p',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => true,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
|
'sessionNameParameter',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'',
|
||||||
|
],
|
||||||
|
'session globals' => [
|
||||||
|
'sessionNameGlobals',
|
||||||
|
'g',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => true,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
|
'sessionNameGlobals',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'',
|
||||||
|
],
|
||||||
|
'session name default' => [
|
||||||
|
'',
|
||||||
|
'd',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => false,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => true,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'',
|
||||||
|
],
|
||||||
|
// error checks
|
||||||
|
// 1: we are in cli
|
||||||
|
'on cli error' => [
|
||||||
|
'',
|
||||||
|
'd',
|
||||||
|
[
|
||||||
|
'checkCliStatus' => true,
|
||||||
|
'getSessionStatus' => PHP_SESSION_NONE,
|
||||||
|
'setSessionName' => true,
|
||||||
|
'checkActiveSession' => [false, true],
|
||||||
|
'getSessionId' => '1234abcd4567'
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
'RuntimeException',
|
||||||
|
1,
|
||||||
|
'[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'
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
'RuntimeException',
|
||||||
|
2,
|
||||||
|
'[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'
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
'UnexpectedValueException',
|
||||||
|
3,
|
||||||
|
'[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'
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
'UnexpectedValueException',
|
||||||
|
3,
|
||||||
|
'[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'
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
'RuntimeException',
|
||||||
|
4,
|
||||||
|
'[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
|
||||||
|
],
|
||||||
|
'',
|
||||||
|
'UnexpectedValueException',
|
||||||
|
5,
|
||||||
|
'[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|null $exception
|
||||||
|
* @param string $expected_error
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testStartSession(
|
||||||
|
string $input,
|
||||||
|
string $type,
|
||||||
|
array $mock_data,
|
||||||
|
string $expected,
|
||||||
|
?string $exception,
|
||||||
|
?int $exception_code,
|
||||||
|
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+$/";
|
||||||
|
|
||||||
|
if ($exception !== null) {
|
||||||
|
$this->expectException($exception);
|
||||||
|
$this->expectExceptionCode($exception_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
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()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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__
|
||||||
48
4dev/tests/DB/CoreLibsDBExtendedArrayIOTest.php
Normal file
48
4dev/tests/DB/CoreLibsDBExtendedArrayIOTest.php
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for DB\Extended\ArrayIO
|
||||||
|
* This will only test the PgSQL parts
|
||||||
|
* @coversDefaultClass \CoreLibs\DB\Extended\ArrayIO
|
||||||
|
* @coversDefaultClass \CoreLibs\DB\Extended\ArrayIO
|
||||||
|
* @testdox \CoreLibs\Extended\ArrayIO method tests for extended DB interface
|
||||||
|
*/
|
||||||
|
final class CoreLibsDBExtendedArrayIOTest 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 DB\Extended\ArrayIO Class tests
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testArrayDBIO()
|
||||||
|
{
|
||||||
|
// $this->assertTrue(true, 'DB Extended ArrayIO Tests not implemented');
|
||||||
|
$this->markTestIncomplete(
|
||||||
|
'DB\Extended\ArrayIO Tests have not yet been implemented'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
5224
4dev/tests/DB/CoreLibsDBIOTest.php
Normal file
5224
4dev/tests/DB/CoreLibsDBIOTest.php
Normal file
File diff suppressed because it is too large
Load Diff
176
4dev/tests/Debug/CoreLibsDebugFileWriterTest.php
Normal file
176
4dev/tests/Debug/CoreLibsDebugFileWriterTest.php
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Debug\FileWriter
|
||||||
|
* @coversDefaultClass \CoreLibs\Debug\FileWriter
|
||||||
|
* @testdox \CoreLibs\Debug\FileWriter method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsDebugFileWriterTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function fsetFolderProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'valid log folder name' => [
|
||||||
|
0 => '/tmp/',
|
||||||
|
1 => true,
|
||||||
|
],
|
||||||
|
'invalid log folder name' => [
|
||||||
|
0 => 'some name',
|
||||||
|
1 => false,
|
||||||
|
],
|
||||||
|
'not writeable log folder name' => [
|
||||||
|
0 => '/opt',
|
||||||
|
1 => false,
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function fsetFilenameProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'valid log file name' => [
|
||||||
|
0 => 'some_valid_name.log',
|
||||||
|
1 => true,
|
||||||
|
],
|
||||||
|
'file name contains path' => [
|
||||||
|
0 => 'log/debug.log',
|
||||||
|
1 => false,
|
||||||
|
],
|
||||||
|
'invalid log file name' => [
|
||||||
|
0 => 'invalid name',
|
||||||
|
1 => false,
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function fdebugProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'debug with default enter' => [
|
||||||
|
0 => 'test string',
|
||||||
|
1 => null,
|
||||||
|
2 => true,
|
||||||
|
3 => 'test string' . "\n"
|
||||||
|
],
|
||||||
|
'debug with no enter' => [
|
||||||
|
0 => 'test string',
|
||||||
|
1 => false,
|
||||||
|
2 => true,
|
||||||
|
3 => 'test string'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @dataProvider fsetFolderProvider
|
||||||
|
* @testdox fsetFolder $input will match $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param boolean $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testFsetFolder(string $input, bool $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Debug\FileWriter::fsetFolder($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @dataProvider fsetFilenameProvider
|
||||||
|
* @testdox fsetFilename $input will match $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param boolean $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testFsetFilename(string $input, bool $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Debug\FileWriter::fsetFilename($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @dataProvider fdebugProvider
|
||||||
|
* @testdox fdebug write $input with enter $enter and will be $expected and written $expected_log [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $input
|
||||||
|
* @param boolean|null $enter
|
||||||
|
* @param boolean $expected
|
||||||
|
* @param string $expected_log
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testFdebug(string $input, ?bool $enter, bool $expected, string $expected_log): void
|
||||||
|
{
|
||||||
|
// set debug log folder
|
||||||
|
$file = 'FileWriterTest.log';
|
||||||
|
$folder = '/tmp';
|
||||||
|
$debug_file = $folder . DIRECTORY_SEPARATOR . $file;
|
||||||
|
$valid_folder = \CoreLibs\Debug\FileWriter::fsetFolder($folder);
|
||||||
|
$this->assertTrue(
|
||||||
|
$valid_folder
|
||||||
|
);
|
||||||
|
$valid_file = \CoreLibs\Debug\FileWriter::fsetFilename($file);
|
||||||
|
$this->assertTrue(
|
||||||
|
$valid_file
|
||||||
|
);
|
||||||
|
// write the log line
|
||||||
|
if ($enter === null) {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Debug\FileWriter::fdebug($input)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Debug\FileWriter::fdebug($input, $enter)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (is_file($debug_file)) {
|
||||||
|
// open file, load data, compre to expected_log
|
||||||
|
$log_data = file_get_contents($debug_file);
|
||||||
|
if ($log_data === false) {
|
||||||
|
$this->fail('fdebug file not readable or not data: ' . $debug_file);
|
||||||
|
}
|
||||||
|
$this->assertStringEndsWith(
|
||||||
|
$expected_log,
|
||||||
|
$log_data
|
||||||
|
);
|
||||||
|
unlink($debug_file);
|
||||||
|
} else {
|
||||||
|
$this->fail('fdebug file not found: ' . $debug_file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
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
119
4dev/tests/Debug/CoreLibsDebugMemoryUsageTest.php
Normal file
119
4dev/tests/Debug/CoreLibsDebugMemoryUsageTest.php
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use CoreLibs\Debug\MemoryUsage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Debug\MemoryUsage
|
||||||
|
* @coversDefaultClass \CoreLibs\Debug\MemoryUsage
|
||||||
|
* @testdox \CoreLibs\Debug\MemoryUsage method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsDebugMemoryUsageTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function memoryUsageProvider(): array
|
||||||
|
{
|
||||||
|
$regex_raw_off = '/^\[[\w\s_-]+\] Peak\/Curr\/Change: \d+(\.\d+)? ?\w{1,2}\/'
|
||||||
|
. '\d+(\.\d+)? ?\w{1,2}\/'
|
||||||
|
. 'Since Start: \d+(\.\d+)? ?\w{1,2} \| '
|
||||||
|
. 'Since Last: \d+(\.\d+)? ?\w{1,2} \| '
|
||||||
|
. 'Since Set: \d+(\.\d+)? ?\w{1,2}$/';
|
||||||
|
$regex_raw_on = '/^\[[\w\s_-]+\] Peak\/Curr\/'
|
||||||
|
// . 'Change: \d+(\.\d+)? ?\w{1,2}\/\d+(\.\d+)? ?\w{1,2} \[\d+\]\/'
|
||||||
|
. 'Change: \d+(\.\d+)? ?\w{1,2}\/\d+(\.\d+)? ?\w{1,2}/'
|
||||||
|
. 'Since Start: \d+(\.\d+)? ?\w{1,2} \[\d+\] \| '
|
||||||
|
. 'Since Last: \d+(\.\d+)? ?\w{1,2} \[\d+\] \| '
|
||||||
|
. 'Since Set: \d+(\.\d+)? ?\w{1,2} \[\d+\]$/';
|
||||||
|
$regex_array = [
|
||||||
|
'prefix' => '/^[\w\s_-]+$/',
|
||||||
|
'peak' => '/^\d+$/',
|
||||||
|
'usage' => '/^\d+$/',
|
||||||
|
'start' => '/^\d+$/',
|
||||||
|
'last' => '/^\d+$/',
|
||||||
|
'set' => '/^\d+$/',
|
||||||
|
];
|
||||||
|
// 0: prefix
|
||||||
|
// 1: raw flag
|
||||||
|
// 2: set flags array
|
||||||
|
// 3: array output expected (as regex)
|
||||||
|
// 4: string output expected (as regex)
|
||||||
|
return [
|
||||||
|
'test normal' => [
|
||||||
|
'test',
|
||||||
|
null,
|
||||||
|
[],
|
||||||
|
$regex_array,
|
||||||
|
$regex_raw_off,
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::resetMemory
|
||||||
|
* @cover ::debugMemoryFlag
|
||||||
|
* @cover ::setStartMemory
|
||||||
|
* @cover ::setMemory
|
||||||
|
* @cover ::memoryUsage
|
||||||
|
* @cover ::printMemoryUsage
|
||||||
|
* @dataProvider memoryUsageProvider
|
||||||
|
* @testdox memoryUsage with $prefix, raw memory $raw [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $prefix
|
||||||
|
* @param bool|null $raw
|
||||||
|
* @param array $set_flags
|
||||||
|
* @param array $expected_array
|
||||||
|
* @param string $expected_string
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testMemoryUsage(
|
||||||
|
string $prefix,
|
||||||
|
?bool $raw,
|
||||||
|
array $settings,
|
||||||
|
array $expected_array,
|
||||||
|
string $expected_string
|
||||||
|
): void {
|
||||||
|
// always reeset to null
|
||||||
|
MemoryUsage::resetMemory();
|
||||||
|
MemoryUsage::debugMemoryFlag(true);
|
||||||
|
MemoryUsage::setStartMemory();
|
||||||
|
MemoryUsage::setMemory();
|
||||||
|
// run collector
|
||||||
|
$memory = MemoryUsage::memoryUsage($prefix);
|
||||||
|
if ($raw === null) {
|
||||||
|
$string = MemoryUsage::printMemoryUsage($memory);
|
||||||
|
} else {
|
||||||
|
$string = MemoryUsage::printMemoryUsage($memory, $raw);
|
||||||
|
}
|
||||||
|
|
||||||
|
// expected_array for each
|
||||||
|
foreach ($expected_array as $name => $regex) {
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$regex,
|
||||||
|
(string)$memory[$name],
|
||||||
|
'assert memory usage array ' . $name
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// regex match string
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$expected_string,
|
||||||
|
$string,
|
||||||
|
'assert memory usage string as regex'
|
||||||
|
);
|
||||||
|
|
||||||
|
// TODO additional tests with use more memory and check diff matching
|
||||||
|
// TODO reset memory usage test
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
183
4dev/tests/Debug/CoreLibsDebugRunningTimeTest.php
Normal file
183
4dev/tests/Debug/CoreLibsDebugRunningTimeTest.php
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
<?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
|
||||||
|
{
|
||||||
|
// 0: return time difference
|
||||||
|
// 1: return time on first run in regex
|
||||||
|
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
|
||||||
|
{
|
||||||
|
// reset for each run
|
||||||
|
\CoreLibs\Debug\RunningTime::hrRunningTimeReset();
|
||||||
|
$start = \CoreLibs\Debug\RunningTime::hrRunningTime();
|
||||||
|
$this->assertEquals(
|
||||||
|
0,
|
||||||
|
$start,
|
||||||
|
'assert first run 0'
|
||||||
|
);
|
||||||
|
time_nanosleep(1, 500);
|
||||||
|
if ($out_time === null) {
|
||||||
|
$second = \CoreLibs\Debug\RunningTime::hrRunningTime();
|
||||||
|
} else {
|
||||||
|
$second = \CoreLibs\Debug\RunningTime::hrRunningTime($out_time);
|
||||||
|
}
|
||||||
|
// print "E: " . $end . "\n";
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$expected,
|
||||||
|
(string)$second,
|
||||||
|
'assert second run regex'
|
||||||
|
);
|
||||||
|
if ($out_time === null) {
|
||||||
|
$end_second = \CoreLibs\Debug\RunningTime::hrRunningTimeFromStart();
|
||||||
|
} else {
|
||||||
|
$end_second = \CoreLibs\Debug\RunningTime::hrRunningTimeFromStart($out_time);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$end_second,
|
||||||
|
$second,
|
||||||
|
'assert end is equal second'
|
||||||
|
);
|
||||||
|
// sleep again, second messurement
|
||||||
|
time_nanosleep(1, 500);
|
||||||
|
if ($out_time === null) {
|
||||||
|
$third = \CoreLibs\Debug\RunningTime::hrRunningTime();
|
||||||
|
} else {
|
||||||
|
$third = \CoreLibs\Debug\RunningTime::hrRunningTime($out_time);
|
||||||
|
}
|
||||||
|
// third call is not null
|
||||||
|
$this->assertNotEquals(
|
||||||
|
0,
|
||||||
|
$third,
|
||||||
|
'assert third call not null'
|
||||||
|
);
|
||||||
|
// third call is bigger than end
|
||||||
|
$this->assertNotEquals(
|
||||||
|
$second,
|
||||||
|
$third,
|
||||||
|
'assert third different second'
|
||||||
|
);
|
||||||
|
// last messurement, must match start - end + last
|
||||||
|
if ($out_time === null) {
|
||||||
|
$end = \CoreLibs\Debug\RunningTime::hrRunningTimeFromStart();
|
||||||
|
} else {
|
||||||
|
$end = \CoreLibs\Debug\RunningTime::hrRunningTimeFromStart($out_time);
|
||||||
|
}
|
||||||
|
$this->assertGreaterThan(
|
||||||
|
$third,
|
||||||
|
$end,
|
||||||
|
'assert end greater third'
|
||||||
|
);
|
||||||
|
// new start
|
||||||
|
\CoreLibs\Debug\RunningTime::hrRunningTimeReset();
|
||||||
|
$new_start = \CoreLibs\Debug\RunningTime::hrRunningTime();
|
||||||
|
$this->assertEquals(
|
||||||
|
0,
|
||||||
|
$new_start,
|
||||||
|
'assert new run 0'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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__
|
||||||
697
4dev/tests/Debug/CoreLibsDebugSupportTest.php
Normal file
697
4dev/tests/Debug/CoreLibsDebugSupportTest.php
Normal file
@@ -0,0 +1,697 @@
|
|||||||
|
<?php // phpcs:disable Generic.Files.LineLength
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use CoreLibs\Debug\Support;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Debug\Support
|
||||||
|
* @coversDefaultClass \CoreLibs\Debug\Support
|
||||||
|
* @testdox \CoreLibs\Debug\Support method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsDebugSupportTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function printTimeProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'default microtime' => [
|
||||||
|
0 => null,
|
||||||
|
1 => "/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{8}$/",
|
||||||
|
],
|
||||||
|
'microtime -1' => [
|
||||||
|
0 => -1,
|
||||||
|
1 => "/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{8}$/",
|
||||||
|
],
|
||||||
|
'microtime 0' => [
|
||||||
|
0 => 0,
|
||||||
|
1 => "/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/",
|
||||||
|
],
|
||||||
|
'microtime 4' => [
|
||||||
|
0 => 4,
|
||||||
|
1 => "/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{4}$/",
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::printTime
|
||||||
|
* @dataProvider printTimeProvider
|
||||||
|
* @testdox printTime test with $microtime and match to regex [$_dataName]
|
||||||
|
*
|
||||||
|
* @param int|null $mircrotime
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testPrintTime(?int $microtime, string $regex): void
|
||||||
|
{
|
||||||
|
if ($microtime === null) {
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$regex,
|
||||||
|
Support::printTime()
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$regex,
|
||||||
|
Support::printTime($microtime)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function printArrayProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'empty array' => [
|
||||||
|
0 => [],
|
||||||
|
1 => "<pre>Array\n(\n)\n</pre>",
|
||||||
|
2 => "Array\n(\n)\n",
|
||||||
|
],
|
||||||
|
'simple array' => [
|
||||||
|
0 => ['a', 'b'],
|
||||||
|
1 => "<pre>Array\n(\n"
|
||||||
|
. " [0] => a\n"
|
||||||
|
. " [1] => b\n"
|
||||||
|
. ")\n</pre>",
|
||||||
|
2 => "Array\n(\n"
|
||||||
|
. " [0] => a\n"
|
||||||
|
. " [1] => b\n"
|
||||||
|
. ")\n",
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::printAr
|
||||||
|
* @cover ::printArray
|
||||||
|
* @dataProvider printArrayProvider
|
||||||
|
* @testdox printAr/printArray $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param array $input
|
||||||
|
* @param string $expected
|
||||||
|
* @param string $expected_strip
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testPrintAr(array $input, string $expected, string $expected_strip): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::printAr($input),
|
||||||
|
'assert printAr'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::printArray($input),
|
||||||
|
'assert printArray'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_strip,
|
||||||
|
Support::prAr($input),
|
||||||
|
'assert prAr'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function printBoolProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'true input default' => [
|
||||||
|
0 => true,
|
||||||
|
1 => [],
|
||||||
|
2 => 'true',
|
||||||
|
3 => 'true',
|
||||||
|
],
|
||||||
|
'false input default' => [
|
||||||
|
0 => false,
|
||||||
|
1 => [],
|
||||||
|
2 => 'false',
|
||||||
|
3 => 'false'
|
||||||
|
],
|
||||||
|
'false input param name' => [
|
||||||
|
0 => false,
|
||||||
|
1 => [
|
||||||
|
'name' => 'param test'
|
||||||
|
],
|
||||||
|
2 => '<b>param test</b>: false',
|
||||||
|
3 => 'false'
|
||||||
|
],
|
||||||
|
'true input param name, true override' => [
|
||||||
|
0 => true,
|
||||||
|
1 => [
|
||||||
|
'name' => 'param test',
|
||||||
|
'true' => 'ok',
|
||||||
|
],
|
||||||
|
2 => '<b>param test</b>: ok',
|
||||||
|
3 => 'ok',
|
||||||
|
],
|
||||||
|
'false input param name, true override, false override' => [
|
||||||
|
0 => false,
|
||||||
|
1 => [
|
||||||
|
'name' => 'param test',
|
||||||
|
'true' => 'ok',
|
||||||
|
'false' => 'not',
|
||||||
|
],
|
||||||
|
2 => '<b>param test</b>: not',
|
||||||
|
3 => 'not'
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::printBool
|
||||||
|
* @dataProvider printBoolProvider
|
||||||
|
* @testdox printBool $input will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param bool $input
|
||||||
|
* @param array $params
|
||||||
|
* @param string $expected
|
||||||
|
* @param string $expected_strip
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testPrintBool(bool $input, array $params, string $expected, string $expected_strip): void
|
||||||
|
{
|
||||||
|
if (
|
||||||
|
isset($params['name']) &&
|
||||||
|
isset($params['true']) &&
|
||||||
|
isset($params['false'])
|
||||||
|
) {
|
||||||
|
$string = Support::printBool(
|
||||||
|
$input,
|
||||||
|
$params['name'],
|
||||||
|
$params['true'],
|
||||||
|
$params['false']
|
||||||
|
);
|
||||||
|
$string_strip = Support::prBl(
|
||||||
|
$input,
|
||||||
|
$params['true'],
|
||||||
|
$params['false']
|
||||||
|
);
|
||||||
|
} elseif (isset($params['name']) && isset($params['true'])) {
|
||||||
|
$string = Support::printBool(
|
||||||
|
$input,
|
||||||
|
$params['name'],
|
||||||
|
$params['true']
|
||||||
|
);
|
||||||
|
$string_strip = Support::prBl(
|
||||||
|
$input,
|
||||||
|
$params['true'],
|
||||||
|
);
|
||||||
|
} elseif (isset($params['name'])) {
|
||||||
|
$string = Support::printBool(
|
||||||
|
$input,
|
||||||
|
$params['name']
|
||||||
|
);
|
||||||
|
$string_strip = Support::prBl(
|
||||||
|
$input
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$string = Support::printBool($input);
|
||||||
|
$string_strip = Support::prBl($input);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
$string,
|
||||||
|
'assert printBool'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_strip,
|
||||||
|
$string_strip,
|
||||||
|
'assert prBl'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function printToStringProvider(): array
|
||||||
|
{
|
||||||
|
// 0: unput
|
||||||
|
// 1: html flag (only for strings and arry)
|
||||||
|
// 2: expected
|
||||||
|
return [
|
||||||
|
'null' => [
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'NULL',
|
||||||
|
],
|
||||||
|
'string' => [
|
||||||
|
'a string',
|
||||||
|
null,
|
||||||
|
'a string',
|
||||||
|
],
|
||||||
|
'string with html chars, encode' => [
|
||||||
|
'a string with <> &',
|
||||||
|
true,
|
||||||
|
'a string with <> &',
|
||||||
|
],
|
||||||
|
'string with html chars' => [
|
||||||
|
'a string with <> &',
|
||||||
|
null,
|
||||||
|
'a string with <> &',
|
||||||
|
],
|
||||||
|
'a number' => [
|
||||||
|
1234,
|
||||||
|
null,
|
||||||
|
'1234',
|
||||||
|
],
|
||||||
|
'a float number' => [
|
||||||
|
1234.5678,
|
||||||
|
null,
|
||||||
|
'1234.5678',
|
||||||
|
],
|
||||||
|
'bool true' => [
|
||||||
|
true,
|
||||||
|
null,
|
||||||
|
'TRUE',
|
||||||
|
],
|
||||||
|
'bool false' => [
|
||||||
|
false,
|
||||||
|
null,
|
||||||
|
'FALSE',
|
||||||
|
],
|
||||||
|
'an array default' => [
|
||||||
|
['a', 'b'],
|
||||||
|
null,
|
||||||
|
"<pre>Array\n(\n"
|
||||||
|
. " [0] => a\n"
|
||||||
|
. " [1] => b\n"
|
||||||
|
. ")\n</pre>",
|
||||||
|
],
|
||||||
|
'an array, no html' => [
|
||||||
|
['a', 'b'],
|
||||||
|
true,
|
||||||
|
"Array\n(\n"
|
||||||
|
. " [0] => a\n"
|
||||||
|
. " [1] => b\n"
|
||||||
|
. ")\n",
|
||||||
|
],
|
||||||
|
// resource
|
||||||
|
'a resource' => [
|
||||||
|
tmpfile(),
|
||||||
|
null,
|
||||||
|
'/^Resource id #\d+$/',
|
||||||
|
],
|
||||||
|
// object
|
||||||
|
'an object' => [
|
||||||
|
new \CoreLibs\Debug\Support(),
|
||||||
|
null,
|
||||||
|
'CoreLibs\Debug\Support',
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::printToString
|
||||||
|
* @dataProvider printToStringProvider
|
||||||
|
* @testdox printToString $input with $flag will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input anything
|
||||||
|
* @param boolean|null $flag html flag, only for string and array
|
||||||
|
* @param string $expected always string
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testPrintToString(mixed $input, ?bool $flag, string $expected): void
|
||||||
|
{
|
||||||
|
if ($flag === null) {
|
||||||
|
// if expected starts with / and ends with / then this is a regex compare
|
||||||
|
if (
|
||||||
|
substr($expected, 0, 1) == '/' &&
|
||||||
|
substr($expected, -1, 1) == '/'
|
||||||
|
) {
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$expected,
|
||||||
|
Support::printToString($input)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::printToString($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::printToString($input, $flag)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function providerDumpExportVar(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'string' => [
|
||||||
|
'input' => 'string',
|
||||||
|
'flag' => null,
|
||||||
|
'expected_dump' => 'string(6) "string"' . "\n",
|
||||||
|
'expected_export' => "<pre>'string'</pre>",
|
||||||
|
],
|
||||||
|
'string, no html' => [
|
||||||
|
'input' => 'string',
|
||||||
|
'flag' => true,
|
||||||
|
'expected_dump' => 'string(6) "string"' . "\n",
|
||||||
|
'expected_export' => "'string'",
|
||||||
|
],
|
||||||
|
// int
|
||||||
|
'int' => [
|
||||||
|
'input' => 6,
|
||||||
|
'flag' => null,
|
||||||
|
'expected_dump' => 'int(6)' . "\n",
|
||||||
|
'expected_export' => "<pre>6</pre>",
|
||||||
|
],
|
||||||
|
// float
|
||||||
|
'float' => [
|
||||||
|
'input' => 1.6,
|
||||||
|
'flag' => null,
|
||||||
|
'expected_dump' => 'float(1.6)' . "\n",
|
||||||
|
'expected_export' => "<pre>1.6</pre>",
|
||||||
|
],
|
||||||
|
// bool
|
||||||
|
'bool' => [
|
||||||
|
'input' => true,
|
||||||
|
'flag' => null,
|
||||||
|
'expected_dump' => 'bool(true)' . "\n",
|
||||||
|
'expected_export' => "<pre>true</pre>",
|
||||||
|
],
|
||||||
|
// array
|
||||||
|
'array' => [
|
||||||
|
'input' => ['string', true],
|
||||||
|
'flag' => null,
|
||||||
|
'expected_dump' => "array(2) {\n"
|
||||||
|
. " [0]=>\n"
|
||||||
|
. " string(6) \"string\"\n"
|
||||||
|
. " [1]=>\n"
|
||||||
|
. " bool(true)\n"
|
||||||
|
. "}\n",
|
||||||
|
'expected_export' => "<pre>array (\n"
|
||||||
|
. " 0 => 'string',\n"
|
||||||
|
. " 1 => true,\n"
|
||||||
|
. ")</pre>",
|
||||||
|
],
|
||||||
|
// more
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::dumpVar
|
||||||
|
* @cover ::exportVar
|
||||||
|
* @dataProvider providerDumpExportVar
|
||||||
|
* @testdox dump/exportVar $input with $flag will be $expected_dump / $expected_export [$_dataName]
|
||||||
|
*
|
||||||
|
* @param mixed $input
|
||||||
|
* @param bool|null $flag
|
||||||
|
* @param string $expected_dump
|
||||||
|
* @param string $expected_export
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testDumpExportVar(mixed $input, ?bool $flag, string $expected_dump, string $expected_export): void
|
||||||
|
{
|
||||||
|
if ($flag === null) {
|
||||||
|
$dump = Support::dumpVar($input);
|
||||||
|
$export = Support::exportVar($input);
|
||||||
|
} else {
|
||||||
|
$dump = Support::dumpVar($input, $flag);
|
||||||
|
$export = Support::exportVar($input, $flag);
|
||||||
|
}
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_dump,
|
||||||
|
$dump,
|
||||||
|
'assert dumpVar'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_export,
|
||||||
|
$export,
|
||||||
|
'assert dumpVar'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::getCallerFileLine
|
||||||
|
* @testWith ["vendor/phpunit/phpunit/src/Framework/TestCase.php:"]
|
||||||
|
* @testdox getCallerFileLine check based on regex /[\w\-\/]/vendor/phpunit/phpunit/src/Framework/TestCase.php:\d+ [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetCallerFileLine(): void
|
||||||
|
{
|
||||||
|
// regex prefix with path "/../" and then fixed vendor + \d+
|
||||||
|
$regex = "/^\/[\w\-\/]+\/vendor\/phpunit\/phpunit\/src\/Framework\/TestCase.php:\d+$/";
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$regex,
|
||||||
|
Support::getCallerFileLine()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::getCallerMethod
|
||||||
|
* @testWith ["testGetCallerMethod"]
|
||||||
|
* @testdox getCallerMethod check if it returns $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetCallerMethod(string $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::getCallerMethod()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::getCallerMethodList
|
||||||
|
* @testWith [["main", "run", "run", "run", "run", "run", "run", "runBare", "runTest", "testGetCallerMethodList"]]
|
||||||
|
* @testdox getCallerMethodList check if it returns $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param array $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetCallerMethodList(array $expected): void
|
||||||
|
{
|
||||||
|
$compare = Support::getCallerMethodList();
|
||||||
|
// 10: legact
|
||||||
|
// 11: direct
|
||||||
|
// 12: full call
|
||||||
|
switch (count($compare)) {
|
||||||
|
case 10:
|
||||||
|
// add nothing
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::getCallerMethodList(),
|
||||||
|
'assert expected 10'
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
// add one "run" before "runBare"
|
||||||
|
// array_splice(
|
||||||
|
// $expected,
|
||||||
|
// 7,
|
||||||
|
// 0,
|
||||||
|
// ['run']
|
||||||
|
// );
|
||||||
|
array_splice(
|
||||||
|
$expected,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
['include']
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::getCallerMethodList(),
|
||||||
|
'assert expected 11'
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
// add two "run" before "runBare"
|
||||||
|
array_splice(
|
||||||
|
$expected,
|
||||||
|
7,
|
||||||
|
0,
|
||||||
|
['run']
|
||||||
|
);
|
||||||
|
array_splice(
|
||||||
|
$expected,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
['include']
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::getCallerMethodList(),
|
||||||
|
'assert expected 12'
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test the lowest one (one above base)
|
||||||
|
*
|
||||||
|
* @cover ::getCallerClass
|
||||||
|
* @testWith ["tests\\CoreLibsDebugSupportTest"]
|
||||||
|
* @testdox getCallerClass check if it returns $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetCallerClass(string $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::getCallerClass()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test highest return (top level)
|
||||||
|
*
|
||||||
|
* @cover ::getCallerTopLevelClass
|
||||||
|
* @testWith ["PHPUnit\\TextUI\\Command"]
|
||||||
|
* @testdox getCallerTopLevelClass check if it returns $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetCallerTopLevelClass(string $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::getCallerTopLevelClass()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test highest return (top level)
|
||||||
|
*
|
||||||
|
* @cover ::getCallerClassMethod
|
||||||
|
* @testWith ["tests\\CoreLibsDebugSupportTest->testGetCallerClassMethod"]
|
||||||
|
* @testdox getCallerClassMethod check if it returns $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetCallerClassMethod(string $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::getCallerClassMethod()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function debugStringProvider(): array
|
||||||
|
{
|
||||||
|
// 0: input string
|
||||||
|
// 1: replace
|
||||||
|
// 2: html flag
|
||||||
|
// 3: expected
|
||||||
|
return [
|
||||||
|
'null string, default' => [
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'-'
|
||||||
|
],
|
||||||
|
'empty string, ... replace' => [
|
||||||
|
'',
|
||||||
|
'...',
|
||||||
|
null,
|
||||||
|
'...'
|
||||||
|
],
|
||||||
|
'filled string' => [
|
||||||
|
'some string',
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
'some string'
|
||||||
|
],
|
||||||
|
'string with html chars, encode' => [
|
||||||
|
'a string with <> &',
|
||||||
|
'-',
|
||||||
|
true,
|
||||||
|
'a string with <> &',
|
||||||
|
],
|
||||||
|
'string with html chars' => [
|
||||||
|
'a string with <> &',
|
||||||
|
'-',
|
||||||
|
null,
|
||||||
|
'a string with <> &',
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @cover ::debugString
|
||||||
|
* @dataProvider debugStringProvider
|
||||||
|
* @testdox debugString $input with replace $replace and html $flag will be $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|null $input
|
||||||
|
* @param string|null $replace
|
||||||
|
* @param bool|null $flag
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testDebugString(?string $input, ?string $replace, ?bool $flag, string $expected): void
|
||||||
|
{
|
||||||
|
if ($replace === null && $flag === null) {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::debugString($input),
|
||||||
|
'assert all default'
|
||||||
|
);
|
||||||
|
} elseif ($flag === null) {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::debugString($input, $replace),
|
||||||
|
'assert flag default'
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
Support::debugString($input, $replace, $flag),
|
||||||
|
'assert all set'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
3
4dev/tests/Debug/log/.gitignore
vendored
Normal file
3
4dev/tests/Debug/log/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
*log
|
||||||
|
*LOG
|
||||||
|
!.gitignore
|
||||||
191
4dev/tests/Get/CoreLibsGetDotEnvTest.php
Normal file
191
4dev/tests/Get/CoreLibsGetDotEnvTest.php
Normal file
@@ -0,0 +1,191 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use CoreLibs\Get\DotEnv;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for ACL\Login
|
||||||
|
* @coversDefaultClass \CoreLibs\Get\DotEnv
|
||||||
|
* @testdox \CoreLibs\Get\DotEnv method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsGetDotEnvTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function envFileProvider(): array
|
||||||
|
{
|
||||||
|
$dot_env_content = [
|
||||||
|
'SOMETHING' => 'A',
|
||||||
|
'OTHER' => 'B IS B',
|
||||||
|
'Complex' => 'A B \"D is F',
|
||||||
|
'HAS_SPACE' => 'ABC',
|
||||||
|
'HAS_COMMENT_QUOTES_SPACE' => 'Comment at end with quotes and space',
|
||||||
|
'HAS_COMMENT_QUOTES_NO_SPACE' => 'Comment at end with quotes no space',
|
||||||
|
'HAS_COMMENT_NO_QUOTES_SPACE' => 'Comment at end no quotes and space',
|
||||||
|
'HAS_COMMENT_NO_QUOTES_NO_SPACE' => 'Comment at end no quotes no space',
|
||||||
|
'COMMENT_IN_TEXT_QUOTES' => 'Foo bar # comment in here',
|
||||||
|
'FAILURE' => 'ABC',
|
||||||
|
'SIMPLEBOX' => 'A B C',
|
||||||
|
'TITLE' => '1',
|
||||||
|
'FOO' => '1.2',
|
||||||
|
'SOME.TEST' => 'Test Var',
|
||||||
|
'SOME.LIVE' => 'Live Var',
|
||||||
|
'A_TEST1' => 'foo',
|
||||||
|
'A_TEST2' => '${TEST1:-bar}',
|
||||||
|
'A_TEST3' => '${TEST4:-bar}',
|
||||||
|
'A_TEST5' => 'null',
|
||||||
|
'A_TEST6' => '${TEST5-bar}',
|
||||||
|
'A_TEST7' => '${TEST6:-bar}',
|
||||||
|
'B_TEST1' => 'foo',
|
||||||
|
'B_TEST2' => '${TEST1:=bar}',
|
||||||
|
'B_TEST3' => '${TEST4:=bar}',
|
||||||
|
'B_TEST5' => 'null',
|
||||||
|
'B_TEST6' => '${TEST5=bar}',
|
||||||
|
'B_TEST7' => '${TEST6=bar}',
|
||||||
|
'Test' => 'A',
|
||||||
|
'TEST' => 'B',
|
||||||
|
'LINE' => "ABC\nDEF",
|
||||||
|
'OTHERLINE' => "ABC\nAF\"ASFASDF\nMORESHIT",
|
||||||
|
'SUPERLINE' => '',
|
||||||
|
'__FOO_BAR_1' => 'b',
|
||||||
|
'__FOOFOO' => 'f ',
|
||||||
|
123123 => 'number',
|
||||||
|
'EMPTY' => '',
|
||||||
|
];
|
||||||
|
// 0: folder relative to test folder, if unset __DIR__
|
||||||
|
// 1: file, if unset .env
|
||||||
|
// 2: status to be returned
|
||||||
|
// 3: _ENV file content to be set
|
||||||
|
// 4: override chmod as octect in string
|
||||||
|
return [
|
||||||
|
'default' => [
|
||||||
|
'folder' => null,
|
||||||
|
'file' => null,
|
||||||
|
'status' => 3,
|
||||||
|
'content' => [],
|
||||||
|
'chmod' => null,
|
||||||
|
],
|
||||||
|
'cannot open file' => [
|
||||||
|
'folder' => __DIR__ . DIRECTORY_SEPARATOR . 'dotenv',
|
||||||
|
'file' => 'cannot_read.env',
|
||||||
|
'status' => 2,
|
||||||
|
'content' => [],
|
||||||
|
// 0000
|
||||||
|
'chmod' => '100000',
|
||||||
|
],
|
||||||
|
'empty file' => [
|
||||||
|
'folder' => __DIR__ . DIRECTORY_SEPARATOR . 'dotenv',
|
||||||
|
'file' => 'empty.env',
|
||||||
|
'status' => 1,
|
||||||
|
'content' => [],
|
||||||
|
// 0664
|
||||||
|
'chmod' => '100664',
|
||||||
|
],
|
||||||
|
'override all' => [
|
||||||
|
'folder' => __DIR__ . DIRECTORY_SEPARATOR . 'dotenv',
|
||||||
|
'file' => 'test.env',
|
||||||
|
'status' => 0,
|
||||||
|
'content' => $dot_env_content,
|
||||||
|
// 0664
|
||||||
|
'chmod' => '100664',
|
||||||
|
],
|
||||||
|
'override directory' => [
|
||||||
|
'folder' => __DIR__ . DIRECTORY_SEPARATOR . 'dotenv',
|
||||||
|
'file' => null,
|
||||||
|
'status' => 0,
|
||||||
|
'content' => $dot_env_content,
|
||||||
|
'chmod' => null,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test read .env file
|
||||||
|
*
|
||||||
|
* @covers ::readEnvFile
|
||||||
|
* @dataProvider envFileProvider
|
||||||
|
* @testdox Read _ENV file from $folder / $file with expected status: $expected_status and chmod $chmod [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|null $folder
|
||||||
|
* @param string|null $file
|
||||||
|
* @param int $expected_status
|
||||||
|
* @param array $expected_env
|
||||||
|
* @param string|null $chmod
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testReadEnvFile(
|
||||||
|
?string $folder,
|
||||||
|
?string $file,
|
||||||
|
int $expected_status,
|
||||||
|
array $expected_env,
|
||||||
|
?string $chmod
|
||||||
|
): void {
|
||||||
|
if (
|
||||||
|
!empty($chmod) &&
|
||||||
|
$chmod == '100000' &&
|
||||||
|
getmyuid() == 0
|
||||||
|
) {
|
||||||
|
$this->markTestSkipped(
|
||||||
|
"Skip cannot read file test because run user is root"
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// if we have file + chmod set
|
||||||
|
$old_chmod = null;
|
||||||
|
if (
|
||||||
|
is_file($folder . DIRECTORY_SEPARATOR . $file) &&
|
||||||
|
!empty($chmod)
|
||||||
|
) {
|
||||||
|
// get the old permissions
|
||||||
|
$old_chmod = fileperms($folder . DIRECTORY_SEPARATOR . $file);
|
||||||
|
chmod($folder . DIRECTORY_SEPARATOR . $file, octdec($chmod));
|
||||||
|
}
|
||||||
|
$message = '\CoreLibs\Get\DotEnv is deprecated in favor for '
|
||||||
|
. 'composer package gullevek\dotenv which is a copy of this';
|
||||||
|
// convert E_USER_DEPRECATED to a exception
|
||||||
|
set_error_handler(
|
||||||
|
static function (int $errno, string $errstr): never {
|
||||||
|
throw new \Exception($errstr, $errno);
|
||||||
|
},
|
||||||
|
E_USER_DEPRECATED
|
||||||
|
);
|
||||||
|
// tests are never run -> deprecated
|
||||||
|
if (is_file($folder . DIRECTORY_SEPARATOR . $file)) {
|
||||||
|
chmod($folder . DIRECTORY_SEPARATOR . $file, 0664);
|
||||||
|
}
|
||||||
|
$this->expectExceptionMessage($message);
|
||||||
|
if ($folder !== null && $file !== null) {
|
||||||
|
$status = DotEnv::readEnvFile($folder, $file);
|
||||||
|
} elseif ($folder !== null) {
|
||||||
|
$status = DotEnv::readEnvFile($folder);
|
||||||
|
} else {
|
||||||
|
$status = DotEnv::readEnvFile();
|
||||||
|
}
|
||||||
|
restore_error_handler();
|
||||||
|
$this->assertEquals(
|
||||||
|
$status,
|
||||||
|
$expected_status,
|
||||||
|
'Assert returned status equal'
|
||||||
|
);
|
||||||
|
// now assert read data
|
||||||
|
$this->assertEquals(
|
||||||
|
$_ENV,
|
||||||
|
$expected_env,
|
||||||
|
'Assert _ENV correct'
|
||||||
|
);
|
||||||
|
// if we have file and chmod unset
|
||||||
|
print "Write mode: $old_chmod\n";
|
||||||
|
if ($old_chmod !== null && $chmod == '100000') {
|
||||||
|
chmod($folder . DIRECTORY_SEPARATOR . $file, 0664);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
221
4dev/tests/Get/CoreLibsGetSystemTest.php
Normal file
221
4dev/tests/Get/CoreLibsGetSystemTest.php
Normal file
@@ -0,0 +1,221 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Get\System
|
||||||
|
* @coversDefaultClass \CoreLibs\Get\System
|
||||||
|
* @testdox \CoreLibs\Get\System method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsGetSystemTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function fileUploadErrorMessageProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'upload err init size' => [
|
||||||
|
0 => UPLOAD_ERR_INI_SIZE,
|
||||||
|
1 => 'The uploaded file exceeds the upload_max_filesize directive in php.ini',
|
||||||
|
],
|
||||||
|
'upload err from size' => [
|
||||||
|
0 => UPLOAD_ERR_FORM_SIZE,
|
||||||
|
1 => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'
|
||||||
|
],
|
||||||
|
'upload err partial' => [
|
||||||
|
0 => UPLOAD_ERR_PARTIAL,
|
||||||
|
1 => 'The uploaded file was only partially uploaded'
|
||||||
|
],
|
||||||
|
'upload err no file' => [
|
||||||
|
0 => UPLOAD_ERR_NO_FILE,
|
||||||
|
1 => 'No file was uploaded'
|
||||||
|
],
|
||||||
|
'upload err no tmp dir' => [
|
||||||
|
0 => UPLOAD_ERR_NO_TMP_DIR,
|
||||||
|
1 => 'Missing a temporary folder'
|
||||||
|
],
|
||||||
|
'upload err cant write' => [
|
||||||
|
0 => UPLOAD_ERR_CANT_WRITE,
|
||||||
|
1 => 'Failed to write file to disk'
|
||||||
|
],
|
||||||
|
'upload err extension' => [
|
||||||
|
0 => UPLOAD_ERR_EXTENSION,
|
||||||
|
1 => 'File upload stopped by extension'
|
||||||
|
],
|
||||||
|
'unkown error' => [
|
||||||
|
0 => 99999,
|
||||||
|
1 => 'Unknown upload error'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getHostNameProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'original set' => [
|
||||||
|
0 => null,
|
||||||
|
1 => 'NOHOST',
|
||||||
|
2 => 0,
|
||||||
|
],
|
||||||
|
'override set no port' => [
|
||||||
|
0 => 'foo.org',
|
||||||
|
1 => 'foo.org',
|
||||||
|
2 => 80
|
||||||
|
],
|
||||||
|
'override set with port' => [
|
||||||
|
0 => 'foo.org:443',
|
||||||
|
1 => 'foo.org',
|
||||||
|
2 => 443
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getPageNameProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// 0: input
|
||||||
|
// 1: expected default/WITH_EXTENSION
|
||||||
|
// 2: expected NO_EXTENSION
|
||||||
|
// 3: expected FULL_PATH, if first and last character are / use regex
|
||||||
|
'original set' => [
|
||||||
|
0 => null,
|
||||||
|
1 => 'phpunit',
|
||||||
|
2 => 'phpunit',
|
||||||
|
// NOTE: this can change, so it is a regex check
|
||||||
|
3 => "/^(\/?.*\/?)?vendor\/bin\/phpunit$/",
|
||||||
|
],
|
||||||
|
'some path with extension' => [
|
||||||
|
0 => '/some/path/to/file.txt',
|
||||||
|
1 => 'file.txt',
|
||||||
|
2 => 'file',
|
||||||
|
3 => '/some/path/to/file.txt',
|
||||||
|
]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::fileUploadErrorMessage
|
||||||
|
* @dataProvider fileUploadErrorMessageProvider
|
||||||
|
* @testdox fileUploadErrorMessage $input error matches $expected [$_dataName]
|
||||||
|
*
|
||||||
|
* @param integer $input
|
||||||
|
* @param string $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testFileUploadErrorMessage(int $input, string $expected): void
|
||||||
|
{
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Get\System::fileUploadErrorMessage($input)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::getHostName
|
||||||
|
* @dataProvider getHostNameProvider
|
||||||
|
* @testdox getHostName $input must match $expected_host:$expected_port [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|null $input
|
||||||
|
* @param string $expected_host
|
||||||
|
* @param int $expected_port
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetHostNanme(?string $input, string $expected_host, int $expected_port): void
|
||||||
|
{
|
||||||
|
// print "HOSTNAME: " . $_SERVER['HTTP_HOST'] . "<br>";
|
||||||
|
// print "SERVER: " . print_r($_SERVER, true) . "\n";
|
||||||
|
// print "SELF: " . $_SERVER['PHP_SELF'] . "\n";
|
||||||
|
if ($input !== null) {
|
||||||
|
$_SERVER['HTTP_HOST'] = $input;
|
||||||
|
}
|
||||||
|
list ($host, $port) = \CoreLibs\Get\System::getHostName();
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_host,
|
||||||
|
$host,
|
||||||
|
'failed expected host assert'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_port,
|
||||||
|
$port,
|
||||||
|
'faile expected port assert'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::getPageName
|
||||||
|
* @dataProvider getPageNameProvider
|
||||||
|
* @testdox getPageName $input will match 0: $expected_0, 1: $expected_1, 2: $expected_2 [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|null $input
|
||||||
|
* @param string $expected_0 default with extension
|
||||||
|
* @param string $expected_1 no extension
|
||||||
|
* @param string $expected_2 full path
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testGetPageName(?string $input, string $expected_0, string $expected_1, string $expected_2)
|
||||||
|
{
|
||||||
|
if ($input !== null) {
|
||||||
|
$_SERVER['PHP_SELF'] = $input;
|
||||||
|
}
|
||||||
|
// default 0,
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_0,
|
||||||
|
\CoreLibs\Get\System::getPageName(),
|
||||||
|
'failed default assert'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_0,
|
||||||
|
\CoreLibs\Get\System::getPageName(\CoreLibs\Get\System::WITH_EXTENSION),
|
||||||
|
'failed WITH_EXTESION assert'
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_1,
|
||||||
|
\CoreLibs\Get\System::getPageName(\CoreLibs\Get\System::NO_EXTENSION),
|
||||||
|
'failed NO_EXTENSION assert'
|
||||||
|
);
|
||||||
|
// FULL PATH check can be equals or regex
|
||||||
|
$page_name_full_path = \CoreLibs\Get\System::getPageName(\CoreLibs\Get\System::FULL_PATH);
|
||||||
|
if (
|
||||||
|
substr($expected_2, 0, 1) == '/' &&
|
||||||
|
substr($expected_2, -1, 1) == '/'
|
||||||
|
) {
|
||||||
|
// this is regex
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$expected_2,
|
||||||
|
$page_name_full_path,
|
||||||
|
'failed FULL_PATH assert regex'
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_2,
|
||||||
|
$page_name_full_path,
|
||||||
|
'failed FULL_PATH assert equals'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
0
4dev/tests/Get/dotenv/cannot_read.env
Normal file
0
4dev/tests/Get/dotenv/cannot_read.env
Normal file
0
4dev/tests/Get/dotenv/empty.env
Normal file
0
4dev/tests/Get/dotenv/empty.env
Normal file
49
4dev/tests/Get/dotenv/test.env
Normal file
49
4dev/tests/Get/dotenv/test.env
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
# enviroment file
|
||||||
|
SOMETHING=A
|
||||||
|
OTHER="B IS B"
|
||||||
|
Complex="A B \"D is F"
|
||||||
|
# COMMENT
|
||||||
|
HAS_SPACE= "ABC";
|
||||||
|
# COMMENT AT END
|
||||||
|
HAS_COMMENT_QUOTES_SPACE="Comment at end with quotes and space" # Comment QE
|
||||||
|
HAS_COMMENT_QUOTES_NO_SPACE="Comment at end with quotes no space"# Comment QES
|
||||||
|
HAS_COMMENT_NO_QUOTES_SPACE=Comment at end no quotes and space # Comment NQE
|
||||||
|
HAS_COMMENT_NO_QUOTES_NO_SPACE=Comment at end no quotes no space# Comment NQES
|
||||||
|
COMMENT_IN_TEXT_QUOTES="Foo bar # comment in here"
|
||||||
|
FAILURE = ABC
|
||||||
|
SIMPLEBOX= A B C
|
||||||
|
TITLE=1
|
||||||
|
FOO=1.2
|
||||||
|
SOME.TEST=Test Var
|
||||||
|
SOME.LIVE=Live Var
|
||||||
|
# VAR TESTS -
|
||||||
|
A_TEST1 = foo
|
||||||
|
A_TEST2 = ${TEST1:-bar} # TEST1 is set so the value of TEST2 = foo
|
||||||
|
A_TEST3 = ${TEST4:-bar} # TEST4 is not set so the value of TEST3 = bar
|
||||||
|
A_TEST5 = null
|
||||||
|
A_TEST6 = ${TEST5-bar} # TEST5 is set but empty so the value of TEST6 = null
|
||||||
|
A_TEST7 = ${TEST6:-bar} # TEST5 is set and empty so the value of TEST7 = bar
|
||||||
|
# VAR TESTS =
|
||||||
|
B_TEST1 = foo
|
||||||
|
B_TEST2 = ${TEST1:=bar} # TEST1 is set so the value of TEST2 = foo
|
||||||
|
B_TEST3 = ${TEST4:=bar} # TEST4 is not set so the value of TEST3 = bar and TEST4 = bar
|
||||||
|
B_TEST5 = null
|
||||||
|
B_TEST6 = ${TEST5=bar} # TEST5 is set but emtpy so the value of TEST6 = null
|
||||||
|
B_TEST7 = ${TEST6=bar} # TEST5 is set and empty so the value of TEST7 = bar and TEST5 = bar
|
||||||
|
# VAR TEST END
|
||||||
|
Test="A"
|
||||||
|
TEST="B"
|
||||||
|
TEST="D"
|
||||||
|
LINE="ABC
|
||||||
|
DEF"
|
||||||
|
OTHERLINE="ABC
|
||||||
|
AF\"ASFASDF
|
||||||
|
MORESHIT"
|
||||||
|
SUPERLINE=
|
||||||
|
"asfasfasf"
|
||||||
|
__FOO_BAR_1 = b
|
||||||
|
__FOOFOO = f
|
||||||
|
123123=number
|
||||||
|
EMPTY=
|
||||||
|
= flase
|
||||||
|
asfasdf
|
||||||
568
4dev/tests/Language/CoreLibsLanguageGetLocaleTest.php
Normal file
568
4dev/tests/Language/CoreLibsLanguageGetLocaleTest.php
Normal file
@@ -0,0 +1,568 @@
|
|||||||
|
<?php // phpcs:disable Generic.Files.LineLength
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace tests;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Language\GetLocale
|
||||||
|
*
|
||||||
|
* @coversDefaultClass \CoreLibs\Language\GetLocale
|
||||||
|
* @testdox \CoreLibs\Language\GetLocale method tests
|
||||||
|
*/
|
||||||
|
final class CoreLibsLanguageGetLocaleTest extends TestCase
|
||||||
|
{
|
||||||
|
public const SITE_ENCODING = 'UTF-8';
|
||||||
|
public const SITE_LOCALE = 'en_US.UTF-8';
|
||||||
|
public const SITE_DOMAIN = 'admin';
|
||||||
|
public const LOCALE_PATH = __DIR__ . DIRECTORY_SEPARATOR
|
||||||
|
. 'includes' . DIRECTORY_SEPARATOR
|
||||||
|
. 'locale' . DIRECTORY_SEPARATOR;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set all constant variables that must be set before call
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public static function setUpBeforeClass(): void
|
||||||
|
{
|
||||||
|
// default web page encoding setting
|
||||||
|
/* if (!defined('DEFAULT_ENCODING')) {
|
||||||
|
define('DEFAULT_ENCODING', 'UTF-8');
|
||||||
|
}
|
||||||
|
if (!defined('DEFAULT_LOCALE')) {
|
||||||
|
// default lang + encoding
|
||||||
|
define('DEFAULT_LOCALE', 'en_US.UTF-8');
|
||||||
|
}
|
||||||
|
// site
|
||||||
|
if (!defined('SITE_ENCODING')) {
|
||||||
|
define('SITE_ENCODING', DEFAULT_ENCODING);
|
||||||
|
}
|
||||||
|
if (!defined('SITE_LOCALE')) {
|
||||||
|
define('SITE_LOCALE', DEFAULT_LOCALE);
|
||||||
|
} */
|
||||||
|
// just set
|
||||||
|
/* if (!defined('BASE')) {
|
||||||
|
define('BASE', str_replace('/configs', '', __DIR__) . DIRECTORY_SEPARATOR);
|
||||||
|
}
|
||||||
|
if (!defined('INCLUDES')) {
|
||||||
|
define('INCLUDES', 'includes' . DIRECTORY_SEPARATOR);
|
||||||
|
}
|
||||||
|
if (!defined('LANG')) {
|
||||||
|
define('LANG', 'lang' . DIRECTORY_SEPARATOR);
|
||||||
|
}
|
||||||
|
if (!defined('LOCALE')) {
|
||||||
|
define('LOCALE', 'locale' . DIRECTORY_SEPARATOR);
|
||||||
|
}
|
||||||
|
if (!defined('CONTENT_PATH')) {
|
||||||
|
define('CONTENT_PATH', 'frontend' . DIRECTORY_SEPARATOR);
|
||||||
|
} */
|
||||||
|
// array session
|
||||||
|
$_SESSION = [];
|
||||||
|
global $_SESSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* all the test data
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
/* public function setLocaleProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// 0: locale
|
||||||
|
// 1: domain
|
||||||
|
// 2: encoding
|
||||||
|
// 3: path
|
||||||
|
// 4: SESSION: DEFAULT_LOCALE
|
||||||
|
// 5: SESSION: DEFAULT_CHARSET
|
||||||
|
// 6: expected array
|
||||||
|
// 7: deprecation message
|
||||||
|
'no params, all default constants' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
null, null, null, null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'en_US.UTF-8',
|
||||||
|
'lang' => 'en_US',
|
||||||
|
'domain' => 'frontend',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
'setLocale: Unset $locale or unset SESSION locale is deprecated',
|
||||||
|
],
|
||||||
|
'no params, session charset and lang' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
null, null, null, null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
'ja_JP', 'UTF-8',
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja_JP',
|
||||||
|
'lang' => 'ja_JP',
|
||||||
|
'domain' => 'frontend',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
'setLocale: Unset $domain is deprecated'
|
||||||
|
],
|
||||||
|
'no params, session charset and lang short' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
null, null, null, null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
'ja', 'UTF-8',
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'frontend',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
'setLocale: Unset $domain is deprecated',
|
||||||
|
],
|
||||||
|
// param lang (no sessions)
|
||||||
|
'locale param only, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'ja.UTF-8', null, null, null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja.UTF-8',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'frontend',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
'setLocale: Unset $domain is deprecated',
|
||||||
|
],
|
||||||
|
// different locale setting
|
||||||
|
'locale complex param only, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'ja_JP.SJIS', null, null, null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja_JP.SJIS',
|
||||||
|
'lang' => 'ja_JP',
|
||||||
|
'domain' => 'frontend',
|
||||||
|
'encoding' => 'SJIS',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
'setLocale: Unset $domain is deprecated',
|
||||||
|
],
|
||||||
|
// param lang and domain (no override)
|
||||||
|
'locale, domain params, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'ja.UTF-8', 'admin', null, null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja.UTF-8',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
'setLocale: Unset $path is deprecated',
|
||||||
|
],
|
||||||
|
// param lang and domain (no override)
|
||||||
|
'locale, domain, encoding params, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'ja.UTF-8', 'admin', 'UTF-8', null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja.UTF-8',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
'setLocale: Unset $path is deprecated'
|
||||||
|
],
|
||||||
|
// lang, domain, path (no override)
|
||||||
|
'locale, domain and path, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'ja.UTF-8', 'admin', '', __DIR__ . '/locale_other/',
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja.UTF-8',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?locale_other\/$/",
|
||||||
|
],
|
||||||
|
null
|
||||||
|
],
|
||||||
|
// all params set (no override)
|
||||||
|
'all parameter, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'ja', 'admin', 'UTF-8', __DIR__ . '/locale_other/',
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?locale_other\/$/",
|
||||||
|
],
|
||||||
|
null
|
||||||
|
],
|
||||||
|
// param lang and domain (no override)
|
||||||
|
'long locale, domain, encoding params, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'de_CH.UTF-8@euro', 'admin', 'UTF-8', null,
|
||||||
|
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
|
||||||
|
null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'de_CH.UTF-8@euro',
|
||||||
|
'lang' => 'de_CH',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
'setLocale: Unset $path is deprecated',
|
||||||
|
],
|
||||||
|
// TODO invalid params (bad path) (no override)
|
||||||
|
// TODO param calls, but with override set
|
||||||
|
];
|
||||||
|
} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::setLocale
|
||||||
|
* @dataProvider setLocaleProvider
|
||||||
|
* @testdox lang settings lang $language, domain $domain, encoding $encoding, path $path; session lang: $SESSION_DEFAULT_LOCALE, session char: $SESSION_DEFAULT_CHARSET [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|null $language
|
||||||
|
* @param string|null $domain
|
||||||
|
* @param string|null $encoding
|
||||||
|
* @param string|null $path
|
||||||
|
* @param string|null $SESSION_DEFAULT_LOCALE
|
||||||
|
* @param string|null $SESSION_DEFAULT_CHARSET
|
||||||
|
* @param array<mixed> $expected
|
||||||
|
* @param string|null $deprecation_message
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
/* public function testsetLocale(
|
||||||
|
?string $language,
|
||||||
|
?string $domain,
|
||||||
|
?string $encoding,
|
||||||
|
?string $path,
|
||||||
|
?string $SESSION_DEFAULT_LOCALE,
|
||||||
|
?string $SESSION_DEFAULT_CHARSET,
|
||||||
|
array $expected,
|
||||||
|
?string $deprecation_message
|
||||||
|
): void {
|
||||||
|
$return_lang_settings = [];
|
||||||
|
global $_SESSION;
|
||||||
|
// set override
|
||||||
|
if ($SESSION_DEFAULT_LOCALE !== null) {
|
||||||
|
$_SESSION['DEFAULT_LOCALE'] = $SESSION_DEFAULT_LOCALE;
|
||||||
|
}
|
||||||
|
if ($SESSION_DEFAULT_CHARSET !== null) {
|
||||||
|
$_SESSION['DEFAULT_CHARSET'] = $SESSION_DEFAULT_CHARSET;
|
||||||
|
}
|
||||||
|
if ($deprecation_message !== null) {
|
||||||
|
set_error_handler(
|
||||||
|
static function (int $errno, string $errstr): never {
|
||||||
|
throw new \Exception($errstr, $errno);
|
||||||
|
},
|
||||||
|
E_USER_DEPRECATED
|
||||||
|
);
|
||||||
|
// catch this with the message
|
||||||
|
$this->expectExceptionMessage($deprecation_message);
|
||||||
|
}
|
||||||
|
// function call
|
||||||
|
if (
|
||||||
|
$language === null && $domain === null &&
|
||||||
|
$encoding === null && $path === null
|
||||||
|
) {
|
||||||
|
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale();
|
||||||
|
} elseif (
|
||||||
|
$language !== null && $domain === null &&
|
||||||
|
$encoding === null && $path === null
|
||||||
|
) {
|
||||||
|
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
|
||||||
|
$language
|
||||||
|
);
|
||||||
|
} elseif (
|
||||||
|
$language !== null && $domain !== null &&
|
||||||
|
$encoding === null && $path === null
|
||||||
|
) {
|
||||||
|
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
|
||||||
|
$language,
|
||||||
|
$domain
|
||||||
|
);
|
||||||
|
} elseif (
|
||||||
|
$language !== null && $domain !== null &&
|
||||||
|
$encoding !== null && $path === null
|
||||||
|
) {
|
||||||
|
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
|
||||||
|
$language,
|
||||||
|
$domain,
|
||||||
|
$encoding
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
|
||||||
|
$language,
|
||||||
|
$domain,
|
||||||
|
$encoding,
|
||||||
|
$path
|
||||||
|
);
|
||||||
|
}
|
||||||
|
restore_error_handler();
|
||||||
|
// print "RETURN: " . print_r($return_lang_settings, true) . "\n";
|
||||||
|
|
||||||
|
foreach (
|
||||||
|
[
|
||||||
|
'locale', 'lang', 'domain', 'encoding', 'path'
|
||||||
|
] as $key
|
||||||
|
) {
|
||||||
|
$value = $expected[$key];
|
||||||
|
if (strpos($value, "/") === 0) {
|
||||||
|
// this is regex
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$value,
|
||||||
|
$return_lang_settings[$key],
|
||||||
|
'assert regex failed for ' . $key
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// assert equal
|
||||||
|
$this->assertEquals(
|
||||||
|
$value,
|
||||||
|
$return_lang_settings[$key],
|
||||||
|
'assert equal failed for ' . $key
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// unset all vars
|
||||||
|
$_SESSION = [];
|
||||||
|
unset($GLOBALS['OVERRIDE_LANG']);
|
||||||
|
} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* all the test data
|
||||||
|
*
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function setLocaleFromSessionProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
// 0: locale
|
||||||
|
// 1: domain
|
||||||
|
// 2: encoding
|
||||||
|
// 3: path
|
||||||
|
// 4: SESSION: DEFAULT_LOCALE
|
||||||
|
// 5: SESSION: DEFAULT_CHARSET
|
||||||
|
// 5: SESSION: DEFAULT_DOMAIN
|
||||||
|
// 6: SESSION: LOCALE_PATH
|
||||||
|
// 6: expected array
|
||||||
|
// 7: deprecation message
|
||||||
|
'all session vars set' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
self::SITE_LOCALE, self::SITE_DOMAIN, self::SITE_ENCODING, self::LOCALE_PATH,
|
||||||
|
// SESSION SETTINGS: locale, charset, domain, path
|
||||||
|
'ja_JP.UTF-8', 'UTF-8', 'admin', __DIR__ . '/locale_other/',
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja_JP.UTF-8',
|
||||||
|
'lang' => 'ja_JP',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?locale_other\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// param lang and domain (no override)
|
||||||
|
'no session set, only parameters' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
self::SITE_LOCALE, self::SITE_DOMAIN, self::SITE_ENCODING, self::LOCALE_PATH,
|
||||||
|
// SESSION SETTINGS: locale, charset, domain, path
|
||||||
|
null, null, null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'en_US.UTF-8',
|
||||||
|
'lang' => 'en_US',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// special parse session check for locales
|
||||||
|
'all session vars set, short lang' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
self::SITE_LOCALE, self::SITE_DOMAIN, self::SITE_ENCODING, self::LOCALE_PATH,
|
||||||
|
// SESSION SETTINGS: locale, charset, domain, path
|
||||||
|
'ja', 'UTF-8', 'admin', __DIR__ . '/locale_other/',
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?locale_other\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// lang with modifier
|
||||||
|
// param lang and domain (no override)
|
||||||
|
'long locale, domain, encoding params, no sessions' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
self::SITE_LOCALE, self::SITE_DOMAIN, self::SITE_ENCODING, self::LOCALE_PATH,
|
||||||
|
// SESSION SETTINGS: locale, charset, domain, path
|
||||||
|
'de_CH.UTF-8@euro', 'admin', 'UTF-8', __DIR__ . '/includes/locale/',
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'de_CH.UTF-8@euro',
|
||||||
|
'lang' => 'de_CH',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// missing session values check
|
||||||
|
// special parse session check for locales
|
||||||
|
'session missing encoding, set from parameters' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
self::SITE_LOCALE, self::SITE_DOMAIN, self::SITE_ENCODING, self::LOCALE_PATH,
|
||||||
|
// SESSION SETTINGS: locale, charset, domain, path
|
||||||
|
'ja', null, 'admin', __DIR__ . '/locale_other/',
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'ja',
|
||||||
|
'lang' => 'ja',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?locale_other\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// null return check for invalid entries
|
||||||
|
'no session set, only parameters, all invalid' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
'###', '&&&&', '$$$$', 'foo_bar_path',
|
||||||
|
// SESSION SETTINGS: locale, charset, domain, path
|
||||||
|
null, null, null, null,
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => null,
|
||||||
|
'lang' => null,
|
||||||
|
'domain' => null,
|
||||||
|
'encoding' => null,
|
||||||
|
'path' => null,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// invalid session names, fall backup
|
||||||
|
'all session vars are invalid, fallback' => [
|
||||||
|
// lang, domain, encoding, path
|
||||||
|
self::SITE_LOCALE, self::SITE_DOMAIN, self::SITE_ENCODING, self::LOCALE_PATH,
|
||||||
|
// SESSION SETTINGS: locale, charset, domain, path
|
||||||
|
'###', '&&&&', '$$$$', 'foo_bar_path',
|
||||||
|
// return array
|
||||||
|
[
|
||||||
|
'locale' => 'en_US.UTF-8',
|
||||||
|
'lang' => 'en_US',
|
||||||
|
'domain' => 'admin',
|
||||||
|
'encoding' => 'UTF-8',
|
||||||
|
'path' => "/^\/(.*\/)?includes\/locale\/$/",
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::setLocale
|
||||||
|
* @dataProvider setLocaleFromSessionProvider
|
||||||
|
* @testdox lang settings lang $language, domain $domain, encoding $encoding, path $path; session lang: $SESSION_DEFAULT_LOCALE, session char: $SESSION_DEFAULT_CHARSET [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string| $language
|
||||||
|
* @param string| $domain
|
||||||
|
* @param string| $encoding
|
||||||
|
* @param string| $path
|
||||||
|
* @param string|null $SESSION_DEFAULT_LOCALE
|
||||||
|
* @param string|null $SESSION_DEFAULT_CHARSET
|
||||||
|
* @param string|null $SESSION_DEFAULT_DOMAIN
|
||||||
|
* @param string|null $SESSION_LOCALE_PATH
|
||||||
|
* @param array<mixed> $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testsetLocaleFromSession(
|
||||||
|
string $language,
|
||||||
|
string $domain,
|
||||||
|
string $encoding,
|
||||||
|
string $path,
|
||||||
|
?string $SESSION_DEFAULT_LOCALE,
|
||||||
|
?string $SESSION_DEFAULT_CHARSET,
|
||||||
|
?string $SESSION_DEFAULT_DOMAIN,
|
||||||
|
?string $SESSION_LOCALE_PATH,
|
||||||
|
array $expected,
|
||||||
|
): void {
|
||||||
|
$return_lang_settings = [];
|
||||||
|
global $_SESSION;
|
||||||
|
// set override
|
||||||
|
if ($SESSION_DEFAULT_LOCALE !== null) {
|
||||||
|
$_SESSION['DEFAULT_LOCALE'] = $SESSION_DEFAULT_LOCALE;
|
||||||
|
}
|
||||||
|
if ($SESSION_DEFAULT_CHARSET !== null) {
|
||||||
|
$_SESSION['DEFAULT_CHARSET'] = $SESSION_DEFAULT_CHARSET;
|
||||||
|
}
|
||||||
|
if ($SESSION_DEFAULT_DOMAIN !== null) {
|
||||||
|
$_SESSION['DEFAULT_DOMAIN'] = $SESSION_DEFAULT_DOMAIN;
|
||||||
|
}
|
||||||
|
if ($SESSION_LOCALE_PATH !== null) {
|
||||||
|
$_SESSION['LOCALE_PATH'] = $SESSION_LOCALE_PATH;
|
||||||
|
}
|
||||||
|
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocaleFromSession(
|
||||||
|
$language,
|
||||||
|
$domain,
|
||||||
|
$encoding,
|
||||||
|
$path
|
||||||
|
);
|
||||||
|
// print "RETURN: " . print_r($return_lang_settings, true) . "\n";
|
||||||
|
foreach (
|
||||||
|
[
|
||||||
|
'locale', 'lang', 'domain', 'encoding', 'path'
|
||||||
|
] as $key
|
||||||
|
) {
|
||||||
|
$value = $expected[$key];
|
||||||
|
if (
|
||||||
|
!empty($value) &&
|
||||||
|
strpos($value, "/") === 0
|
||||||
|
) {
|
||||||
|
// this is regex
|
||||||
|
$this->assertMatchesRegularExpression(
|
||||||
|
$value,
|
||||||
|
$return_lang_settings[$key] ?? '',
|
||||||
|
'assert regex failed for ' . $key
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// assert equal
|
||||||
|
$this->assertEquals(
|
||||||
|
$value,
|
||||||
|
$return_lang_settings[$key],
|
||||||
|
'assert equal failed for ' . $key
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// unset all vars
|
||||||
|
$_SESSION = [];
|
||||||
|
unset($GLOBALS['OVERRIDE_LANG']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// __END__
|
||||||
1147
4dev/tests/Language/CoreLibsLanguageL10nTest.php
Normal file
1147
4dev/tests/Language/CoreLibsLanguageL10nTest.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