Compare commits
351 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
97e1b2b63d | ||
|
|
d632a2599e | ||
|
|
2f81009a97 | ||
|
|
e9799f888b | ||
|
|
94b24b4eae | ||
|
|
a304d29698 | ||
|
|
c4c809be66 | ||
|
|
a3bf38f6cf | ||
|
|
c1b906e701 | ||
|
|
32f8e1440d | ||
|
|
2f8f98642b | ||
|
|
7ab03913ac | ||
|
|
a7853171e0 | ||
|
|
dfdfcf87f2 | ||
|
|
6218e0a6a8 | ||
|
|
a84a745be2 | ||
|
|
312762e92e | ||
|
|
fa4c1f0597 | ||
|
|
438a75af23 | ||
|
|
afd8ff3e31 | ||
|
|
4343af7937 | ||
|
|
d06769c48b | ||
|
|
4c0390f082 | ||
|
|
95bee3dc8c | ||
|
|
65132d8a4a | ||
|
|
b2243cd06d | ||
|
|
8f09b67d86 | ||
|
|
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 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -0,0 +1 @@
|
||||
.libs
|
||||
|
||||
@@ -26,6 +26,10 @@
|
||||
use Phan\Config;
|
||||
|
||||
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
|
||||
// they are first seen. If false, we'll report an
|
||||
// error message.
|
||||
@@ -36,7 +40,7 @@ return [
|
||||
"null_casts_as_any_type" => false,
|
||||
|
||||
// Backwards Compatibility Checking
|
||||
'backward_compatibility_checks' => true,
|
||||
'backward_compatibility_checks' => false,
|
||||
|
||||
// Run a quick version of checks that takes less
|
||||
// time
|
||||
@@ -46,6 +50,12 @@ return [
|
||||
// (0 is low severity, 5 is normal severity, 10 is critical)
|
||||
"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
|
||||
"enable_include_path_checks" => true,
|
||||
"include_paths" => [
|
||||
@@ -86,8 +96,6 @@ return [
|
||||
"exclude_analysis_directory_list" => [
|
||||
'www/vendor',
|
||||
'www/tests',
|
||||
'www/lib/Smarty',
|
||||
'www/lib/smarty-3.1.30',
|
||||
'www/templates_c',
|
||||
'www/log',
|
||||
'www/tmp',
|
||||
@@ -108,15 +116,24 @@ return [
|
||||
// ignore the old qq tests
|
||||
'www/admin/qq_file_upload_front.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
|
||||
'suppress_issue_types' => [
|
||||
// 'PhanUndeclaredMethod',
|
||||
'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.
|
||||
|
||||
12
.phive/phars.xml
Normal file
12
.phive/phars.xml
Normal file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<phive xmlns="https://phar.io/phive">
|
||||
<phar name="phpunit" version="^9.6" installed="9.6.13" location="./tools/phpunit" copy="false"/>
|
||||
<phar name="phpcbf" version="^3.7.2" installed="3.7.2" location="./tools/phpcbf" copy="false"/>
|
||||
<phar name="phpcs" version="^3.7.2" installed="3.7.2" location="./tools/phpcs" copy="false"/>
|
||||
<phar name="phpstan" version="^1.10.37" installed="1.10.37" location="./tools/phpstan" copy="false"/>
|
||||
<phar name="phan" version="^5.4.2" installed="5.4.2" location="./tools/phan" copy="false"/>
|
||||
<phar name="psalm" version="^5.15.0" installed="5.15.0" location="./tools/psalm" copy="false"/>
|
||||
<phar name="phpdox" version="^0.12.0" installed="0.12.0" location="./tools/phpdox" copy="false"/>
|
||||
<phar name="phpdocumentor" version="^3.4.2" installed="3.4.2" location="./tools/phpDocumentor" copy="false"/>
|
||||
<phar name="php-cs-fixer" version="^3.34.1" installed="3.34.1" location="./tools/php-cs-fixer" copy="false"/>
|
||||
</phive>
|
||||
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__
|
||||
6
4dev/checking/phan.sh
Normal file → Executable file
6
4dev/checking/phan.sh
Normal file → Executable file
@@ -1,3 +1,5 @@
|
||||
base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
|
||||
# must be run in ${base}www/
|
||||
phan --progress-bar -C --analyze-twice
|
||||
# must be run in ${base}
|
||||
cd $base;
|
||||
${base}tools/phan --progress-bar -C --analyze-twice;
|
||||
cd ~;
|
||||
|
||||
6
4dev/checking/phpstan.sh
Normal file → Executable file
6
4dev/checking/phpstan.sh
Normal file → Executable file
@@ -1,3 +1,5 @@
|
||||
base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
|
||||
# must be run in ${base}www/
|
||||
phpstan
|
||||
# must be run in ${base}
|
||||
cd $base;
|
||||
${base}tools/phpstan;
|
||||
cd ~;
|
||||
|
||||
@@ -1,4 +1,47 @@
|
||||
#!/bin/env bash
|
||||
|
||||
base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
|
||||
# -c phpunit.xml
|
||||
# --testdox
|
||||
${base}www/vendor/bin/phpunit -c ${base}phpunit.xml ${base}4dev/tests/
|
||||
# call with "t" to give verbose testdox output
|
||||
# SUPPORTED: https://www.php.net/supported-versions.php
|
||||
# call with php version number to force a certain php version
|
||||
|
||||
opt_testdox="";
|
||||
if [ "${1}" = "t" ] || [ "${2}" = "t" ]; then
|
||||
opt_testdox="--testdox";
|
||||
fi;
|
||||
php_bin="";
|
||||
if [ ! -z "${1}" ]; then
|
||||
case "${1}" in
|
||||
# "7.3") php_bin="/usr/bin/php7.3 "; ;;
|
||||
# "7.4") php_bin="/usr/bin/php7.4 "; ;;
|
||||
# "8.0") php_bin="/usr/bin/php8.0 "; ;;
|
||||
# "8.1") php_bin="/usr/bin/php8.1 "; ;;
|
||||
"8.2") php_bin="/usr/bin/php8.2 "; ;;
|
||||
*) echo "Not support PHP: ${1}"; exit; ;;
|
||||
esac;
|
||||
fi;
|
||||
if [ ! -z "${2}" ] && [ -z "${php_bin}" ]; then
|
||||
case "${2}" in
|
||||
# "7.3") php_bin="/usr/bin/php7.3 "; ;;
|
||||
# "7.4") php_bin="/usr/bin/php7.4 "; ;;
|
||||
# "8.0") php_bin="/usr/bin/php8.0 "; ;;
|
||||
# "8.1") php_bin="/usr/bin/php8.1 "; ;;
|
||||
"8.2") php_bin="/usr/bin/php8.2 "; ;;
|
||||
*) echo "Not support PHP: ${1}"; exit; ;;
|
||||
esac;
|
||||
fi;
|
||||
|
||||
# Note 4dev/tests/bootstrap.php has to be set as bootstrap file in phpunit.xml
|
||||
phpunit_call="${php_bin}${base}tools/phpunit ${opt_testdox} -c ${base}phpunit.xml ${base}4dev/tests/";
|
||||
|
||||
${phpunit_call};
|
||||
|
||||
if [ ! -z "${php_bin}" ]; then
|
||||
echo "CALLED WITH PHP: ${php_bin}"$(${php_bin} --version);
|
||||
else
|
||||
echo "Default PHP used: "$(php --version);
|
||||
fi;
|
||||
|
||||
# __END__
|
||||
|
||||
22
4dev/composer/sync-to-composer-all-folder.sh
Executable file
22
4dev/composer/sync-to-composer-all-folder.sh
Executable file
@@ -0,0 +1,22 @@
|
||||
#!/bin/env bash
|
||||
|
||||
# syncs
|
||||
# 4dev/tests/
|
||||
# www/lib/CoreLibs/
|
||||
#
|
||||
# to the composer corelibs all repo
|
||||
|
||||
GO="${1}";
|
||||
DRY_RUN="";
|
||||
if [ "${GO}" != "go" ]; then
|
||||
DRY_RUN="-n ";
|
||||
fi;
|
||||
|
||||
BASE="/storage/var/www/html/developers/clemens/core_data/";
|
||||
SOURCE="${BASE}php_libraries/trunk/"
|
||||
TARGET="${BASE}composer-packages/CoreLibs-Composer-All/"
|
||||
|
||||
rsync ${DRY_RUN}-Plzvrupt --stats --delete ${SOURCE}4dev/tests/ ${TARGET}test/phpunit/
|
||||
rsync ${DRY_RUN}-Plzvrupt --stats --delete ${SOURCE}www/lib/CoreLibs/ ${TARGET}src/
|
||||
|
||||
# __END__
|
||||
@@ -1,10 +1,11 @@
|
||||
# this list only holds edit_* related table data
|
||||
# functions
|
||||
function/set_uid.sql
|
||||
function/set_generic.sql
|
||||
function/random_string.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_user_set_login_user_id_set_date.sql
|
||||
# generic tables
|
||||
table/edit_temp_files.sql
|
||||
table/edit_generic.sql
|
||||
|
||||
@@ -6,20 +6,25 @@
|
||||
#exit;
|
||||
|
||||
# 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';
|
||||
input='';
|
||||
# write to file do not write to DB directly
|
||||
write='y';
|
||||
# database connection info
|
||||
db='<db name>';
|
||||
host='<db host>';
|
||||
user='<db user>';
|
||||
schema="public";
|
||||
schemas='public';
|
||||
export PGPASSWORD='';
|
||||
|
||||
# log files
|
||||
error_file="log/error";
|
||||
output_file="log/output";
|
||||
error_file='log/error';
|
||||
output_file='log/output';
|
||||
data_file='database_create_data.sql';
|
||||
|
||||
if [ "$write" = 'y' ]; then
|
||||
rm -f "${data_file}";
|
||||
fi;
|
||||
if [ ! -f ORDER ]; then
|
||||
echo "Could not find ORDER file";
|
||||
exit;
|
||||
@@ -40,26 +45,37 @@ while read file <&3; do
|
||||
if [ -f "$file" ]; then
|
||||
for path in "$schemas"; do
|
||||
echo "[+] WORK ON '${file}' @ '${path}'";
|
||||
# skip all on test
|
||||
if [ "$test" = 'n' ]; then
|
||||
echo "=== START [$file] ===>" >> ${error_file};
|
||||
psql -U ${user} -h ${host} -f "${file}" ${db} 1>> ${output_file} 2>> ${error_file}
|
||||
echo "=== END [$file] ===>" >> ${error_file};
|
||||
fi;
|
||||
if [ "$development" = "y" ]; then
|
||||
echo "Press 'y' to move to next. Press 'r' to reload last file. ^c to abort";
|
||||
fi;
|
||||
while [ "$development" = "y" ] && [ "$input" != "y" ]; do
|
||||
read -ep "Continue (y|r|^c): " input;
|
||||
if [ "$input" = "r" ]; then
|
||||
echo "Reload File '${file}' ...";
|
||||
if [ "$test" = 'n' ]; then
|
||||
echo "=== START RELOAD [$file] ===>" >> ${error_file};
|
||||
psql -U ${user} -h ${host} -f "${file}" ${db} 1>> ${output_file} 2>> ${error_file}
|
||||
echo "=== END RELOAD [$file] ===>" >> ${error_file};
|
||||
# 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};
|
||||
psql -U ${user} -h ${host} -f "${file}" ${db} 1>> ${output_file} 2>> ${error_file}
|
||||
echo "=== END [$file] ===>" >> ${error_file};
|
||||
# next wait for dev
|
||||
if [ "$development" = "y" ]; then
|
||||
echo "Press 'y' to move to next. Press 'r' to reload last file. ^c to abort";
|
||||
fi;
|
||||
# loop run for reload on failed
|
||||
while [ "$development" = "y" ] && [ "$input" != "y" ]; do
|
||||
read -ep "Continue (y|r|^c): " input;
|
||||
if [ "$input" = "r" ]; then
|
||||
echo "Reload File '${file}' ...";
|
||||
if [ "$test" = 'n' ]; then
|
||||
echo "=== START RELOAD [$file] ===>" >> ${error_file};
|
||||
psql -U ${user} -h ${host} -f "${file}" ${db} 1>> ${output_file} 2>> ${error_file}
|
||||
echo "=== END RELOAD [$file] ===>" >> ${error_file};
|
||||
fi;
|
||||
fi;
|
||||
done;
|
||||
input='';
|
||||
fi;
|
||||
done;
|
||||
input='';
|
||||
fi;
|
||||
done;
|
||||
elif [[ ${file::1} != "#" ]]; then
|
||||
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);
|
||||
|
||||
-- edit language
|
||||
-- short_name = locale without encoding
|
||||
-- iso_name = encoding
|
||||
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 (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 ('English', 'en_US', 'UTF-8', 1, 1, 1);
|
||||
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
|
||||
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
|
||||
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,
|
||||
(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_scheme_id FROM edit_scheme WHERE name = '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';
|
||||
@@ -9,142 +9,142 @@ CREATE OR REPLACE FUNCTION edit_log_insert_trigger ()
|
||||
RETURNS TRIGGER AS
|
||||
$$
|
||||
DECLARE
|
||||
start_date DATE := '2010-01-01';
|
||||
end_date DATE;
|
||||
timeformat TEXT := 'YYYY';
|
||||
selector TEXT := 'year';
|
||||
base_table TEXT := 'edit_log';
|
||||
_interval INTERVAL := '1 ' || selector;
|
||||
_interval_next INTERVAL := '2 ' || selector;
|
||||
table_name TEXT;
|
||||
-- compare date column
|
||||
compare_date DATE := NEW.event_date;
|
||||
compare_date_name TEXT := 'event_date';
|
||||
-- the create commands
|
||||
command_create_table TEXT := 'CREATE TABLE IF NOT EXISTS {TABLE_NAME} (CHECK({COMPARE_DATE_NAME} >= {START_DATE} AND {COMPARE_DATE_NAME} < {END_DATE})) INHERITS ({BASE_NAME})';
|
||||
command_create_primary_key TEXT := 'ALTER TABLE {TABLE_NAME} ADD PRIMARY KEY ({BASE_TABLE}_id)';
|
||||
command_create_foreign_key_1 TEXT := 'ALTER TABLE {TABLE_NAME} ADD CONSTRAINT {TABLE_NAME}_euid_fkey FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL';
|
||||
command_create_trigger_1 TEXT = 'CREATE TRIGGER trg_{TABLE_NAME} BEFORE INSERT OR UPDATE ON {TABLE_NAME} FOR EACH ROW EXECUTE PROCEDURE set_edit_generic()';
|
||||
start_date DATE := '2010-01-01';
|
||||
end_date DATE;
|
||||
timeformat TEXT := 'YYYY';
|
||||
selector TEXT := 'year';
|
||||
base_table TEXT := 'edit_log';
|
||||
_interval INTERVAL := '1 ' || selector;
|
||||
_interval_next INTERVAL := '2 ' || selector;
|
||||
table_name TEXT;
|
||||
-- compare date column
|
||||
compare_date DATE := NEW.event_date;
|
||||
compare_date_name TEXT := 'event_date';
|
||||
-- the create commands
|
||||
command_create_table TEXT := 'CREATE TABLE IF NOT EXISTS {TABLE_NAME} (CHECK({COMPARE_DATE_NAME} >= {START_DATE} AND {COMPARE_DATE_NAME} < {END_DATE})) INHERITS ({BASE_NAME})';
|
||||
command_create_primary_key TEXT := 'ALTER TABLE {TABLE_NAME} ADD PRIMARY KEY ({BASE_TABLE}_id)';
|
||||
command_create_foreign_key_1 TEXT := 'ALTER TABLE {TABLE_NAME} ADD CONSTRAINT {TABLE_NAME}_euid_fkey FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL';
|
||||
command_create_trigger_1 TEXT = 'CREATE TRIGGER trg_{TABLE_NAME} BEFORE INSERT OR UPDATE ON {TABLE_NAME} FOR EACH ROW EXECUTE PROCEDURE set_edit_generic()';
|
||||
BEGIN
|
||||
-- we are in valid start time area
|
||||
IF (NEW.event_date >= start_date) THEN
|
||||
-- current table name
|
||||
table_name := base_table || '_' || to_char(NEW.event_date, timeformat);
|
||||
BEGIN
|
||||
EXECUTE 'INSERT INTO ' || quote_ident(table_name) || ' SELECT ($1).*' USING NEW;
|
||||
-- if insert failed because of missing table, create new below
|
||||
EXCEPTION
|
||||
WHEN undefined_table THEN
|
||||
-- another block, so in case the creation fails here too
|
||||
BEGIN
|
||||
-- create new table here + all indexes
|
||||
start_date := date_trunc(selector, NEW.event_date);
|
||||
end_date := date_trunc(selector, NEW.event_date + _interval);
|
||||
-- creat table
|
||||
EXECUTE format(REPLACE( -- end date
|
||||
REPLACE( -- start date
|
||||
REPLACE( -- compare date name
|
||||
REPLACE( -- base name (inherit)
|
||||
REPLACE( -- table name
|
||||
command_create_table,
|
||||
'{TABLE_NAME}',
|
||||
table_name
|
||||
),
|
||||
'{BASE_NAME}',
|
||||
base_table
|
||||
),
|
||||
'{COMPARE_DATE_NAME}',
|
||||
compare_date_name
|
||||
),
|
||||
'{START_DATE}',
|
||||
quote_literal(start_date)
|
||||
),
|
||||
'{END_DATE}',
|
||||
quote_literal(end_date)
|
||||
));
|
||||
-- create all indexes and triggers
|
||||
EXECUTE format(REPLACE(
|
||||
REPLACE(
|
||||
command_create_primary_key,
|
||||
'{TABLE_NAME}',
|
||||
table_name
|
||||
),
|
||||
'{BASE_TABLE}',
|
||||
base_table
|
||||
));
|
||||
-- FK constraints
|
||||
EXECUTE format(REPLACE(command_create_foreign_key_1, '{TABLE_NAME}', table_name));
|
||||
-- generic trigger
|
||||
EXECUTE format(REPLACE(command_create_trigger_1, '{TABLE_NAME}', table_name));
|
||||
-- we are in valid start time area
|
||||
IF (NEW.event_date >= start_date) THEN
|
||||
-- current table name
|
||||
table_name := base_table || '_' || to_char(NEW.event_date, timeformat);
|
||||
BEGIN
|
||||
EXECUTE 'INSERT INTO ' || quote_ident(table_name) || ' SELECT ($1).*' USING NEW;
|
||||
-- if insert failed because of missing table, create new below
|
||||
EXCEPTION
|
||||
WHEN undefined_table THEN
|
||||
-- another block, so in case the creation fails here too
|
||||
BEGIN
|
||||
-- create new table here + all indexes
|
||||
start_date := date_trunc(selector, NEW.event_date);
|
||||
end_date := date_trunc(selector, NEW.event_date + _interval);
|
||||
-- creat table
|
||||
EXECUTE format(REPLACE( -- end date
|
||||
REPLACE( -- start date
|
||||
REPLACE( -- compare date name
|
||||
REPLACE( -- base name (inherit)
|
||||
REPLACE( -- table name
|
||||
command_create_table,
|
||||
'{TABLE_NAME}',
|
||||
table_name
|
||||
),
|
||||
'{BASE_NAME}',
|
||||
base_table
|
||||
),
|
||||
'{COMPARE_DATE_NAME}',
|
||||
compare_date_name
|
||||
),
|
||||
'{START_DATE}',
|
||||
quote_literal(start_date)
|
||||
),
|
||||
'{END_DATE}',
|
||||
quote_literal(end_date)
|
||||
));
|
||||
-- create all indexes and triggers
|
||||
EXECUTE format(REPLACE(
|
||||
REPLACE(
|
||||
command_create_primary_key,
|
||||
'{TABLE_NAME}',
|
||||
table_name
|
||||
),
|
||||
'{BASE_TABLE}',
|
||||
base_table
|
||||
));
|
||||
-- FK constraints
|
||||
EXECUTE format(REPLACE(command_create_foreign_key_1, '{TABLE_NAME}', table_name));
|
||||
-- generic trigger
|
||||
EXECUTE format(REPLACE(command_create_trigger_1, '{TABLE_NAME}', table_name));
|
||||
|
||||
-- insert try again
|
||||
EXECUTE 'INSERT INTO ' || quote_ident(table_name) || ' SELECT ($1).*' USING NEW;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
-- if this faled, throw it into the overflow table (so we don't loose anything)
|
||||
INSERT INTO edit_log_overflow VALUES (NEW.*);
|
||||
END;
|
||||
-- other errors, insert into overlow
|
||||
WHEN OTHERS THEN
|
||||
-- if this faled, throw it into the overflow table (so we don't loose anything)
|
||||
INSERT INTO edit_log_overflow VALUES (NEW.*);
|
||||
END;
|
||||
-- main insert run done, check if we have to create next months table
|
||||
BEGIN
|
||||
-- check if next month table exists
|
||||
table_name := base_table || '_' || to_char((SELECT NEW.event_date + _interval)::DATE, timeformat);
|
||||
-- RAISE NOTICE 'SEARCH NEXT: %', table_name;
|
||||
IF (SELECT to_regclass(table_name)) IS NULL THEN
|
||||
-- move inner interval same
|
||||
start_date := date_trunc(selector, NEW.event_date + _interval);
|
||||
end_date := date_trunc(selector, NEW.event_date + _interval_next);
|
||||
-- RAISE NOTICE 'CREATE NEXT: %', table_name;
|
||||
-- create table
|
||||
EXECUTE format(REPLACE( -- end date
|
||||
REPLACE( -- start date
|
||||
REPLACE( -- compare date name
|
||||
REPLACE( -- base name (inherit)
|
||||
REPLACE( -- table name
|
||||
command_create_table,
|
||||
'{TABLE_NAME}',
|
||||
table_name
|
||||
),
|
||||
'{BASE_NAME}',
|
||||
base_table
|
||||
),
|
||||
'{COMPARE_DATE_NAME}',
|
||||
compare_date_name
|
||||
),
|
||||
'{START_DATE}',
|
||||
quote_literal(start_date)
|
||||
),
|
||||
'{END_DATE}',
|
||||
quote_literal(end_date)
|
||||
));
|
||||
-- create all indexes and triggers
|
||||
EXECUTE format(REPLACE(
|
||||
REPLACE(
|
||||
command_create_primary_key,
|
||||
'{TABLE_NAME}',
|
||||
table_name
|
||||
),
|
||||
'{BASE_TABLE}',
|
||||
base_table
|
||||
));
|
||||
-- FK constraints
|
||||
EXECUTE format(REPLACE(command_create_foreign_key_1, '{TABLE_NAME}', table_name));
|
||||
-- generic trigger
|
||||
EXECUTE format(REPLACE(command_create_trigger_1, '{TABLE_NAME}', table_name));
|
||||
END IF;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
RAISE NOTICE 'Failed to create next table: %', table_name;
|
||||
END;
|
||||
ELSE
|
||||
-- if outside valid date, insert into overflow
|
||||
INSERT INTO edit_log_overflow VALUES (NEW.*);
|
||||
END IF;
|
||||
RETURN NULL;
|
||||
-- insert try again
|
||||
EXECUTE 'INSERT INTO ' || quote_ident(table_name) || ' SELECT ($1).*' USING NEW;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
-- if this faled, throw it into the overflow table (so we don't loose anything)
|
||||
INSERT INTO edit_log_overflow VALUES (NEW.*);
|
||||
END;
|
||||
-- other errors, insert into overlow
|
||||
WHEN OTHERS THEN
|
||||
-- if this faled, throw it into the overflow table (so we don't loose anything)
|
||||
INSERT INTO edit_log_overflow VALUES (NEW.*);
|
||||
END;
|
||||
-- main insert run done, check if we have to create next months table
|
||||
BEGIN
|
||||
-- check if next month table exists
|
||||
table_name := base_table || '_' || to_char((SELECT NEW.event_date + _interval)::DATE, timeformat);
|
||||
-- RAISE NOTICE 'SEARCH NEXT: %', table_name;
|
||||
IF (SELECT to_regclass(table_name)) IS NULL THEN
|
||||
-- move inner interval same
|
||||
start_date := date_trunc(selector, NEW.event_date + _interval);
|
||||
end_date := date_trunc(selector, NEW.event_date + _interval_next);
|
||||
-- RAISE NOTICE 'CREATE NEXT: %', table_name;
|
||||
-- create table
|
||||
EXECUTE format(REPLACE( -- end date
|
||||
REPLACE( -- start date
|
||||
REPLACE( -- compare date name
|
||||
REPLACE( -- base name (inherit)
|
||||
REPLACE( -- table name
|
||||
command_create_table,
|
||||
'{TABLE_NAME}',
|
||||
table_name
|
||||
),
|
||||
'{BASE_NAME}',
|
||||
base_table
|
||||
),
|
||||
'{COMPARE_DATE_NAME}',
|
||||
compare_date_name
|
||||
),
|
||||
'{START_DATE}',
|
||||
quote_literal(start_date)
|
||||
),
|
||||
'{END_DATE}',
|
||||
quote_literal(end_date)
|
||||
));
|
||||
-- create all indexes and triggers
|
||||
EXECUTE format(REPLACE(
|
||||
REPLACE(
|
||||
command_create_primary_key,
|
||||
'{TABLE_NAME}',
|
||||
table_name
|
||||
),
|
||||
'{BASE_TABLE}',
|
||||
base_table
|
||||
));
|
||||
-- FK constraints
|
||||
EXECUTE format(REPLACE(command_create_foreign_key_1, '{TABLE_NAME}', table_name));
|
||||
-- generic trigger
|
||||
EXECUTE format(REPLACE(command_create_trigger_1, '{TABLE_NAME}', table_name));
|
||||
END IF;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
RAISE NOTICE 'Failed to create next table: %', table_name;
|
||||
END;
|
||||
ELSE
|
||||
-- if outside valid date, insert into overflow
|
||||
INSERT INTO edit_log_overflow VALUES (NEW.*);
|
||||
END IF;
|
||||
RETURN NULL;
|
||||
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,18 +1,20 @@
|
||||
-- create random string with length X
|
||||
|
||||
CREATE FUNCTION random_string(randomLength int)
|
||||
RETURNS text AS $$
|
||||
RETURNS text AS
|
||||
$$
|
||||
SELECT array_to_string(
|
||||
ARRAY(
|
||||
SELECT substring(
|
||||
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
|
||||
trunc(random() * 62)::int + 1,
|
||||
1
|
||||
)
|
||||
FROM generate_series(1, randomLength) AS gs(x)
|
||||
),
|
||||
''
|
||||
ARRAY(
|
||||
SELECT substring(
|
||||
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
|
||||
trunc(random() * 62)::int + 1,
|
||||
1
|
||||
)
|
||||
FROM generate_series(1, randomLength) AS gs(x)
|
||||
),
|
||||
''
|
||||
)
|
||||
$$ LANGUAGE SQL
|
||||
$$
|
||||
LANGUAGE SQL
|
||||
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
|
||||
|
||||
CREATE OR REPLACE FUNCTION set_edit_generic() RETURNS TRIGGER AS '
|
||||
DECLARE
|
||||
random_length INT = 12; -- that should be long enough
|
||||
BEGIN
|
||||
IF TG_OP = ''INSERT'' THEN
|
||||
NEW.date_created := ''now'';
|
||||
NEW.cuid := random_string(random_length);
|
||||
ELSIF TG_OP = ''UPDATE'' THEN
|
||||
NEW.date_updated := ''now'';
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
' LANGUAGE 'plpgsql';
|
||||
CREATE OR REPLACE FUNCTION set_edit_generic()
|
||||
RETURNS TRIGGER AS
|
||||
$$
|
||||
DECLARE
|
||||
random_length INT = 25; -- that should be long enough
|
||||
BEGIN
|
||||
IF TG_OP = 'INSERT' THEN
|
||||
NEW.date_created := 'now';
|
||||
NEW.cuid := random_string(random_length);
|
||||
ELSIF TG_OP = 'UPDATE' THEN
|
||||
NEW.date_updated := 'now';
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$
|
||||
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
|
||||
|
||||
CREATE OR REPLACE FUNCTION set_uid() RETURNS TRIGGER AS '
|
||||
DECLARE
|
||||
random_length INT = 32; -- that should be long enough
|
||||
BEGIN
|
||||
IF TG_OP = ''INSERT'' THEN
|
||||
NEW.uid := random_string(random_length);
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
' LANGUAGE 'plpgsql';
|
||||
CREATE OR REPLACE FUNCTION set_uid()
|
||||
RETURNS TRIGGER AS
|
||||
$$
|
||||
DECLARE
|
||||
random_length INT = 32; -- that should be long enough
|
||||
BEGIN
|
||||
IF TG_OP = 'INSERT' THEN
|
||||
NEW.uid := random_string(random_length);
|
||||
END IF;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE 'plpgsql';
|
||||
|
||||
@@ -2,15 +2,18 @@
|
||||
|
||||
-- OLD, DEPRECATED, use set_generic.sql
|
||||
|
||||
-- CREATE OR REPLACE FUNCTION set_generic() RETURNS TRIGGER AS '
|
||||
-- BEGIN
|
||||
-- IF TG_OP = ''INSERT'' THEN
|
||||
-- NEW.date_created := clock_timestamp();
|
||||
-- NEW.user_created := current_user;
|
||||
-- ELSIF TG_OP = ''UPDATE'' THEN
|
||||
-- NEW.date_updated := clock_timestamp();
|
||||
-- NEW.user_updated := current_user;
|
||||
-- END IF;
|
||||
-- RETURN NEW;
|
||||
-- END;
|
||||
-- ' LANGUAGE 'plpgsql';
|
||||
-- CREATE OR REPLACE FUNCTION set_generic()
|
||||
-- RETURNS TRIGGER AS
|
||||
-- $$
|
||||
-- BEGIN
|
||||
-- IF TG_OP = 'INSERT' THEN
|
||||
-- NEW.date_created := clock_timestamp();
|
||||
-- NEW.user_created := current_user;
|
||||
-- ELSIF TG_OP = 'UPDATE' THEN
|
||||
-- NEW.date_updated := clock_timestamp();
|
||||
-- NEW.user_updated := current_user;
|
||||
-- END IF;
|
||||
-- RETURN NEW;
|
||||
-- END;
|
||||
-- $$
|
||||
-- LANGUAGE 'plpgsql';
|
||||
|
||||
@@ -7,13 +7,13 @@
|
||||
|
||||
-- DROP TABLE edit_access;
|
||||
CREATE TABLE edit_access (
|
||||
edit_access_id SERIAL PRIMARY KEY,
|
||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||
protected SMALLINT DEFAULT 0,
|
||||
deleted SMALLINT DEFAULT 0,
|
||||
uid VARCHAR,
|
||||
name VARCHAR UNIQUE,
|
||||
description VARCHAR,
|
||||
color VARCHAR,
|
||||
additional_acl JSONB
|
||||
edit_access_id SERIAL PRIMARY KEY,
|
||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||
protected SMALLINT DEFAULT 0,
|
||||
deleted SMALLINT DEFAULT 0,
|
||||
uid VARCHAR,
|
||||
name VARCHAR UNIQUE,
|
||||
description VARCHAR,
|
||||
color VARCHAR,
|
||||
additional_acl JSONB
|
||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||
|
||||
@@ -7,10 +7,14 @@
|
||||
|
||||
-- DROP TABLE edit_access_data;
|
||||
CREATE TABLE edit_access_data (
|
||||
edit_access_data_id SERIAL PRIMARY KEY,
|
||||
edit_access_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||
name VARCHAR,
|
||||
value VARCHAR
|
||||
edit_access_data_id SERIAL PRIMARY KEY,
|
||||
edit_access_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||
name VARCHAR,
|
||||
value VARCHAR
|
||||
) 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);
|
||||
|
||||
@@ -8,9 +8,9 @@
|
||||
|
||||
-- DROP TABLE edit_access_right;
|
||||
CREATE TABLE edit_access_right (
|
||||
edit_access_right_id SERIAL PRIMARY KEY,
|
||||
name VARCHAR,
|
||||
level SMALLINT,
|
||||
type VARCHAR,
|
||||
UNIQUE (level,type)
|
||||
edit_access_right_id SERIAL PRIMARY KEY,
|
||||
name VARCHAR,
|
||||
level SMALLINT,
|
||||
type VARCHAR,
|
||||
UNIQUE (level,type)
|
||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||
|
||||
@@ -7,13 +7,13 @@
|
||||
|
||||
-- DROP TABLE edit_access_user;
|
||||
CREATE TABLE edit_access_user (
|
||||
edit_access_user_id SERIAL PRIMARY KEY,
|
||||
edit_access_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
edit_user_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
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,
|
||||
edit_default SMALLINT DEFAULT 0,
|
||||
enabled SMALLINT NOT NULL DEFAULT 0
|
||||
edit_access_user_id SERIAL PRIMARY KEY,
|
||||
edit_access_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
edit_user_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
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,
|
||||
edit_default SMALLINT DEFAULT 0,
|
||||
enabled SMALLINT NOT NULL DEFAULT 0
|
||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
-- DROP TABLE edit_generic;
|
||||
CREATE TABLE edit_generic (
|
||||
cuid VARCHAR,
|
||||
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
||||
date_updated TIMESTAMP WITHOUT TIME ZONE
|
||||
cuid VARCHAR,
|
||||
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
||||
date_updated TIMESTAMP WITHOUT TIME ZONE
|
||||
);
|
||||
|
||||
@@ -7,14 +7,14 @@
|
||||
|
||||
-- DROP TABLE edit_group;
|
||||
CREATE TABLE edit_group (
|
||||
edit_group_id SERIAL PRIMARY KEY,
|
||||
edit_scheme_id INT,
|
||||
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,
|
||||
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,
|
||||
deleted SMALLINT DEFAULT 0,
|
||||
uid VARCHAR,
|
||||
name VARCHAR,
|
||||
additional_acl JSONB
|
||||
edit_group_id SERIAL PRIMARY KEY,
|
||||
edit_scheme_id INT,
|
||||
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,
|
||||
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,
|
||||
deleted SMALLINT DEFAULT 0,
|
||||
uid VARCHAR,
|
||||
name VARCHAR,
|
||||
additional_acl JSONB
|
||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||
|
||||
@@ -8,11 +8,11 @@
|
||||
|
||||
-- DROP TABLE edit_language;
|
||||
CREATE TABLE edit_language (
|
||||
edit_language_id SERIAL PRIMARY KEY,
|
||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||
lang_default SMALLINT NOT NULL DEFAULT 0,
|
||||
long_name VARCHAR,
|
||||
short_name VARCHAR,
|
||||
iso_name VARCHAR,
|
||||
order_number INT
|
||||
edit_language_id SERIAL PRIMARY KEY,
|
||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||
lang_default SMALLINT NOT NULL DEFAULT 0,
|
||||
long_name VARCHAR,
|
||||
short_name VARCHAR, -- en_US, en or en_US@latin without encoding
|
||||
iso_name VARCHAR, -- should actually be encoding
|
||||
order_number INT
|
||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||
|
||||
@@ -7,35 +7,35 @@
|
||||
|
||||
-- DROP TABLE edit_log;
|
||||
CREATE TABLE edit_log (
|
||||
edit_log_id SERIAL PRIMARY KEY,
|
||||
euid INT, -- this is a foreign key, but I don't nedd to reference to it
|
||||
FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL,
|
||||
username VARCHAR,
|
||||
password VARCHAR,
|
||||
event_date TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||
ip VARCHAR,
|
||||
error TEXT,
|
||||
event TEXT,
|
||||
data_binary BYTEA,
|
||||
data TEXT,
|
||||
page VARCHAR,
|
||||
action VARCHAR,
|
||||
action_id VARCHAR,
|
||||
action_yes VARCHAR,
|
||||
action_flag VARCHAR,
|
||||
action_menu VARCHAR,
|
||||
action_loaded VARCHAR,
|
||||
action_value VARCHAR,
|
||||
action_type VARCHAR,
|
||||
action_error VARCHAR,
|
||||
user_agent VARCHAR,
|
||||
referer VARCHAR,
|
||||
script_name VARCHAR,
|
||||
query_string VARCHAR,
|
||||
server_name VARCHAR,
|
||||
http_host VARCHAR,
|
||||
http_accept VARCHAR,
|
||||
http_accept_charset VARCHAR,
|
||||
http_accept_encoding VARCHAR,
|
||||
session_id VARCHAR
|
||||
edit_log_id SERIAL PRIMARY KEY,
|
||||
euid INT, -- this is a foreign key, but I don't nedd to reference to it
|
||||
FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL,
|
||||
username VARCHAR,
|
||||
password VARCHAR,
|
||||
event_date TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||
ip VARCHAR,
|
||||
error TEXT,
|
||||
event TEXT,
|
||||
data_binary BYTEA,
|
||||
data TEXT,
|
||||
page VARCHAR,
|
||||
action VARCHAR,
|
||||
action_id VARCHAR,
|
||||
action_yes VARCHAR,
|
||||
action_flag VARCHAR,
|
||||
action_menu VARCHAR,
|
||||
action_loaded VARCHAR,
|
||||
action_value VARCHAR,
|
||||
action_type VARCHAR,
|
||||
action_error VARCHAR,
|
||||
user_agent VARCHAR,
|
||||
referer VARCHAR,
|
||||
script_name VARCHAR,
|
||||
query_string VARCHAR,
|
||||
server_name VARCHAR,
|
||||
http_host VARCHAR,
|
||||
http_accept VARCHAR,
|
||||
http_accept_charset VARCHAR,
|
||||
http_accept_encoding VARCHAR,
|
||||
session_id VARCHAR
|
||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||
|
||||
@@ -7,10 +7,10 @@
|
||||
|
||||
-- DROP TABLE edit_menu_group;
|
||||
CREATE TABLE edit_menu_group (
|
||||
edit_menu_group_id SERIAL PRIMARY KEY,
|
||||
name VARCHAR,
|
||||
flag VARCHAR,
|
||||
order_number INT NOT NULL
|
||||
edit_menu_group_id SERIAL PRIMARY KEY,
|
||||
name VARCHAR,
|
||||
flag VARCHAR,
|
||||
order_number INT NOT NULL
|
||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||
|
||||
|
||||
|
||||
@@ -7,16 +7,16 @@
|
||||
|
||||
-- DROP TABLE edit_page;
|
||||
CREATE TABLE edit_page (
|
||||
edit_page_id SERIAL PRIMARY KEY,
|
||||
content_alias_edit_page_id INT, -- alias for page content, if the page content is defined on a different page, ege for ajax backend pages
|
||||
FOREIGN KEY (content_alias_edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||
filename VARCHAR,
|
||||
name VARCHAR UNIQUE,
|
||||
order_number INT NOT NULL,
|
||||
online SMALLINT NOT NULL DEFAULT 0,
|
||||
menu SMALLINT NOT NULL DEFAULT 0,
|
||||
popup SMALLINT NOT NULL DEFAULT 0,
|
||||
popup_x SMALLINT,
|
||||
popup_y SMALLINT,
|
||||
hostname VARCHAR
|
||||
edit_page_id SERIAL PRIMARY KEY,
|
||||
content_alias_edit_page_id INT, -- alias for page content, if the page content is defined on a different page, ege for ajax backend pages
|
||||
FOREIGN KEY (content_alias_edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE,
|
||||
filename VARCHAR,
|
||||
name VARCHAR UNIQUE,
|
||||
order_number INT NOT NULL,
|
||||
online SMALLINT NOT NULL DEFAULT 0,
|
||||
menu SMALLINT NOT NULL DEFAULT 0,
|
||||
popup SMALLINT NOT NULL DEFAULT 0,
|
||||
popup_x SMALLINT,
|
||||
popup_y SMALLINT,
|
||||
hostname VARCHAR
|
||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||
|
||||
@@ -7,14 +7,14 @@
|
||||
|
||||
-- DROP TABLE edit_page_access;
|
||||
CREATE TABLE edit_page_access (
|
||||
edit_page_access_id SERIAL PRIMARY KEY,
|
||||
edit_group_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
edit_page_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
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,
|
||||
enabled SMALLINT NOT NULL DEFAULT 0
|
||||
edit_page_access_id SERIAL PRIMARY KEY,
|
||||
edit_group_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
edit_page_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
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,
|
||||
enabled SMALLINT NOT NULL DEFAULT 0
|
||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||
|
||||
|
||||
|
||||
@@ -8,13 +8,13 @@
|
||||
|
||||
-- DROP TABLE edit_page_content;
|
||||
CREATE TABLE edit_page_content (
|
||||
edit_page_content_id SERIAL PRIMARY KEY,
|
||||
edit_page_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
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,
|
||||
uid VARCHAR UNIQUE,
|
||||
name VARCHAR,
|
||||
order_number INT NOT NULL,
|
||||
online SMALLINT NOT NULL DEFAULT 0
|
||||
edit_page_content_id SERIAL PRIMARY KEY,
|
||||
edit_page_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
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,
|
||||
uid VARCHAR UNIQUE,
|
||||
name VARCHAR,
|
||||
order_number INT NOT NULL,
|
||||
online SMALLINT NOT NULL DEFAULT 0
|
||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
|
||||
-- DROP TABLE edit_page_menu_group;
|
||||
CREATE TABLE edit_page_menu_group (
|
||||
edit_page_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
edit_menu_group_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_menu_group_id) REFERENCES edit_menu_group (edit_menu_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
||||
edit_page_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
edit_menu_group_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_menu_group_id) REFERENCES edit_menu_group (edit_menu_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
|
||||
-- DROP TABLE edit_page_visible_group;
|
||||
CREATE TABLE edit_page_visible_group (
|
||||
edit_page_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
edit_visible_group_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_visible_group_id) REFERENCES edit_visible_group (edit_visible_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
||||
edit_page_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
edit_visible_group_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_visible_group_id) REFERENCES edit_visible_group (edit_visible_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
|
||||
-- DROP TABLE edit_query_string;
|
||||
CREATE TABLE edit_query_string (
|
||||
edit_query_string_id SERIAL PRIMARY KEY,
|
||||
edit_page_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||
name VARCHAR,
|
||||
value VARCHAR,
|
||||
dynamic SMALLINT NOT NULL DEFAULT 0
|
||||
edit_query_string_id SERIAL PRIMARY KEY,
|
||||
edit_page_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||
name VARCHAR,
|
||||
value VARCHAR,
|
||||
dynamic SMALLINT NOT NULL DEFAULT 0
|
||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||
|
||||
@@ -7,10 +7,10 @@
|
||||
|
||||
-- DROP TABLE edit_scheme;
|
||||
CREATE TABLE edit_scheme (
|
||||
edit_scheme_id SERIAL PRIMARY KEY,
|
||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||
name VARCHAR,
|
||||
header_color VARCHAR,
|
||||
css_file VARCHAR,
|
||||
template VARCHAR
|
||||
edit_scheme_id SERIAL PRIMARY KEY,
|
||||
enabled SMALLINT NOT NULL DEFAULT 0,
|
||||
name VARCHAR,
|
||||
header_color VARCHAR,
|
||||
css_file VARCHAR,
|
||||
template VARCHAR
|
||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||
|
||||
@@ -7,6 +7,6 @@
|
||||
|
||||
-- DROP TABLE temp_files;
|
||||
CREATE TABLE temp_files (
|
||||
filename VARCHAR,
|
||||
folder VARCHAR
|
||||
filename VARCHAR,
|
||||
folder VARCHAR
|
||||
);
|
||||
|
||||
@@ -7,42 +7,93 @@
|
||||
|
||||
-- DROP TABLE edit_user;
|
||||
CREATE TABLE edit_user (
|
||||
edit_user_id SERIAL PRIMARY KEY,
|
||||
connect_edit_user_id INT, -- possible reference to other user
|
||||
FOREIGN KEY (connect_edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
edit_language_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_language_id) REFERENCES edit_language (edit_language_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
edit_group_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
edit_scheme_id INT,
|
||||
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,
|
||||
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,
|
||||
deleted SMALLINT NOT NULL DEFAULT 0,
|
||||
username VARCHAR UNIQUE,
|
||||
password VARCHAR,
|
||||
first_name VARCHAR,
|
||||
last_name VARCHAR,
|
||||
first_name_furigana VARCHAR,
|
||||
last_name_furigana VARCHAR,
|
||||
debug SMALLINT NOT NULL DEFAULT 0,
|
||||
db_debug SMALLINT NOT NULL DEFAULT 0,
|
||||
email VARCHAR,
|
||||
protected SMALLINT NOT NULL DEFAULT 0,
|
||||
admin SMALLINT NOT NULL DEFAULT 0,
|
||||
last_login TIMESTAMP WITHOUT TIME ZONE,
|
||||
login_error_count INT DEFAULT 0,
|
||||
login_error_date_last TIMESTAMP WITHOUT TIME ZONE,
|
||||
login_error_date_first TIMESTAMP WITHOUT TIME ZONE,
|
||||
strict SMALLINT DEFAULT 0,
|
||||
locked SMALLINT DEFAULT 0,
|
||||
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_reset_time TIMESTAMP WITHOUT TIME ZONE, -- when the password reset was requested
|
||||
password_reset_uid VARCHAR, -- the uid to access the password reset page
|
||||
additional_acl JSONB -- additional ACL as JSON string (can be set by other pages)
|
||||
edit_user_id SERIAL PRIMARY KEY,
|
||||
connect_edit_user_id INT, -- possible reference to other user
|
||||
FOREIGN KEY (connect_edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
edit_language_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_language_id) REFERENCES edit_language (edit_language_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
edit_group_id INT NOT NULL,
|
||||
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
edit_scheme_id INT,
|
||||
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,
|
||||
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
-- username/password
|
||||
username VARCHAR UNIQUE,
|
||||
password VARCHAR,
|
||||
-- name block
|
||||
first_name VARCHAR,
|
||||
last_name VARCHAR,
|
||||
first_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,
|
||||
db_debug SMALLINT NOT NULL DEFAULT 0,
|
||||
-- is admin user
|
||||
admin SMALLINT NOT NULL DEFAULT 0,
|
||||
-- last login log
|
||||
last_login TIMESTAMP WITHOUT TIME ZONE,
|
||||
-- login error
|
||||
login_error_count INT DEFAULT 0,
|
||||
login_error_date_last TIMESTAMP WITHOUT TIME ZONE,
|
||||
login_error_date_first TIMESTAMP WITHOUT TIME ZONE,
|
||||
-- time locked
|
||||
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_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_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)
|
||||
) 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_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';
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
-- DROP TABLE edit_visible_group;
|
||||
CREATE TABLE edit_visible_group (
|
||||
edit_visible_group_id SERIAL PRIMARY KEY,
|
||||
name VARCHAR,
|
||||
flag VARCHAR
|
||||
edit_visible_group_id SERIAL PRIMARY KEY,
|
||||
name VARCHAR,
|
||||
flag VARCHAR
|
||||
) INHERITS (edit_generic) WITHOUT OIDS;
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
-- AUTHOR: Clemens Schwaighofer
|
||||
-- DATE: 2005/07/05
|
||||
-- DESCRIPTION:
|
||||
-- cms tables; generic basic table
|
||||
-- generic basic table with date and uid column
|
||||
-- TABLE: generic
|
||||
-- HISTORY:
|
||||
|
||||
-- DROP TABLE edit_generic;
|
||||
-- DROP TABLE generic;
|
||||
CREATE TABLE generic (
|
||||
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
||||
date_updated TIMESTAMP WITHOUT TIME ZONE
|
||||
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_access
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_access
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_access_data
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_access_right
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_access_user
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_group
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_group
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_language
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_log
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_log
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_log_overflow
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_menu_group
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_page
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_page_access
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_page_content
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_query_string
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_scheme
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_user
|
||||
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
|
||||
BEFORE INSERT OR UPDATE ON edit_visible_group
|
||||
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
<?php
|
||||
|
||||
// config.php reads auto loader and uses CoreLibs version of this
|
||||
// DEPRECATED for here
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* parses .env file
|
||||
*
|
||||
@@ -20,9 +25,15 @@
|
||||
* 1 for file loadable, but no data inside
|
||||
* 2 for file not readable
|
||||
* 3 for file not found
|
||||
* @deprecated V6 Use \CoreLibs\Get\DotEnv::readEnvFile()
|
||||
*/
|
||||
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;
|
||||
$status = -1;
|
||||
$env_file_target = $path . DIRECTORY_SEPARATOR . $env_file;
|
||||
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
|
||||
# CREATED: 2005/08/09
|
||||
# SHORT DESCRIPTION:
|
||||
# Backned English Messages file for gettext
|
||||
# to craete: msgfmt -o ja.mo messages_en.po
|
||||
# HISTORY:
|
||||
# Frontend English Messages file for gettext
|
||||
# ********************************************************************/
|
||||
|
||||
msgid ""
|
||||
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"
|
||||
"POT-Creation-Date: 2018-03-28 10:40+0900\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: en\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "Year"
|
||||
msgstr "Year"
|
||||
|
||||
msgid "Month"
|
||||
msgstr "Month"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
|
||||
msgid "INPUT TEST"
|
||||
msgstr "OUTPUT TEST EN"
|
||||
msgstr "OUTPUT TEST FRONTEND EN"
|
||||
|
||||
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 "single"
|
||||
msgid_plural "multi"
|
||||
msgstr[0] "Multi frontend en 0"
|
||||
msgstr[1] "Multi frontend en 1"
|
||||
msgstr[2] "Multi frontend en 2"
|
||||
@@ -2,22 +2,22 @@
|
||||
# AUTHOR: Clemens Schwaighofer
|
||||
# CREATED: 2018/03/28
|
||||
# SHORT DESCRIPTION:
|
||||
# Backend Japanese Messages file for gettext
|
||||
# to craete: msgfmt -o ja.mo messages_ja.po
|
||||
# HISTORY:
|
||||
# Backend Japanese Messages file for gettext>
|
||||
# ********************************************************************/
|
||||
|
||||
msgid ""
|
||||
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"
|
||||
"POT-Creation-Date: 2018-03-28 10:40+0900\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: ja\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\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"
|
||||
msgstr "はい"
|
||||
@@ -63,7 +63,25 @@ msgid "Sun"
|
||||
msgstr "日"
|
||||
|
||||
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
|
||||
msgid "Hello %s"
|
||||
@@ -75,3 +93,5 @@ msgstr "「スマーティー」これは正しいです"
|
||||
msgid "Are we translated?"
|
||||
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
|
||||
path=$(pwd)"/"$0;
|
||||
@@ -10,6 +10,11 @@ TARGET_HOST_WEB="<user>@<host>";
|
||||
TMP_DIR=$LOCAL_BASE_DIR"/4dev/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/
|
||||
|
||||
@@ -18,6 +23,7 @@ rm -f $tmpf_web;
|
||||
echo ".*.swp" >> $tmpf_web;
|
||||
echo "._*" >> $tmpf_web;
|
||||
echo ".DS_Store" >> $tmpf_web;
|
||||
echo ".user.ini" >> $tmpf_web;
|
||||
echo ".svn" >> $tmpf_web;
|
||||
echo ".svnignore" >> $tmpf_web;
|
||||
echo ".git" >> $tmpf_web;
|
||||
|
||||
40
4dev/tests/AAASetupData/CoreLibsAAASetupDataTest.php
Normal file
40
4dev/tests/AAASetupData/CoreLibsAAASetupDataTest.php
Normal file
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace tests;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* Test base setup
|
||||
* @testdox AAASetupData\AAASetupDataTest just setup BASE
|
||||
*/
|
||||
final class CoreLibsAAASetupDataTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* Covers nothing
|
||||
*
|
||||
* @testdox Just setup BASE
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testSetupData(): void
|
||||
{
|
||||
if (!defined('BASE')) {
|
||||
define(
|
||||
'BASE',
|
||||
str_replace('/configs', '', __DIR__)
|
||||
. DIRECTORY_SEPARATOR
|
||||
);
|
||||
}
|
||||
$this->assertEquals(
|
||||
str_replace('/configs', '', __DIR__)
|
||||
. DIRECTORY_SEPARATOR,
|
||||
BASE,
|
||||
'BASE Path set check'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// __END__
|
||||
1
4dev/tests/AAASetupData/includes
Symbolic link
1
4dev/tests/AAASetupData/includes
Symbolic link
@@ -0,0 +1 @@
|
||||
../Language/includes/
|
||||
1
4dev/tests/AAASetupData/log
Symbolic link
1
4dev/tests/AAASetupData/log
Symbolic link
@@ -0,0 +1 @@
|
||||
../Debug/log/
|
||||
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__
|
||||
@@ -8,7 +8,8 @@ use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* Undocumented class
|
||||
* @testdox CoreLibs\Check\Email method tests
|
||||
* @coversDefaultClass \CoreLibs\Check\Email
|
||||
* @testdox \CoreLibs\Check\Email method tests
|
||||
*/
|
||||
final class CoreLibsCheckEmailTest extends TestCase
|
||||
{
|
||||
@@ -40,8 +41,9 @@ final class CoreLibsCheckEmailTest extends TestCase
|
||||
/**
|
||||
* Test regex level return
|
||||
*
|
||||
* @covers ::getEmailRegex
|
||||
* @dataProvider emailRegexProvider
|
||||
* @testdox Email::getEmailRegex $input will be $expected [$_dataName]
|
||||
* @testdox getEmailRegex $input will be $expected [$_dataName]
|
||||
*
|
||||
* @param int $input
|
||||
* @param string $expected
|
||||
@@ -93,8 +95,9 @@ final class CoreLibsCheckEmailTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::checkEmail
|
||||
* @dataProvider emailCheckProvider
|
||||
* @testdox Email::checkEmail $input will be $expected [$_dataName]
|
||||
* @testdox checkEmail $input will be $expected [$_dataName]
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
@@ -124,8 +127,9 @@ final class CoreLibsCheckEmailTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::checkEmailFull
|
||||
* @dataProvider emailCheckFullProvider
|
||||
* @testdox Email::checkEmailFull $input will be $expected [$_dataName]
|
||||
* @testdox checkEmailFull $input will be $expected [$_dataName]
|
||||
*
|
||||
* @param string $input
|
||||
* @param array $expected
|
||||
@@ -218,8 +222,9 @@ final class CoreLibsCheckEmailTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::getEmailRegexErrorMessage
|
||||
* @dataProvider emailRegexErrorProvider
|
||||
* @testdox Email::getEmailRegexErrorMessage $input will be $expected [$_dataName]
|
||||
* @testdox getEmailRegexErrorMessage $input will be $expected [$_dataName]
|
||||
*
|
||||
* @param integer $input
|
||||
* @param array $expected
|
||||
@@ -282,8 +287,9 @@ final class CoreLibsCheckEmailTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::getEmailType
|
||||
* @dataProvider emailTypeProviderLong
|
||||
* @testdox Email::getEmailType $input will be normal $expected [$_dataName]
|
||||
* @testdox getEmailType $input will be normal $expected [$_dataName]
|
||||
*
|
||||
* @param string $input
|
||||
* @param string $expected
|
||||
@@ -300,8 +306,9 @@ final class CoreLibsCheckEmailTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::getEmailType
|
||||
* @dataProvider emailTypeProviderShort
|
||||
* @testdox Email::getEmailType $input will be short $expected [$_dataName]
|
||||
* @testdox getEmailType $input will be short $expected [$_dataName]
|
||||
*
|
||||
* @param string $input
|
||||
* @param string $expected
|
||||
@@ -354,8 +361,9 @@ final class CoreLibsCheckEmailTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::getShortEmailType
|
||||
* @dataProvider emailProviderTypeLongToShort
|
||||
* @testdox Email::getShortEmailType $input will be $expected [$_dataName]
|
||||
* @testdox getShortEmailType $input will be $expected [$_dataName]
|
||||
*
|
||||
* @param string $input
|
||||
* @param string|bool $expected
|
||||
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__
|
||||
@@ -8,7 +8,8 @@ use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* Undocumented class
|
||||
* @testdox CoreLibs\Convert\Math method tests
|
||||
* @coversDefaultClass \CoreLibs\Convert\Math
|
||||
* @testdox \CoreLibs\Convert\Math method tests
|
||||
*/
|
||||
final class CoreLibsConvertMathTest extends TestCase
|
||||
{
|
||||
@@ -29,8 +30,9 @@ final class CoreLibsConvertMathTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::fceil
|
||||
* @dataProvider fceilProvider
|
||||
* @testdox Math::fceil: Input $input must be $expected
|
||||
* @testdox fceil: Input $input must be $expected
|
||||
*
|
||||
* @param float $input
|
||||
* @param int $expected
|
||||
@@ -60,8 +62,9 @@ final class CoreLibsConvertMathTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::floorp
|
||||
* @dataProvider floorProvider
|
||||
* @testdox Math::floor: Input $input with cutoff $cutoff must be $expected
|
||||
* @testdox floor: Input $input with cutoff $cutoff must be $expected
|
||||
*
|
||||
* @param int $input
|
||||
* @param int $cutoff
|
||||
@@ -94,8 +97,9 @@ final class CoreLibsConvertMathTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::initNumeric
|
||||
* @dataProvider initNumericProvider
|
||||
* @testdox Math::initNumeric: Input $info $input must match $expected [$_dataName]
|
||||
* @testdox initNumeric: Input $info $input must match $expected [$_dataName]
|
||||
*
|
||||
* @param int|float|string $input
|
||||
* @param float $expected
|
||||
@@ -109,26 +113,6 @@ final class CoreLibsConvertMathTest extends TestCase
|
||||
\CoreLibs\Convert\Math::initNumeric($input)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* A testWith sample
|
||||
*
|
||||
* @testdox Math::initNumeric: alternate tests $input => $expected ($info) [$_dataName]
|
||||
* @testWith [123.123, 123.123, "float"]
|
||||
* ["123.123", 123.123, "string"]
|
||||
*
|
||||
* @param int|float|string $input
|
||||
* @param float $expected
|
||||
* @param string $info
|
||||
* @return void
|
||||
*/
|
||||
public function testMathInitNumericValueAlt($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__
|
||||
@@ -1,89 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace tests;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
/**
|
||||
* Undocumented class
|
||||
* @testdox CoreLibs\Check\File method tests
|
||||
*/
|
||||
final class CoreLibsCheckFileTest extends TestCase
|
||||
{
|
||||
/** @var array<mixed> */
|
||||
private $files = [];
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
// write a dummy files for testing
|
||||
}
|
||||
|
||||
protected function tearDown(): void
|
||||
{
|
||||
// unlink files
|
||||
}
|
||||
|
||||
/**
|
||||
* main file list + data provider
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function filesList(): array
|
||||
{
|
||||
return [
|
||||
['filename.txt', 'txt', 5]
|
||||
];
|
||||
}
|
||||
|
||||
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
|
||||
*
|
||||
* @#dataProvider filesExtensionProvider
|
||||
* @#testdox File::getFilenameEnding Input $input must be $expected
|
||||
* //string $input, string $expected
|
||||
*
|
||||
* @param string $input
|
||||
* @param string $expected
|
||||
* @return void
|
||||
*/
|
||||
public function testGetFilenameEnding(): void
|
||||
{
|
||||
// getFilenameEnding
|
||||
/* $this->assertEquals(
|
||||
$expected,
|
||||
\CoreLibs\Check\File::getFilenameEnding($input)
|
||||
); */
|
||||
$this->assertTrue(true, 'This should already work.');
|
||||
$this->markTestIncomplete(
|
||||
'testGetFilenameEnding has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
* // string $input, string $expected
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testGetLinesFromFile(): void
|
||||
{
|
||||
// getLinesFromFile
|
||||
$this->assertTrue(true, 'This should already work.');
|
||||
$this->markTestIncomplete(
|
||||
'testGetLinesFromFile has not been implemented yet.'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// __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__
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user