Compare commits

..

4 Commits

Author SHA1 Message Date
dbabd89491 Backport Login changes
Password change backport
2018-05-09 15:11:06 +09:00
9842c979b6 Backport of missing password changes for Login class
move password check into method.
do proper check for password change.
remove all password log/error outputs. ever.
2018-05-09 12:26:01 +09:00
85a327f45f Backport new password interface to legacy classes 2018-05-09 11:47:16 +09:00
7b085f86f0 Change to <?php for core core classes
Basic/DB IO/db_pgsql switch only
2018-04-17 10:05:41 +09:00
3172 changed files with 69274 additions and 273763 deletions

View File

@@ -1,29 +0,0 @@
# PHP XDEBUG SETTINGS
# php_value xdebug.profiler_output_dir xdebug/
# php_value xdebug.profiler_output_name timestamp
# php_value xdebug.profiler_enable 1
php_value xdebug.collect_params 2
php_value xdebug.collect_vars 0
php_value xdebug.show_local_vars 0
#php_value xdebug.dump_globals 0
# allowed COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION
#php_value xdebug.dump.GET *
# PHP ERROR SETTINGS
php_flag short_open_tag off
php_flag display_startup_errors on
php_flag display_errors on
php_flag html_errors on
php_flag log_errors on
php_flag ignore_repeated_errors off
php_flag ignore_repeated_source off
php_flag report_memleaks on
php_flag track_errors on
php_value docref_root 0
php_value docref_ext 0
# Turn this on to redirect log to different folder
#php_value error_log /var/www/html/developers/clemens/php/php-error/php-errors.log
# this is E_ALL reporting ON
php_value error_reporting -1
# this is E_ALL | ~E_NOTICE
#php_value error_reporting 2039
php_value log_errors_max_len 0

View File

@@ -1,141 +0,0 @@
<?php
/**
* This configuration will be read and overlaid on top of the
* default configuration. Command line arguments will be applied
* after this file is read.
*
* @see src/Phan/Config.php
* See Config for all configurable options.
*
* A Note About Paths
* ==================
*
* Files referenced from this file should be defined as
*
* ```
* Config::projectPath('relative_path/to/file')
* ```
*
* where the relative path is relative to the root of the
* project which is defined as either the working directory
* of the phan executable or a path passed in via the CLI
* '-d' flag.
*/
use Phan\Config;
return [
// 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.
"allow_missing_properties" => false,
// Allow null to be cast as any type and for any
// type to be cast to null.
"null_casts_as_any_type" => false,
// Backwards Compatibility Checking
'backward_compatibility_checks' => false,
// Run a quick version of checks that takes less
// time
"quick_mode" => false,
// Only emit critical issues to start with
// (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" => [
'.', '../configs/'
],
'ignore_undeclared_variables_in_global_scope' => true,
"file_list" => [
"./www/configs/config.db.php",
"./www/configs/config.host.php",
"./www/configs/config.path.php",
"./www/configs/config.other.php",
"./www/configs/config.master.php",
"./www/includes/admin_header.php",
],
// A list of directories that should be parsed for class and
// method information. After excluding the directories
// defined in exclude_analysis_directory_list, the remaining
// files will be statically analyzed for errors.
//
// Thus, both first-party and third-party code being used by
// your application should be included in this list.
'directory_list' => [
// Change this to include the folders you wish to analyze
// (and the folders of their dependencies)
'www',
// To speed up analysis, we recommend going back later and
// limiting this to only the vendor/ subdirectories your
// project depends on.
// `phan --init` will generate a list of folders for you
//'www/vendor',
],
// A list of directories holding code that we want
// to parse, but not analyze
"exclude_analysis_directory_list" => [
'www/vendor',
'www/tests',
'www/lib/Smarty',
'www/lib/smarty-4.1.0',
'www/templates_c',
'www/log',
'www/tmp',
'www/cache',
'www/media',
],
'exclude_file_list' => [
// ignore all symlink files to edit
'www/admin/edit_access.php',
'www/admin/edit_groups.php',
'www/admin/edit_languages.php',
'www/admin/edit_menu_group.php',
'www/admin/edit_order.php',
'www/admin/edit_pages.php',
'www/admin/edit_schemes.php',
'www/admin/edit_users.php',
'www/admin/edit_visible_group.php',
// ignore the old qq tests
'www/admin/qq_file_upload_front.php',
'www/admin/qq_file_upload_ajax.php',
// symlink ignore
'www/lib/smarty-4.1.0/libs/Smarty.class.php'
],
// what not to show as problem
'suppress_issue_types' => [
// 'PhanUndeclaredMethod',
'PhanEmptyFile',
// ignore unreferences public methods, etc here (for dead code check)
'PhanUnreferencedPublicMethod',
'PhanUnreferencedClass',
'PhanWriteOnlyPublicProperty',
'PhanUnreferencedConstant',
'PhanWriteOnlyPublicProperty',
'PhanReadOnlyPublicProperty'
],
// Override to hardcode existence and types of (non-builtin) globals in the global scope.
// Class names should be prefixed with `\`.
//
// (E.g. `['_FOO' => '\FooClass', 'page' => '\PageClass', 'userId' => 'int']`)
'globals_type_map' => [],
];

File diff suppressed because one or more lines are too long

View File

@@ -1,3 +0,0 @@
base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
# must be run in ${base}www/
phan --progress-bar -C --analyze-twice

View File

@@ -1,3 +0,0 @@
base="/storage/var/www/html/developers/clemens/core_data/php_libraries/trunk/";
# must be run in ${base}www/
phpstan

View File

@@ -1,4 +0,0 @@
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/

View File

@@ -1,27 +0,0 @@
Install composer:
# old
curl -sS https://getcomposer.org/installer | /usr/local/php-8.0-httpd-2.4/bin/php
# new (4 steps) https://getcomposer.org/download/
/usr/local/php-8.0-httpd-2.4/bin/php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
/usr/local/php-8.0-httpd-2.4/bin/php -r "if (hash_file('sha384', 'composer-setup.php') === '906a84df04cea2aa72f40b5f787e49f22d4c2f19492ac310e8cba5b96ac8b64115ac402c8cd292b8a03482574915d1a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
/usr/local/php-8.0-httpd-2.4/bin/php composer-setup.php
/usr/local/php-8.0-httpd-2.4/bin/php -r "unlink('composer-setup.php');
Update composer phar file
/usr/local/php-8.0-httpd-2.4/bin/php composer.phar selfupdate
Install something:
/usr/local/php-8.0-httpd-2.4/bin/php composer.phar require something/something
Update all installed:
/usr/local/php-8.0-httpd-2.4/bin/php composer.phar update
Or update only one package:
/usr/local/php-8.0-httpd-2.4/bin/php composer.phar something/something
Install AWS SDK:
/usr/local/php-8.0-httpd-2.4/bin/php -d memory_limit=-1 composer.phar require aws/aws-sdk-php
Install zipStream:
/usr/local/php-8.0-httpd-2.4/bin/php composer.phar require maennchen/zipstream-php

View File

@@ -1,10 +1,5 @@
# 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_log_partition_insert.sql
function/update_function.sql
# generic tables
table/edit_temp_files.sql
table/edit_generic.sql
@@ -19,29 +14,22 @@ table/edit_scheme.sql
table/edit_language.sql
table/edit_group.sql
table/edit_page_access.sql
table/edit_page_content.sql
table/edit_user.sql
table/edit_log.sql
table/edit_log_overflow.sql
table/edit_access.sql
table/edit_access_user.sql
table/edit_access_data.sql
# all triggers (after all tables have been created)
trigger/trg_edit_access_right.sql
trigger/trg_edit_access.sql
trigger/trg_edit_access_data.sql
trigger/trg_edit_access_user.sql
trigger/trg_edit_generic.sql
trigger/trg_edit_group.sql
trigger/trg_edit_language.sql
trigger/trg_edit_log_overflow.sql
trigger/trg_edit_log.sql
trigger/trg_edit_page_access.sql
trigger/trg_edit_page_content.sql
trigger/trg_edit_page.sql
trigger/trg_edit_query_string.sql
trigger/trg_edit_scheme.sql
trigger/trg_edit_user.sql
trigger/trg_edit_visible_group.sql
trigger/trg_edit_menu_group.sql
# insert data
data/edit_tables.sql

View File

@@ -15,20 +15,22 @@ function_name="set_generic";
#sql_path_prep=`echo $sql_path | sed -e "s/\///g"`;
# goes for each file and strips headers and endings, and creates trigger name
for name in $sql_path*; do
for name in $sql_path*;
do
echo "Wokring on $name";
# strip ending
# t_name=`echo $name | sed -e 's/.sql$//g' | sed -e "s/^$sql_path_prep//g" | sed -e 's/\///g'`;
t_name=`echo $name | sed -e 's/^.*\///g' | sed -e 's/.sql$//g'`;
# clean all beginnings
for prefix in $file_prefix; do
for prefix in $file_prefix;
do
prefix=$prefix"_";
t_name=`echo $t_name | sed -e "s/\$prefix//g"`;
done;
# those tables don't need a trigger
# edit_generic
# generic
# those tables don't need a trigger
# edit_generic
# generic
# copy the trigger template to the target
trg_filename=$trigger_path$trigger_prefix"_"$t_name".sql";

View File

@@ -14,14 +14,17 @@ file_prefix="trg";
trigger_prefix="trg";
index_prefix="idx";
for file in `cat ORDER`; do
if [ -f $file ]; then
for file in `cat ORDER`;
do
if [ -f $file ];
then
# write them into a var, so we can re order them in the other way
new_order=$file" "$new_order;
fi;
done;
for file in $new_order; do
for file in $new_order;
do
sqltype=`echo $file | egrep "table/"`;
trgtype=`echo $file | egrep "trigger/"`;
idxtype=`echo $file | egrep "index/"`;
@@ -29,34 +32,43 @@ for file in $new_order; do
datatype=`echo $file | egrep "data/"`;
# remove all around to get table name
t_file=`echo $file | sed -e 's/^.*\///g' | sed -e 's/.sql$//g'`;
for prefix in $file_prefix; do
for prefix in $file_prefix;
do
prefix=$prefix"_";
t_file=`echo $t_file | sed -e "s/\$prefix//g"`;
done;
# copy the trigger template to the target
for path in $schemas; do
if [ $sqltype ]; then
for path in $schema;
do
if [ $sqltype ];
then
echo "SQL "$path"."$t_file;
echo "DROP TABLE "$path"."$t_file" CASCADE;" | psql -U $user -h $host $db
fi;
if [ $trgtype ]; then
if [ $trgtype ];
then
trigger=$trigger_prefix"_"$t_file;
echo "TRG $trigger TBL "$path".$t_file";
echo "DROP TRIGGER "$path".$trigger ON "$t_file" CASCADE;" | psql -U $user -h $host $db
fi;
if [ $fcttype ]; then
if [ $fcttype ];
then
echo "FCT "$path"."$t_file;
echo "DROP FUNCTION "$path"."$t_file"();" | psql -U $user -h $host $db
fi;
if [ $idxtype ]; then
if [ $idxtype ];
then
index=$index_prefix"_"$t_file;
# echo "IDX "$t_file;
# echo "DROP INDEX $index ON $t_file;" | psql -U $user -h $host $db
# echo "IDX "$t_file;
# echo "DROP INDEX $index ON $t_file;" | psql -U $user -h $host $db
fi;
if [ $datatype ]; then
if [ $datatype ];
then
echo "DATA "$t_file;
# echo "DROP FUNCTION "$t_file"();" | psql -U $user -h $host $db
# echo "DROP FUNCTION "$t_file"();" | psql -U $user -h $host $db
fi;
# psql -U cms_user -h 192.168.12.14 -f $file CMSv2
done;
done;

View File

@@ -5,63 +5,19 @@
#echo "EXIT";
#exit;
# if flagged 'y' then it will ask after each import to continue
development='y';
test='n';
input='';
# database connection info
db='<db name>';
host='<db host>';
user='<db user>';
schema="public";
export PGPASSWORD='';
#schema="publicv";
# log files
error_file="log/error";
output_file="log/output";
if [ ! -f ORDER ]; then
echo "Could not find ORDER file";
exit;
fi;
if [ "$test" != "n" ]; then
echo "TESTING MODE, NO DATA WILL BE IMPORTED";
fi;
if [ "$development" = "y" ]; then
echo "STEP BY STEP IMPORT MODE ACTIVATED";
fi;
while read file <&3; do
if [ "$file" = "FINISHED" ]; then
echo "Database data is flagged as FINISHED in ORDER file";
exit;
for file in `cat ORDER`;
do
if [ -f $file ];
then
# for path in $schema;
# do
# echo "WORK ON "$schema"."$file;
psql -U $user -h $host -f $file $db 1>> output 2>> error
# done;
fi;
if [ -f "$file" ]; then
for path in "$schemas"; do
echo "[+] WORK ON '${file}' @ '${path}'";
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};
fi;
fi;
done;
input='';
done;
elif [[ ${file::1} != "#" ]]; then
echo "[!] COULD NOT FIND FILE: '${file}'";
fi;
done 3<ORDER;
done;

View File

@@ -1,149 +0,0 @@
-- edit tables insert data in order
-- edit visible group
DELETE FROM edit_visible_group;
INSERT INTO edit_visible_group (name, flag) VALUES ('Main Menu', 'main');
INSERT INTO edit_visible_group (name, flag) VALUES ('Data popup Menu', 'datapopup');
-- edit menu group
DELETE FROM edit_menu_group;
INSERT INTO edit_menu_group (name, flag, order_number) VALUES ('Admin Menu', 'admin', 1);
INSERT INTO edit_menu_group (name, flag, order_number) VALUES ('Admin Data Popup Menu', 'AdminDataPopup', 2);
-- edit page
DELETE FROM edit_page;
INSERT INTO edit_page (filename, name, order_number, online, menu) VALUES ('edit_pages.php', 'Edit Pages', 1, 1, 1);
INSERT INTO edit_page (filename, name, order_number, online, menu) VALUES ('edit_users.php', 'Edit Users', 2, 1, 1);
INSERT INTO edit_page (filename, name, order_number, online, menu) VALUES ('edit_languages.php', 'Edit Languages', 3, 1, 1);
INSERT INTO edit_page (filename, name, order_number, online, menu) VALUES ('edit_schemes.php', 'Edit Schemes', 4, 1, 1);
INSERT INTO edit_page (filename, name, order_number, online, menu) VALUES ('edit_groups.php', 'Edit Groups', 5, 1, 1);
INSERT INTO edit_page (filename, name, order_number, online, menu) VALUES ('edit_visible_group.php', 'Edit Visible Groups', 6, 1, 1);
INSERT INTO edit_page (filename, name, order_number, online, menu) VALUES ('edit_menu_group.php', 'Edit Menu Groups', 7, 1, 1);
INSERT INTO edit_page (filename, name, order_number, online, menu) VALUES ('edit_access.php', 'Edit Access', 8, 1, 1);
INSERT INTO edit_page (filename, name, order_number, online, menu) VALUES ('edit_order.php', 'Edit Order', 9, 1, 0);
-- edit visible group
DELETE FROM edit_page_visible_group;
INSERT INTO edit_page_visible_group VALUES ((SELECT edit_page_id FROM edit_page WHERE name = 'Edit Pages'), (SELECT edit_visible_group_id FROM edit_visible_group WHERE flag = 'main'));
INSERT INTO edit_page_visible_group VALUES ((SELECT edit_page_id FROM edit_page WHERE name = 'Edit Users'), (SELECT edit_visible_group_id FROM edit_visible_group WHERE flag = 'main'));
INSERT INTO edit_page_visible_group VALUES ((SELECT edit_page_id FROM edit_page WHERE name = 'Edit Languages'), (SELECT edit_visible_group_id FROM edit_visible_group WHERE flag = 'main'));
INSERT INTO edit_page_visible_group VALUES ((SELECT edit_page_id FROM edit_page WHERE name = 'Edit Schemes'), (SELECT edit_visible_group_id FROM edit_visible_group WHERE flag = 'main'));
INSERT INTO edit_page_visible_group VALUES ((SELECT edit_page_id FROM edit_page WHERE name = 'Edit Groups'), (SELECT edit_visible_group_id FROM edit_visible_group WHERE flag = 'main'));
INSERT INTO edit_page_visible_group VALUES ((SELECT edit_page_id FROM edit_page WHERE name = 'Edit Visible Groups'), (SELECT edit_visible_group_id FROM edit_visible_group WHERE flag = 'main'));
INSERT INTO edit_page_visible_group VALUES ((SELECT edit_page_id FROM edit_page WHERE name = 'Edit Menu Groups'), (SELECT edit_visible_group_id FROM edit_visible_group WHERE flag = 'main'));
INSERT INTO edit_page_visible_group VALUES ((SELECT edit_page_id FROM edit_page WHERE name = 'Edit Access'), (SELECT edit_visible_group_id FROM edit_visible_group WHERE flag = 'main'));
-- INSERT INTO edit_page_visible_group VALUES ((SELECT edit_page_id FROM edit_page WHERE name = 'Edit Order'), (SELECT edit_visible_group_id FROM edit_visible_group WHERE flag = 'main'));
-- edit page menu group
DELETE FROM edit_page_menu_group;
INSERT INTO edit_page_menu_group VALUES ((SELECT edit_page_id FROM edit_page WHERE name = 'Edit Pages'), (SELECT edit_menu_group_id FROM edit_menu_group WHERE flag = 'admin'));
INSERT INTO edit_page_menu_group VALUES ((SELECT edit_page_id FROM edit_page WHERE name = 'Edit Users'), (SELECT edit_menu_group_id FROM edit_menu_group WHERE flag = 'admin'));
INSERT INTO edit_page_menu_group VALUES ((SELECT edit_page_id FROM edit_page WHERE name = 'Edit Languages'), (SELECT edit_menu_group_id FROM edit_menu_group WHERE flag = 'admin'));
INSERT INTO edit_page_menu_group VALUES ((SELECT edit_page_id FROM edit_page WHERE name = 'Edit Schemes'), (SELECT edit_menu_group_id FROM edit_menu_group WHERE flag = 'admin'));
INSERT INTO edit_page_menu_group VALUES ((SELECT edit_page_id FROM edit_page WHERE name = 'Edit Groups'), (SELECT edit_menu_group_id FROM edit_menu_group WHERE flag = 'admin'));
INSERT INTO edit_page_menu_group VALUES ((SELECT edit_page_id FROM edit_page WHERE name = 'Edit Visible Groups'), (SELECT edit_menu_group_id FROM edit_menu_group WHERE flag = 'admin'));
INSERT INTO edit_page_menu_group VALUES ((SELECT edit_page_id FROM edit_page WHERE name = 'Edit Menu Groups'), (SELECT edit_menu_group_id FROM edit_menu_group WHERE flag = 'admin'));
INSERT INTO edit_page_menu_group VALUES ((SELECT edit_page_id FROM edit_page WHERE name = 'Edit Access'), (SELECT edit_menu_group_id FROM edit_menu_group WHERE flag = 'admin'));
-- INSERT INTO edit_page_menu_group VALUES ((SELECT edit_page_id FROM edit_page WHERE name = 'Edit Order'), (SELECT edit_menu_group_id FROM edit_menu_group WHERE flag = 'admin'));
-- edit access right
DELETE FROM edit_access_right;
INSERT INTO edit_access_right (name, level, type) VALUES ('Default', -1, 'default');
INSERT INTO edit_access_right (name, level, type) VALUES ('No Access', 0, 'none');
INSERT INTO edit_access_right (name, level, type) VALUES ('List', 10, 'list');
INSERT INTO edit_access_right (name, level, type) VALUES ('Read', 20, 'read');
INSERT INTO edit_access_right (name, level, type) VALUES ('Translator', 30, 'mod_trans');
INSERT INTO edit_access_right (name, level, type) VALUES ('Modify', 40, 'mod');
INSERT INTO edit_access_right (name, level, type) VALUES ('Create/Write', 60, 'write');
INSERT INTO edit_access_right (name, level, type) VALUES ('Delete', 80, 'del');
INSERT INTO edit_access_right (name, level, type) VALUES ('Site Admin', 90, 'siteadmin');
INSERT INTO edit_access_right (name, level, type) VALUES ('Admin', 100, 'admin');
-- edit scheme
DELETE FROM edit_scheme;
INSERT INTO edit_scheme (name, header_color, enabled) VALUES ('Default Scheme', 'E0E2FF', 1);
INSERT INTO edit_scheme (name, header_color, enabled) VALUES ('Admin', 'CC7E7E', 1);
INSERT INTO edit_scheme (name, header_color, enabled) VALUES ('Visitor', 'B0C4B3', 1);
INSERT INTO edit_scheme (name, header_color, enabled) VALUES ('User', '1E789E', 1);
-- edit language
-- iso_name = encoding
DELETE FROM edit_language;
INSERT INTO edit_language (long_name, short_name, iso_name, order_number, enabled, lang_default) VALUES ('English', 'en_US', 'UTF-8', 1, 1, 1);
INSERT INTO edit_language (long_name, short_name, long_name, iso_name, order_number, enabled, lang_default) VALUES ('Japanese', 'ja_JP', 'UTF-8', 2, 1, 0);
-- edit group
DELETE FROM edit_group;
INSERT INTO edit_group (name, enabled, edit_scheme_id, edit_access_right_id) VALUES ('Admin', 1, (SELECT edit_scheme_id FROM edit_scheme WHERE name = 'Admin'), (SELECT edit_access_right_id FROM edit_access_right WHERE type = 'admin'));
INSERT INTO edit_group (name, enabled, edit_scheme_id, edit_access_right_id) VALUES ('User', 1, (SELECT edit_scheme_id FROM edit_scheme WHERE name = 'User'), (SELECT edit_access_right_id FROM edit_access_right WHERE type = 'write'));
-- edit page access
DELETE FROM edit_page_access;
INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_right_id) VALUES (1,
(SELECT edit_group_id FROM edit_group WHERE name = 'Admin'),
(SELECT edit_page_id FROM edit_page WHERE name = 'Edit Pages'),
(SELECT edit_access_right_id FROM edit_access_right WHERE type = 'admin')
);
INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_right_id) VALUES (1,
(SELECT edit_group_id FROM edit_group WHERE name = 'Admin'),
(SELECT edit_page_id FROM edit_page WHERE name = 'Edit Users'),
(SELECT edit_access_right_id FROM edit_access_right WHERE type = 'admin')
);
INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_right_id) VALUES (1,
(SELECT edit_group_id FROM edit_group WHERE name = 'Admin'),
(SELECT edit_page_id FROM edit_page WHERE name = 'Edit Languages'),
(SELECT edit_access_right_id FROM edit_access_right WHERE type = 'admin')
);
INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_right_id) VALUES (1,
(SELECT edit_group_id FROM edit_group WHERE name = 'Admin'),
(SELECT edit_page_id FROM edit_page WHERE name = 'Edit Schemes'),
(SELECT edit_access_right_id FROM edit_access_right WHERE type = 'admin')
);
INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_right_id) VALUES (1,
(SELECT edit_group_id FROM edit_group WHERE name = 'Admin'),
(SELECT edit_page_id FROM edit_page WHERE name = 'Edit Groups'),
(SELECT edit_access_right_id FROM edit_access_right WHERE type = 'admin')
);
INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_right_id) VALUES (1,
(SELECT edit_group_id FROM edit_group WHERE name = 'Admin'),
(SELECT edit_page_id FROM edit_page WHERE name = 'Edit Visible Groups'),
(SELECT edit_access_right_id FROM edit_access_right WHERE type = 'admin')
);
INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_right_id) VALUES (1,
(SELECT edit_group_id FROM edit_group WHERE name = 'Admin'),
(SELECT edit_page_id FROM edit_page WHERE name = 'Edit Menu Groups'),
(SELECT edit_access_right_id FROM edit_access_right WHERE type = 'admin')
);
INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_right_id) VALUES (1,
(SELECT edit_group_id FROM edit_group WHERE name = 'Admin'),
(SELECT edit_page_id FROM edit_page WHERE name = 'Edit Access'),
(SELECT edit_access_right_id FROM edit_access_right WHERE type = 'admin')
);
INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_right_id) VALUES (1,
(SELECT edit_group_id FROM edit_group WHERE name = 'Admin'),
(SELECT edit_page_id FROM edit_page WHERE name = 'Edit Order'),
(SELECT edit_access_right_id FROM edit_access_right WHERE type = 'admin')
);
-- edit user
-- 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_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')
);
-- edit access
DELETE FROM edit_access;
INSERT INTO edit_access (name, enabled, protected) VALUES ('Admin Access', 1, 1);
-- edit access user
DELETE FROM edit_access_user;
INSERT INTO edit_access_user (edit_default, enabled, edit_access_id, edit_user_id, edit_access_right_id) VALUES (1, 1,
(SELECT edit_access_id FROM edit_access WHERE uid = 'AdminAccess'),
(SELECT edit_user_id FROM edit_user WHERE username = 'admin'),
(SELECT edit_access_right_id FROM edit_access_right WHERE type = 'admin')
);

View File

@@ -1,150 +0,0 @@
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2018-07-17
-- DESCRIPTION:
-- partition the edit_log table by year
-- auto creates table if missing, if failure writes to overflow table
-- HISTORY:
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()';
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));
-- 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';

View File

@@ -1,6 +1,6 @@
-- add uid add for edit_access table
CREATE OR REPLACE FUNCTION set_edit_access_uid() RETURNS TRIGGER AS
CREATE OR REPLACE FUNCTION set_edit_access_uid() RETURNS TRIGGER AS
$$
DECLARE
myrec RECORD;

View File

@@ -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';

View File

@@ -1,18 +0,0 @@
-- create random string with length X
CREATE FUNCTION random_string(randomLength int)
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)
),
''
)
$$ LANGUAGE SQL
RETURNS NULL ON NULL INPUT
VOLATILE; -- LEAKPROOF;

View File

@@ -1,15 +0,0 @@
-- 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';

View File

@@ -1,12 +0,0 @@
-- 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';

View File

@@ -1,16 +1,14 @@
-- adds the created or updated date tags
-- 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';

View File

@@ -8,12 +8,10 @@
-- 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,
name VARCHAR(255) UNIQUE,
description VARCHAR,
color VARCHAR,
additional_acl JSONB
COLOR VARCHAR
) INHERITS (edit_generic) WITHOUT OIDS;
DELETE FROM edit_access;
INSERT INTO edit_access (name) VALUES ('Admin Access');

View File

@@ -9,8 +9,8 @@
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
value VARCHAR,
enabled SMALLINT NOT NULL DEFAULT 0,
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -14,3 +14,14 @@ CREATE TABLE edit_access_right (
type VARCHAR,
UNIQUE (level,type)
) INHERITS (edit_generic) WITHOUT OIDS;
DELETE FROM edit_access_right;
INSERT INTO edit_access_right (name, level, type) VALUES ('Default', -1, 'default');
INSERT INTO edit_access_right (name, level, type) VALUES ('No Access', 0, 'none');
INSERT INTO edit_access_right (name, level, type) VALUES ('Read', 20, 'read');
INSERT INTO edit_access_right (name, level, type) VALUES ('Translator', 30, 'mod_trans');
INSERT INTO edit_access_right (name, level, type) VALUES ('Modify', 40, 'mod');
INSERT INTO edit_access_right (name, level, type) VALUES ('Create/Write', 60, 'write');
INSERT INTO edit_access_right (name, level, type) VALUES ('Delete', 80, 'del');
INSERT INTO edit_access_right (name, level, type) VALUES ('Site Admin', 90, 'siteadmin');
INSERT INTO edit_access_right (name, level, type) VALUES ('Admin', 100, 'admin');

View File

@@ -8,12 +8,15 @@
-- 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_id INT NOT NULL,
edit_user_id INT NOT NULL,
edit_access_right_id INT NOT NULL,
enabled SMALLINT NOT NULL DEFAULT 0,
FOREIGN KEY (edit_access_id) REFERENCES edit_access (edit_access_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (edit_user_id) REFERENCES edit_user (edit_user_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
) INHERITS (edit_generic) WITHOUT OIDS;
DELETE FROM edit_access_user;
INSERT INTO edit_access_user (edit_default, edit_access_id, edit_user_id, edit_access_right_id) VALUES (1, 1, 1, 8);

View File

@@ -7,7 +7,7 @@
-- DROP TABLE edit_generic;
CREATE TABLE edit_generic (
cuid VARCHAR,
eg_status INT,
date_created TIMESTAMP WITHOUT TIME ZONE DEFAULT clock_timestamp(),
date_updated TIMESTAMP WITHOUT TIME ZONE
);

View File

@@ -8,13 +8,12 @@
-- 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,
name VARCHAR(50),
enabled SMALLINT NOT NULL DEFAULT 0,
deleted SMALLINT DEFAULT 0,
uid VARCHAR,
name VARCHAR,
additional_acl JSONB
edit_scheme_id INT,
edit_access_right_id INT NOT NULL,
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
) INHERITS (edit_generic) WITHOUT OIDS;
INSERT INTO edit_group (name, enabled, edit_scheme_id, edit_access_right_id) VALUES ('Admin', 1, 2, 8);

View File

@@ -9,10 +9,12 @@
-- DROP TABLE edit_language;
CREATE TABLE edit_language (
edit_language_id SERIAL PRIMARY KEY,
short_name VARCHAR(2),
long_name VARCHAR(70),
iso_name VARCHAR(12),
order_number INT,
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
lang_default SMALLINT NOT NULL DEFAULT 0 UNIQUE
) INHERITS (edit_generic) WITHOUT OIDS;
INSERT INTO edit_language (short_name, long_name, iso_name, order_number, enabled, lang_default) VALUES ('en', 'English', 'UTF-8', 1, 1, 1);

View File

@@ -8,8 +8,6 @@
-- 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,
@@ -28,6 +26,7 @@ CREATE TABLE edit_log (
action_value VARCHAR,
action_type VARCHAR,
action_error VARCHAR,
euid INT, -- this is a foreign key, but I don't nedd to reference to it
user_agent VARCHAR,
referer VARCHAR,
script_name VARCHAR,
@@ -37,5 +36,6 @@ CREATE TABLE edit_log (
http_accept VARCHAR,
http_accept_charset VARCHAR,
http_accept_encoding VARCHAR,
session_id VARCHAR
session_id VARCHAR,
FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE
) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -1,12 +0,0 @@
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2020/1/28
-- DESCRIPTION:
-- edit log overflow table
-- this is the overflow table for partition
-- TABLE: edit_log_overflow
-- HISTORY:
-- DROP TABLE edit_log_overflow;
CREATE TABLE IF NOT EXISTS edit_log_overflow () INHERITS (edit_log);
ALTER TABLE edit_log_overflow ADD PRIMARY KEY (edit_log_id);
ALTER TABLE edit_log_overflow ADD CONSTRAINT edit_log_overflow_euid_fkey FOREIGN KEY (euid) REFERENCES edit_user (edit_user_id) MATCH FULL ON UPDATE CASCADE ON DELETE SET NULL;

View File

@@ -8,9 +8,11 @@
-- DROP TABLE edit_menu_group;
CREATE TABLE edit_menu_group (
edit_menu_group_id SERIAL PRIMARY KEY,
name VARCHAR,
flag VARCHAR,
name VARCHAR(255),
flag VARCHAR(50),
order_number INT NOT NULL
) INHERITS (edit_generic) WITHOUT OIDS;
DELETE FROM edit_menu_group;
INSERT INTO edit_menu_group (name, flag, order_number) VALUES ('Admin Menu', 'admin', 1);
INSERT INTO edit_menu_group (name, flag, order_number) VALUES ('Admin Data Popup Menu', 'AdminDataPopup', 2);

View File

@@ -2,21 +2,29 @@
-- DATE: 2005/07/05
-- DESCRIPTION:
-- edit tables, this table contains all pages in the edit interface and allocates rights + values to it
-- TABLE: edit_page
-- TABLE: edit_table
-- HISTORY:
-- 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,
filename VARCHAR(70),
name VARCHAR(255) 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
popup_y SMALLINT
) INHERITS (edit_generic) WITHOUT OIDS;
DELETE FROM edit_page;
INSERT INTO edit_page (filename, name, order_number, online, menu) VALUES ('edit_pages.php', 'Edit Pages', 1, 1, 1);
INSERT INTO edit_page (filename, name, order_number, online, menu) VALUES ('edit_users.php', 'Edit Users', 2, 1, 1);
INSERT INTO edit_page (filename, name, order_number, online, menu) VALUES ('edit_languages.php', 'Edit Languages', 3, 1, 1);
INSERT INTO edit_page (filename, name, order_number, online, menu) VALUES ('edit_schemes.php', 'Edit Schemes', 4, 1, 1);
INSERT INTO edit_page (filename, name, order_number, online, menu) VALUES ('edit_groups.php', 'Edit Groups', 5, 1, 1);
INSERT INTO edit_page (filename, name, order_number, online, menu) VALUES ('edit_visible_group.php', 'Edit Visible Groups', 6, 1, 1);
INSERT INTO edit_page (filename, name, order_number, online, menu) VALUES ('edit_menu_group.php', 'Edit Menu Groups', 7, 1, 1);
INSERT INTO edit_page (filename, name, order_number, online, menu) VALUES ('edit_access.php', 'Edit Access', 8, 1, 1);
INSERT INTO edit_page (filename, name, order_number, online, menu) VALUES ('edit_order.php', 'Edit Order', 9, 1, 0);

View File

@@ -8,13 +8,21 @@
-- DROP TABLE edit_page_access;
CREATE TABLE edit_page_access (
edit_page_access_id SERIAL PRIMARY KEY,
enabled SMALLINT NOT NULL DEFAULT 0,
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
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (edit_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
) INHERITS (edit_generic) WITHOUT OIDS;
INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_right_id) VALUES (1, 1, 1, 8);
INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_right_id) VALUES (1, 1, 2, 8);
INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_right_id) VALUES (1, 1, 3, 8);
INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_right_id) VALUES (1, 1, 4, 8);
INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_right_id) VALUES (1, 1, 5, 8);
INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_right_id) VALUES (1, 1, 6, 8);
INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_right_id) VALUES (1, 1, 7, 8);
INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_right_id) VALUES (1, 1, 8, 8);
INSERT INTO edit_page_access (enabled, edit_group_id, edit_page_id, edit_access_right_id) VALUES (1, 1, 9, 8);

View File

@@ -1,20 +0,0 @@
-- AUTHOR: Clemens Schwaighofer
-- DATE: 2019/9/9
-- DESCRIPTION:
-- sub content to one page with additional edit access right set
-- can be eg JS content groups on one page
-- TABLE: edit_page_content
-- HISTORY:
-- 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
) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -8,7 +8,16 @@
-- 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_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (edit_menu_group_id) REFERENCES edit_menu_group (edit_menu_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
);
DELETE FROM edit_page_menu_group;
INSERT INTO edit_page_menu_group VALUES (1, 1);
INSERT INTO edit_page_menu_group VALUES (2, 1);
INSERT INTO edit_page_menu_group VALUES (3, 1);
INSERT INTO edit_page_menu_group VALUES (4, 1);
INSERT INTO edit_page_menu_group VALUES (5, 1);
INSERT INTO edit_page_menu_group VALUES (6, 1);
INSERT INTO edit_page_menu_group VALUES (7, 1);

View File

@@ -8,7 +8,16 @@
-- 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_page_id) REFERENCES edit_page (edit_page_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (edit_visible_group_id) REFERENCES edit_visible_group (edit_visible_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
);
DELETE FROM edit_page_visible_group;
INSERT INTO edit_page_visible_group VALUES (1, 1);
INSERT INTO edit_page_visible_group VALUES (2, 1);
INSERT INTO edit_page_visible_group VALUES (3, 1);
INSERT INTO edit_page_visible_group VALUES (4, 1);
INSERT INTO edit_page_visible_group VALUES (5, 1);
INSERT INTO edit_page_visible_group VALUES (6, 1);
INSERT INTO edit_page_visible_group VALUES (7, 1);

View File

@@ -8,10 +8,10 @@
-- 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,
name VARCHAR(255),
value VARCHAR(255),
enabled SMALLINT NOT NULL DEFAULT 0,
name VARCHAR,
value VARCHAR,
dynamic SMALLINT NOT NULL DEFAULT 0
dynamic SMALLINT NOT NULL DEFAULT 0,
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
) INHERITS (edit_generic) WITHOUT OIDS;

View File

@@ -9,8 +9,12 @@
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
name VARCHAR(50),
header_color VARCHAR(7),
css_file VARCHAR(50),
template VARCHAR(50)
) INHERITS (edit_generic) WITHOUT OIDS;
INSERT INTO edit_scheme (name, header_color, enabled) VALUES ('Default Scheme', '#E0E2FF', 1);
INSERT INTO edit_scheme (name, header_color, enabled) VALUES ('Admin', '#CC7E7E', 1);
INSERT INTO edit_scheme (name, header_color, enabled) VALUES ('Visitor', '#B0C4B3', 1);

View File

@@ -7,6 +7,5 @@
-- DROP TABLE temp_files;
CREATE TABLE temp_files (
filename VARCHAR,
folder VARCHAR
filename VARCHAR(250)
);

View File

@@ -8,41 +8,31 @@
-- 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,
enabled SMALLINT NOT NULL DEFAULT 0,
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,
edit_language_id INT NOT NULL,
edit_group_id INT NOT NULL,
edit_scheme_id INT,
edit_access_right_id INT NOT NULL,
login_error_count INT,
login_error_date_last TIMESTAMP WTIHOUT TIME ZONE,
login_error_date_first TIMESTAMP WTIHOUT 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)
FOREIGN KEY (edit_language_id) REFERENCES edit_language (edit_language_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (edit_group_id) REFERENCES edit_group (edit_group_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (edit_scheme_id) REFERENCES edit_scheme (edit_scheme_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (edit_access_right_id) REFERENCES edit_access_right (edit_access_right_id) MATCH FULL ON DELETE CASCADE ON UPDATE CASCADE
) INHERITS (edit_generic) WITHOUT OIDS;
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';
-- 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, 1, 1, 2, 8);

View File

@@ -8,6 +8,10 @@
-- DROP TABLE edit_visible_group;
CREATE TABLE edit_visible_group (
edit_visible_group_id SERIAL PRIMARY KEY,
name VARCHAR,
flag VARCHAR
name VARCHAR(255),
flag VARCHAR(50)
) INHERITS (edit_generic) WITHOUT OIDS;
DELETE FROM edit_visible_group;
INSERT INTO edit_visible_group (name, flag) VALUES ('Main Menu', 'main');
INSERT INTO edit_visible_group (name, flag) VALUES ('Data popup Menu', 'datapopup');

View File

@@ -1,9 +1,4 @@
DROP TRIGGER IF EXISTS trg_edit_access ON edit_access;
-- DROP TRIGGER 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;
CREATE TRIGGER trg_set_edit_access_uid
BEFORE INSERT OR UPDATE ON edit_access
FOR EACH ROW EXECUTE PROCEDURE set_edit_access_uid();
FOR EACH ROW EXECUTE PROCEDURE set_generic();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER IF EXISTS trg_edit_access_data ON edit_access_data;
-- DROP TRIGGER 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();
FOR EACH ROW EXECUTE PROCEDURE set_generic();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER IF EXISTS trg_edit_access_right ON edit_access_right;
-- DROP TRIGGER 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();
FOR EACH ROW EXECUTE PROCEDURE set_generic();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER IF EXISTS trg_edit_access_user ON edit_access_user;
-- DROP TRIGGER 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();
FOR EACH ROW EXECUTE PROCEDURE set_generic();

View File

@@ -1,9 +1,4 @@
DROP TRIGGER IF EXISTS trg_edit_group ON edit_group;
-- DROP TRIGGER 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;
CREATE TRIGGER trg_set_edit_group_uid
BEFORE INSERT OR UPDATE ON edit_group
FOR EACH ROW EXECUTE PROCEDURE set_edit_group_uid();
FOR EACH ROW EXECUTE PROCEDURE set_generic();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER IF EXISTS trg_edit_language ON edit_language;
-- DROP TRIGGER 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();
FOR EACH ROW EXECUTE PROCEDURE set_generic();

View File

@@ -1,9 +1,4 @@
DROP TRIGGER IF EXISTS trg_edit_log ON edit_log;
-- DROP TRIGGER 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;
CREATE TRIGGER trg_edit_log_insert_partition
BEFORE INSERT OR UPDATE ON edit_log
FOR EACH ROW EXECUTE PROCEDURE edit_log_insert_trigger();
FOR EACH ROW EXECUTE PROCEDURE set_generic();

View File

@@ -1,4 +0,0 @@
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();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER IF EXISTS trg_edit_menu_group ON edit_menu_group;
-- DROP TRIGGER trg_edit_visible_group ON edit_visible_group;
CREATE TRIGGER trg_edit_menu_group
BEFORE INSERT OR UPDATE ON edit_menu_group
FOR EACH ROW EXECUTE PROCEDURE set_edit_generic();
FOR EACH ROW EXECUTE PROCEDURE set_generic();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER IF EXISTS trg_edit_page ON edit_page;
-- DROP TRIGGER 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();
FOR EACH ROW EXECUTE PROCEDURE set_generic();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER IF EXISTS trg_edit_page_access ON edit_page_access;
-- DROP TRIGGER 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();
FOR EACH ROW EXECUTE PROCEDURE set_generic();

View File

@@ -1,4 +0,0 @@
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();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER IF EXISTS trg_edit_query_string ON edit_query_string;
-- DROP TRIGGER 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();
FOR EACH ROW EXECUTE PROCEDURE set_generic();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER IF EXISTS trg_edit_scheme ON edit_scheme;
-- DROP TRIGGER 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();
FOR EACH ROW EXECUTE PROCEDURE set_generic();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER IF EXISTS trg_edit_user ON edit_user;
-- DROP TRIGGER 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();
FOR EACH ROW EXECUTE PROCEDURE set_generic();

View File

@@ -1,4 +1,4 @@
DROP TRIGGER IF EXISTS trg_edit_visible_group ON edit_visible_group;
-- DROP TRIGGER 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();
FOR EACH ROW EXECUTE PROCEDURE set_generic();

View File

@@ -0,0 +1,4 @@
-- DROP TRIGGER 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();

View File

@@ -1,14 +0,0 @@
-- update missing edit_* table data
ALTER TABLE edit_generic ADD cuid VARCHAR;
ALTER TABLE edit_access ADD enabled SMALLINT DEFAULT 0;
ALTER TABLE edit_access ADD protected SMALLINT DEFAULT 0;
ALTER TABLE edit_group ADD uid VARCHAR;
ALTER TABLE edit_group ADD deleted SMALLINT DEFAULT 0;
ALTER TABLE temp_files ADD folder VARCHAR;
ALTER TABLE edit_page ADD hostname VARCHAR;
ALTER TABLE edit_user ADD deleted SMALLINT DEFAULT 0;

View File

@@ -1,17 +0,0 @@
-- 2019/9/10 UPDATE missing cuid in edit_* tables
UPDATE edit_access SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_access_data SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_access_right SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_access_user SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_group SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_language SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_log SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_menu_group SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_page SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_page_access SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_page_content SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_query_string SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_scheme SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_user SET cuid = random_string(12) WHERE cuid IS NULL;
UPDATE edit_visible_group SET cuid = random_string(12) WHERE cuid IS NULL;

View File

@@ -1,55 +0,0 @@
# 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`

View File

@@ -1,57 +0,0 @@
# ********************************************************************
# AUTHOR: Clemens Schwaighofer
# CREATED: 2005/08/09
# SHORT DESCRIPTION:
# Backned English Messages file for gettext
# to craete: msgfmt -o <output.po> <input.mo>
# ********************************************************************/
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"

View File

@@ -1,24 +0,0 @@
# to craete: msgfmt -o <output.po> <input.mo>
msgid ""
msgstr ""
"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: 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 "INPUT TEST"
msgstr "OUTPUT TEST FRONTEND EN"
msgid "single"
msgid_plural "multi"
msgstr[0] "Multi frontend en 0"
msgstr[1] "Multi frontend en 1"
msgstr[2] "Multi frontend en 2"

View File

@@ -1,98 +0,0 @@
# ********************************************************************
# AUTHOR: Clemens Schwaighofer
# CREATED: 2018/03/28
# SHORT DESCRIPTION:
# Backend Japanese Messages file for gettext
# to craete: msgfmt -o <output.po> <input.mo>
# ********************************************************************/
msgid ""
msgstr ""
"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: 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 "はい"
msgid "No"
msgstr "いいえ"
# Basic date info
msgid "Year"
msgstr "年"
msgid "Month"
msgstr "月"
msgid "Day"
msgstr "日"
msgid "Hour"
msgstr "時"
msgid "Minute"
msgstr "分"
msgid "Mon"
msgstr "月"
msgid "Tue"
msgstr "火"
msgid "Wed"
msgstr "水"
msgid "Thu"
msgstr "木"
msgid "Fri"
msgstr "金"
msgid "Sat"
msgstr "土"
msgid "Sun"
msgstr "日"
msgid "INPUT TEST"
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"
msgstr "こにちは %s"
msgid "I should be translated"
msgstr "「スマーティー」これは正しいです"
msgid "Are we translated?"
msgstr "「クラス」これは翻訳です?"
msgid "Original with string: %1"
msgstr "%1と翻訳した"

View File

@@ -1,24 +0,0 @@
# to craete: msgfmt -o <output.po> <input.mo>
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"

View File

@@ -1,17 +1,14 @@
#!/bin/bash
# create path
path=$(pwd)"/"$0;
path=`pwd`"/"$0;
LOCAL_BASE_DIR="<local folder>";
LOCAL_DIR=$LOCAL_BASE_DIR"";
REMOTE_WEB="<remote folder>";
TARGET_HOST_WEB="<user>@<host>";
TMP_DIR=$LOCAL_BASE_DIR"/4dev/tmp/";
tmpf_web=$TMP_DIR"sync.exclude.tmp";
# if vendor be sure group folder is +x
chmod -R ug+rX ${LOCAL_DIR}/vender/
TARGET_HOST_WEB="<user>@<host>
TMP_DIR=$LOCAL_BASE_DIR"/4dev/";
tmpf_web=$TMP_DIR"tmp.web";
# for web (ika)
rm -f $tmpf_web;
@@ -38,19 +35,20 @@ cat $tmpf_web;
echo "($1) Syncing from $LOCAL_DIR/* to $TARGET_HOST_WEB:$REMOTE_WEB";
echo "You hav 5 seconds to abort (<ctrl> + c)";
#c=0;until [ $c -eq 10 ];do echo -n "#"; sleep 1; c=`expr $c + 1`;done;
for ((i=5;i>=1;i--));
do
echo -n $i" ";
sleep 1;
echo -n $i" ";
sleep 1;
done;
if [ "$1" = "live" ];
then
# live sync
rsync -Plzvrupt --stats --include ".htaccess" --exclude-from=$tmpf_web --delete -e ssh $LOCAL_DIR/* $TARGET_HOST_WEB:$REMOTE_WEB
# ika sync
rsync -Plzvrupt --stats --include ".htaccess" --exclude-from=$tmpf_web --delete -e ssh $LOCAL_DIR/* $TARGET_HOST_WEB:$REMOTE_WEB
else
# test sync
rsync -n -Plzvrupt --stats --include ".htaccess" --exclude-from=$tmpf_web --delete -e ssh $LOCAL_DIR/* $TARGET_HOST_WEB:$REMOTE_WEB
# ika sync
rsync -n -Plzvrupt --stats --include ".htaccess" --exclude-from=$tmpf_web --delete -e ssh $LOCAL_DIR/* $TARGET_HOST_WEB:$REMOTE_WEB
fi;
# END

View File

@@ -1,46 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for ACL\Login
* @coversDefaultClass \CoreLibs\ACL\Login
* @testdox \CoreLibs\ACL\Login method tests
*/
final class CoreLibsACLLoginTest extends TestCase
{
/**
* Undocumented function
*
* @return void
*/
protected function setUp(): void
{
if (!extension_loaded('pgsql')) {
$this->markTestSkipped(
'The PgSQL extension is not available.'
);
}
}
/**
* Undocumented function
*
* @testdox ACL\Login Class tests
*
* @return void
*/
public function testACLLogin()
{
$this->assertTrue(true, 'ACL Login Tests not implemented');
$this->markTestIncomplete(
'ACL\Login Tests have not yet been implemented'
);
}
}
// __END__

View File

@@ -1,47 +0,0 @@
<?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__

View File

@@ -1,381 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Undocumented class
* @coversDefaultClass \CoreLibs\Check\Email
* @testdox \CoreLibs\Check\Email method tests
*/
final class CoreLibsCheckEmailTest extends TestCase
{
/**
* Array position to regex
*
* @return array<mixed>
*/
public function emailRegexProvider(): array
{
return [
'get email regex invalid -1, will be 0' => [
-1,
"^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$"
],
'get email regex invalid 10, will be 0' => [
10,
"^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$"
],
'get email regex valid 1, will be 1' => [
1,
"@(.*)@(.*)"
]
];
}
/**
* Test regex level return
*
* @covers ::getEmailRegex
* @dataProvider emailRegexProvider
* @testdox getEmailRegex $input will be $expected [$_dataName]
*
* @param int $input
* @param string $expected
* @return void
*/
public function testGetEmailRegexReturn(int $input, string $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Check\Email::getEmailRegex($input)
);
}
/**
* provides data for emailCheckProvider and emailCheckFullProvider
*
* @return array
*/
public function emailCheckList(): array
{
return [
'valid email' => ['test@test.com', true, []],
'invalid empty email' => ['', false, [0, 2, 3, 4, 5]],
'invalid email' => ['-@-', false, [0, 3, 4, 5]],
'invalid email leading dot' => ['.test@test.com', false, [0, 2]],
'invalid email invalid domain' => ['test@t_est.com', false, [0, 3, 4]],
'invalid email double @' => ['test@@test.com', false, [0, 1]],
'invalid email double dot' => ['test@test..com', false, [0, 3, 6]],
'invalid email end with dot' => ['test@test.', false, [0, 3, 5, 7]],
'invalid email bad top level' => ['test@test.j', false, [0, 3, 5]],
'invalid email double @ and double dot' => ['test@@test..com', false, [0, 1, 3, 6]],
];
}
/**
* Valids or not valid email address
*
* @return array
*/
public function emailCheckProvider(): array
{
$list = [];
foreach ($this->emailCheckList() as $key => $data) {
$list[$key] = [$data[0], $data[1]];
}
return $list;
}
/**
* Undocumented function
*
* @covers ::checkEmail
* @dataProvider emailCheckProvider
* @testdox checkEmail $input will be $expected [$_dataName]
*
* @return void
*/
public function testCheckEmail(string $input, bool $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Check\Email::checkEmail($input)
);
}
/**
* this is like emailCheckProvider but it has the full detail errors
* All errors should be tetsed in testGetEmailRegexErrorMessage
*
* @return array
*/
public function emailCheckFullProvider(): array
{
$list = [];
foreach ($this->emailCheckList() as $key => $data) {
$list[$key] = [$data[0], $data[2]];
}
return $list;
}
/**
* Undocumented function
*
* @covers ::checkEmailFull
* @dataProvider emailCheckFullProvider
* @testdox checkEmailFull $input will be $expected [$_dataName]
*
* @param string $input
* @param array $expected
* @return void
*/
public function testCheckEmailFull(string $input, array $expected): void
{
$this->assertEqualsCanonicalizing(
$expected,
\CoreLibs\Check\Email::checkEmailFull($input, true)
);
}
/**
* error data returned for each error position
*
* @return array
*/
public function emailRegexErrorProvider(): array
{
return [
'error 0 will return general' => [
0,
[
'error' => 0,
'message' => 'Invalid email address',
'regex' => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
. "[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]{1,})*\.([a-zA-Z]{2,}){1}$"
]
],
'error 1 will return double @ error' => [
1,
[
'error' => 1,
'message' => 'Double @ mark in email address',
'regex' => "@(.*)@(.*)"
]
],
'error 2 will be invalid before @' => [
2,
[
'error' => 2,
'message' => 'Invalid email part before @ sign',
'regex' => "^[A-Za-z0-9!#$%&'*+\-\/=?^_`{|}~][A-Za-z0-9!#$%:\(\)&'*+\-\/=?^_`{|}~\.]{0,63}@"
]
],
'error 3 will be invalid domain and top level' => [
3,
[
'error' => 3,
'message' => 'Invalid domain part after @ sign',
'regex' => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\.([a-zA-Z]{2,}){1}$"
]
],
'error 4 will be invalid domain' => [
4,
[
'error' => 4,
'message' => 'Invalid domain name part',
'regex' => "@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]{1,})*\."
]
],
'error 5 will be invalid domain top level only' => [
5,
[
'error' => 5,
'message' => 'Wrong domain top level part',
'regex' => "\.([a-zA-Z]{2,6}){1}$"
]
],
'error 6 will be domain double dot' => [
6,
[
'error' => 6,
'message' => 'Double consecutive dots in domain name (..)',
'regex' => "@(.*)\.{2,}"
]
],
'error 7 will domain ends with dot' => [
7,
[
'error' => 7,
'message' => 'Domain ends with a dot or is missing top level part',
'regex' => "@.*\.$"
]
]
];
}
/**
* Undocumented function
*
* @covers ::getEmailRegexErrorMessage
* @dataProvider emailRegexErrorProvider
* @testdox getEmailRegexErrorMessage $input will be $expected [$_dataName]
*
* @param integer $input
* @param array $expected
* @return void
*/
public function testGetEmailRegexErrorMessage(int $input, array $expected): void
{
$this->assertEqualsCanonicalizing(
$expected,
\CoreLibs\Check\Email::getEmailRegexErrorMessage($input)
);
}
/**
* This holds all email type checks normal and short
*
* @return array
*/
public function emailTypeProvider(): array
{
return [
['test@test.com', 'pc_html', 'pc'],
['test@docomo.ne.jp', 'keitai_docomo', 'docomo'],
['test@softbank.ne.jp', 'keitai_softbank', 'softbank'],
['test@i.softbank.ne.jp', 'smartphone_softbank_iphone', 'iphone'],
// TODO: add more test emails here
];
}
/**
* Returns only normal email type checks
*
* @return array<mixed>
*/
public function emailTypeProviderLong(): array
{
$list = [];
foreach ($this->emailTypeProvider() as $set) {
$list['email ' . $set[0] . ' is valid and matches normal ' . $set[1]] = [$set[0], $set[1]];
}
$list['email is empty and not valid normal'] = ['', 'invalid'];
return $list;
}
/**
* only short email type list
*
* @return array<mixed>
*/
public function emailTypeProviderShort(): array
{
$list = [];
foreach ($this->emailTypeProvider() as $set) {
$list['email ' . $set[0] . ' is valid and matches short ' . $set[2]] = [$set[0], $set[2]];
}
$list['email is empty and not valid short'] = ['', 'invalid'];
return $list;
}
/**
* Undocumented function
*
* @covers ::getEmailType
* @dataProvider emailTypeProviderLong
* @testdox getEmailType $input will be normal $expected [$_dataName]
*
* @param string $input
* @param string $expected
* @return void
*/
public function testGetEmailTypeNormal(string $input, string $expected)
{
$this->assertEquals(
$expected,
\CoreLibs\Check\Email::getEmailType($input, false)
);
}
/**
* Undocumented function
*
* @covers ::getEmailType
* @dataProvider emailTypeProviderShort
* @testdox getEmailType $input will be short $expected [$_dataName]
*
* @param string $input
* @param string $expected
* @return void
*/
public function testGetEmailTypeShort(string $input, string $expected)
{
$this->assertEquals(
$expected,
\CoreLibs\Check\Email::getEmailType($input, true)
);
}
/**
* Undocumented function
*
* @return array
*/
public function emailProviderTypeLongToShort(): array
{
$mobile_email_type_short = [
'keitai_docomo' => 'docomo',
'keitai_kddi_ezweb' => 'kddi',
'keitai_kddi' => 'kddi',
'keitai_kddi_tu-ka' => 'kddi',
'keitai_kddi_sky' => 'kddi',
'keitai_softbank' => 'softbank',
'smartphone_softbank_iphone' => 'iphone',
'keitai_softbank_disney' => 'softbank',
'keitai_softbank_vodafone' => 'softbank',
'keitai_softbank_j-phone' => 'softbank',
'keitai_willcom' => 'willcom',
'keitai_willcom_pdx' => 'willcom',
'keitai_willcom_bandai' => 'willcom',
'keitai_willcom_pipopa' => 'willcom',
'keitai_willcom_ymobile' => 'willcom',
'keitai_willcom_emnet' => 'willcom',
'pc_html' => 'pc',
];
$list = [];
// use the static one
foreach ($mobile_email_type_short as $long => $short) {
$list[$long . ' matches to ' . $short] = [$long, $short];
}
// add invalid check
$list['Not found will be bool false'] = ['invalid', false];
return $list;
}
/**
* Undocumented function
*
* @covers ::getShortEmailType
* @dataProvider emailProviderTypeLongToShort
* @testdox getShortEmailType $input will be $expected [$_dataName]
*
* @param string $input
* @param string|bool $expected
* @return void
*/
public function testGetShortEmailType(string $input, $expected)
{
$this->assertEquals(
$expected,
\CoreLibs\Check\Email::getShortEmailType($input)
);
}
}
// __END__

View File

@@ -1,117 +0,0 @@
<?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 {
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
);
}
}
// __END__

View File

@@ -1,120 +0,0 @@
<?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__

View File

@@ -1,73 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Check\Password
* @coversDefaultClass \CoreLibs\Check\Password
* @testdox \CoreLibs\Check\Password method tests
*/
final class CoreLibsCheckPasswordTest extends TestCase
{
public function passwordProvider(): array
{
return [
'matching password' => ['test', 'test', true],
'not matching password' => ['test', 'not_test', false],
];
}
public function passwordRehashProvider(): array
{
return [
'no rehash needed' => ['$2y$10$EgWJ2WE73DWi.hIyFRCdpejLXTvHbmTK3LEOclO1tAvXAXUNuUS4W', false],
'rehash needed' => ['9c42a1346e333a770904b2a2b37fa7d3', true],
];
}
/**
* Undocumented function
*
* @covers ::passwordVerify
* @covers ::passwordSet
* @dataProvider passwordProvider
* @testdox passwordSet $input compare to $input_hash: passwordVerify $expected [$_dataName]
*
* @param string $input
* @param string $input_hash
* @param boolean $expected
* @return void
*/
public function testPasswordSetVerify(string $input, string $input_hash, bool $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Check\Password::passwordVerify($input, \CoreLibs\Check\Password::passwordSet($input_hash))
);
}
/**
* Undocumented function
*
* @covers ::passwordRehashCheck
* @dataProvider passwordRehashProvider
* @testdox passwordRehashCheck $input will be $expected [$_dataName]
*
* @param string $input
* @param boolean $expected
* @return void
*/
public function testPasswordRehashCheck(string $input, bool $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Check\Password::passwordRehashCheck($input)
);
}
}
// __END__

View File

@@ -1,73 +0,0 @@
<?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__

View File

@@ -1,785 +0,0 @@
<?php
// because we have long testdox lines
// phpcs:disable Generic.Files.LineLength
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Combined\ArrayHandler
* @coversDefaultClass \CoreLibs\Combined\ArrayHandler
* @testdox \CoreLibs\Combined\ArrayHandler method tests
*/
final class CoreLibsCombinedArrayHandlerTest extends TestCase
{
// we use that for all
public static $array = [
'a' => [
'b' => 'bar',
'c' => 'foo',
'same' => 'same',
3 => 'foobar',
'foobar' => 4,
'true' => true,
],
'd',
4,
'b',
'c' => 'test',
'same' => 'same',
'deep' => [
'sub' => [
'nested' => 'bar',
'same' => 'same',
'more' => 'test'
]
]
];
/**
* Undocumented function
*
* @return array
*/
public function arraySearchRecursiveProvider(): array
{
return [
'find value' => [
0 => 'bar',
1 => self::$array,
2 => null,
3 => ['a', 'b'],
],
'find value with key' => [
0 => 'bar',
1 => self::$array,
2 => 'nested',
3 => ['deep', 'sub', 'nested']
],
'not existing value' => [
0 => 'not exists',
1 => self::$array,
2 => null,
3 => [],
],
'find value int' => [
0 => 4,
1 => self::$array,
2 => null,
3 => ['a', 'foobar']
],
'find value int as string' => [
0 => '4',
1 => self::$array,
2 => null,
3 => []
],
'find value int as string with key' => [
0 => '4',
1 => self::$array,
2 => 'foobar',
3 => []
],
'first level value' => [
0 => 'd',
1 => self::$array,
2 => null,
4 => [0]
],
'find value, return int key' => [
0 => 'foobar',
1 => self::$array,
2 => null,
3 => ['a', 3]
]
];
}
/**
* Undocumented function
*
* @return array
*/
public function arraySearchRecursiveAllProvider(): array
{
return [
'find value' => [
0 => 'bar',
1 => self::$array,
2 => null,
3 => true,
4 => [
'level' => -1,
'work' => [],
'found' => [
0 => ['a', 'b'],
1 => ['deep', 'sub', 'nested']
]
]
],
'find value, new type' => [
0 => 'bar',
1 => self::$array,
2 => null,
3 => false,
4 => [
0 => ['a', 'b'],
1 => ['deep', 'sub', 'nested']
]
],
'find value with key' => [
0 => 'bar',
1 => self::$array,
2 => 'nested',
3 => true,
4 => [
'level' => -1,
'work' => [],
'found' => [
0 => ['deep', 'sub', 'nested']
]
]
],
'not existing value' => [
0 => 'not exists',
1 => self::$array,
2 => null,
3 => true,
4 => [
'level' => -1,
'work' => [],
],
],
'not existing value, new type' => [
0 => 'not exists',
1 => self::$array,
2 => null,
3 => false,
4 => [],
],
];
}
/**
* Undocumented function
*
* @return array
*/
public function arraySearchSimpleProvider(): array
{
return [
'key/value exist' => [
0 => self::$array,
1 => 'c',
2 => 'foo',
3 => false,
4 => true,
],
'key/value exists twice' => [
0 => self::$array,
1 => 'same',
2 => 'same',
3 => false,
4 => true,
],
'key/value not found' => [
0 => self::$array,
1 => 'not exists',
2 => 'not exists',
3 => false,
4 => false,
],
'key exists, value not' => [
0 => self::$array,
1 => 'b',
2 => 'not exists',
3 => false,
4 => false,
],
'key not, value exists' => [
0 => self::$array,
1 => 'not exists',
2 => 'bar',
3 => false,
4 => false,
],
'numeric key, value exists' => [
0 => self::$array,
1 => 0,
2 => 'd',
3 => false,
4 => true,
],
'numeric key as string, value exists' => [
0 => self::$array,
1 => '0',
2 => 'd',
3 => false,
4 => true,
],
'numeric key as string, value exists, strinct' => [
0 => self::$array,
1 => '0',
2 => 'd',
3 => true,
4 => false,
],
'key exists, value numeric' => [
0 => self::$array,
1 => 'foobar',
2 => 4,
3 => false,
4 => true,
],
'key exists, value numeric as string' => [
0 => self::$array,
1 => 'foobar',
2 => '4',
3 => false,
4 => true,
],
'key exists, value numeric as string, strict' => [
0 => self::$array,
1 => 'foobar',
2 => '4',
3 => true,
4 => false,
],
'key exists, value bool' => [
0 => self::$array,
1 => 'true',
2 => true,
3 => false,
4 => true,
],
'key exists, value bool as string' => [
0 => self::$array,
1 => 'true',
2 => 'true',
3 => false,
4 => true,
],
'key exists, value bool as string, strict' => [
0 => self::$array,
1 => 'true',
2 => 'true',
3 => true,
4 => false,
],
];
}
/**
* TODO: create provider for n array merge
* provides array listing for the merge test
*
* @return array
*/
public function arrayMergeRecursiveProvider(): array
{
return [
];
}
/**
* Undocumented function
*
* @return array
*/
public function arrayCompareProvider(): array
{
return [
'one matching' => [
['a', 'b', 'c'],
['c', 'd', 'e'],
['a', 'b', 'd', 'e']
],
'all the same' => [
['a', 'b', 'c'],
['a', 'b', 'c'],
[]
],
'all different' => [
['a', 'b'],
['c', 'd'],
['a', 'b', 'c', 'd']
],
'empty arrays' => [
[],
[],
[]
]
];
}
/**
* Undocumented function
*
* @return array
*/
public function inArrayAnyProvider(): array
{
return [
'all exist in haystack' => [
[1],
[1, 2, 3, 4],
[1]
],
'not all exist in haystack' => [
[1, 5],
[1, 2, 3, 4],
[1]
],
'none exist in haystack' => [
[5],
[1, 2, 3, 4],
false
],
];
}
public function genAssocArrayProvider(): array
{
return [
'non set' => [
[
0 => ['a' => 'a1', 'b' => 2],
1 => ['a' => 'a2', 'b' => 3],
2 => ['a' => '', 'b' => null],
],
false,
false,
false,
[],
],
'key set' => [
[
0 => ['a' => 'a1', 'b' => 2],
1 => ['a' => 'a2', 'b' => 3],
2 => ['a' => '', 'b' => null],
],
'a',
false,
false,
['a1' => 0, 'a2' => 1],
],
'value set' => [
[
0 => ['a' => 'a1', 'b' => 2],
1 => ['a' => 'a2', 'b' => 3],
2 => ['a' => '', 'b' => null],
],
false,
'a',
false,
[0 => 'a1', 1 => 'a2', 2 => ''],
],
'key and value set, add empty, null' => [
[
0 => ['a' => 'a1', 'b' => 2],
1 => ['a' => 'a2', 'b' => 3],
2 => ['a' => '', 'b' => null],
],
'a',
'b',
false,
['a1' => 2, 'a2' => 3],
],
'key and value set, add empty' => [
[
0 => ['a' => 'a1', 'b' => 2],
1 => ['a' => 'a2', 'b' => 3],
2 => ['a' => '', 'b' => ''],
3 => ['a' => 'a4', 'b' => ''],
],
'a',
'b',
false,
['a1' => 2, 'a2' => 3, 'a4' => ''],
],
'key/value set, skip empty' => [
[
0 => ['a' => 'a1', 'b' => 2],
1 => ['a' => 'a2', 'b' => 3],
2 => ['a' => '', 'b' => null],
],
'a',
'b',
true,
['a1' => 2, 'a2' => 3],
],
];
}
/**
* Undocumented function
*
* @return array
*/
public function flattenArrayProvider(): array
{
return [
'array key/value, single' => [
0 => ['a' => 'foo', 1 => 'bar', 'c' => 2],
1 => ['foo', 'bar', 2],
2 => ['a', 1, 'c'],
3 => ['a', 1, 'c'],
],
'array values, single' => [
0 => ['foo', 'bar', 2],
1 => ['foo', 'bar', 2],
2 => [0, 1, 2],
3 => [0, 1, 2],
],
'array key/value, multi' => [
0 => [
'a' => ['a1' => 'a1foo', 'a2' => 'a1bar'],
1 => 'bar',
'c' => [2, 3, 4],
'd' => [
'e' => [
'de1' => 'subfoo', 'de2' => 'subbar', 'a2' => 'a1bar'
]
]
],
1 => ['a1foo', 'a1bar', 'bar', 2, 3, 4, 'subfoo', 'subbar', 'a1bar'],
2 => ['a', 'a1', 'a2', 1, 'c', 0, 1, 2, 'd', 'e', 'de1', 'de2', 'a2'],
3 => ['a1', 'a2', 1, 0, 1, 2, 'de1', 'de2', 'a2'],
],
'array with double values' => [
0 => ['a', 'a', 'b'],
1 => ['a', 'a', 'b'],
2 => [0, 1, 2],
3 => [0, 1, 2],
]
];
}
/**
* use the flattenArrayProvider and replace 1 with 2 array pos
*
* @return array
*/
public function flattenArrayKeyProvider(): array
{
$list = [];
foreach ($this->flattenArrayProvider() as $key => $row) {
$list[$key] = [
$row[0],
$row[2],
];
}
return $list;
}
/**
* use the flattenArrayProvider and replace 1 with array pos
*
* @return array
*/
public function flattenArrayKeyLeavesOnlyProvider(): array
{
$list = [];
foreach ($this->flattenArrayProvider() as $key => $row) {
$list[$key] = [
$row[0],
$row[3],
];
}
return $list;
}
/**
* Undocumented function
*
* @return array
*/
public function arrayFlatForKeyProvider(): array
{
return [
'all present, single level' => [
0 => [
'a' => ['b1' => 'foo', 'a2' => 'a-foo'],
'b' => ['b1' => 'bar', 'a2' => 'b-foo'],
'c' => ['b1' => 'foobar', 'a2' => 'c-foo'],
],
1 => 'a2',
2 => [
'a' => 'a-foo',
'b' => 'b-foo',
'c' => 'c-foo',
],
],
'no sub arrays' => [
0 => ['a', 'b', 'c'],
1 => 'a',
2 => ['a', 'b', 'c'],
],
'sub arrays with missing' => [
0 => [
'a' => ['b1' => 'foo', 'a2' => 'a-foo'],
'b' => ['b1' => 'bar'],
'c' => ['b1' => 'foobar', 'a2' => 'c-foo'],
],
1 => 'a2',
2 => [
'a' => 'a-foo',
'b' => ['b1' => 'bar'],
'c' => 'c-foo',
],
],
'deep nested sub arrays' => [
0 => [
'a' => [
'b1' => 'foo',
'a2' => [
'text' => ['a-foo', 'a-bar'],
],
],
'b' => [
'b1' => 'bar',
'a2' => [
'text' => 'b-foo',
],
],
],
1 => 'a2',
2 => [
'a' => [
'text' => ['a-foo', 'a-bar'],
],
'b' => [
'text' => 'b-foo',
],
],
]
];
}
/**
* Undocumented function
*
* @covers ::arraySearchRecursive
* @dataProvider arraySearchRecursiveProvider
* @testdox arraySearchRecursive $needle (key $key_search_for) in $input and will be $expected [$_dataName]
*
* @param string|null $needle
* @param array $input
* @param string|null $key_search_for
* @return void
*/
public function testArraySearchRecursive($needle, array $input, ?string $key_search_for, array $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Combined\ArrayHandler::arraySearchRecursive($needle, $input, $key_search_for)
);
}
/**
* Undocumented function
*
* @covers ::arraySearchRecursiveAll
* @dataProvider arraySearchRecursiveAllProvider
* @testdox arraySearchRecursiveAll $needle (key $key_search_for) in $input and will be $expected (old: $flag) [$_dataName]
*
* @param string|null $needle
* @param array $input
* @param string|null $key_search_for
* @param bool $flag
* @return void
*/
public function testArraySearchRecursiveAll($needle, array $input, ?string $key_search_for, bool $flag, array $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Combined\ArrayHandler::arraySearchRecursiveAll($needle, $input, $key_search_for, $flag)
);
}
/**
* Undocumented function
*
* @covers ::arraySearchSimple
* @dataProvider arraySearchSimpleProvider
* @testdox arraySearchSimple $input searched with key: $key / value: $value (strict: $flag) will be $expected [$_dataName]
*
* @param array $input
* @param string|int $key
* @param string|int $value
* @param bool $expected
* @return void
*/
public function testArraySearchSimple(array $input, $key, $value, bool $flag, bool $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Combined\ArrayHandler::arraySearchSimple($input, $key, $value, $flag)
);
}
/**
* Undocumented function
*
* @covers ::arrayMergeRecursive
* @#dataProvider arrayMergeRecursiveProvider
* @testdox arrayMergeRecursive ... will be $expected [$_dataName]
*
* @param array $input nested array set as each parameter
* @param bool $flag
* @param bool|array $expected
* @return void
* array $input, bool $flag, $expected
*/
public function testArrayMergeRecursive(): void
{
$this->assertTrue(true, 'Implement proper test run');
$this->markTestIncomplete(
'testArrayMergeRecursive has not been implemented yet.'
);
}
/**
* Undocumented function
*
* @covers ::arrayDiff
* @dataProvider arrayCompareProvider
* @testdox arrayDiff $input_a diff $input_b will be $expected [$_dataName]
*
* @param array $input_a
* @param array $input_b
* @param array $expected
* @return void
*/
public function testArrayDiff(array $input_a, array $input_b, array $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Combined\ArrayHandler::arrayDiff($input_a, $input_b)
);
}
/**
* Undocumented function
*
* @covers ::inArrayAny
* @dataProvider inArrayAnyProvider
* @testdox inArrayAny needle $input_a in haystack $input_b will be $expected [$_dataName]
*
* @param array $input_a
* @param array $input_b
* @param array|bool $expected
* @return void
*/
public function testInArrayAny(array $input_a, array $input_b, $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Combined\ArrayHandler::inArrayAny($input_a, $input_b)
);
}
/**
* Undocumented function
*
* @covers ::genAssocArray
* @dataProvider genAssocArrayProvider
* @testdox genAssocArray array $input with $key or $value and flag set only $flag will be $expected [$_dataName]
*
* @param array $input
* @param string|int|bool $key
* @param string|int|bool $value
* @param bool $flag
* @param array $expected
* @return void
*/
public function testGenAssocArray(array $input, $key, $value, bool $flag, array $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Combined\ArrayHandler::genAssocArray($input, $key, $value, $flag)
);
}
/**
* Undocumented function
*
* @covers ::flattenArray
* @dataProvider flattenArrayProvider
* @testdox testFlattenArray array $input will be $expected [$_dataName]
*
* @param array $input
* @param array $expected
* @return void
*/
public function testFlattenyArray(array $input, array $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Combined\ArrayHandler::flattenArray($input)
);
}
/**
* Undocumented function
*
* @covers ::flattenArrayKey
* @dataProvider flattenArrayKeyProvider
* @testdox flattenArrayKey array $input will be $expected [$_dataName]
*
* @param array $input
* @param array $expected
* @return void
*/
public function testFlattenArrayKey(array $input, array $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Combined\ArrayHandler::flattenArrayKey($input)
);
}
/**
* Undocumented function
*
* @covers ::flattenArrayKeyLeavesOnly
* @dataProvider flattenArrayKeyLeavesOnlyProvider
* @testdox flattenArrayKeyLeavesOnly array $input will be $expected [$_dataName]
*
* @param array $input
* @param array $expected
* @return void
*/
public function testFlattenArrayKeyLeavesOnly(array $input, array $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Combined\ArrayHandler::flattenArrayKeyLeavesOnly($input)
);
}
/**
* Undocumented function
*
* @covers ::arrayFlatForKey
* @dataProvider arrayFlatForKeyProvider
* @testdox arrayFlatForKey array $input will be $expected [$_dataName]
*
* @param array $input
* @param array $expected
* @return void
*/
public function testArrayFlatForKey(array $input, $search, array $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Combined\ArrayHandler::arrayFlatForKey($input, $search)
);
}
}
// __END__

View File

@@ -1,630 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Combined\DateTime
* @coversDefaultClass \CoreLibs\Combined\DateTime
* @testdox \CoreLibs\Combined\DateTime method tests
*/
final class CoreLibsCombinedDateTimeTest extends TestCase
{
/**
* timestamps
*
* @return array
*/
public function timestampProvider(): array
{
return [
'valid timestamp no microtime' => [
1641515890,
false,
false,
'2022-01-07 09:38:10',
],
'valid timestamp with microtime' => [
1641515890,
true,
false,
'2022-01-07 09:38:10',
],
'valid timestamp with microtime float' => [
1641515890,
true,
true,
'2022-01-07 09:38:10',
],
'valid micro timestamp with microtime' => [
1641515890.123456,
true,
false,
'2022-01-07 09:38:10 1235ms',
],
'valid micro timestamp with microtime float' => [
1641515890.123456,
true,
true,
'2022-01-07 09:38:10.1235',
],
'valid micro timestamp no microtime' => [
1641515890.123456,
false,
false,
'2022-01-07 09:38:10',
],
'invalid timestamp' => [
-123123,
false,
false,
'1969-12-30 22:47:57',
],
];
}
/**
* interval for both directions
*
* @return array
*/
public function intervalProvider(): array
{
return [
'interval no microtime' => [
1641515890,
false,
'18999d 0h 38m 10s',
],
'interval with microtime' => [
1641515890,
true,
'18999d 0h 38m 10s',
],
'micro interval no microtime' => [
1641515890.123456,
false,
'18999d 0h 38m 10s',
],
'micro interval with microtime' => [
1641515890.123456,
true,
'18999d 0h 38m 10s 1235ms',
],
'negative interval no microtime' => [
-1641515890,
false,
'-18999d 0h 38m 10s',
],
// short for mini tests
'microtime only' => [
0.123456,
true,
'0s 1235ms',
],
'seconds only' => [
30.123456,
true,
'30s 1235ms',
],
'minutes only' => [
90.123456,
true,
'1m 30s 1235ms',
],
'hours only' => [
3690.123456,
true,
'1h 1m 30s 1235ms',
],
'days only' => [
90090.123456,
true,
'1d 1h 1m 30s 1235ms',
],
'already set' => [
'1d 1h 1m 30s 1235ms',
true,
'1d 1h 1m 30s 1235ms',
],
'invalid data' => [
'xyz',
true,
'0s',
],
'out of bounds timestamp' => [
999999999999999,
false,
'1s'
]
];
}
/**
* Undocumented function
*
* @return array
*/
public function reverseIntervalProvider(): array
{
return [
'interval no microtime' => [
'18999d 0h 38m 10s',
1641515890,
],
'micro interval with microtime' => [
'18999d 0h 38m 10s 1235ms',
1641515890.1235,
],
'micro interval with microtime' => [
'18999d 0h 38m 10s 1234567890ms',
1641515890.1234567,
],
'negative interval no microtime' => [
'-18999d 0h 38m 10s',
-1641515890,
],
// short for mini tests
'microtime only' => [
'0s 1235ms',
0.1235,
],
'seconds only' => [
'30s 1235ms',
30.1235,
],
'minutes only' => [
'1m 30s 1235ms',
90.1235,
],
'hours only' => [
'1h 1m 30s 1235ms',
3690.1235,
],
'days only' => [
'1d 1h 1m 30s 1235ms',
90090.1235,
],
'already set' => [
1641515890,
1641515890,
],
'invalid data' => [
'xyz',
'xyz',
],
'out of bound data' => [
'99999999999999999999d',
8.64E+24
],
];
}
/**
* Undocumented function
*
* @return array
*/
public function dateProvider(): array
{
return [
'valid date with -' => [
'2021-12-12',
true,
],
'valid date with /' => [
'2021/12/12',
true,
],
'valid date time with -' => [
'2021-12-12 12:12:12',
true,
],
'invalid date' => [
'2021-31-31',
false,
],
'invalid date string' => [
'xyz',
false,
],
'out of bound date' => [
'9999-12-31',
true
]
];
}
/**
* Undocumented function
*
* @return array
*/
public function dateTimeProvider(): array
{
return [
'valid date time with -' => [
'2021-12-12 12:12:12',
true,
],
'valid date time with /' => [
'2021/12/12 12:12:12',
true,
],
'vald date time with hour/min' => [
'2021/12/12 12:12',
true,
],
'valid date missing time' => [
'2021-12-12',
false,
],
'valid date invalid time string' => [
'2021-12-12 ab:cd',
false,
],
'invalid hour +' => [
'2021-12-12 35:12',
false,
],
'invalid hour -' => [
'2021-12-12 -12:12',
false,
],
'invalid minute +' => [
'2021-12-12 23:65:12',
false,
],
'invalid minute -' => [
'2021-12-12 23:-12:12',
false,
],
'invalid seconds +' => [
'2021-12-12 23:12:99',
false,
],
'invalid seconds -' => [
'2021-12-12 23:12:-12',
false,
],
'invalid seconds string' => [
'2021-12-12 23:12:ss',
false,
],
];
}
/**
* Undocumented function
*
* @return array
*/
public function dateCompareProvider(): array
{
return [
'first date smaller' => [
'2020-12-12',
'2021-12-12',
-1,
],
'dates equal' => [
'2020-12-12',
'2020-12-12',
0,
],
'second date smaller' => [
'2021-12-12',
'2020-12-12',
1
],
'dates equal with different time' => [
'2020-12-12 12:12:12',
'2020-12-12 13:13:13',
0,
],
'invalid dates --' => [
'--',
'--',
false
],
'empty dates' => [
'',
'',
false
],
'invalid dates' => [
'not a date',
'not a date either',
false,
],
'out of bound dates' => [
'1900-1-1',
'9999-12-31',
-1
]
];
}
public function dateTimeCompareProvider(): array
{
return [
'first date smaller no time' => [
'2020-12-12',
'2021-12-12',
-1,
],
'dates equal no timestamp' => [
'2020-12-12',
'2020-12-12',
0,
],
'second date smaller no timestamp' => [
'2021-12-12',
'2020-12-12',
1
],
'date equal first time smaller' => [
'2020-12-12 12:12:12',
'2020-12-12 13:13:13',
-1,
],
'date equal time equal' => [
'2020-12-12 12:12:12',
'2020-12-12 12:12:12',
0,
],
'date equal second time smaller' => [
'2020-12-12 13:13:13',
'2020-12-12 12:12:12',
1,
],
'valid date invalid time' => [
'2020-12-12 13:99:13',
'2020-12-12 12:12:99',
false,
],
'invalid datetimes --' => [
'--',
'--',
false,
],
'empty datetimess' => [
'',
'',
false,
],
'invalid datetimes' => [
'not a date',
'not a date either',
false,
],
];
}
/**
* Undocumented function
*
* @return array
*/
public function daysIntervalProvider(): array
{
return [
'valid interval /, not named array' => [
'2020/1/1',
'2020/1/30',
false,
[29, 22, 8],
],
'valid interval /, named array' => [
'2020/1/1',
'2020/1/30',
true,
['overall' => 29, 'weekday' => 22, 'weekend' => 8],
],
'valid interval -' => [
'2020-1-1',
'2020-1-30',
false,
[29, 22, 8],
],
'valid interval switched' => [
'2020/1/30',
'2020/1/1',
false,
[28, 0, 0],
],
'valid interval with time' => [
'2020/1/1 12:12:12',
'2020/1/30 13:13:13',
false,
[28, 21, 8],
],
'invalid dates' => [
'abc',
'xyz',
false,
[0, 0, 0]
],
// this test will take a long imte
'out of bound dates' => [
'1900-1-1',
'9999-12-31',
false,
[2958463,2113189,845274],
],
];
}
/**
* date string convert test
*
* @covers ::dateStringFormat
* @dataProvider timestampProvider
* @testdox dateStringFormat $input (microtime $flag) will be $expected [$_dataName]
*
* @param int|float $input
* @param bool $flag
* @param string $expected
* @return void
*/
public function testDateStringFormat(
$input,
bool $flag_show_micro,
bool $flag_micro_as_float,
string $expected
): void {
$this->assertEquals(
$expected,
\CoreLibs\Combined\DateTime::dateStringFormat(
$input,
$flag_show_micro,
$flag_micro_as_float
)
);
}
/**
* interval convert test
*
* @covers ::timeStringFormat
* @dataProvider intervalProvider
* @testdox timeStringFormat $input (microtime $flag) will be $expected [$_dataName]
*
* @param int|float $input
* @param bool $flag
* @param string $expected
* @return void
*/
public function testTimeStringFormat($input, bool $flag, string $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Combined\DateTime::timeStringFormat($input, $flag)
);
}
/**
* Undocumented function
*
* @covers ::stringToTime
* @dataProvider reverseIntervalProvider
* @testdox stringToTime $input will be $expected [$_dataName]
*
* @param string|int|float $input
* @param string|int|float $expected
* @return void
*/
public function testStringToTime($input, $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Combined\DateTime::stringToTime($input)
);
}
/**
* Undocumented function
*
* @covers ::checkDate
* @dataProvider dateProvider
* @testdox checkDate $input will be $expected [$_dataName]
*
* @param string $input
* @param bool $expected
* @return void
*/
public function testCheckDate(string $input, bool $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Combined\DateTime::checkDate($input)
);
}
/**
* Undocumented function
*
* @covers ::checkDateTime
* @dataProvider dateTimeProvider
* @testdox checkDateTime $input will be $expected [$_dataName]
*
* @param string $input
* @param bool $expected
* @return void
*/
public function testCheckDateTime(string $input, bool $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Combined\DateTime::checkDateTime($input)
);
}
/**
* Undocumented function
*
* @covers ::compareDate
* @dataProvider dateCompareProvider
* @testdox compareDate $input_a compared to $input_b will be $expected [$_dataName]
*
* @param string $input_a
* @param string $input_b
* @param int|bool $expected
* @return void
*/
public function testCompareDate(string $input_a, string $input_b, $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Combined\DateTime::compareDate($input_a, $input_b)
);
}
/**
* Undocumented function
*
* @covers ::compareDateTime
* @dataProvider dateTimeCompareProvider
* @testdox compareDateTime $input_a compared to $input_b will be $expected [$_dataName]
*
* @param string $input_a
* @param string $input_b
* @param int|bool $expected
* @return void
*/
public function testCompareDateTime(string $input_a, string $input_b, $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Combined\DateTime::compareDateTime($input_a, $input_b)
);
}
/**
* Undocumented function
*
* @covers ::calcDaysInterval
* @dataProvider daysIntervalProvider
* @testdox calcDaysInterval $input_a compared to $input_b will be $expected [$_dataName]
* @medium
*
* @param string $input_a
* @param string $input_b
* @param bool $flag
* @param array $expected
* @return void
*/
public function testCalcDaysInterval(string $input_a, string $input_b, bool $flag, $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Combined\DateTime::calcDaysInterval($input_a, $input_b, $flag)
);
}
}
// __END__

View File

@@ -1,222 +0,0 @@
<?php
// because we have long testdox lines
// phpcs:disable Generic.Files.LineLength
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for 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
{
return [
'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)
);
}
}
// __END__

View File

@@ -1,387 +0,0 @@
<?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
],
];
}
/**
* 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
{
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,
],
// invalid values
'invalid color' => [
'rgb' => [-12, 300, 12],
'hsb' => [-12, 300, 12],
'hsl' => [-12, 300, 12],
'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'][0],
1 => $values['hsb'][1],
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'][0],
1 => $values['hsl'][1],
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
* @return void
*/
public function testRgb2hex(int $input_r, int $input_g, int $input_b, $expected_hash, $expected)
{
// 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,
$expected,
$expected_str,
string $separator,
$expected_str_sep
): void {
$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, $expected): void
{
$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, $expected): void
{
$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, $expected): void
{
$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($input_h, float $input_s, float $input_l, $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Convert\Colors::hsl2rgb($input_h, $input_s, $input_l)
);
}
}
// __END__

View File

@@ -1,102 +0,0 @@
<?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__

View File

@@ -1,188 +0,0 @@
<?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 &lt;&gt; inside',
],
'skip number' => [
0 => 1234,
1 => 1234,
],
'utf8' => [
0 => '日本語 <>',
1 => '日本語 &lt;&gt;'
]
];
}
/**
* 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__

View File

@@ -1,167 +0,0 @@
<?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
*/
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,
[]
]
];
}
/**
* json error list
*
* @return array 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 $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 string $expected
* @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)
);
}
}
// __END__

View File

@@ -1,118 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Undocumented class
* @coversDefaultClass \CoreLibs\Convert\Math
* @testdox \CoreLibs\Convert\Math method tests
*/
final class CoreLibsConvertMathTest extends TestCase
{
/**
* Undocumented function
*
* @return array<mixed>
*/
public function fceilProvider(): array
{
return [
'5.5 must be 6' => [5.5, 6],
'5.1234567890 with 5 must be 6' => [5.1234567890, 6],
'6 must be 6' => [6, 6]
];
}
/**
* Undocumented function
*
* @covers ::fceil
* @dataProvider fceilProvider
* @testdox fceil: Input $input must be $expected
*
* @param float $input
* @param int $expected
* @return void
*/
public function testMathFceilValue(float $input, int $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Convert\Math::fceil($input)
);
}
/**
* Undocumented function
*
* @return array<mixed>
*/
public function floorProvider(): array
{
return [
'5123456 with -3 must be 5123000' => [5123456, -3, 5123000],
'5123456 with -10 must be 5000000' => [5123456, -10, 5000000]
];
}
/**
* Undocumented function
*
* @covers ::floorp
* @dataProvider floorProvider
* @testdox floor: Input $input with cutoff $cutoff must be $expected
*
* @param int $input
* @param int $cutoff
* @param int $expected
* @return void
*/
public function testMathFloorValue(int $input, int $cutoff, int $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Convert\Math::floorp($input, $cutoff)
);
}
/**
* Undocumented function
*
* @return array<mixed>
*/
public function initNumericProvider(): array
{
return [
'5 must be 5' => [5, 5, 'int'],
'5.123 must be 5.123' => [5.123, 5.123, 'float'],
"'5' must be 5" => ['5', 5, 'string'],
"'5.123' must be 5.123" => ['5.123', 5.123, 'string'],
];
}
/**
* Undocumented function
*
* @covers ::initNumeric
* @dataProvider initNumericProvider
* @testdox initNumeric: Input $info $input must match $expected [$_dataName]
*
* @param int|float|string $input
* @param float $expected
* @param string $info
* @return void
*/
public function testMathInitNumericValue($input, float $expected, string $info): void
{
$this->assertEquals(
$expected,
\CoreLibs\Convert\Math::initNumeric($input)
);
}
}
// __END__

View File

@@ -1,60 +0,0 @@
<?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__

View File

@@ -1,101 +0,0 @@
<?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__

View File

@@ -1,208 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Create\Hash
* @coversDefaultClass \CoreLibs\Create\Hash
* @testdox \CoreLibs\Create\Hash method tests
*/
final class CoreLibsCreateHashTest extends TestCase
{
public function hashData(): array
{
return [
'any string' => [
'text' => 'Some String Text',
'crc32b_reverse' => 'c5c21d91', // crc32b (in revere)
'sha1Short' => '4d2bc9ba0', // sha1Short
// via hash
'crc32b' => '911dc2c5', // hash: crc32b
'adler32' => '31aa05f1', // hash: alder32
'fnv132' => '9df444f9', // hash: fnv132
'fnv1a32' => '2c5f91b9', // hash: fnv1a32
'joaat' => '50dab846', // hash: joaat
]
];
}
/**
* Undocumented function
*
* @return array
*/
public function crc32bProvider(): array
{
$list = [];
foreach ($this->hashData() as $name => $values) {
$list[$name . ' to crc32b reverse'] = [
0 => $values['text'],
1 => $values['crc32b_reverse'],
];
}
return $list;
}
/**
* Undocumented function
*
* @return array
*/
public function sha1ShortProvider(): array
{
$list = [];
foreach ($this->hashData() as $name => $values) {
$list[$name . ' to sha1 short'] = [
0 => $values['text'],
1 => $values['crc32b_reverse'],
2 => $values['sha1Short'],
];
}
return $list;
}
/**
* test all hash functions
* NOTE: if we add new hash functions in the __hash method
* they need to be added here too (and in the master hashData array too)
*
* @return array
*/
public function hashProvider(): array
{
$list = [];
foreach ($this->hashData() as $name => $values) {
foreach ([null, 'crc32b', 'adler32', 'fnv132', 'fnv1a32', 'joaat'] as $_hash_type) {
// default value test
if ($_hash_type === null) {
$hash_type = \CoreLibs\Create\Hash::STANDARD_HASH_SHORT;
} else {
$hash_type = $_hash_type;
}
$list[$name . ' to ' . $hash_type] = [
0 => $values['text'],
1 => $_hash_type,
2 => $values[$hash_type]
];
}
}
return $list;
}
/**
* Undocumented function
*
* @return array
*/
public function hashLongProvider(): array
{
$hash_source = 'Some String Text';
return [
'Long Hash check: ' . \CoreLibs\Create\Hash::STANDARD_HASH_LONG => [
$hash_source,
hash(\CoreLibs\Create\Hash::STANDARD_HASH_LONG, $hash_source)
],
];
}
/**
* Undocumented function
*
* @covers ::__crc32b
* @dataProvider crc32bProvider
* @testdox __crc32b $input will be $expected [$_dataName]
*
* @param string $input
* @param string $expected
* @return void
*/
public function testCrc32b(string $input, string $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Create\Hash::__crc32b($input)
);
}
/**
* Undocumented function
*
* @covers ::__sha1Short
* @dataProvider sha1ShortProvider
* @testdox __sha1Short $input will be $expected (crc32b) and $expected_sha1 (sha1 short) [$_dataName]
*
* @param string $input
* @param string $expected
* @return void
*/
public function testSha1Short(string $input, string $expected, string $expected_sha1): void
{
// uses crc32b
$this->assertEquals(
$expected,
\CoreLibs\Create\Hash::__sha1Short($input)
);
$this->assertEquals(
$expected,
\CoreLibs\Create\Hash::__sha1Short($input, false)
);
// sha1 type
$this->assertEquals(
$expected_sha1,
\CoreLibs\Create\Hash::__sha1Short($input, true)
);
}
/**
* Undocumented function
*
* @covers ::__hash
* @dataProvider hashProvider
* @testdox __hash $input with $hash_type will be $expected [$_dataName]
*
* @param string $input
* @param string|null $hash_type
* @param string $expected
* @return void
*/
public function testHash(string $input, ?string $hash_type, string $expected): void
{
if ($hash_type === null) {
$this->assertEquals(
$expected,
\CoreLibs\Create\Hash::__hash($input)
);
} else {
$this->assertEquals(
$expected,
\CoreLibs\Create\Hash::__hash($input, $hash_type)
);
}
}
/**
* Undocumented function
*
* @covers ::__hashLong
* @dataProvider hashLongProvider
* @testdox __hashLong $input will be $expected [$_dataName]
*
* @param string $input
* @param string $expected
* @return void
*/
public function testHashLong(string $input, string $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Create\Hash::__hashLong($input)
);
}
}
// __END__

View File

@@ -1,205 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Create\RandomKey
* @coversDefaultClass \CoreLibs\Create\RandomKey
* @testdox \CoreLibs\Create\RandomKey method tests
*/
final class CoreLibsCreateRandomKeyTest extends TestCase
{
/**
* Undocumented function
*
* @return array
*/
public function keyLenghtProvider(): array
{
return [
'valid key length' => [
0 => 6,
1 => true,
2 => 6,
],
'negative key length' => [
0 => -1,
1 => false,
2 => 4,
],
'tpp big key length' => [
0 => 300,
1 => false,
2 => 4,
],
];
}
/**
* Undocumented function
*
* @return array
*/
public function randomKeyGenProvider(): array
{
return [
'default key length' => [
0 => null,
1 => 4
],
'set -1 key length default' => [
0 => -1,
1 => 4,
],
'set too large key length' => [
0 => 300,
1 => 4,
],
'set override key lenght' => [
0 => 6,
1 => 6,
],
];
}
/**
* 1
*
* @return array
*/
public function keepKeyLengthProvider(): array
{
return [
'set too large' => [
0 => 6,
1 => 300,
2 => 6,
],
'set too small' => [
0 => 8,
1 => -2,
2 => 8,
],
'change valid' => [
0 => 10,
1 => 6,
2 => 6,
]
];
}
/**
* run before each test and reset to default 4
*
* @before
*
* @return void
*/
public function resetKeyLength(): void
{
\CoreLibs\Create\RandomKey::setRandomKeyLength(4);
}
/**
* check that first length is 4
*
* @covers ::getRandomKeyLength
* @testWith [4]
* @testdox getRandomKeyLength on init will be $expected [$_dataName]
*
* @param integer $expected
* @return void
*/
public function testGetRandomKeyLengthInit(int $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Create\RandomKey::getRandomKeyLength()
);
}
/**
* Undocumented function
*
* @covers ::setRandomKeyLength
* @covers ::getRandomKeyLength
* @dataProvider keyLenghtProvider
* @testdox setRandomKeyLength $input will be $expected, compare to $compare [$_dataName]
*
* @param integer $input
* @param boolean $expected
* @param integer $compare
* @return void
*/
public function testSetRandomKeyLength(int $input, bool $expected, int $compare): void
{
// set
$this->assertEquals(
$expected,
\CoreLibs\Create\RandomKey::setRandomKeyLength($input)
);
// read test, if false, use compare check
if ($expected === false) {
$input = $compare;
}
$this->assertEquals(
$input,
\CoreLibs\Create\RandomKey::getRandomKeyLength()
);
}
/**
* Undocumented function
*
* @covers ::randomKeyGeyn
* @dataProvider randomKeyGenProvider
* @testdox randomKeyGen use $input key length $expected [$_dataName]
*
* @param integer|null $input
* @param integer $expected
* @return void
*/
public function testRandomKeyGen(?int $input, int $expected): void
{
if ($input === null) {
$this->assertEquals(
$expected,
strlen(\CoreLibs\Create\RandomKey::randomKeyGen())
);
} else {
$this->assertEquals(
$expected,
strlen(\CoreLibs\Create\RandomKey::randomKeyGen($input))
);
}
}
/**
* Check that if set to n and then invalid, it keeps the previous one
* or if second change valid, second will be shown
*
* @covers ::setRandomKeyLength
* @dataProvider keepKeyLengthProvider
* @testdox keep setRandomKeyLength set with $input_valid and then $input_invalid will be $expected [$_dataName]
*
* @param integer $input_valid
* @param integer $input_invalid
* @param integer $expected
* @return void
*/
public function testKeepKeyLength(int $input_valid, int $input_invalid, int $expected): void
{
\CoreLibs\Create\RandomKey::setRandomKeyLength($input_valid);
\CoreLibs\Create\RandomKey::setRandomKeyLength($input_invalid);
$this->assertEquals(
$expected,
\CoreLibs\Create\RandomKey::getRandomKeyLength()
);
}
}
// __END__

View File

@@ -1,104 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Create\Session
* @coversDefaultClass \CoreLibs\Create\Session
* @testdox \CoreLibs\Create\Session method tests
*/
final class CoreLibsCreateSessionTest extends TestCase
{
/**
* Undocumented function
*
* @return array
*/
public function sessionProvider(): array
{
return [
'session parameter' => [
'sessionNameParameter',
'p',
'sessionNameParameter',
'/^\w+$/'
],
'session globals' => [
'sessionNameGlobals',
'g',
'sessionNameGlobals',
'/^\w+$/'
],
'session constant' => [
'sessionNameConstant',
'c',
'sessionNameConstant',
'/^\w+$/'
],
];
}
/**
* Undocumented function
*
* @return void
*/
protected function setUp(): void
{
if (session_id()) {
session_destroy();
}
}
/**
* Undocumented function
*
* @dataProvider sessionProvider
* @testdox startSession $input name for $type will be $expected_n with $expected_i [$_dataName]
*
* @param string $input
* @param string $type
* @param string|bool $expected_n
* @param string|bool $expected_i
* @return void
*/
public function testStartSession(string $input, string $type, $expected_n, $expected_i): void
{
/* $session_id = '';
switch ($type) {
case 'p':
$session_id = \CoreLibs\Create\Session::startSession($input);
break;
case 'g':
$GLOBALS['SET_SESSION_NAME'] = $input;
$session_id = \CoreLibs\Create\Session::startSession();
break;
case 'c':
define('SET_SESSION_NAME', $input);
$session_id = \CoreLibs\Create\Session::startSession();
break;
}
$this->assertMatchesRegularExpression(
$expected_i,
(string)$session_id
);
$this->assertMatchesRegularExpression(
$expected_i,
(string)\CoreLibs\Create\Session::getSessionId()
);
$this->assertEquals(
$expected_n,
\CoreLibs\Create\Session::getSessionName()
);
if ($type == 'g') {
unset($GLOBALS['SET_SESSION_NAME']);
} */
$this->markTestSkipped('No implementation for Create\Session. Cannot run session_start in CLI');
}
}
// __END__

View File

@@ -1,186 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Create\Uids
* @coversDefaultClass \CoreLibs\Create\Uids
* @testdox \CoreLibs\Create\Uids method tests
*/
final class CoreLibsCreateUidsTest extends TestCase
{
/**
* Undocumented function
*
* @return array
*/
public function uniqIdProvider(): array
{
return [
'md5 hash' => [
0 => 'md5',
1 => 32,
],
'sha256 hash' => [
0 => 'sha256',
1 => 64
],
'ripemd160 hash' => [
0 => 'ripemd160',
1 => 40
],
'adler32 hash' => [
0 => 'adler32',
1 => 8
],
'not in list hash but valid' => [
0 => 'sha3-512',
1 => strlen(hash('sha3-512', 'A'))
],
'default hash not set' => [
0 => null,
1 => 64,
],
'invalid name' => [
0 => 'iamnotavalidhash',
1 => 64,
],
'auto: ' . \CoreLibs\Create\Uids::DEFAULT_HASH => [
0 => \CoreLibs\Create\Uids::DEFAULT_HASH,
1 => strlen(hash(\CoreLibs\Create\Uids::DEFAULT_HASH, 'A'))
],
'auto: ' . \CoreLibs\Create\Uids::STANDARD_HASH_LONG => [
0 => \CoreLibs\Create\Uids::STANDARD_HASH_LONG,
1 => strlen(hash(\CoreLibs\Create\Uids::STANDARD_HASH_LONG, 'A'))
],
'auto: ' . \CoreLibs\Create\Uids::STANDARD_HASH_SHORT => [
0 => \CoreLibs\Create\Uids::STANDARD_HASH_SHORT,
1 => strlen(hash(\CoreLibs\Create\Uids::STANDARD_HASH_SHORT, 'A'))
],
];
}
/**
* Undocumented function
*
* @return array
*/
public function uniqIdLongProvider(): array
{
return [
'uniq id long: ' . \CoreLibs\Create\Uids::STANDARD_HASH_LONG => [
strlen(hash(\CoreLibs\Create\Uids::STANDARD_HASH_LONG, 'A'))
],
];
}
/**
* must match 7e78fe0d-59b8-4637-af7f-e88d221a7d1e
*
* @covers ::uuidv4
* @testdox uuidv4 check that return is matching regex [$_dataName]
*
* @return void
*/
public function testUuidv4(): void
{
$uuid = \CoreLibs\Create\Uids::uuidv4();
$this->assertMatchesRegularExpression(
'/^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$/',
$uuid
);
// $this->assertStringMatchesFormat(
// '%4s%4s-%4s-%4s-%4s-%4s%4s%4s',
// $uuid
// );
}
/**
* Undocumented function
*
* @covers ::uniqId
* @dataProvider uniqIdProvider
* @testdox uniqId $input will be length $expected [$_dataName]
*
* @param string|null $input
* @param string $expected
* @return void
*/
public function testUniqId(?string $input, int $expected): void
{
if ($input === null) {
$this->assertEquals(
$expected,
strlen(\CoreLibs\Create\Uids::uniqId())
);
} else {
$this->assertEquals(
$expected,
strlen(\CoreLibs\Create\Uids::uniqId($input))
);
}
}
/**
* Because we set a constant here, we can only run one test
* so we test invalid one to force check
*
* @covers ::uniqId
* @#dataProvider uniqIdProvider
* @testWith ["invalidhash", 64]
* @testdox uniqId use DEFAULT_HASH set $input with length $expected [$_dataName]
*
* @return void
*/
public function testUnidIdDefaultHash(string $input, int $expected): void
{
define('DEFAULT_HASH', $input);
$this->assertEquals(
$expected,
strlen(\CoreLibs\Create\Uids::uniqId())
);
}
/**
* Short id, always 8 in length
*
* @covers ::uniqIdShort
* @testWith [8]
* @testdox uniqIdShort will be length $expected [$_dataName]
*
* @param integer $expected
* @return void
*/
public function testUniqIdShort(int $expected): void
{
$this->assertEquals(
$expected,
strlen(\CoreLibs\Create\Uids::uniqIdShort())
);
}
/**
* Long Id, length can change
*
* @covers ::uniqIdLong
* @dataProvider uniqIdLongProvider
* @testdox uniqIdLong will be length $expected [$_dataName]
*
* @param integer $expected
* @return void
*/
public function testUniqIdLong(int $expected): void
{
$this->assertEquals(
$expected,
strlen(\CoreLibs\Create\Uids::uniqIdLong())
);
}
}
// __END__

View File

@@ -1,48 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for DB\Extended\ArrayIO
* This will only test the PgSQL parts
* @coversDefaultClass \CoreLibs\DB\Extended\ArrayIO
* @coversDefaultClass \CoreLibs\DB\Extended\ArrayIO
* @testdox \CoreLibs\Extended\ArrayIO method tests for extended DB interface
*/
final class CoreLibsDBExtendedArrayIOTest extends TestCase
{
/**
* Undocumented function
*
* @return void
*/
protected function setUp(): void
{
if (!extension_loaded('pgsql')) {
$this->markTestSkipped(
'The PgSQL extension is not available.'
);
}
}
/**
* Undocumented function
*
* @testdox DB\Extended\ArrayIO Class tests
*
* @return void
*/
public function testDBIO()
{
$this->assertTrue(true, 'DB Extended ArrayIO Tests not implemented');
$this->markTestIncomplete(
'DB\Extended\ArrayIO Tests have not yet been implemented'
);
}
}
// __END__

File diff suppressed because it is too large Load Diff

View File

@@ -1,176 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Debug\FileWriter
* @coversDefaultClass \CoreLibs\Debug\FileWriter
* @testdox \CoreLibs\Debug\FileWriter method tests
*/
final class CoreLibsDebugFileWriterTest extends TestCase
{
/**
* Undocumented function
*
* @return array
*/
public function fsetFolderProvider(): array
{
return [
'valid log folder name' => [
0 => '/tmp/',
1 => true,
],
'invalid log folder name' => [
0 => 'some name',
1 => false,
],
'not writeable log folder name' => [
0 => '/opt',
1 => false,
]
];
}
/**
* Undocumented function
*
* @return array
*/
public function fsetFilenameProvider(): array
{
return [
'valid log file name' => [
0 => 'some_valid_name.log',
1 => true,
],
'file name contains path' => [
0 => 'log/debug.log',
1 => false,
],
'invalid log file name' => [
0 => 'invalid name',
1 => false,
]
];
}
/**
* Undocumented function
*
* @return array
*/
public function fdebugProvider(): array
{
return [
'debug with default enter' => [
0 => 'test string',
1 => null,
2 => true,
3 => 'test string' . "\n"
],
'debug with no enter' => [
0 => 'test string',
1 => false,
2 => true,
3 => 'test string'
]
];
}
/**
* Undocumented function
*
* @dataProvider fsetFolderProvider
* @testdox fsetFolder $input will match $expected [$_dataName]
*
* @param string $input
* @param boolean $expected
* @return void
*/
public function testFsetFolder(string $input, bool $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Debug\FileWriter::fsetFolder($input)
);
}
/**
* Undocumented function
*
* @dataProvider fsetFilenameProvider
* @testdox fsetFilename $input will match $expected [$_dataName]
*
* @param string $input
* @param boolean $expected
* @return void
*/
public function testFsetFilename(string $input, bool $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Debug\FileWriter::fsetFilename($input)
);
}
/**
* Undocumented function
*
* @dataProvider fdebugProvider
* @testdox fdebug write $input with enter $enter and will be $expected and written $expected_log [$_dataName]
*
* @param string $input
* @param boolean|null $enter
* @param boolean $expected
* @param string $expected_log
* @return void
*/
public function testFdebug(string $input, ?bool $enter, bool $expected, string $expected_log): void
{
// set debug log folder
$file = 'FileWriterTest.log';
$folder = '/tmp';
$debug_file = $folder . DIRECTORY_SEPARATOR . $file;
$valid_folder = \CoreLibs\Debug\FileWriter::fsetFolder($folder);
$this->assertTrue(
$valid_folder
);
$valid_file = \CoreLibs\Debug\FileWriter::fsetFilename($file);
$this->assertTrue(
$valid_file
);
// write the log line
if ($enter === null) {
$this->assertEquals(
$expected,
\CoreLibs\Debug\FileWriter::fdebug($input)
);
} else {
$this->assertEquals(
$expected,
\CoreLibs\Debug\FileWriter::fdebug($input, $enter)
);
}
if (is_file($debug_file)) {
// open file, load data, compre to expected_log
$log_data = file_get_contents($debug_file);
if ($log_data === false) {
$this->fail('fdebug file not readable or not data: ' . $debug_file);
}
$this->assertStringEndsWith(
$expected_log,
$log_data
);
unlink($debug_file);
} else {
$this->fail('fdebug file not found: ' . $debug_file);
}
}
}
// __END__

View File

@@ -1,836 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Debug\Logging
* @coversDefaultClass \CoreLibs\Debug\Logging
* @testdox \CoreLibs\Debug\Logging method tests
*/
final class CoreLibsDebugLoggingTest extends TestCase
{
public $log;
/**
* test set for options BASIC
*
* 0: options
* - null for NOT set
* 1: expected
* 2: override
* override:
* - constant for COSNTANTS
* - global for _GLOBALS
*
* @return array
*/
public function optionsProvider(): array
{
return [
'log folder set' => [
[
'log_folder' => '/tmp'
],
[
'log_folder' => '/tmp/',
'debug_all' => false,
'print_all' => false,
],
[]
],
'nothing set' => [
null,
[
'log_folder' => getcwd() . DIRECTORY_SEPARATOR,
'debug_all' => false,
'print_all' => false,
],
[]
],
'no options set, constant set' => [
null,
[
'log_folder' => '/tmp/',
'debug_all' => false,
'print_all' => false,
],
[
'constant' => [
'BASE' => '/tmp',
'LOG' => '/'
]
]
],
'standard test set' => [
[
'log_folder' => '/tmp',
'debug_all' => true,
'print_all' => true,
],
[
'log_folder' => '/tmp/',
'debug_all' => true,
'print_all' => true,
],
[]
]
];
}
/**
* adds log ID settings based on basic options
*
* @return array
*/
public function logIdOptionsProvider(): array
{
// 0: options
// 1: expected
// 2: override
return [
'no log id set' => [
null,
[
'log_file_id' => ''
],
[]
],
// set log id manually afterwards
'set log id manually' => [
null,
[
'log_file_id' => '',
'set_log_file_id' => 'abc123',
],
[
// set post launch
'values' => [
'log_file_id' => 'abc123'
]
]
],
// set log id from options
'set log id via options' => [
[
'file_id' => 'abc456',
],
[
'log_file_id' => 'abc456'
],
[]
],
// set log id from GLOBALS [DEPRECATED]
'set log id via globals' => [
null,
[
'log_file_id' => 'def123'
],
[
'globals' => [
'LOG_FILE_ID' => 'def123'
]
]
],
// set log id from CONSTANT [DEPRECATED]
'set log id via constant' => [
null,
[
'log_file_id' => 'ghi123'
],
[
// reset global
'globals' => [
'LOG_FILE_ID' => null
],
'constant' => [
'LOG_FILE_ID' => 'ghi123'
]
]
],
// invalid, keep previous set
'invalid log id' => [
[
'file_id' => 'jkl456'
],
[
'log_file_id' => 'jkl456',
'set_log_file_id' => 'jkl456',
],
[
'values' => [
'log_file_id' => './#'
]
]
]
];
}
/**
* Undocumented function
*
* @return array
*/
public function logLevelAllProvider(): array
{
return [
'debug all true' => [
'debug',
true,
true,
true,
],
'echo all true' => [
'echo',
true,
true,
true,
],
'print all true' => [
'print',
true,
true,
true,
],
'set invalid level' => [
'invalud',
true,
false,
false,
],
];
}
/**
* Undocumented function
*
* @return array
*/
public function logLevelProvider(): array
{
return [
'set debug on for level A,B,C and check full set' => [
'debug',
'on',
['A', 'B', 'C'],
true,
null,
[
'A' => true,
'B' => true,
'C' => true,
]
],
'set debug off for level A,B,C and check A' => [
'debug',
'off',
['A', 'B', 'C'],
true,
'A',
true,
],
// set one to false
'set debug off for level A, B to false and check all' => [
'debug',
'off',
['A', 'B' => false],
true,
null,
[
'A' => true,
'B' => false,
],
],
// set invalid type
'set invalid level' => [
'invalid',
'',
[],
false,
null,
false
],
// set invalid flag
'set invalid on flag' => [
'print',
'invalid',
[],
false,
null,
false
],
// missing debug array set
'missing debug level array' => [
'print',
'off',
[],
false,
null,
[]
],
// set but check no existing
'set level but check no exisitng' => [
'print',
'on',
['A'],
true,
'C',
false
]
];
}
/**
* Undocumented function
*
* @return array
*/
public function logPerProvider(): array
{
return [
'level set true' => [
'level',
true,
true,
true,
],
'class set true' => [
'class',
true,
true,
true,
],
'page set true' => [
'page',
true,
true,
true,
],
'run set true' => [
'run',
true,
true,
true,
],
'set invalid type' => [
'invalid',
true,
false,
false,
]
];
}
/**
* Undocumented function
*
* @return array
*/
public function prArProvider(): array
{
return [
'simple array' => [
[
'A' => 'foobar'
],
"##HTMLPRE##Array\n(\n"
. " [A] => foobar\n"
. ")\n"
. "##/HTMLPRE##"
],
'empty array' => [
[],
"##HTMLPRE##Array\n(\n"
. ")\n"
. "##/HTMLPRE##"
],
'nested array' => [
[
'A' => [
'B' => 'bar'
]
],
"##HTMLPRE##Array\n(\n"
. " [A] => Array\n"
. " (\n"
. " [B] => bar\n"
. " )\n"
. "\n"
. ")\n"
. "##/HTMLPRE##"
],
];
}
/**
* Undocumented function
*
* 0: array $options
* 1: array $debug_msg
* 2: boolean $expected_debug
* 3: string $expected_file
* 4: string $expected_string_start
* 5: string $expected_string_contains
*
* @return array
*/
public function debugProvider(): array
{
// error message to pass in
$error_msg['A'] = [
'level' => 'A',
'string' => 'error msg',
'strip' => false,
'prefix' => '',
];
// file content to check
$file_msg['A'] = "{PHPUnit\TextUI\Command} <A> - error msg\n";
// string messages to check
$string_msg['A'] = [
's' => '<div style="text-align: left; padding: 5px; font-size: 10px; '
. 'font-family: sans-serif; border-top: 1px solid black; '
. 'border-bottom: 1px solid black; margin: 10px 0 10px 0; '
. 'background-color: white; color: black;">'
. '<div style="font-size: 12px;">{<span style="font-style: '
. 'italic; color: #928100;">PHPUnit\TextUI\Command</span>}'
. '</div><div style="font-size: 12px;">[<span style="font-style: '
. 'italic; color: #c56c00;">A</span>] </div><div>[<span '
. 'style="font-weight: bold; color: #5e8600;">',
'c' => 'PHPUnit\TextUI\Command</span>} - error msg</div><!--#BR#-->',
];
// array provider
return [
'A debug: on, print: on, echo: on' => [
[
'debug_all' => true,
'print_all' => true,
'echo_all' => true,
],
$error_msg['A'],
true,
$file_msg['A'],
$string_msg['A']['s'],
$string_msg['A']['c'],
],
'B debug: on, print: off, echo: on' => [
[
'debug_all' => true,
'print_all' => false,
'echo_all' => true,
],
$error_msg['A'],
true,
'',
$string_msg['A']['s'],
$string_msg['A']['c'],
],
'C debug: on, print: on, echo: off' => [
[
'debug_all' => true,
'print_all' => true,
'echo_all' => false,
],
$error_msg['A'],
true,
$file_msg['A'],
'',
'',
],
'D debug: on, print: off, echo: off' => [
[
'debug_all' => true,
'print_all' => false,
'echo_all' => false,
],
$error_msg['A'],
false,
'',
'',
''
],
'E debug: off, print: off, echo: off' => [
[
'debug_all' => false,
'print_all' => false,
'echo_all' => false,
],
$error_msg['A'],
false,
'',
'',
''
]
// TODO more tests with different error messages
];
}
/**
* init logging class
*
* @dataProvider optionsProvider
* @testdox init test [$_dataName]
*
* @param array|null $options
* @param array $expected
* @param array $override
* @return void
*/
public function testClassInit(?array $options, array $expected, array $override): void
{
if (!empty($override['constant'])) {
foreach ($override['constant'] as $var => $value) {
define($var, $value);
}
}
if ($options === null) {
$this->log = new \CoreLibs\Debug\Logging();
} else {
$this->log = new \CoreLibs\Debug\Logging($options);
}
// check that settings match
$this->assertEquals(
$expected['log_folder'],
$this->log->getSetting('log_folder')
);
$this->assertEquals(
$expected['debug_all'],
$this->log->getSetting('debug_output_all')
);
$this->assertEquals(
$expected['print_all'],
$this->log->getSetting('print_output_all')
);
// print "LOG: " . $this->log->getSetting('log_folder') . "\n";
// print "DEBUG: " . $this->log->getSetting('debug_output_all') . "\n";
// print "PRINT: " . $this->log->getSetting('print_output_all') . "\n";
}
/**
* test the setting and getting of LogId
*
* @covers ::setLogId
* @dataProvider logIdOptionsProvider
* @testdox log id set/get tests [$_dataName]
*
* @param array|null $options
* @param array $expected
* @param array $override
* @return void
*/
public function testLogId(?array $options, array $expected, array $override): void
{
// we need to set with file_id option, globals LOG_FILE_ID, constant LOG_FILE_ID
if (!empty($override['constant'])) {
foreach ($override['constant'] as $var => $value) {
define($var, $value);
}
}
if (!empty($override['globals'])) {
foreach ($override['globals'] as $var => $value) {
$GLOBALS[$var] = $value;
}
}
if ($options === null) {
$this->log = new \CoreLibs\Debug\Logging();
} else {
$this->log = new \CoreLibs\Debug\Logging($options);
}
// check current
$this->assertEquals(
$this->log->getLogId(),
$expected['log_file_id']
);
// we need to override now too
if (!empty($override['values'])) {
// check if we have values, set them post and assert
$this->log->basicSetLogId($override['values']['log_file_id']);
$this->assertEquals(
$this->log->getLogId(),
$expected['set_log_file_id']
);
}
}
/**
* check set/get for log level all flag
*
* @dataProvider logLevelAllProvider
* @testdox set/get all log level $type with flag $flag [$_dataName]
*
* @param string $type
* @param bool $flag
* @param bool $expected_set
* @param bool $expected_get
* @return void
*/
public function testSetGetLogLevelAll(
string $type,
bool $flag,
bool $expected_set,
bool $expected_get
): void {
// neutral start with default
$this->log = new \CoreLibs\Debug\Logging();
// set and check
$this->assertEquals(
$this->log->setLogLevelAll($type, $flag),
$expected_set
);
// get and check
$this->assertEquals(
$this->log->getLogLevelAll($type),
$expected_get
);
}
/**
* checks setting for per log info level
*
* @covers ::setLogLevel
* @dataProvider logLevelProvider
* @testdox set/get log level $type to $flag check with $level [$_dataName]
*
* @param string $type
* @param string $flag
* @param array $debug_on
* @param bool $expected_set
* @param string|null $level
* @param bool|array<mixed> $expected_get
* @return void
*/
public function testSetGetLogLevel(
string $type,
string $flag,
array $debug_on,
bool $expected_set,
?string $level,
$expected_get
): void {
// neutral start with default
$this->log = new \CoreLibs\Debug\Logging();
// set
$this->assertEquals(
$this->log->setLogLevel($type, $flag, $debug_on),
$expected_set
);
// get, if level is null compare to?
$this->assertEquals(
$this->log->getLogLevel($type, $flag, $level),
$expected_get
);
}
/**
* set and get per log
* for level/class/page/run flags
*
* @covers ::setLogPer
* @dataProvider logPerProvider
* @testdox set/get log per $type with $set [$_dataName]
*
* @param string $type
* @param boolean $set
* @param boolean $expected_set
* @param boolean $expected_get
* @return void
*/
public function testSetGetLogPer(
string $type,
bool $set,
bool $expected_set,
bool $expected_get
): void {
// neutral start with default
$this->log = new \CoreLibs\Debug\Logging();
// set and check
$this->assertEquals(
$this->log->setLogPer($type, $set),
$expected_set
);
// get and check
$this->assertEquals(
$this->log->getLogPer($type),
$expected_get
);
}
/**
* set the print log file date part
*
* @covers ::setGetLogPrintFileDate
* @testWith [true, true, true]
* [false, false, false]
* @testdox set/get log file date to $input [$_dataName]
*
* @param boolean $input
* @param boolean $expected_set
* @param boolean $expected_get
* @return void
*/
public function testSetGetLogPrintFileDate(bool $input, bool $expected_set, bool $expected_get): void
{
// neutral start with default
$this->log = new \CoreLibs\Debug\Logging();
// set and check
$this->assertEquals(
$this->log->setGetLogPrintFileDate($input),
$expected_set
);
$this->assertEquals(
$this->log->setGetLogPrintFileDate(),
$expected_get
);
}
/**
* convert array to string with ## pre replace space holders
*
* @covers ::prAr
* @dataProvider prArProvider
* @testdox check prAr array to string conversion [$_dataName]
*
* @param array $input
* @param string $expected
* @return void
*/
public function testPrAr(array $input, string $expected): void
{
$this->log = new \CoreLibs\Debug\Logging();
$this->assertEquals(
$this->log->prAr($input),
$expected
);
}
// from here are complex debug tests
/**
* Test debug flow
*
* @covers ::debug
* @dataProvider debugProvider
* @testdox check debug flow: $expected_debug [$_dataName]
*
* @param array $options
* @param array $debug_msg
* @param boolean $expected_debug
* @param string $expected_file
* @param string $expected_string_start
* @param string $expected_string_contains
* @return void
*/
public function testDebug(
array $options,
array $debug_msg,
bool $expected_debug,
string $expected_file,
string $expected_string_start,
string $expected_string_contains,
): void {
// must run with below matrix
// level | debug | print | echo | debug() | printErrorMsg() | file
// A 1/1/1 | on | on | on | true | 'string' | on
// B 1/0/1 | on | off | on | true | 'string' | off
// C 1/1/0 | on | on | off | true | '' | on
// D 1/0/0 | on | off | off | false | '' | off
// E 0/1/1 | off | on | on | false | '' | off
// F 0/0/1 | off | off | on | false | '' | off
// G 0/1/0 | off | on | off | false | '' | off
// H 0/0/0 | off | off | off | false | '' | off
// * debug off
// return false on debug(),
// return false on writeErrorMsg()
// empty string on printErrorMsg
// * print off
// return true on debug(),
// return false on writeErrorMsg()
// empty string on printErrorMsg
// * echo off
// return true on debug(),
// empty string on printErrorMsg
// fillxed error_msg array
// overwrite any previous set from test
$options['file_id'] = 'TestDebug';
// set log folder to temp
$options['log_folder'] = '/tmp/';
// remove any files named /tmp/error_log_TestDebug*.log
array_map('unlink', glob($options['log_folder'] . 'error_msg_' . $options['file_id'] . '*.log'));
// init logger
$this->log = new \CoreLibs\Debug\Logging($options);
// * debug (A/B)
// NULL check for strip/prefix
$this->assertEquals(
$this->log->debug(
$debug_msg['level'],
$debug_msg['string'],
$debug_msg['strip'],
$debug_msg['prefix'],
),
$expected_debug
);
// * if print check data in log file
$log_file = $this->log->getLogFileName();
if (!empty($options['debug_all']) && !empty($options['print_all'])) {
// file name matching
$this->assertStringStartsWith(
$options['log_folder'] . 'error_msg_' . $options['file_id'],
$log_file,
);
// cotents check
if (!is_file($log_file)) {
$this->fail('error msg file not found: ' . $log_file);
} else {
$log_data = file_get_contents($log_file);
if ($log_data === null) {
$this->fail('error msg file not readable or not data: ' . $log_file);
}
// file content matching
$this->assertStringEndsWith(
$expected_file,
$log_data,
);
}
} else {
// there should be no file there
$this->assertEquals(
$log_file,
''
);
}
// ** ECHO ON
$log_string = $this->log->printErrorMsg();
// * print
if (!empty($options['debug_all']) && !empty($options['echo_all'])) {
// print $this->log->printErrorMsg() . "\n";
// echo string must start with
$this->assertStringStartsWith(
$expected_string_start,
$log_string
);
// echo string must containt
$this->assertStringContainsString(
$expected_string_contains,
$log_string
);
// TODO: as printing directly is not really done anymore tests below are todo
// * get error msg (getErrorMsg)
// * merge error msg (mergeErrors)
// * print merged (printErrorMsg)
// * reset A (resetErrorMsg)
// * reset ALL (resetErrorMsg)
} else {
$this->assertEquals(
$log_string,
''
);
}
}
}
// __END__

View File

@@ -1,129 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Debug\RunningTime
* @coversDefaultClass \CoreLibs\Debug\RunningTime
* @testdox \CoreLibs\Debug\RunningTime method tests
*/
final class CoreLibsDebugRunningTimeTest extends TestCase
{
public function hrRunningTimeProvider(): array
{
return [
'default time' => [
0 => null,
1 => '/^\d{4}\.\d{1,}$/'
],
'nanoseconds' => [
0 => 'ns',
1 => '/^\d{10}$/'
],
'microseconds' => [
0 => 'ys',
1 => '/^\d{7}\.\d{1,}$/'
],
'milliseconds' => [
0 => 'ms',
1 => '/^\d{4}\.\d{1,}$/'
],
'seconds' => [
0 => 's',
1 => '/^\d{1}\.\d{4,}$/'
],
'invalid fallback to ms' => [
0 => 'invalid',
1 => '/^\d{4}\.\d{1,}$/'
]
];
}
public function runningTimeProvider(): array
{
return [
'run time test' => [
0 => '/^\d{1,}\.\d{1,}$/',
1 => '/^Start: \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} 0\.\d{8}, $/',
2 => '/^Start: \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} 0\.\d{8}, '
. 'End: \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} 0\.\d{8}, '
. 'Run: \d{1,}\.\d{1,} s$/'
]
];
}
/**
* Undocumented function
*
* @cover ::hrRunningTime
* @dataProvider hrRunningTimeProvider
* @testdox hrRunningTime with $out_time matching $expected [$_dataName]
*
* @param string|null $out_time
* @param string $expected
* @return void
*/
public function testHrRunningTime(?string $out_time, string $expected): void
{
$start = \CoreLibs\Debug\RunningTime::hrRunningTime();
$this->assertEquals(
0,
$start
);
time_nanosleep(1, 500);
if ($out_time === null) {
$end = \CoreLibs\Debug\RunningTime::hrRunningTime();
} else {
$end = \CoreLibs\Debug\RunningTime::hrRunningTime($out_time);
}
// print "E: " . $end . "\n";
$this->assertMatchesRegularExpression(
$expected,
(string)$end
);
}
/**
* Undocumented function
*
* @dataProvider runningTimeProvider
* @testdox runningTime matching return $expected_number and start $expected_start end $expected_end [$_dataName]
*
* @param string $expected_number
* @param string $expected_start
* @param string $expected_end
* @return void
*/
public function testRunningTime(string $expected_number, string $expected_start, string $expected_end): void
{
$start = \CoreLibs\Debug\RunningTime::runningTime(true);
// print "Start: " . $start . "\n";
$this->assertEquals(
0,
$start
);
// print "STRING: " . \CoreLibs\Debug\RunningTime::runningTimeString() . "\n";
$this->assertMatchesRegularExpression(
$expected_start,
\CoreLibs\Debug\RunningTime::runningTimeString()
);
time_nanosleep(1, 500);
$end = \CoreLibs\Debug\RunningTime::runningTime(true);
// print "Start: " . $end . "\n";
$this->assertMatchesRegularExpression(
$expected_number,
(string)$end
);
// print "STRING: " . \CoreLibs\Debug\RunningTime::runningTimeString() . "\n";
$this->assertMatchesRegularExpression(
$expected_end,
\CoreLibs\Debug\RunningTime::runningTimeString()
);
}
}
// __END__

View File

@@ -1,326 +0,0 @@
<?php // phpcs:disable Generic.Files.LineLength
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Debug\Support
* @coversDefaultClass \CoreLibs\Debug\Support
* @testdox \CoreLibs\Debug\Support method tests
*/
final class CoreLibsDebugSupportTest extends TestCase
{
/**
* Undocumented function
*
* @return array
*/
public function printTimeProvider(): array
{
return [
'default microtime' => [
0 => null,
1 => "/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{8}$/",
],
'microtime -1' => [
0 => -1,
1 => "/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{8}$/",
],
'microtime 0' => [
0 => 0,
1 => "/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/",
],
'microtime 4' => [
0 => 4,
1 => "/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{4}$/",
],
];
}
/**
* Undocumented function
*
* @return array
*/
public function printArProvider(): array
{
return [
'empty array' => [
0 => [],
1 => "<pre>Array\n(\n)\n</pre>"
],
'simple array' => [
0 => ['a', 'b'],
1 => "<pre>Array\n(\n"
. " [0] => a\n"
. " [1] => b\n"
. ")\n</pre>"
],
];
}
/**
* Undocumented function
*
* @return array
*/
public function printToStringProvider(): array
{
return [
'string' => [
'a string',
null,
'a string',
],
'a number' => [
1234,
null,
'1234',
],
'a float number' => [
1234.5678,
null,
'1234.5678',
],
'bool true' => [
true,
null,
'TRUE',
],
'bool false' => [
false,
null,
'FALSE',
],
'an array default' => [
['a', 'b'],
null,
"<pre>Array\n(\n"
. " [0] => a\n"
. " [1] => b\n"
. ")\n</pre>",
],
'an array, no html' => [
['a', 'b'],
true,
"##HTMLPRE##"
. "Array\n(\n"
. " [0] => a\n"
. " [1] => b\n"
. ")\n"
. "##/HTMLPRE##",
],
// resource
'a resource' => [
tmpfile(),
null,
'/^Resource id #\d+$/',
],
// object
'an object' => [
new \CoreLibs\Debug\Support(),
null,
'CoreLibs\Debug\Support',
]
];
}
/**
* Undocumented function
*
* @return array
*/
public function debugStringProvider(): array
{
return [
'null string, default' => [
0 => null,
1 => null,
2 => '-'
],
'empty string, ... replace' => [
0 => '',
1 => '...',
2 => '...'
],
'filled string' => [
0 => 'some string',
1 => null,
2 => 'some string'
]
];
}
/**
* Undocumented function
*
* @cover ::printTime
* @dataProvider printTimeProvider
* @testdox printTime test with $microtime and match to regex [$_dataName]
*
* @param int|null $mircrotime
* @param string $expected
* @return void
*/
public function testPrintTime(?int $microtime, string $regex): void
{
if ($microtime === null) {
$this->assertMatchesRegularExpression(
$regex,
\CoreLibs\Debug\Support::printTime()
);
} else {
$this->assertMatchesRegularExpression(
$regex,
\CoreLibs\Debug\Support::printTime($microtime)
);
}
}
/**
* Undocumented function
*
* @cover ::printAr
* @dataProvider printArProvider
* @testdox printAr $input will be $expected [$_dataName]
*
* @param array $input
* @param string $expected
* @return void
*/
public function testPrintAr(array $input, string $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Debug\Support::printAr($input)
);
}
/**
* Undocumented function
*
* @cover ::printToString
* @dataProvider printToStringProvider
* @testdox printToString $input with $flag will be $expected [$_dataName]
*
* @param mixed $input
* @param boolean|null $flag
* @param string $expected
* @return void
*/
public function testPrintToString($input, ?bool $flag, string $expected): void
{
if ($flag === null) {
// if expected starts with / and ends with / then this is a regex compare
if (substr($expected, 0, 1) == '/' && substr($expected, -1, 1) == '/') {
$this->assertMatchesRegularExpression(
$expected,
\CoreLibs\Debug\Support::printToString($input)
);
} else {
$this->assertEquals(
$expected,
\CoreLibs\Debug\Support::printToString($input)
);
}
} else {
$this->assertEquals(
$expected,
\CoreLibs\Debug\Support::printToString($input, $flag)
);
}
}
/**
* Undocumented function
*
* @cover ::getCallerMethod
* @testWith ["testGetCallerMethod"]
* @testdox getCallerMethod check if it returns $expected [$_dataName]
*
* @return void
*/
public function testGetCallerMethod(string $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Debug\Support::getCallerMethod()
);
}
/**
* Undocumented function
*
* @cover ::getCallerMethodList
* @testWith [["main", "run", "run", "run", "run", "run", "run", "runBare", "runTest", "testGetCallerMethodList"],["main", "run", "run", "run", "run", "run", "run", "run", "runBare", "runTest", "testGetCallerMethodList"]]
* @testdox getCallerMethodList check if it returns $expected [$_dataName]
*
* @param array $expected
* @return void
*/
public function testGetCallerMethodList(array $expected, array $expected_group): void
{
$compare = \CoreLibs\Debug\Support::getCallerMethodList();
// if we direct call we have 10, if we call as folder we get 11
if (count($compare) == 10) {
$this->assertEquals(
$expected,
\CoreLibs\Debug\Support::getCallerMethodList()
);
} else {
$this->assertEquals(
$expected_group,
\CoreLibs\Debug\Support::getCallerMethodList()
);
}
}
/**
* Undocumented function
*
* @cover ::getCallerClass
* @testWith ["PHPUnit\\TextUI\\Command"]
* @testdox getCallerClass check if it returns $expected [$_dataName]
*
* @return void
*/
public function testGetCallerClass(string $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Debug\Support::getCallerClass()
);
}
/**
* Undocumented function
*
* @cover ::debugString
* @dataProvider debugStringProvider
* @testdox debugString $input with replace $replace will be $expected [$_dataName]
*
* @param string|null $input
* @param string|null $replace
* @param string $expected
* @return void
*/
public function testDebugString(?string $input, ?string $replace, string $expected)
{
if ($replace === null) {
$this->assertEquals(
$expected,
\CoreLibs\Debug\Support::debugString($input)
);
} else {
$this->assertEquals(
$expected,
\CoreLibs\Debug\Support::debugString($input, $replace)
);
}
}
}
// __END__

View File

@@ -1,196 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Get\System
* @coversDefaultClass \CoreLibs\Get\System
* @testdox \CoreLibs\Get\System method tests
*/
final class CoreLibsGetSystemTest extends TestCase
{
/**
* Undocumented function
*
* @return array
*/
public function fileUploadErrorMessageProvider(): array
{
return [
'upload err init size' => [
0 => UPLOAD_ERR_INI_SIZE,
1 => 'The uploaded file exceeds the upload_max_filesize directive in php.ini',
],
'upload err from size' => [
0 => UPLOAD_ERR_FORM_SIZE,
1 => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'
],
'upload err partial' => [
0 => UPLOAD_ERR_PARTIAL,
1 => 'The uploaded file was only partially uploaded'
],
'upload err no file' => [
0 => UPLOAD_ERR_NO_FILE,
1 => 'No file was uploaded'
],
'upload err no tmp dir' => [
0 => UPLOAD_ERR_NO_TMP_DIR,
1 => 'Missing a temporary folder'
],
'upload err cant write' => [
0 => UPLOAD_ERR_CANT_WRITE,
1 => 'Failed to write file to disk'
],
'upload err extension' => [
0 => UPLOAD_ERR_EXTENSION,
1 => 'File upload stopped by extension'
],
'unkown error' => [
0 => 99999,
1 => 'Unknown upload error'
]
];
}
/**
* Undocumented function
*
* @return array
*/
public function getHostNameProvider(): array
{
return [
'original set' => [
0 => null,
1 => 'NOHOST',
2 => 'NOPORT',
],
'override set no port' => [
0 => 'foo.org',
1 => 'foo.org',
2 => '80'
],
'override set with port' => [
0 => 'foo.org:443',
1 => 'foo.org',
2 => '443'
]
];
}
/**
* Undocumented function
*
* @return array
*/
public function getPageNameProvider(): array
{
return [
'original set' => [
0 => null, // input
1 => 'phpunit',
2 => 'phpunit',
3 => 'www/vendor/bin/phpunit', // NOTE: this can change
],
'some path with extension' => [
0 => '/some/path/to/file.txt',
1 => 'file.txt',
2 => 'file',
3 => '/some/path/to/file.txt',
]
];
}
/**
* Undocumented function
*
* @covers ::fileUploadErrorMessage
* @dataProvider fileUploadErrorMessageProvider
* @testdox fileUploadErrorMessage $input error matches $expected [$_dataName]
*
* @param integer $input
* @param string $expected
* @return void
*/
public function testFileUploadErrorMessage(int $input, string $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Get\System::fileUploadErrorMessage($input)
);
}
/**
* Undocumented function
*
* @covers ::getHostName
* @dataProvider getHostNameProvider
* @testdox getHostName $input must match $expected_host:$expected_port [$_dataName]
*
* @param string|null $input
* @param string $expected_host
* @param string $expected_port
* @return void
*/
public function testGetHostNanme(?string $input, string $expected_host, string $expected_port): void
{
// print "HOSTNAME: " . $_SERVER['HTTP_HOST'] . "<br>";
// print "SERVER: " . print_r($_SERVER, true) . "\n";
// print "SELF: " . $_SERVER['PHP_SELF'] . "\n";
if ($input !== null) {
$_SERVER['HTTP_HOST'] = $input;
}
list ($host, $port) = \CoreLibs\Get\System::getHostName();
$this->assertEquals(
$expected_host,
$host
);
$this->assertEquals(
$expected_port,
$port
);
}
/**
* Undocumented function
*
* @covers ::getPageName
* @dataProvider getPageNameProvider
* @testdox getPageName $input will match 0: $expected_0, 1: $expected_1, 2: $expected_2 [$_dataName]
*
* @param string|null $input
* @param string $expected_0 default with extension
* @param string $expected_1 no extension
* @param string $expected_2 full path
* @return void
*/
public function testGetPageName(?string $input, string $expected_0, string $expected_1, string $expected_2)
{
if ($input !== null) {
$_SERVER['PHP_SELF'] = $input;
}
// default 0,
$this->assertEquals(
$expected_0,
\CoreLibs\Get\System::getPageName()
);
$this->assertEquals(
$expected_0,
\CoreLibs\Get\System::getPageName(\CoreLibs\Get\System::WITH_EXTENSION)
);
$this->assertEquals(
$expected_1,
\CoreLibs\Get\System::getPageName(\CoreLibs\Get\System::NO_EXTENSION)
);
$this->assertEquals(
$expected_2,
\CoreLibs\Get\System::getPageName(\CoreLibs\Get\System::FULL_PATH)
);
}
}
// __END__

View File

@@ -1,291 +0,0 @@
<?php // phpcs:disable Generic.Files.LineLength
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Language\GetLocale
*
* @coversDefaultClass \CoreLibs\Language\GetLocale
* @testdox \CoreLibs\Language\GetLocale method tests
*/
final class CoreLibsLanguageGetLocaleTest extends TestCase
{
/**
* set all constant variables that must be set before call
*
* @return void
*/
public static function setUpBeforeClass(): void
{
// default web page encoding setting
define('DEFAULT_ENCODING', 'UTF-8');
// default lang + encoding
define('DEFAULT_LOCALE', 'en_US.UTF-8');
// site
define('SITE_ENCODING', DEFAULT_ENCODING);
define('SITE_LOCALE', DEFAULT_LOCALE);
// just set
define('BASE', str_replace('/configs', '', __DIR__) . DIRECTORY_SEPARATOR);
define('INCLUDES', 'includes' . DIRECTORY_SEPARATOR);
define('LOCALE', 'locale' . DIRECTORY_SEPARATOR);
define('CONTENT_PATH', 'frontend' . DIRECTORY_SEPARATOR);
// array session
$_SESSION = [];
global $_SESSION;
}
/**
* all the test data
*
* @return array
*/
public function setLocaleProvider(): array
{
return [
// 0: locale
// 1: domain
// 2: encoding
// 3: path
// 4: SESSION: DEFAULT_LOCALE
// 5: SESSION: DEFAULT_CHARSET
// 6: expected array
'no params, all default constants' => [
// lang, domain, encoding, path
null, null, null, null,
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
null, null,
// return array
[
'locale' => 'en_US.UTF-8',
'lang' => 'en_US',
'domain' => 'frontend',
'encoding' => 'UTF-8',
'path' => "/^\/(.*\/)?includes\/locale\/$/",
],
],
'no params, session charset and lang' => [
// lang, domain, encoding, path
null, null, null, null,
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
'ja_JP', 'UTF-8',
// return array
[
'locale' => 'ja_JP',
'lang' => 'ja_JP',
'domain' => 'frontend',
'encoding' => 'UTF-8',
'path' => "/^\/(.*\/)?includes\/locale\/$/",
],
],
'no params, session charset and lang short' => [
// lang, domain, encoding, path
null, null, null, null,
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
'ja', 'UTF-8',
// return array
[
'locale' => 'ja',
'lang' => 'ja',
'domain' => 'frontend',
'encoding' => 'UTF-8',
'path' => "/^\/(.*\/)?includes\/locale\/$/",
],
],
// param lang (no sessions)
'locale param only, no sessions' => [
// lang, domain, encoding, path
'ja.UTF-8', null, null, null,
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
null, null,
// return array
[
'locale' => 'ja.UTF-8',
'lang' => 'ja',
'domain' => 'frontend',
'encoding' => 'UTF-8',
'path' => "/^\/(.*\/)?includes\/locale\/$/",
],
],
// different locale setting
'locale complex param only, no sessions' => [
// lang, domain, encoding, path
'ja_JP.SJIS', null, null, null,
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
null, null,
// return array
[
'locale' => 'ja_JP.SJIS',
'lang' => 'ja_JP',
'domain' => 'frontend',
'encoding' => 'SJIS',
'path' => "/^\/(.*\/)?includes\/locale\/$/",
],
],
// param lang and domain (no override)
'locale, domain params, no sessions' => [
// lang, domain, encoding, path
'ja.UTF-8', 'admin', null, null,
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
null, null,
// return array
[
'locale' => 'ja.UTF-8',
'lang' => 'ja',
'domain' => 'admin',
'encoding' => 'UTF-8',
'path' => "/^\/(.*\/)?includes\/locale\/$/",
],
],
// param lang and domain (no override)
'locale, domain, encoding params, no sessions' => [
// lang, domain, encoding, path
'ja.UTF-8', 'admin', 'UTF-8', null,
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
null, null,
// return array
[
'locale' => 'ja.UTF-8',
'lang' => 'ja',
'domain' => 'admin',
'encoding' => 'UTF-8',
'path' => "/^\/(.*\/)?includes\/locale\/$/",
],
],
// lang, domain, path (no override)
'locale, domain and path, no sessions' => [
// lang, domain, encoding, path
'ja.UTF-8', 'admin', '', __DIR__ . '/locale_other/',
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
null, null,
// return array
[
'locale' => 'ja.UTF-8',
'lang' => 'ja',
'domain' => 'admin',
'encoding' => 'UTF-8',
'path' => "/^\/(.*\/)?locale_other\/$/",
],
],
// all params set (no override)
'all parameter, no sessions' => [
// lang, domain, encoding, path
'ja', 'admin', 'UTF-8', __DIR__ . '/locale_other/',
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
null, null,
// return array
[
'locale' => 'ja',
'lang' => 'ja',
'domain' => 'admin',
'encoding' => 'UTF-8',
'path' => "/^\/(.*\/)?locale_other\/$/",
],
],
// param lang and domain (no override)
'long locale, domain, encoding params, no sessions' => [
// lang, domain, encoding, path
'de_CH.UTF-8@euro', 'admin', 'UTF-8', null,
// SESSION DEFAULT_LOCALE, SESSION: DEFAULT_CHARSET
null, null,
// return array
[
'locale' => 'de_CH.UTF-8@euro',
'lang' => 'de_CH',
'domain' => 'admin',
'encoding' => 'UTF-8',
'path' => "/^\/(.*\/)?includes\/locale\/$/",
],
],
// TODO invalid params (bad path) (no override)
// TODO param calls, but with override set
];
}
/**
* Undocumented function
*
* @covers ::setLocale
* @dataProvider setLocaleProvider
* @testdox lang settings lang $language, domain $domain, encoding $encoding, path $path; session lang: $SESSION_DEFAULT_LOCALE, session char: $SESSION_DEFAULT_CHARSET [$_dataName]
*
* @return void
*/
public function testsetLocale(
?string $language,
?string $domain,
?string $encoding,
?string $path,
?string $SESSION_DEFAULT_LOCALE,
?string $SESSION_DEFAULT_CHARSET,
array $expected,
): void {
$return_lang_settings = [];
global $_SESSION;
// set override
if ($SESSION_DEFAULT_LOCALE !== null) {
$_SESSION['DEFAULT_LOCALE'] = $SESSION_DEFAULT_LOCALE;
}
if ($SESSION_DEFAULT_CHARSET !== null) {
$_SESSION['DEFAULT_CHARSET'] = $SESSION_DEFAULT_CHARSET;
}
// function call
if ($language === null && $domain === null && $encoding === null && $path === null) {
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale();
} elseif ($language !== null && $domain === null && $encoding === null && $path === null) {
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
$language
);
} elseif ($language !== null && $domain !== null && $encoding === null && $path === null) {
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
$language,
$domain
);
} elseif ($language !== null && $domain !== null && $encoding !== null && $path === null) {
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
$language,
$domain,
$encoding
);
} else {
$return_lang_settings = \CoreLibs\Language\GetLocale::setLocale(
$language,
$domain,
$encoding,
$path
);
}
// print "RETURN: " . print_r($return_lang_settings, true) . "\n";
foreach (
[
'locale', 'lang', 'domain', 'encoding', 'path'
] as $key
) {
$value = $expected[$key];
if (strpos($value, "/") === 0) {
// this is regex
$this->assertMatchesRegularExpression(
$value,
$return_lang_settings[$key],
'assert regex failed for ' . $key
);
} else {
// assert equal
$this->assertEquals(
$value,
$return_lang_settings[$key],
'assert equal failed for ' . $key
);
}
}
// unset all vars
$_SESSION = [];
unset($GLOBALS['OVERRIDE_LANG']);
}
}
// __END__

View File

@@ -1,325 +0,0 @@
<?php // phpcs:disable Generic.Files.LineLength
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Language\GetSettings
*
* @coversDefaultClass \CoreLibs\Language\GetSettings
* @testdox \CoreLibs\Language\GetSettings method tests
*/
final class CoreLibsLanguageGetSettingsTest extends TestCase
{
/**
* set all constant variables that must be set before call
*
* @return void
*/
public static function setUpBeforeClass(): void
{
define('DEFAULT_LANG', 'en_US');
// default web page encoding setting
define('DEFAULT_ENCODING', 'UTF-8');
// default lang + encoding
define('DEFAULT_LOCALE', 'en_US.UTF-8');
// site
define('SITE_LANG', DEFAULT_LANG);
// just set
define('BASE', str_replace('/configs', '', __DIR__) . DIRECTORY_SEPARATOR);
define('INCLUDES', 'includes' . DIRECTORY_SEPARATOR);
define('LANG', 'lang' . DIRECTORY_SEPARATOR);
define('CONTENT_PATH', 'frontend' . DIRECTORY_SEPARATOR);
// array session
$_SESSION = [];
global $_SESSION;
}
/**
* all the test data
*
* @return array
*/
public function setLangEncodingProvider(): array
{
return [
// 0: locale/lang
// 1: domain
// 2: path
// 3: SESSION DEFAULT_CHARSE
// 4: GLOBALS: OVERRIDE_LANG
// 5: SESSION: DEFAULT_LANG
// 6: expected array
'no params, all default constants' => [
// lang, domain, path
null, null, null,
// global set no session
// SESSION: DEFAULT_CHARSET, GLOBALS: OVERRIDE_LANG, SESSION: DEFAULT_LANG
null, null, null,
// return array
[
0 => 'UTF-8',
1 => 'en_US',
2 => 'en',
3 => 'frontend',
4 => "/^\/(.*\/)?includes\/lang\/frontend\/$/",
'encoding' => 'UTF-8',
'lang' => 'en_US',
'lang_short' => 'en',
'domain' => 'frontend',
'path' => "/^\/(.*\/)?includes\/lang\/frontend\/$/",
],
],
'no params, session charset and lang' => [
// lang, domain, path
null, null, null,
// global set no session
// SESSION: DEFAULT_CHARSET, GLOBALS: OVERRIDE_LANG, SESSION: DEFAULT_LANG
'UTF-8', null, 'ja_JP',
// return array
[
0 => 'UTF-8',
1 => 'ja_JP',
2 => 'ja',
3 => 'frontend',
4 => "/^\/(.*\/)?includes\/lang\/frontend\/$/",
'encoding' => 'UTF-8',
'lang' => 'ja_JP',
'lang_short' => 'ja',
'domain' => 'frontend',
'path' => "/^\/(.*\/)?includes\/lang\/frontend\/$/",
],
],
'no params, session charset and lang short' => [
// lang, domain, path
null, null, null,
// global set no session
// SESSION: DEFAULT_CHARSET, GLOBALS: OVERRIDE_LANG, SESSION: DEFAULT_LANG
'UTF-8', null, 'ja',
// return array
[
0 => 'UTF-8',
1 => 'ja',
2 => 'ja',
3 => 'frontend',
4 => "/^\/(.*\/)?includes\/lang\/frontend\/$/",
'encoding' => 'UTF-8',
'lang' => 'ja',
'lang_short' => 'ja',
'domain' => 'frontend',
'path' => "/^\/(.*\/)?includes\/lang\/frontend\/$/",
],
],
// globals override lang
'no params, session charset and lang, default lang override' => [
// lang, domain, path
null, null, null,
// global set no session
// SESSION: DEFAULT_CHARSET, GLOBALS: OVERRIDE_LANG, SESSION: DEFAULT_LANG
'UTF-8', 'en_US', 'ja_JP',
// return array
[
0 => 'UTF-8',
1 => 'en_US',
2 => 'en',
3 => 'frontend',
4 => "/^\/(.*\/)?includes\/lang\/frontend\/$/",
'encoding' => 'UTF-8',
'lang' => 'en_US',
'lang_short' => 'en',
'domain' => 'frontend',
'path' => "/^\/(.*\/)?includes\/lang\/frontend\/$/",
],
],
// globals override lang short
'no params, session charset and lang, default lang short override' => [
// lang, domain, path
null, null, null,
// global set no session
// SESSION: DEFAULT_CHARSET, GLOBALS: OVERRIDE_LANG, SESSION: DEFAULT_LANG
'UTF-8', 'en', 'ja_JP',
// return array
[
0 => 'UTF-8',
1 => 'en',
2 => 'en',
3 => 'frontend',
4 => "/^\/(.*\/)?includes\/lang\/frontend\/$/",
'encoding' => 'UTF-8',
'lang' => 'en',
'lang_short' => 'en',
'domain' => 'frontend',
'path' => "/^\/(.*\/)?includes\/lang\/frontend\/$/",
],
],
// param lang (no override)
'locale param only, no override' => [
// lang, domain, path
'ja.UTF-8', null, null,
// global set no session
// SESSION: DEFAULT_CHARSET, GLOBALS: OVERRIDE_LANG, SESSION: DEFAULT_LANG
null, null, null,
// return array
[
0 => 'UTF-8',
1 => 'ja',
2 => 'ja',
3 => 'frontend',
4 => "/^\/(.*\/)?includes\/lang\/frontend\/$/",
'encoding' => 'UTF-8',
'lang' => 'ja',
'lang_short' => 'ja',
'domain' => 'frontend',
'path' => "/^\/(.*\/)?includes\/lang\/frontend\/$/",
],
],
// different locale setting
'locale complex param only, no override' => [
// lang, domain, path
'ja_JP.SJIS', null, null,
// global set no session
// SESSION: DEFAULT_CHARSET, GLOBALS: OVERRIDE_LANG, SESSION: DEFAULT_LANG
null, null, null,
// return array
[
0 => 'SJIS',
1 => 'ja_JP',
2 => 'ja',
3 => 'frontend',
4 => "/^\/(.*\/)?includes\/lang\/frontend\/$/",
'encoding' => 'SJIS',
'lang' => 'ja_JP',
'lang_short' => 'ja',
'domain' => 'frontend',
'path' => "/^\/(.*\/)?includes\/lang\/frontend\/$/",
],
],
// param lang and domain (no override)
'locale, domain params, no override' => [
// lang, domain, path
'ja.UTF-8', 'admin', null,
// global set no session
// SESSION: DEFAULT_CHARSET, GLOBALS: OVERRIDE_LANG, SESSION: DEFAULT_LANG
null, null, null,
// return array
[
0 => 'UTF-8',
1 => 'ja',
2 => 'ja',
3 => 'admin',
4 => "/^\/(.*\/)?includes\/lang\/frontend\/$/",
'encoding' => 'UTF-8',
'lang' => 'ja',
'lang_short' => 'ja',
'domain' => 'admin',
'path' => "/^\/(.*\/)?includes\/lang\/frontend\/$/",
],
],
// all params set (no override)
'all params, no override' => [
// lang, domain, path
'ja.UTF-8', 'admin', __DIR__ . '/locale_other/',
// global set no session
// SESSION: DEFAULT_CHARSET, GLOBALS: OVERRIDE_LANG, SESSION: DEFAULT_LANG
null, null, null,
// return array
[
0 => 'UTF-8',
1 => 'ja',
2 => 'ja',
3 => 'admin',
4 => "/^\/(.*\/)?locale_other\/$/",
'encoding' => 'UTF-8',
'lang' => 'ja',
'lang_short' => 'ja',
'domain' => 'admin',
'path' => "/^\/(.*\/)?locale_other\/$/",
],
],
// TODO invalid params (bad path) (no override)
// TODO param calls, but with override set
];
}
/**
* Undocumented function
*
* @covers ::setLangEncoding
* @dataProvider setLangEncodingProvider
* @testdox lang settings lang $language, domain $domain, path $path; null session char: $SESSION_DEFAULT_CHARSET, null global lang: $GLOBAL_OVERRIDE_LANG, null session lang: $SESSION_DEFAULT_LANG [$_dataName]
*
* @return void
*/
public function testSetLangEncoding(
?string $language,
?string $domain,
?string $path,
?string $SESSION_DEFAULT_CHARSET,
?string $GLOBAL_OVERRIDE_LANG,
?string $SESSION_DEFAULT_LANG,
array $expected,
): void {
$return_lang_settings = [];
global $_SESSION;
// set override
if ($SESSION_DEFAULT_CHARSET !== null) {
$_SESSION['DEFAULT_CHARSET'] = $SESSION_DEFAULT_CHARSET;
}
if ($GLOBAL_OVERRIDE_LANG !== null) {
$GLOBALS['OVERRIDE_LANG'] = $GLOBAL_OVERRIDE_LANG;
}
if ($SESSION_DEFAULT_LANG !== null) {
$_SESSION['DEFAULT_LANG'] = $SESSION_DEFAULT_LANG;
}
// function call
if ($language === null && $domain === null && $path === null) {
$return_lang_settings = \CoreLibs\Language\GetSettings::setLangEncoding();
} elseif ($language !== null && $domain === null && $path === null) {
$return_lang_settings = \CoreLibs\Language\GetSettings::setLangEncoding(
$language
);
} elseif ($language !== null && $domain !== null && $path === null) {
$return_lang_settings = \CoreLibs\Language\GetSettings::setLangEncoding(
$language,
$domain
);
} else {
$return_lang_settings = \CoreLibs\Language\GetSettings::setLangEncoding(
$language,
$domain,
$path
);
}
// print "RETURN: " . print_r($return_lang_settings, true) . "\n";
foreach (
[
0, 1, 2, 3, 4,
'encoding', 'lang', 'lang_short', 'domain', 'path'
] as $key
) {
$value = $expected[$key];
if (strpos($value, "/") === 0) {
// this is regex
$this->assertMatchesRegularExpression(
$value,
$return_lang_settings[$key]
);
} else {
// assert equal
$this->assertEquals(
$value,
$return_lang_settings[$key],
);
}
}
// unset all vars
$_SESSION = [];
unset($GLOBALS['OVERRIDE_LANG']);
}
}
// __END__

View File

@@ -1,996 +0,0 @@
<?php // phpcs:disable Generic.Files.LineLength
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Language\L10n
* Included are all Language\Core methods too if they are needed
*
* @coversDefaultClass \CoreLibs\Language\L10n
* @testdox \CoreLibs\Language\L10n method tests
*/
final class CoreLibsLanguageL10nTest extends TestCase
{
/**
* set all constant variables that must be set before call
*
* @return void
*/
public static function setUpBeforeClass(): void
{
define('DEFAULT_LANG', 'en_US');
// default web page encoding setting
define('DEFAULT_ENCODING', 'UTF-8');
// default lang + encoding
define('DEFAULT_LOCALE', 'en_US.UTF-8');
// site
define('SITE_LANG', DEFAULT_LANG);
// just set
define('BASE', str_replace('/configs', '', __DIR__) . DIRECTORY_SEPARATOR);
define('INCLUDES', 'includes' . DIRECTORY_SEPARATOR);
define('LANG', 'lang' . DIRECTORY_SEPARATOR);
define('LOCALE', 'locale' . DIRECTORY_SEPARATOR);
define('CONTENT_PATH', 'frontend' . DIRECTORY_SEPARATOR);
}
/**
* get instance self type check
*
* @covers ::getInstance
* @testdox check that getInstance() returns valid instance
*
* @return void
*/
public function testGetInstance(): void
{
$l10n_obj = \CoreLibs\Language\L10n::getInstance();
$this->assertIsObject(
$l10n_obj
);
$this->assertInstanceOf(
'\CoreLibs\Language\L10n',
$l10n_obj
);
}
/**
* get current translator class type check
*
* @covers ::getTranslatorClass
* @testdox check that getTranslatorClass() returns valid instance
*
* @return void
*/
public function testGetTranslatorClass(): void
{
$l10n = new \CoreLibs\Language\L10n();
$translator = $l10n->getTranslatorClass();
$this->assertIsObject(
$translator
);
$this->assertInstanceOf(
'\CoreLibs\Language\Core\GetTextReader',
$translator
);
}
/**
* provider for class load parameters
*
* @return array
*/
public function l10nObjectProvider(): array
{
return [
// 0: locale
// 1: domain
// 2: encoding
// 3: path
// 4: locale expected
// 5: domain exepcted
// 6: context (null for none)
// 7: test string in
// 8: test translated
// new style load
'gettext load en' => [
'en_US.UTF-8',
'frontend',
__DIR__ . 'includes/locale/',
//
'en_US.UTF-8',
'frontend',
null,
'Original',
'Translated frontend en_US',
],
'gettext load en' => [
'en_US.UTF-8',
'frontend',
__DIR__ . 'includes/locale/',
//
'en_US.UTF-8',
'frontend',
'context',
'Original',
'Original context frontend en_US',
],
'gettext load ja' => [
'ja_JP.UTF-8',
'admin',
__DIR__ . 'includes/locale/',
//
'ja_JP.UTF-8',
'admin',
null,
'Original',
'Translated admin ja_JP',
],
// mixed path and domain
'mixed path and domain' => [
'en_US.UTF-8',
__DIR__ . 'includes/locale/',
'frontend',
//
'en_US.UTF-8',
'frontend',
'context',
'Original',
'Original context frontend en_US',
],
// null set
'empty load new ' => [
'',
'',
'',
//
'',
'',
null,
'Original',
'Original',
]
];
}
/**
* new class load test (basic test)
*
* @covers ::__construct
* @dataProvider l10nObjectProvider
* @testdox check l10n init with Locale $locale, Path $path, Domain $domain, Legacy: $legacy with $context [$_dataName]
*
* @param string|null $locale
* @param string|null $domain
* @param string|null $path
* @param string $locale_expected
* @param string $domain_expected
* @param ?string $context
* @param string $original
* @param string $translated
* @return void
*/
public function testL10nObject(
?string $locale,
?string $domain,
?string $path,
string $locale_expected,
string $domain_expected,
?string $context,
string $original,
string $translated,
): void {
if ($locale === null) {
$l10n = new \CoreLibs\Language\L10n();
} elseif ($domain === null) {
$l10n = new \CoreLibs\Language\L10n($locale);
} elseif ($path === null) {
$l10n = new \CoreLibs\Language\L10n($locale, $domain);
} else {
$l10n = new \CoreLibs\Language\L10n($locale, $domain, $path);
}
// print "LOC: " . $locale . ", " . $l10n->getLocale() . ", " . $locale_expected . "\n";
// print "MO: " . $l10n->getMoFile() . "\n";
$this->assertEquals(
$locale_expected,
$l10n->getLocale(),
'Locale assert failed'
);
$this->assertEquals(
$domain_expected,
$l10n->getDomain(),
'Domain assert failed'
);
if (empty($context)) {
$this->assertEquals(
$translated,
$l10n->__($original),
'Translated string assert failed'
);
} else {
$this->assertEquals(
$translated,
$l10n->__p($context, $original),
'Translated string assert failed in context: ' . $context
);
}
}
// l10nReloadMOfile and getTranslator
// null init with loader
// loader with reload (change type)
/**
* Undocumented function
*
* @return array
*/
public function getTranslatorProvider(): array
{
return [
// 0: locale
// 1: domain
// 2: path
// 3: load error
// 4: input string to translated
// 5: expected locale
// 6: expected domain
// 7: expected translation
// 8: change locale
// 9: change domain
// 10: change path
// 11: change load error
// 12: expected locale
// 13: expected domain
// 14: expected translation
'load and change (en->ja)' => [
// set 0-2
'en_US.UTF-8',
'frontend',
__DIR__ . 'includes/locale/',
// status 3
false,
// to translate 4
'Original',
// check setter 5-7
'en_US.UTF-8',
'frontend',
'Translated frontend en_US',
// set new 8-10
'ja_JP.UTF-8',
'frontend',
__DIR__ . 'includes/locale/',
// status new 11
false,
// check new setter 12-14
'ja_JP.UTF-8',
'frontend',
'Translated frontend ja_JP',
],
'empty load and change to en' => [
// set 0-2
'',
'',
'',
// status 3
false,
// to translate 4
'Original',
// check setter 5-7
'',
'',
'Original',
// set new 8-10
'en_US.UTF-8',
'frontend',
__DIR__ . 'includes/locale/',
// status new 11
false,
// check new setter 12-14
'en_US.UTF-8',
'frontend',
'Translated frontend en_US',
]
];
}
/**
* init check and connected change translation
*
* @covers ::getTranslator
* @covers ::l10nReloadMOfile
* @dataProvider getTranslatorProvider
* @testdox change locale from $locale and domain $domain to locale $locale_new and domain $domain_new [$_dataName]
*
* @param string|null $locale
* @param string|null $domain
* @param string|null $path
* @param bool $load_error
* @param string $original
* @param string $locale_expected_a
* @param string $domain_expected_a
* @param string $translated_a
* @param string|null $locale_new
* @param string|null $domain_new
* @param string|null $path_new
* @param bool $load_error_new
* @param string $locale_expected_b
* @param string $domain_expected_b
* @param string $translated_b
* @return void
*/
public function testGetTranslator(
// 0-2
?string $locale,
?string $domain,
?string $path,
// 3
bool $load_error,
// 4
string $original,
// 5-7
string $locale_expected_a,
string $domain_expected_a,
string $translated_a,
// 8-10
?string $locale_new,
?string $domain_new,
?string $path_new,
// 11
bool $load_error_new,
// 12-14
string $locale_expected_b,
string $domain_expected_b,
string $translated_b,
): void {
if ($locale === null) {
$l10n = new \CoreLibs\Language\L10n();
} elseif ($domain === null) {
$l10n = new \CoreLibs\Language\L10n($locale);
} elseif ($path === null) {
$l10n = new \CoreLibs\Language\L10n($locale, $domain);
} else {
$l10n = new \CoreLibs\Language\L10n($locale, $domain, $path);
}
// print "LOC: " . $locale . ", " . $l10n->getLocale() . ", " . $locale_expected . "\n";
// status check
$this->assertEquals(
$load_error,
$l10n->getLoadError(),
'Legacy method load error init check'
);
$this->assertEquals(
$locale_expected_a,
$l10n->getLocale(),
'Locale init assert failed'
);
$this->assertEquals(
$domain_expected_a,
$l10n->getDomain(),
'Domain init assert failed'
);
$this->assertEquals(
$translated_a,
$l10n->__($original),
'Translated string init assert failed'
);
// switch
if ($locale_new === null) {
$translator = $l10n->getTranslator();
} elseif ($domain_new === null) {
$translator = $l10n->getTranslator($locale_new);
} elseif ($path_new === null) {
$translator = $l10n->getTranslator($locale_new, $domain_new);
} else {
$translator = $l10n->getTranslator($locale_new, $domain_new, $path_new);
}
// status check
$this->assertEquals(
$load_error_new,
$l10n->getLoadError(),
'Translate method load error change check'
);
// check that returned is class GetTextReader and object
$this->assertIsObject(
$translator,
'translater class is object assert failed'
);
$this->assertInstanceOf(
'\CoreLibs\Language\Core\GetTextReader',
$translator,
'translator class is correct instance assert failed'
);
// translator class
$this->assertEquals(
$translated_b,
$translator->gettext($original),
'Translated string change assert failed from returned class'
);
// new set check
$this->assertEquals(
$locale_expected_b,
$l10n->getLocale(),
'Locale change assert failed'
);
$this->assertEquals(
$domain_expected_b,
$l10n->getDomain(),
'Domain change assert failed'
);
$this->assertEquals(
$translated_b,
$l10n->__($original),
'Translated string change assert failed'
);
}
// TODO: domain based
// ->dgettext
// ->dngettext
// ->dpgettext
// ->dpngettext
/**
* for plural and plural context
*
* @return array
*/
public function ngettextProvider(): array
{
return [
// 0: locale
// 1: path
// 2: domain
// 3: context (null for none)
// 4: single string
// 5: plural string
// 6: array for each n value expected string
'plural text en' => [
'en_US',
__DIR__ . 'includes/locale/',
'admin',
// context
null,
// text single/multi in
'single',
'multi',
// confirm translation, pos in array equal n
[
0 => 'Multi admin en_US 1',
1 => 'Multi admin en_US 0',
2 => 'Multi admin en_US 1',
]
],
'plural text context en' => [
'en_US',
__DIR__ . 'includes/locale/',
'admin',
// context
'context',
// text single/multi in
'single',
'multi',
// confirm translation, pos in array equal n
[
0 => 'Multi context admin en_US 1',
1 => 'Multi context admin en_US 0',
2 => 'Multi context admin en_US 1',
]
],
];
}
/**
* plural and plural context
*
* @covers ::__n
* @covers ::__pn
* @dataProvider ngettextProvider
* @testdox plural string test for locale $locale and domain $domain with $context [$_dataName]
*
* @param string $locale
* @param string $path
* @param string $domain
* @param ?string $context
* @param string $original_single
* @param string $original_plural
* @param array $expected_strings
* @return void
*/
public function testNgettext(
// config 0-3
string $locale,
string $path,
string $domain,
// context string
?string $context,
// input strings
string $original_single,
string $original_plural,
// expected
array $expected_strings
): void {
$l10n = new \CoreLibs\Language\L10n($locale, $path, $domain, false);
foreach ($expected_strings as $n => $expected) {
if (empty($context)) {
$this->assertEquals(
$expected,
$l10n->__n($original_single, $original_plural, $n),
'assert failed for plural: ' . $n
);
} else {
$this->assertEquals(
$expected,
$l10n->__pn($context, $original_single, $original_plural, $n),
'assert failed for plural: ' . $n . ' in context: ' . $context
);
}
}
}
/**
* locales list for testing locale folder lookup
*
* @return array
*/
public function localesProvider(): array
{
return [
// 0: locale
// 1: return array
'en' => [
'en',
[
'en',
],
[
'lang' => 'en',
'country' => null,
'charset' => null,
'modifier' => null,
],
],
'en.UTF-8' => [
'en.UTF-8',
[
'en.UTF-8',
'en',
],
[
'lang' => 'en',
'country' => null,
'charset' => 'UTF-8',
'modifier' => null,
],
],
'en_US' => [
'en_US',
[
'en_US',
'en',
],
[
'lang' => 'en',
'country' => 'US',
'charset' => null,
'modifier' => null,
],
],
'en_US.UTF-8' => [
'en_US.UTF-8',
[
'en_US.UTF-8',
'en_US',
'en',
],
[
'lang' => 'en',
'country' => 'US',
'charset' => 'UTF-8',
'modifier' => null,
],
],
'en_US@subtext' => [
'en_US@subtext',
[
'en_US@subtext',
'en@subtext',
'en_US',
'en',
],
[
'lang' => 'en',
'country' => 'US',
'charset' => null,
'modifier' => 'subtext',
],
],
'en_US.UTF-8@subtext' => [
'en_US.UTF-8@subtext',
[
'en_US.UTF-8@subtext',
'en_US@subtext',
'en@subtext',
'en_US.UTF-8',
'en_US',
'en',
],
[
'lang' => 'en',
'country' => 'US',
'charset' => 'UTF-8',
'modifier' => 'subtext',
],
]
];
}
/**
* test locales array return
*
* @covers ::listLocales
* @dataProvider localesProvider
* @testdox check $locale [$_dataName]
*
* @param string $locale
* @param array $expected_list
* @param array $expected_detail
* @return void
*/
public function testListLocales(string $locale, array $expected_list, array $expected_detail): void
{
$locale_detail = \CoreLibs\Language\L10n::parseLocale($locale);
$this->assertEquals(
$expected_detail,
$locale_detail,
'Parse local assert failed'
);
$locale_list = \CoreLibs\Language\L10n::listLocales($locale);
// print "LOCALES: " . print_r($locale_list, true) . "\n";
$this->assertEquals(
$expected_list,
$locale_list,
'List locale assert failed'
);
}
// @covers ::detectLocale
/**
* Undocumented function
*
* @return array
*/
public function detectLocaleProvider(): array
{
return [
// 0: type: global | env
// 1: global variable name or enviroment var
// 2: value to set
// 3: value to expect back
'global locale' => [
'global',
'LOCALE',
'ja_JP.UTF-8',
'ja_JP.UTF-8',
],
'env LC_ALL' => [
'env',
'LC_ALL',
'ja_JP.UTF-8',
'ja_JP.UTF-8',
],
'env LANG' => [
'env',
'LANG',
'ja_JP.UTF-8',
'ja_JP.UTF-8',
],
'default return' => [
'env',
'LC_ALL',
'',
'en',
]
];
}
/**
* Undocumented function
* @covers ::detectLocale
* @dataProvider detectLocaleProvider
* @testdox check detectLocale for $type with $var and $value is $expected [$_dataName]
*
* @return void
*/
public function testDetectLocale(
string $type,
string $var,
string $value,
string $expected,
): void {
switch ($type) {
case 'global':
$GLOBALS[$var] = $value;
break;
case 'env':
$old_value = getenv("$var");
putenv("$var=$value");
// unset all other env vars
foreach (['LC_ALL', 'LC_MESSAGES', 'LANG'] as $env) {
if ($env != $var) {
putenv("$env=");
}
}
break;
}
$locale = \CoreLibs\Language\L10n::detectLocale();
$this->assertEquals(
$expected,
$locale
);
// reset post run
switch ($type) {
case 'global':
unset($GLOBALS[$var]);
break;
case 'env':
putenv("$var=$old_value");
break;
}
}
// set/get text domain, domain, locale
/**
* Undocumented function
*
* @return array
*/
public function textDomainProvider(): array
{
return [
// 0: set domain
// 1: set path
// 2: get domain
// 3: expected path
'valid set and get' => [
'foo',
'foo/bar',
'foo',
'foo/bar',
],
'invalid set and get' => [
'foo',
'foo/bar',
'iamnotset',
false
]
];
}
/**
* Undocumented function
*
* @covers ::setTextDomain
* @covers ::getTextDomain
* @dataProvider textDomainProvider
* @testdox set $domain with $path and get $get_domain and expect $expected [$_dataName]
*
* @param string $domain
* @param string $path
* @param string $get_domain
* @param string|bool $expected
* @return void
*/
public function testSetGetTextDomain(string $domain, string $path, string $get_domain, $expected): void
{
$l10n = new \CoreLibs\Language\L10n();
$l10n->setTextDomain($domain, $path);
$this->assertEquals(
$expected,
$l10n->getTextDomain($get_domain)
);
}
/**
* Undocumented function
*
* @return array
*/
public function domainProvider(): array
{
return [
// 0: set domain
// 1: expected domain from get
'valid domain' => [
'foo',
'foo',
],
'empty domain' => [
'',
'',
]
];
}
/**
* Undocumented function
*
* @covers ::setDomain
* @covers ::getDomain
* @dataProvider domainProvider
* @testdox set $domain and expect $expected [$_dataName]
*
* @param string $domain
* @param string $expected
* @return void
*/
public function testSetGetDomain(string $domain, string $expected): void
{
$l10n = new \CoreLibs\Language\L10n();
$l10n->setDomain($domain);
$this->assertEquals(
$expected,
$l10n->getDomain()
);
}
/**
* Undocumented function
*
* @return array
*/
public function localeProvider(): array
{
return [
// 0: set locale
// 1: pre set if not null or not empty
// 2: expected return from set
// 3: expected from get
'valid locale' => [
'foo',
null,
'foo',
'foo',
],
'empty locale' => [
'',
null,
'',
'',
],
'empty locale, pre set' => [
'',
'foo',
'foo',
'foo',
],
];
}
/**
* Undocumented function
*
* @covers ::setLocale
* @covers ::getLocale
* @dataProvider localeProvider
* @testdox set $locale with $expected_return and expect $expected [$_dataName]
*
* @param string $locale
* @param string $pre_locale
* @param string $expected_return
* @param string $expected
* @return void
*/
public function testSetGetLocale(
string $locale,
?string $pre_locale,
string $expected_return,
string $expected
): void {
$l10n = new \CoreLibs\Language\L10n();
if (!empty($pre_locale)) {
$l10n->setLocale($pre_locale);
}
$returned = $l10n->setLocale($locale);
$this->assertEquals(
$expected_return,
$returned,
'Set locale return assert failed'
);
$this->assertEquals(
$expected,
$l10n->getLocale(),
'Get locale aszert failed'
);
}
// static load
/**
* Undocumented function
*
* @return array
*/
public function functionsProvider(): array
{
return [
// 0: lang/locale
// 1: domain
// 2: path
// 3: encoding
// 4: string
// 5: translated string
'standard en' => [
'en_US.UTF-8',
'frontend',
__DIR__ . 'includes/locale/',
'UTF-8',
'Original',
'Translated frontend en_US',
],
'standard ja' => [
'ja_JP.UTF-8',
'admin',
__DIR__ . 'includes/locale/',
'UTF-8',
'Original',
'Translated admin ja_JP',
]
];
}
/**
* fuctions check
* TODO: others d/dn/dp/dpn gettext functions
*
* @covers __setlocale
* @covers __bindtextdomain
* @covers __bind_textdomain_codeset
* @covers __textdomain
* @covers __gettext
* @covers __
* @dataProvider functionsProvider
* @testdox check functions with locale $locale and domain $domain [$_dataName]
* @param string $locale
* @param string $domain
* @param string $path
* @param string $encoding
* @param string $original
* @param string $translated
* @return void
*/
public function testFunctions(
string $locale,
string $domain,
string $path,
string $encoding,
string $original,
string $translated
): void {
\CoreLibs\Language\L10n::loadFunctions();
__setlocale(LC_MESSAGES, $locale);
__textdomain($domain);
__bindtextdomain($domain, $path);
__bind_textdomain_codeset($domain, $encoding);
$this->assertEquals(
$translated,
__($original),
'function __ assert failed'
);
$this->assertEquals(
$translated,
__gettext($original),
'function gettext assert failed'
);
}
}
// __END__

View File

@@ -1,33 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Output\Form\Elements
* @coversDefaultClass \CoreLibs\Output\Form\Elements
* @testdox \CoreLibs\Output\Form\Elements method tests
*/
final class CoreLibsOutputFormElementsTest extends TestCase
{
/**
* Undocumented function
*
* @testdox Output\Form\Elements Class tests
*
* @return void
*/
public function testOutputFormElements()
{
$this->assertTrue(true, 'Output Form Elements Tests not implemented');
$this->markTestIncomplete(
'Output\Form\Elements Tests have not yet been implemented'
);
// $this->markTestSkipped('No implementation for Output\Form\Elements at the moment');
}
}
// __END__

View File

@@ -1,33 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Output\Form\Generate
* @coversDefaultClass \CoreLibs\Output\Form\Generate
* @testdox \CoreLibs\Output\Form\Generate method tests
*/
final class CoreLibsOutputFormGenerateTest extends TestCase
{
/**
* Undocumented function
*
* @testdox Output\Form\Generate Class tests
*
* @return void
*/
public function testOutputFormGenerate()
{
/* $this->assertTrue(true, 'Output Form Generate Tests not implemented');
$this->markTestIncomplete(
'Output\Form\Generate Tests have not yet been implemented'
); */
$this->markTestSkipped('No implementation for Output\Form\Generate at the moment');
}
}
// __END__

View File

@@ -1,33 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Output\Form\Token
* @coversDefaultClass \CoreLibs\Output\Form\Token
* @testdox \CoreLibs\Output\Form\Token method tests
*/
final class CoreLibsOutputFormTokenTest extends TestCase
{
/**
* Undocumented function
*
* @testdox Output\Form\Token Class tests
*
* @return void
*/
public function testOutputFormToken()
{
$this->assertTrue(true, 'Output Form Token Tests not implemented');
$this->markTestIncomplete(
'Output\Form\Token Tests have not yet been implemented'
);
// $this->markTestSkipped('No implementation for Output\Form\Token at the moment');
}
}
// __END__

View File

@@ -1,33 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Output\Image
* @coversDefaultClass \CoreLibs\Output\Image
* @testdox \CoreLibs\Output\Image method tests
*/
final class CoreLibsOutputImageTest extends TestCase
{
/**
* Undocumented function
*
* @testdox Output\Image Class tests
*
* @return void
*/
public function testOutputImage()
{
$this->assertTrue(true, 'Output Image Tests not implemented');
$this->markTestIncomplete(
'Output\Image Tests have not yet been implemented'
);
// $this->markTestSkipped('No implementation for Output\Image at the moment');
}
}
// __END__

View File

@@ -1,33 +0,0 @@
<?php
declare(strict_types=1);
namespace tests;
use PHPUnit\Framework\TestCase;
/**
* Test class for Output\Progressbar
* @coversDefaultClass \CoreLibs\Output\Progressbar
* @testdox \CoreLibs\Output\Progressbar method tests
*/
final class CoreLibsOutputProgressbarTest extends TestCase
{
/**
* Undocumented function
*
* @testdox Output\Progressbar Class tests
*
* @return void
*/
public function testOutputProgressbar()
{
/* $this->assertTrue(true, 'Output Progressbar Tests not implemented');
$this->markTestIncomplete(
'Output\Progressbar Tests have not yet been implemented'
); */
$this->markTestSkipped('No implementation for Output\Progressbar at the moment');
}
}
// __END__

Some files were not shown because too many files have changed in this diff Show More