Compare commits
16
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
369f2e2586 | ||
|
|
3a33f07ae7 | ||
|
|
0b057864ae | ||
|
|
2bb405d741 | ||
|
|
c38ff8b405 | ||
|
|
66d5f6247b | ||
|
|
74da813832 | ||
|
|
8c7e2782ae | ||
|
|
7bc7674021 | ||
|
|
3f02bee643 | ||
|
|
e3306a096f | ||
|
|
d66fce374c | ||
|
|
7e01886ad8 | ||
|
|
e2362418aa | ||
|
|
71e34848d9 | ||
|
|
f275180571 |
@@ -12,6 +12,8 @@ use PHPUnit\Framework\TestCase;
|
||||
*/
|
||||
final class CoreLibsAAASetupDataTest extends TestCase
|
||||
{
|
||||
public const TIME_ZONE = 'Asia/Tokyo';
|
||||
|
||||
/**
|
||||
* Covers nothing
|
||||
*
|
||||
@@ -34,6 +36,9 @@ final class CoreLibsAAASetupDataTest extends TestCase
|
||||
BASE,
|
||||
'BASE Path set check'
|
||||
);
|
||||
|
||||
// if time zone is not set, errors can happen
|
||||
ini_set('date.timezone', self::TIME_ZONE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -80,21 +80,27 @@ final class CoreLibsACLLoginTest extends TestCase
|
||||
'log_file_id' => 'CoreLibs-ACL-Login-Test',
|
||||
]);
|
||||
// test database we need to connect do, if not possible this test is skipped
|
||||
self::$db = new \CoreLibs\DB\IO(
|
||||
[
|
||||
'db_name' => $db_name,
|
||||
'db_user' => $db_user,
|
||||
'db_pass' => $db_password,
|
||||
'db_host' => $db_host,
|
||||
'db_port' => 5432,
|
||||
'db_schema' => 'public',
|
||||
'db_type' => 'pgsql',
|
||||
'db_encoding' => '',
|
||||
'db_ssl' => 'allow', // allow, disable, require, prefer
|
||||
'db_debug' => true,
|
||||
],
|
||||
self::$log
|
||||
);
|
||||
try {
|
||||
self::$db = new \CoreLibs\DB\IO(
|
||||
[
|
||||
'db_name' => $db_name,
|
||||
'db_user' => $db_user,
|
||||
'db_pass' => $db_password,
|
||||
'db_host' => $db_host,
|
||||
'db_port' => 5432,
|
||||
'db_schema' => 'public',
|
||||
'db_type' => 'pgsql',
|
||||
'db_encoding' => '',
|
||||
'db_ssl' => 'allow', // allow, disable, require, prefer
|
||||
'db_debug' => true,
|
||||
],
|
||||
self::$log
|
||||
);
|
||||
} catch (\Exception $e) {
|
||||
self::markTestSkipped(
|
||||
'Cannot connect to Test DB for ACL\Login test: ' . $e->getMessage()
|
||||
);
|
||||
}
|
||||
// ALWAYS drop DB and RECREATE DB
|
||||
// dropdb -U corelibs_acl_login_test -h localhost corelibs_acl_login_test
|
||||
// createdb -U corelibs_acl_login_test -O corelibs_acl_login_test -E utf8 corelibs_acl_login_test;
|
||||
|
||||
@@ -15,6 +15,12 @@ if [ ! -f "${load_sql}" ]; then
|
||||
echo 1;
|
||||
exit 1;
|
||||
fi;
|
||||
# if we have no dropdb, createdb, psql, exit with 6
|
||||
if ! command -v dropdb &> /dev/null || ! command -v createdb &> /dev/null || ! command -v psql &> /dev/null; then
|
||||
echo 6;
|
||||
exit 6;
|
||||
fi;
|
||||
|
||||
db_user="${2}";
|
||||
db_name="${3}";
|
||||
db_host="${4}";
|
||||
@@ -24,25 +30,25 @@ if [ -z "${db_user}" ] || [ -z "${db_name}" ] || [ -z "${db_host}" ]; then
|
||||
exit 2;
|
||||
fi;
|
||||
# drop database, on error exit with 3
|
||||
dropdb -U ${db_user} -h ${db_host} ${db_name} 2>&1;
|
||||
if [ $? -ne 0 ]; then
|
||||
dropdb -U "${db_user}" -h "${db_host}" "${db_name}" 2>&1;
|
||||
if [ ! $? ]; then
|
||||
echo 3;
|
||||
exit 3;
|
||||
fi;
|
||||
# create database, on error exit with 4
|
||||
createdb -U ${db_user} -O ${db_user} -h ${db_host} -E utf8 ${db_name} 2>&1;
|
||||
if [ $? -ne 0 ]; then
|
||||
createdb -U "${db_user}" -O "${db_user}" -h "${db_host}" -E utf8 "${db_name}" 2>&1;
|
||||
if [ ! $? ]; then
|
||||
echo 4;
|
||||
exit 4;
|
||||
fi;
|
||||
# if error 5 thrown, test with enabled below
|
||||
if [ ! -z "${5}" ]; then
|
||||
psql -U ${db_user} -h ${db_host} -f ${load_sql} ${db_name};
|
||||
if [ -n "${5}" ]; then
|
||||
psql -U "${db_user}" -h "${db_host}" -f "${load_sql}" "${db_name}";
|
||||
else
|
||||
# load data (redirect ALL error to null), on error exit with 5
|
||||
psql -U ${db_user} -h ${db_host} -f ${load_sql} ${db_name} 2>&1 1>/dev/null 2>/dev/null;
|
||||
psql -U "${db_user}" -h "${db_host}" -f "${load_sql}" "${db_name}" 2>&1 1>/dev/null 2>/dev/null;
|
||||
fi;
|
||||
if [ $? -ne 0 ]; then
|
||||
if [ ! $? ]; then
|
||||
echo 5;
|
||||
exit 5;
|
||||
fi;
|
||||
|
||||
@@ -16,7 +16,7 @@ use PHPUnit\Framework\TestCase;
|
||||
*/
|
||||
final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
{
|
||||
// we use that for all
|
||||
/** @var array<mixed> we use that for all */
|
||||
public static $array = [
|
||||
'a' => [
|
||||
'b' => 'bar',
|
||||
@@ -51,7 +51,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @return array
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function arraySearchRecursiveProvider(): array
|
||||
{
|
||||
@@ -110,7 +110,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @return array
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function arraySearchRecursiveAllProvider(): array
|
||||
{
|
||||
@@ -182,7 +182,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @return array
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function arraySearchSimpleProvider(): array
|
||||
{
|
||||
@@ -383,7 +383,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @return array
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function arraySearchKeyProvider(): array
|
||||
{
|
||||
@@ -565,7 +565,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
/**
|
||||
* provides array listing for the merge test
|
||||
*
|
||||
* @return array
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function arrayMergeRecursiveProvider(): array
|
||||
{
|
||||
@@ -602,7 +602,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
/**
|
||||
* for warning checks
|
||||
*
|
||||
* @return array
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function arrayMergeRecursiveProviderWarning(): array
|
||||
{
|
||||
@@ -634,7 +634,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @return array
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function arrayCompareProvider(): array
|
||||
{
|
||||
@@ -665,7 +665,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @return array
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function inArrayAnyProvider(): array
|
||||
{
|
||||
@@ -688,6 +688,11 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function genAssocArrayProvider(): array
|
||||
{
|
||||
return [
|
||||
@@ -764,7 +769,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @return array
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function flattenArrayProvider(): array
|
||||
{
|
||||
@@ -808,7 +813,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
/**
|
||||
* use the flattenArrayProvider and replace 1 with 2 array pos
|
||||
*
|
||||
* @return array
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function flattenArrayKeyProvider(): array
|
||||
{
|
||||
@@ -825,7 +830,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
/**
|
||||
* use the flattenArrayProvider and replace 1 with 3 array pos
|
||||
*
|
||||
* @return array
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function flattenArrayKeyLeavesOnlyProvider(): array
|
||||
{
|
||||
@@ -842,7 +847,7 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @return array
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function arrayFlatForKeyProvider(): array
|
||||
{
|
||||
@@ -906,6 +911,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
];
|
||||
}
|
||||
|
||||
// MARK: arraySearchRecursive
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -926,6 +933,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
// MARK: arraySearchRecursiveAll
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -947,6 +956,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
// MARK: arraySearchSimple
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -969,6 +980,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
// MARK: arraySearchKey
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -1007,6 +1020,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
// MARK: arrayMergeRecursive
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -1031,6 +1046,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
// MARK: arrayMergeRecursive
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -1063,6 +1080,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
restore_error_handler();
|
||||
}
|
||||
|
||||
// MARK: arrayDiff
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -1083,6 +1102,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
// MARK: inArrayAny
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -1103,6 +1124,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
// MARK: genAssocArray
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -1125,6 +1148,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
// MARK: flattenArray
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -1144,6 +1169,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
// MARK: flattenArrayKey
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -1163,6 +1190,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
// MARK: flattenArrayKeyLeavesOnly
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -1182,6 +1211,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
// MARK: arrayFlatForKey
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -1202,6 +1233,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
// MARK: arrayGetPrevKey, arrayGetNextKey
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -1266,7 +1299,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::arrayGetPrevKey, ::arrayGetNextKey
|
||||
* @covers ::arrayGetPrevKey
|
||||
* @covers ::arrayGetNextKey
|
||||
* @dataProvider providerArrayGetNextPrevKey
|
||||
* @testdox arrayGetNextPrevKey get next/prev key for $search wtih $expected_prev/$expected_next [$_dataName]
|
||||
*
|
||||
@@ -1294,6 +1328,13 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
// MARK: arrayReturnMatchingKeyOnly
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function providerReturnMatchingKeyOnley(): array
|
||||
{
|
||||
return [
|
||||
@@ -1379,6 +1420,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
// MARK: arrayModifyKey
|
||||
|
||||
/**
|
||||
* provider for arrayModifyKey
|
||||
*
|
||||
@@ -1491,6 +1534,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
// MARK: sortArray
|
||||
|
||||
/**
|
||||
* sort
|
||||
*
|
||||
@@ -1710,7 +1755,9 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
// MARK: ksortArray
|
||||
|
||||
/**
|
||||
* sort
|
||||
*
|
||||
* @return array
|
||||
@@ -1866,6 +1913,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: findArraysMissingKey
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -2033,6 +2082,8 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
// MARK: selectArrayFromOption
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
@@ -2378,6 +2429,316 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
||||
$result
|
||||
);
|
||||
}
|
||||
|
||||
// MARK: getRandomEntryFromArrayProvider
|
||||
|
||||
/**
|
||||
* Get random entry from array provider
|
||||
*
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function getRandomEntryFromArrayProvider(): array
|
||||
{
|
||||
return [
|
||||
'empty array' => [
|
||||
[],
|
||||
],
|
||||
'single element array' => [
|
||||
['only'],
|
||||
],
|
||||
'multiple elements array' => [
|
||||
['first', 'second', 'third'],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::getRandomEntryFromArray
|
||||
* @dataProvider getRandomEntryFromArrayProvider
|
||||
* @testdox getRandomEntryFromArray get random value from array [$_dataName]
|
||||
*
|
||||
* @param array $input
|
||||
* @return void
|
||||
*/
|
||||
public function testGetRandomEntryFromArray(array $input): void
|
||||
{
|
||||
$result = \CoreLibs\Combined\ArrayHandler::getRandomEntryFromArray($input);
|
||||
if (empty($input)) {
|
||||
$this->assertNull($result);
|
||||
} else {
|
||||
$this->assertContains($result, $input);
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: removeArrayEntryByValue
|
||||
|
||||
/**
|
||||
* Remove array entry by value provider
|
||||
*
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function removeArrayEntryByValueProvider(): array
|
||||
{
|
||||
return [
|
||||
'empty array' => [
|
||||
[],
|
||||
'',
|
||||
null,
|
||||
[],
|
||||
],
|
||||
'single element array' => [
|
||||
['only'],
|
||||
'only',
|
||||
null,
|
||||
[]
|
||||
],
|
||||
'single element array, not found' => [
|
||||
['only'],
|
||||
'foo',
|
||||
null,
|
||||
['only']
|
||||
],
|
||||
'multiple elements array' => [
|
||||
['first', 'second', 'third'],
|
||||
'second',
|
||||
null,
|
||||
['first', 'third'],
|
||||
],
|
||||
'array with multiple identical elements' => [
|
||||
['first', 'second', 'first', 'third'],
|
||||
'first',
|
||||
null,
|
||||
['second', 'third'],
|
||||
],
|
||||
'array with multiple identical elements, other remove' => [
|
||||
['first', 'second', 'first', 'third'],
|
||||
'second',
|
||||
null,
|
||||
['first', 'first', 'third'],
|
||||
],
|
||||
'array with key value entries' => [
|
||||
[
|
||||
'key1' => 'value1',
|
||||
'key2' => 'value2',
|
||||
'key3' => 'value3',
|
||||
],
|
||||
'value2',
|
||||
null,
|
||||
[
|
||||
'key1' => 'value1',
|
||||
'key3' => 'value3',
|
||||
]
|
||||
],
|
||||
'nested array, array match' => [
|
||||
[
|
||||
['first', 'second'],
|
||||
['third', 'fourth'],
|
||||
],
|
||||
['third', 'fourth'],
|
||||
null,
|
||||
[
|
||||
['first', 'second'],
|
||||
],
|
||||
],
|
||||
'strict test, off' => [
|
||||
['3', 3,],
|
||||
'3',
|
||||
null,
|
||||
[],
|
||||
],
|
||||
'strict test, on' => [
|
||||
['3', 3,],
|
||||
'3',
|
||||
true,
|
||||
[3,],
|
||||
],
|
||||
'strict test bool, off' => [
|
||||
['false', false, 0],
|
||||
false,
|
||||
null,
|
||||
['false'],
|
||||
],
|
||||
'strict test bool, on' => [
|
||||
['false', false, 0],
|
||||
false,
|
||||
true,
|
||||
['false', 0],
|
||||
],
|
||||
'strict test float, off' => [
|
||||
['3.14', 3.14],
|
||||
3.14,
|
||||
null,
|
||||
[],
|
||||
],
|
||||
'strict test float, on' => [
|
||||
['3.14', 3.14],
|
||||
3.14,
|
||||
true,
|
||||
['3.14'],
|
||||
],
|
||||
'stric test float and int, off' => [
|
||||
['1.0', '1', 1.0, 1],
|
||||
1,
|
||||
null,
|
||||
[],
|
||||
],
|
||||
'stric test float and int, on' => [
|
||||
['1.0', '1', 1.0, 1],
|
||||
1,
|
||||
true,
|
||||
['1.0', '1', 1.0],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for removeArrayEntryByValue function
|
||||
*
|
||||
* @covers ::removeArrayEntryByValue
|
||||
* @dataProvider removeArrayEntryByValueProvider
|
||||
* @testdox removeArrayEntryByValue Remove $value from array $input, with $strict [$_dataName]
|
||||
*
|
||||
* @param array $input
|
||||
* @param string|int|float|bool|array $value
|
||||
* @param bool|null $strict
|
||||
* @param array $expected
|
||||
* @return void
|
||||
*/
|
||||
public function testRemoveArrayEntryByValue(
|
||||
array $input,
|
||||
string|int|float|bool|array $value,
|
||||
?bool $strict,
|
||||
array $expected
|
||||
): void {
|
||||
if ($strict !== null) {
|
||||
$result = \CoreLibs\Combined\ArrayHandler::removeArrayEntryByValue($input, $value, $strict);
|
||||
} else {
|
||||
$result = \CoreLibs\Combined\ArrayHandler::removeArrayEntryByValue($input, $value);
|
||||
}
|
||||
$this->assertEquals(array_values($expected), array_values($result));
|
||||
}
|
||||
|
||||
// MARK: addStringToEachValueInArray
|
||||
|
||||
/**
|
||||
* Data provider for addStringToEachValueInArray tests.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function addStringToEachValueInArrayProvider(): array
|
||||
{
|
||||
return [
|
||||
'empty array' => [
|
||||
[],
|
||||
'string',
|
||||
null,
|
||||
[],
|
||||
],
|
||||
'empty string to add' => [
|
||||
['a', 'b'],
|
||||
'',
|
||||
null,
|
||||
['a', 'b'],
|
||||
],
|
||||
'prefix true' => [
|
||||
['a', 'b'],
|
||||
'pre_',
|
||||
true,
|
||||
['pre_a', 'pre_b'],
|
||||
],
|
||||
'prefix false' => [
|
||||
['a', 'b'],
|
||||
'_suf',
|
||||
false,
|
||||
['a_suf', 'b_suf'],
|
||||
],
|
||||
'mixed values' => [
|
||||
['a', 'b', 'c', 5, 6],
|
||||
'X',
|
||||
true,
|
||||
['Xa', 'Xb', 'Xc', 'X5', 'X6'],
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for addStringToEachValueInArray function
|
||||
*
|
||||
* @covers ::addStringToEachValueInArray
|
||||
* @dataProvider addStringToEachValueInArrayProvider
|
||||
* @testdox addStringToEachValueInArray Add $string_to_add to each value in $array, with $prefix [$_dataName]
|
||||
*
|
||||
* @param array $array
|
||||
* @param string $string_to_add
|
||||
* @param bool|null $prefix
|
||||
* @param array|null $expected
|
||||
* @return void
|
||||
*/
|
||||
public function testAddStringToEachValueInArray(
|
||||
array $array,
|
||||
string $string_to_add,
|
||||
?bool $prefix,
|
||||
?array $expected
|
||||
) {
|
||||
if ($prefix == null) {
|
||||
$result = \CoreLibs\Combined\ArrayHandler::addStringToEachValueInArray($array, $string_to_add);
|
||||
} else {
|
||||
$result = \CoreLibs\Combined\ArrayHandler::addStringToEachValueInArray($array, $string_to_add, $prefix);
|
||||
}
|
||||
$this->assertEquals($expected, $result);
|
||||
}
|
||||
|
||||
// MARK: createSortedArrayByKey
|
||||
|
||||
/**
|
||||
* Data provider for createSortedArrayByKey tests.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function createSortedArrayByKeyProvider(): array
|
||||
{
|
||||
return [
|
||||
'empty' => [
|
||||
[],
|
||||
[],
|
||||
],
|
||||
'flat array' => [
|
||||
['b' => 2, 'a' => 1, 'c' => 3],
|
||||
['a' => 1, 'b' => 2, 'c' => 3],
|
||||
],
|
||||
'nested array' => [
|
||||
['b' => 2, 'a' => 1, 'c' => ['d' => 4, 'b' => 2]],
|
||||
['a' => 1, 'b' => 2, 'c' => ['b' => 2, 'd' => 4]],
|
||||
],
|
||||
'deeply nested array' => [
|
||||
['b' => 2, 'a' => 1, 'c' => ['d' => 4, 'b' => 2, 'e' => ['g' => 7, 'f' => 6]]],
|
||||
['a' => 1, 'b' => 2, 'c' => ['b' => 2, 'd' => 4, 'e' => ['f' => 6, 'g' => 7]]],
|
||||
],
|
||||
'mixed key type' => [
|
||||
['b' => 2, 1 => 'one', 'a' => 1],
|
||||
[1 => 'one', 'a' => 1, 'b' => 2],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for createSortedArrayByKey function
|
||||
*
|
||||
* @covers ::createSortedArrayByKey
|
||||
* @dataProvider createSortedArrayByKeyProvider
|
||||
* @testdox createSortedArrayByKey Sort the array by keys recursively [$_dataName]
|
||||
*
|
||||
* @param array $input
|
||||
* @param array $expected
|
||||
* @return void
|
||||
*/
|
||||
public function testCreateSortedArrayByKey(array $input, array $expected): void
|
||||
{
|
||||
$result = \CoreLibs\Combined\ArrayHandler::createSortedArrayByKey($input);
|
||||
$this->assertEquals($expected, $result);
|
||||
}
|
||||
}
|
||||
|
||||
// __END__
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<?php
|
||||
<?php // phpcs:disable Generic.Files.LineLength
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
@@ -71,15 +71,16 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
||||
*
|
||||
* @covers ::dateStringFormat
|
||||
* @dataProvider timestampProvider
|
||||
* @testdox dateStringFormat $input (microtime $flag) will be $expected [$_dataName]
|
||||
* @testdox dateStringFormat $input (mt $flag_show_micro, float mt $flag_micro_as_float) will be $expected [$_dataName]
|
||||
*
|
||||
* @param int|float $input
|
||||
* @param bool $flag
|
||||
* @param bool $flag_show_micro
|
||||
* @param bool $flag_micro_as_float
|
||||
* @param string $expected
|
||||
* @return void
|
||||
*/
|
||||
public function testDateStringFormat(
|
||||
$input,
|
||||
int|float $input,
|
||||
bool $flag_show_micro,
|
||||
bool $flag_micro_as_float,
|
||||
string $expected
|
||||
|
||||
@@ -101,7 +101,7 @@ final class CoreLibsConvertColorTest extends TestCase
|
||||
* @covers ::rgbToHwb
|
||||
* @covers ::hsbToRgb
|
||||
* @covers ::hslToRgb
|
||||
* @covers ::hwebToRgb
|
||||
* @covers ::hwbToRgb
|
||||
* @testdox Convert from and to RGB via HSL, HWB, HSB/V
|
||||
*
|
||||
* @return void
|
||||
@@ -298,7 +298,6 @@ final class CoreLibsConvertColorTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::returnAsHex()
|
||||
* @testdox Convert from and to RGB via hex
|
||||
*
|
||||
* @return void
|
||||
@@ -342,8 +341,6 @@ final class CoreLibsConvertColorTest extends TestCase
|
||||
/**
|
||||
* linear RGB conversion tests
|
||||
*
|
||||
* @covers ::fromLinear
|
||||
* @covers ::toLinear
|
||||
* @testdox Convert from and to RGB linear conversion check
|
||||
*
|
||||
* @return void
|
||||
@@ -933,7 +930,6 @@ final class CoreLibsConvertColorTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::__get
|
||||
* @testdox Exception handling for RGB general calls
|
||||
*
|
||||
* @return void
|
||||
@@ -958,7 +954,6 @@ final class CoreLibsConvertColorTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::setFromHex
|
||||
* @testdox Exception handling for RGB setFromHex failues
|
||||
*
|
||||
* @return void
|
||||
@@ -1086,7 +1081,6 @@ final class CoreLibsConvertColorTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::__get
|
||||
* @testdox Exception handling for Lab general calls
|
||||
*
|
||||
* @return void
|
||||
@@ -1120,7 +1114,6 @@ final class CoreLibsConvertColorTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::__get
|
||||
* @testdox Exception handling for LCH general calls
|
||||
*
|
||||
* @return void
|
||||
@@ -1155,7 +1148,6 @@ final class CoreLibsConvertColorTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::__get
|
||||
* @testdox Exception handling for XYZ general calls
|
||||
*
|
||||
* @return void
|
||||
|
||||
@@ -671,7 +671,7 @@ final class CoreLibsConvertStringsTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::isValidRegexSimple
|
||||
* @covers ::isValidRegex
|
||||
* @dataProvider isValidRegexSimpleProvider
|
||||
* @testdox isValidRegexSimple make $input unqiue to $expected [$_dataName]
|
||||
*
|
||||
|
||||
@@ -421,6 +421,100 @@ final class CoreLibsCreateHashTest extends TestCase
|
||||
'hash hmac valid'
|
||||
);
|
||||
}
|
||||
|
||||
// MARK: generateImmutableHashForArray
|
||||
|
||||
/**
|
||||
* Data provider for testGenerateImmutableHashForArray.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function generateImmutableHashForArrayProvider(): array
|
||||
{
|
||||
return [
|
||||
'Empty array' => [
|
||||
[],
|
||||
null,
|
||||
'064f01fe',
|
||||
],
|
||||
'Simple array' => [
|
||||
['key' => 'value'],
|
||||
null,
|
||||
'78f40899',
|
||||
],
|
||||
'flat array a' => [
|
||||
[0, 1, 'b', 'c', 'a'],
|
||||
null,
|
||||
'ccec0f5b',
|
||||
],
|
||||
'flat array b' => [
|
||||
['b', 'c', 'a', 1, 0],
|
||||
null,
|
||||
'c6040f5b',
|
||||
],
|
||||
'flat array b, not sorted' => [
|
||||
['b', 'c', 'a', 1, 0],
|
||||
false,
|
||||
'c6040f5b',
|
||||
],
|
||||
'key array a' => [
|
||||
['A' => 0, 'F' => 1, 'C' => 'b', 'K' => 'c', 'B' => 'a'],
|
||||
null,
|
||||
'01f11355',
|
||||
],
|
||||
'key array a, not sorted' => [
|
||||
['A' => 0, 'F' => 1, 'C' => 'b', 'K' => 'c', 'B' => 'a'],
|
||||
false,
|
||||
'04911355',
|
||||
],
|
||||
'key array b' => [
|
||||
['A' => 0, 'B' => 'a', 'C' => 'b', 'F' => 1, 'K' => 'c'],
|
||||
null,
|
||||
'01f11355',
|
||||
],
|
||||
'key array b, not sorted' => [
|
||||
['A' => 0, 'B' => 'a', 'C' => 'b', 'F' => 1, 'K' => 'c'],
|
||||
false,
|
||||
'01f11355',
|
||||
],
|
||||
'complex nested array' => [
|
||||
[
|
||||
'level1' => [
|
||||
'level2' => [
|
||||
'level3' => 'value'
|
||||
]
|
||||
]
|
||||
],
|
||||
null,
|
||||
'd8de1565',
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for generating an immutable hash from an array.
|
||||
*
|
||||
* @covers ::generateImmutableHashForArray
|
||||
* @dataProvider generateImmutableHashForArrayProvider
|
||||
* @testdox generate immutable hash for array with result $expected [$_dataName]
|
||||
*
|
||||
* @param array<mixed> $input
|
||||
* @param string $expected
|
||||
*/
|
||||
public function testGenerateImmutableHashForArray(array $input, ?bool $sort_keys, string $expected): void
|
||||
{
|
||||
if ($sort_keys === null) {
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
\CoreLibs\Create\Hash::generateImmutableHashForArray($input)
|
||||
);
|
||||
} else {
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
\CoreLibs\Create\Hash::generateImmutableHashForArray($input, $sort_keys)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// __END__
|
||||
|
||||
@@ -87,7 +87,7 @@ final class CoreLibsCreateRandomKeyTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::randomKeyGeyn
|
||||
* @covers ::randomKeyGen
|
||||
* @dataProvider randomKeyGenProvider
|
||||
* @testdox randomKeyGen use $input key length $expected [$_dataName]
|
||||
*
|
||||
|
||||
@@ -78,7 +78,6 @@ final class CoreLibsCreateSessionTest extends TestCase
|
||||
/**
|
||||
* Test session start
|
||||
*
|
||||
* @covers ::startSession
|
||||
* @dataProvider sessionProvider
|
||||
* @testdox startSession $input name for $type will be $expected (error: $expected_error) [$_dataName]
|
||||
*
|
||||
|
||||
@@ -121,7 +121,6 @@ final class CoreLibsCreateUidsTest extends TestCase
|
||||
* must match 7e78fe0d-59b8-4637-af7f-e88d221a7d1e
|
||||
*
|
||||
* @covers ::uuidv4
|
||||
* @covers ::validateUuidv4
|
||||
* @testdox uuidv4 check that return is matching regex [$_dataName]
|
||||
*
|
||||
* @return void
|
||||
|
||||
@@ -123,10 +123,16 @@ final class CoreLibsDBIOTest extends TestCase
|
||||
'log_file_id' => 'CoreLibs-DB-IO-Test',
|
||||
]);
|
||||
// will be true, default logging is true
|
||||
$db = new \CoreLibs\DB\IO(
|
||||
self::$db_config['valid'],
|
||||
self::$log
|
||||
);
|
||||
try {
|
||||
$db = new \CoreLibs\DB\IO(
|
||||
self::$db_config['valid'],
|
||||
self::$log
|
||||
);
|
||||
} catch (\Exception $e) {
|
||||
self::markTestSkipped(
|
||||
'Cannot connect to Test DB for DB\IO test: ' . $e->getMessage()
|
||||
);
|
||||
}
|
||||
if (!$db->dbGetConnectionStatus()) {
|
||||
self::markTestSkipped(
|
||||
'Cannot connect to valid Test DB for DB\IO test.'
|
||||
@@ -543,8 +549,6 @@ final class CoreLibsDBIOTest extends TestCase
|
||||
/**
|
||||
* Test dbSetDbug, dbGetDebug
|
||||
*
|
||||
* @covers ::dbGetDbug
|
||||
* @covers ::dbSetDebug
|
||||
* @testdox Set and Get Debug flag
|
||||
*
|
||||
* @return void
|
||||
@@ -1003,6 +1007,59 @@ final class CoreLibsDBIOTest extends TestCase
|
||||
$db->dbClose();
|
||||
}
|
||||
|
||||
// MARK: stripAssocOnly
|
||||
|
||||
/**
|
||||
* Data provider for stripAssocOnly tests
|
||||
*
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public function stripAssocOnlyProvider(): array
|
||||
{
|
||||
return [
|
||||
'empty' => [
|
||||
[],
|
||||
[]
|
||||
],
|
||||
'int only' => [
|
||||
[0 => 'foo', 1 => 'bar'],
|
||||
[],
|
||||
],
|
||||
'mixed' => [
|
||||
[0 => 'foo', 'col_a' => 'foo', 1 => 'bar', 'col_b' => 'bar'],
|
||||
['col_a' => 'foo', 'col_b' => 'bar'],
|
||||
],
|
||||
'key only' => [
|
||||
['col_a' => 'foo', 'col_b' => 'bar'],
|
||||
['col_a' => 'foo', 'col_b' => 'bar'],
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for stripAssocOnly function
|
||||
*
|
||||
* @covers ::stripAssocOnly
|
||||
* @dataProvider stripAssocOnlyProvider
|
||||
* @testdox strip assoc non string entries from return [$_dataName]
|
||||
*
|
||||
* @param array<mixed> $input
|
||||
* @param array<string,mixed> $expected
|
||||
* @return void
|
||||
*/
|
||||
public function testStripAssocOnly(array $input, array $expected): void
|
||||
{
|
||||
$db = new \CoreLibs\DB\IO(
|
||||
self::$db_config['valid'],
|
||||
self::$log
|
||||
);
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
$db->stripAssocOnly($input)
|
||||
);
|
||||
$db->dbClose();
|
||||
}
|
||||
|
||||
// - string escape tests
|
||||
// dbEscapeString, dbEscapeLiteral, dbEscapeIdentifier,
|
||||
|
||||
@@ -3021,8 +3078,6 @@ final class CoreLibsDBIOTest extends TestCase
|
||||
* @covers ::dbReturnParams
|
||||
* @covers ::dbCacheReset
|
||||
* @covers ::dbGetCursorExt
|
||||
* @covers ::dbCursorPos
|
||||
* @covers ::dbCursorNumRows
|
||||
* @dataProvider dbReturnProvider
|
||||
* @testdox dbReturn Read First $read_first_only only and cache $flag_cache and assoc $flag_assoc with (Warning: $warning/Error: $error) [$_dataName]
|
||||
*
|
||||
|
||||
@@ -13,29 +13,6 @@ use PHPUnit\Framework\TestCase;
|
||||
*/
|
||||
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
|
||||
*
|
||||
@@ -85,18 +62,59 @@ final class CoreLibsDebugFileWriterTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @dataProvider fsetFolderProvider
|
||||
* @testdox fsetFolder $input will match $expected [$_dataName]
|
||||
* @testdox fsetFolder test correct return code
|
||||
*
|
||||
* @param string $input
|
||||
* @param boolean $expected
|
||||
* @return void
|
||||
*/
|
||||
public function testFsetFolder(string $input, bool $expected): void
|
||||
public function testFsetFolder(): void
|
||||
{
|
||||
// check the following
|
||||
// - valid folder, writeable
|
||||
// - valid folder, not writeable
|
||||
// - invalid folder (eg file)
|
||||
// - invalid folder name (eg contains spaces), must match ^[\w\-\/]+
|
||||
|
||||
// if we have no /tmp/ folder, we cannot test this, so skip the test
|
||||
if (!is_dir('/tmp')) {
|
||||
$this->markTestSkipped('No /tmp folder found, cannot test fsetFolder');
|
||||
}
|
||||
// TEST 3:
|
||||
// create a file in /tmp/ to test invalid folder (eg file)
|
||||
$test_file = '/tmp/somefile.txt';
|
||||
if (!is_file($test_file)) {
|
||||
touch($test_file);
|
||||
}
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
\CoreLibs\Debug\FileWriter::fsetFolder($input)
|
||||
false,
|
||||
\CoreLibs\Debug\FileWriter::fsetFolder($test_file)
|
||||
);
|
||||
// TEST 4:
|
||||
// test invalid folder name (eg contains spaces), must match ^[\w\-\/]+
|
||||
$this->assertEquals(
|
||||
false,
|
||||
\CoreLibs\Debug\FileWriter::fsetFolder('some name')
|
||||
);
|
||||
// TEST 1:
|
||||
// create a folder in /tmp/ to test valid folder, writeable
|
||||
$test_folder = '/tmp/somefolder';
|
||||
if (!is_dir($test_folder)) {
|
||||
mkdir($test_folder);
|
||||
}
|
||||
$this->assertEquals(
|
||||
true,
|
||||
\CoreLibs\Debug\FileWriter::fsetFolder($test_folder)
|
||||
);
|
||||
// TEST 2:
|
||||
// create a folder in /tmp/ to test valid folder, not writeable
|
||||
$test_folder = '/tmp/somefolder2';
|
||||
if (!is_dir($test_folder)) {
|
||||
mkdir($test_folder);
|
||||
}
|
||||
// remove all write permissions for the folder
|
||||
chmod($test_folder, 0555);
|
||||
$this->assertEquals(
|
||||
false,
|
||||
\CoreLibs\Debug\FileWriter::fsetFolder($test_folder)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -48,8 +48,8 @@ final class CoreLibsDebugSupportTest extends TestCase
|
||||
* @dataProvider printTimeProvider
|
||||
* @testdox printTime test with $microtime and match to regex [$_dataName]
|
||||
*
|
||||
* @param int|null $mircrotime
|
||||
* @param string $expected
|
||||
* @param ?int $microtime
|
||||
* @param string $regex
|
||||
* @return void
|
||||
*/
|
||||
public function testPrintTime(?int $microtime, string $regex): void
|
||||
@@ -460,10 +460,8 @@ final class CoreLibsDebugSupportTest extends TestCase
|
||||
* Undocumented function
|
||||
*
|
||||
* @cover ::getCallerFileLine
|
||||
* @testWith ["vendor/phpunit/phpunit/src/Framework/TestCase.php:6434","phar:///home/clemens/.phive/phars/phpunit-9.6.13.phar/phpunit/Framework/TestCase.php:6434"]
|
||||
* @testdox getCallerFileLine check based on regex .../Framework/TestCase.php:\d+ [$_dataName]
|
||||
*
|
||||
* @param string $expected
|
||||
* @return void
|
||||
*/
|
||||
public function testGetCallerFileLine(): void
|
||||
@@ -471,15 +469,19 @@ final class CoreLibsDebugSupportTest extends TestCase
|
||||
// regex prefix with path "/../" and then fixed vendor + \d+
|
||||
// or phar start if phiev installed
|
||||
// phar:///home/clemens/.phive/phars/phpunit-9.6.13.phar/phpunit/Framework/TestCase.php
|
||||
// phar:///usr/local/bin/phpunit/phpunit/Framework/TestCase.php
|
||||
$regex = "/^("
|
||||
. "\/.*\/vendor\/phpunit\/phpunit\/src"
|
||||
. "|"
|
||||
. "phar:\/\/\/.*\.phive\/phars\/phpunit-\d+\.\d+\.\d+\.phar\/phpunit"
|
||||
. "|"
|
||||
. "phar:\/\/\/usr\/local\/bin\/phpunit\/phpunit"
|
||||
. ")"
|
||||
. "\/Framework\/TestCase.php:\d+$/";
|
||||
$this->assertMatchesRegularExpression(
|
||||
$regex,
|
||||
Support::getCallerFileLine()
|
||||
Support::getCallerFileLine(),
|
||||
'Failed for: ' . Support::getCallerFileLine()
|
||||
);
|
||||
}
|
||||
|
||||
@@ -522,7 +524,7 @@ final class CoreLibsDebugSupportTest extends TestCase
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
$compare,
|
||||
'assert expected 10'
|
||||
'assert expected 10: ' . print_r($compare, true)
|
||||
);
|
||||
break;
|
||||
case 11:
|
||||
@@ -545,27 +547,38 @@ final class CoreLibsDebugSupportTest extends TestCase
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
$compare,
|
||||
'assert expected 11'
|
||||
'assert expected 11: ' . print_r($compare, true)
|
||||
);
|
||||
break;
|
||||
case 12:
|
||||
// add two "run" before "runBare"
|
||||
array_splice(
|
||||
$expected,
|
||||
7,
|
||||
0,
|
||||
['run']
|
||||
);
|
||||
array_splice(
|
||||
$expected,
|
||||
0,
|
||||
0,
|
||||
['include']
|
||||
);
|
||||
// if compare starts with "main"
|
||||
if ($compare[0] == 'main') {
|
||||
// add two more run after main
|
||||
array_splice(
|
||||
$expected,
|
||||
1,
|
||||
0,
|
||||
['run', 'run']
|
||||
);
|
||||
} else {
|
||||
// add two "run" before "runBare"
|
||||
array_splice(
|
||||
$expected,
|
||||
7,
|
||||
0,
|
||||
['run']
|
||||
);
|
||||
array_splice(
|
||||
$expected,
|
||||
0,
|
||||
0,
|
||||
['include']
|
||||
);
|
||||
}
|
||||
$this->assertEquals(
|
||||
$expected,
|
||||
$compare,
|
||||
'assert expected 12'
|
||||
'assert expected 12: ' . print_r($compare, true)
|
||||
);
|
||||
break;
|
||||
default:
|
||||
@@ -589,7 +602,7 @@ final class CoreLibsDebugSupportTest extends TestCase
|
||||
if ($call_stack < 8) {
|
||||
$this->assertFalse(true, 'getCallStack too low: 8');
|
||||
} else {
|
||||
$this->assertTrue(true, 'getCallSteck ok');
|
||||
$this->assertTrue(true, 'getCallStack ok');
|
||||
}
|
||||
// just test top entry
|
||||
$first = array_shift($call_stack);
|
||||
|
||||
@@ -442,7 +442,6 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
||||
* 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]
|
||||
*
|
||||
@@ -639,7 +638,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
||||
* plural and plural context
|
||||
*
|
||||
* @covers ::__n
|
||||
* @covers ::__pn
|
||||
* @covers ::__np
|
||||
* @dataProvider ngettextProvider
|
||||
* @testdox plural string test for locale $locale and domain $domain with $context [$_dataName]
|
||||
*
|
||||
@@ -865,6 +864,7 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
||||
string $value,
|
||||
string $expected
|
||||
): void {
|
||||
$old_value = null;
|
||||
switch ($type) {
|
||||
case 'global':
|
||||
$GLOBALS[$var] = $value;
|
||||
@@ -1101,11 +1101,11 @@ final class CoreLibsLanguageL10nTest extends TestCase
|
||||
* fuctions check
|
||||
* TODO: others d/dn/dp/dnp gettext functions
|
||||
*
|
||||
* @covers __setlocale
|
||||
* @covers __bindtextdomain
|
||||
* @covers __bind_textdomain_codeset
|
||||
* @covers __textdomain
|
||||
* @covers __gettext
|
||||
* @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]
|
||||
|
||||
@@ -514,7 +514,6 @@ final class CoreLibsLoggingLoggingTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers Logger\Flag
|
||||
* @testdox Logger\Flag enum test
|
||||
*
|
||||
* @return void
|
||||
@@ -828,6 +827,7 @@ final class CoreLibsLoggingLoggingTest extends TestCase
|
||||
// clean all data in folder first
|
||||
array_map('unlink', glob($log->getLogFolder() . $log->getLogFileId() . '*.log'));
|
||||
|
||||
$log_status = false;
|
||||
switch ($level->value) {
|
||||
case 200:
|
||||
$log_status = $log->info($message);
|
||||
@@ -851,7 +851,7 @@ final class CoreLibsLoggingLoggingTest extends TestCase
|
||||
$log_status = $log->emergency($message);
|
||||
break;
|
||||
}
|
||||
$this->assertTrue($log_status, 'log write successful');
|
||||
$this->assertTrue($log_status, 'log write unsuccessful for level: ' . $level->getName());
|
||||
$file_content = file_get_contents(
|
||||
$log->getLogFolder() . $log->getLogFile()
|
||||
) ?: '';
|
||||
|
||||
@@ -334,7 +334,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
||||
/**
|
||||
* test encrypt/decrypt produce correct output
|
||||
*
|
||||
* @covers ::generateRandomKey
|
||||
* @covers ::encrypt
|
||||
* @covers ::decrypt
|
||||
* @dataProvider providerEncryptDecryptSuccess
|
||||
@@ -370,7 +369,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
||||
/**
|
||||
* test encrypt/decrypt produce correct output
|
||||
*
|
||||
* @covers ::generateRandomKey
|
||||
* @covers ::encrypt
|
||||
* @covers ::decrypt
|
||||
* @dataProvider providerEncryptDecryptSuccess
|
||||
@@ -397,7 +395,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
||||
/**
|
||||
* test encrypt/decrypt produce correct output
|
||||
*
|
||||
* @covers ::generateRandomKey
|
||||
* @covers ::encrypt
|
||||
* @covers ::decrypt
|
||||
* @dataProvider providerEncryptDecryptSuccess
|
||||
@@ -424,7 +421,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
||||
/**
|
||||
* test encrypt/decrypt produce correct output
|
||||
*
|
||||
* @covers ::generateRandomKey
|
||||
* @covers ::encrypt
|
||||
* @covers ::decrypt
|
||||
* @dataProvider providerEncryptDecryptSuccess
|
||||
@@ -469,7 +465,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
||||
/**
|
||||
* Test decryption with wrong key
|
||||
*
|
||||
* @covers ::generateRandomKey
|
||||
* @covers ::encrypt
|
||||
* @covers ::decrypt
|
||||
* @dataProvider providerEncryptFailed
|
||||
@@ -496,7 +491,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
||||
/**
|
||||
* Test decryption with wrong key
|
||||
*
|
||||
* @covers ::generateRandomKey
|
||||
* @covers ::encrypt
|
||||
* @covers ::decrypt
|
||||
* @dataProvider providerEncryptFailed
|
||||
@@ -521,7 +515,6 @@ final class CoreLibsSecurityAsymmetricAnonymousEncryptionTest extends TestCase
|
||||
/**
|
||||
* Test decryption with wrong key
|
||||
*
|
||||
* @covers ::generateRandomKey
|
||||
* @covers ::encrypt
|
||||
* @covers ::decrypt
|
||||
* @dataProvider providerEncryptFailed
|
||||
|
||||
@@ -104,7 +104,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
||||
/**
|
||||
* test encrypt/decrypt produce correct output
|
||||
*
|
||||
* @covers ::generateRandomKey
|
||||
* @covers ::encrypt
|
||||
* @covers ::decrypt
|
||||
* @dataProvider providerEncryptDecryptSuccess
|
||||
@@ -132,7 +131,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
||||
/**
|
||||
* test encrypt/decrypt produce correct output
|
||||
*
|
||||
* @covers ::generateRandomKey
|
||||
* @covers ::encrypt
|
||||
* @covers ::decrypt
|
||||
* @dataProvider providerEncryptDecryptSuccess
|
||||
@@ -158,7 +156,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
||||
/**
|
||||
* test encrypt/decrypt produce correct output
|
||||
*
|
||||
* @covers ::generateRandomKey
|
||||
* @covers ::encryptKey
|
||||
* @covers ::decryptKey
|
||||
* @dataProvider providerEncryptDecryptSuccess
|
||||
@@ -202,7 +199,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
||||
/**
|
||||
* Test decryption with wrong key
|
||||
*
|
||||
* @covers ::generateRandomKey
|
||||
* @covers ::encrypt
|
||||
* @covers ::decrypt
|
||||
* @dataProvider providerEncryptFailed
|
||||
@@ -228,7 +224,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
||||
/**
|
||||
* Test decryption with wrong key
|
||||
*
|
||||
* @covers ::generateRandomKey
|
||||
* @covers ::encrypt
|
||||
* @covers ::decrypt
|
||||
* @dataProvider providerEncryptFailed
|
||||
@@ -252,7 +247,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
|
||||
/**
|
||||
* Test decryption with wrong key
|
||||
*
|
||||
* @covers ::generateRandomKey
|
||||
* @covers ::encryptKey
|
||||
* @covers ::decryptKey
|
||||
* @dataProvider providerEncryptFailed
|
||||
|
||||
@@ -42,7 +42,6 @@ final class CoreLibsTemplateHtmlBuilderElementTest extends TestCase
|
||||
/**
|
||||
* Undocumented function
|
||||
*
|
||||
* @covers ::Element
|
||||
* @covers ::buildHtml
|
||||
* @covers ::getTag
|
||||
* @covers ::getId
|
||||
|
||||
@@ -58,6 +58,11 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
||||
if ($handle === false) {
|
||||
continue;
|
||||
}
|
||||
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
|
||||
$status = curl_exec($handle);
|
||||
if ($status === false) {
|
||||
continue;
|
||||
}
|
||||
$this->url_basic = $url;
|
||||
// print "Open: $url\n";
|
||||
break;
|
||||
@@ -459,20 +464,19 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
||||
/**
|
||||
* set setup + header, base uri change
|
||||
*
|
||||
* @covers ::Curl
|
||||
* @covers ::setBaseUri
|
||||
* @covers ::addHeader
|
||||
* @covers ::removeHEader
|
||||
* @covers ::setHeaders
|
||||
* @covers ::removeHeaders
|
||||
* @dataProvider providerUrlRequestsCurlSetup
|
||||
* @testdox UrlRequests\Curl Class setup tasks [$_dataName]
|
||||
*
|
||||
* @param null|array $config
|
||||
* @param array $expected
|
||||
* @param null|string $new_base_uri
|
||||
* @param null|array $set_header
|
||||
* @param null|bool $set_header_add
|
||||
* @param null|array $remove_header
|
||||
* @param null|array $expected_change
|
||||
* @param null|array $config
|
||||
* @param array<string,mixed> $expected_set
|
||||
* @param null|string $new_base_uri
|
||||
* @param null|array $set_header
|
||||
* @param null|bool $set_header_add
|
||||
* @param null|array $remove_header
|
||||
* @param null|array $expected_change
|
||||
* @return void
|
||||
*/
|
||||
public function testUrlRequestsCurlSetupConfig(
|
||||
@@ -492,10 +496,18 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
||||
};
|
||||
// if ($new_base_uri === null && $set_header === null && $remove_header === null) {
|
||||
// }
|
||||
$this->assertEquals($expected_set, $curl->getConfig(), 'Class setup config mismatch');
|
||||
$this->assertEquals(
|
||||
$expected_set,
|
||||
$curl->getConfig(),
|
||||
'Class setup config mismatch'
|
||||
);
|
||||
if ($new_base_uri !== null) {
|
||||
$curl->setBaseUri($new_base_uri);
|
||||
$this->assertEquals($expected_change, $curl->getConfig(), 'new base_uri not matching');
|
||||
$this->assertEquals(
|
||||
$expected_change,
|
||||
$curl->getConfig(),
|
||||
'new base_uri not matching'
|
||||
);
|
||||
}
|
||||
if ($set_header !== null) {
|
||||
if ($set_header_add !== null) {
|
||||
@@ -503,11 +515,19 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
||||
} else {
|
||||
$curl->setHeaders($set_header);
|
||||
}
|
||||
$this->assertEquals($expected_change, $curl->getConfig(), 'new headers not matching');
|
||||
$this->assertEquals(
|
||||
$expected_change,
|
||||
$curl->getConfig(),
|
||||
'new headers not matching'
|
||||
);
|
||||
}
|
||||
if ($remove_header !== null) {
|
||||
$curl->removeHeaders($remove_header);
|
||||
$this->assertEquals($expected_change, $curl->getConfig(), 'removed headers not matching');
|
||||
$this->assertEquals(
|
||||
$expected_change,
|
||||
$curl->getConfig(),
|
||||
'removed headers not matching'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -877,7 +897,7 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
||||
string $return_content
|
||||
) {
|
||||
if (!$this->url_basic) {
|
||||
$this->markTestSkipped('No backend interface setup for testing: GET');
|
||||
$this->markTestSkipped('No backend interface setup for testing');
|
||||
}
|
||||
$curl = new \CoreLibs\UrlRequests\Curl();
|
||||
// options
|
||||
@@ -960,6 +980,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
||||
*/
|
||||
public function testUrlRequestsCurlRequestMultiple()
|
||||
{
|
||||
if (!$this->url_basic) {
|
||||
$this->markTestSkipped('No backend interface setup for testing');
|
||||
}
|
||||
$curl = new \CoreLibs\UrlRequests\Curl();
|
||||
// get
|
||||
$response = $curl->get($this->url_basic, [
|
||||
@@ -1051,6 +1074,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
||||
*/
|
||||
public function testUrlRequestsCurlAuthHeader()
|
||||
{
|
||||
if (!$this->url_basic) {
|
||||
$this->markTestSkipped('No backend interface setup for testing');
|
||||
}
|
||||
$curl = new \CoreLibs\UrlRequests\Curl([
|
||||
"auth" => ["user", "pass", "basic"],
|
||||
"http_errors" => false,
|
||||
@@ -1117,6 +1143,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
||||
*/
|
||||
public function testExceptionInvalidHeaderKey(): void
|
||||
{
|
||||
if (!$this->url_basic) {
|
||||
$this->markTestSkipped('No backend interface setup for testing');
|
||||
}
|
||||
$curl = new \CoreLibs\UrlRequests\Curl();
|
||||
$this->expectException(\RuntimeException::class);
|
||||
$this->expectExceptionMessageMatches("/InvalidHeaderKey/");
|
||||
@@ -1137,6 +1166,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
||||
*/
|
||||
public function testExceptionInvalidHeaderValue(): void
|
||||
{
|
||||
if (!$this->url_basic) {
|
||||
$this->markTestSkipped('No backend interface setup for testing');
|
||||
}
|
||||
$curl = new \CoreLibs\UrlRequests\Curl();
|
||||
$this->expectException(\RuntimeException::class);
|
||||
$this->expectExceptionMessageMatches("/InvalidHeaderValue/");
|
||||
@@ -1186,6 +1218,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
||||
*/
|
||||
public function testExceptionBadRequest(): void
|
||||
{
|
||||
if (!$this->url_basic) {
|
||||
$this->markTestSkipped('No backend interface setup for testing');
|
||||
}
|
||||
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => true]);
|
||||
$this->expectException(\RuntimeException::class);
|
||||
$this->expectExceptionMessageMatches("/ClientError/");
|
||||
@@ -1207,6 +1242,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
||||
*/
|
||||
public function testExceptionBadRequestEnable(): void
|
||||
{
|
||||
if (!$this->url_basic) {
|
||||
$this->markTestSkipped('No backend interface setup for testing');
|
||||
}
|
||||
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => false]);
|
||||
$this->expectException(\RuntimeException::class);
|
||||
$this->expectExceptionMessageMatches("/ClientError/");
|
||||
@@ -1229,6 +1267,9 @@ final class CoreLibsUrlRequestsCurlTest extends TestCase
|
||||
*/
|
||||
public function testExceptionBadRequestUnset(): void
|
||||
{
|
||||
if (!$this->url_basic) {
|
||||
$this->markTestSkipped('No backend interface setup for testing');
|
||||
}
|
||||
// if true, with false it has to be off
|
||||
$curl = new \CoreLibs\UrlRequests\Curl(["http_errors" => true]);
|
||||
$response = $curl->request('get', $this->url_basic, [
|
||||
|
||||
@@ -124,3 +124,11 @@ The development for those files is located in a different repository
|
||||
General: <https://[service]/CodeBlocks/JavaScript.utils>
|
||||
|
||||
Org: <https://[serverice]/[org]/Code-Blocks.JavaScript.utils>
|
||||
|
||||
### Update NPM packages
|
||||
|
||||
```sh
|
||||
npm-check-updates
|
||||
ncu -u
|
||||
npm install
|
||||
```
|
||||
|
||||
@@ -18,6 +18,10 @@ export default [
|
||||
globals: {
|
||||
...globals.browser,
|
||||
...globals.jquery
|
||||
},
|
||||
parserOptions: {
|
||||
ecmaVersion: 2022,
|
||||
sourceType: "script",
|
||||
}
|
||||
}},
|
||||
pluginJs.configs.recommended,
|
||||
|
||||
+4
-4
@@ -9,9 +9,9 @@
|
||||
"license": "",
|
||||
"description": "Core Libraries",
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.20.0",
|
||||
"esbuild": "^0.25.0",
|
||||
"eslint": "^9.20.1",
|
||||
"globals": "^15.15.0"
|
||||
"@eslint/js": "^10.0.1",
|
||||
"esbuild": "^0.28.1",
|
||||
"eslint": "^10.5.0",
|
||||
"globals": "^17.7.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,4 +23,10 @@
|
||||
<directory>./www/lib/CoreLibs</directory>
|
||||
</include>
|
||||
</source> -->
|
||||
<logging>
|
||||
<!-- JUnit XML log (Most Common for CI/CD) -->
|
||||
<junit outputFile="build/logs/junit.xml"/>
|
||||
<!-- TestDox HTML log -->
|
||||
<testdoxHtml outputFile="build/testdox.html"/>
|
||||
</logging>
|
||||
</phpunit>
|
||||
|
||||
@@ -103,6 +103,20 @@ foreach ($hash_types as $hash_type) {
|
||||
// print "UNIQU ID SHORT : " . Hash::__uniqId() . "<br>";
|
||||
// print "UNIQU ID LONG : " . Hash::__uniqIdLong() . "<br>";
|
||||
|
||||
$tests = [
|
||||
// array diff
|
||||
[0, 1, 'b', 'c', 'a'],
|
||||
['b', 'c', 'a', 1, 0],
|
||||
// key set arrays DO NOT diff
|
||||
['A' => 0, 'F' => 1, 'C' => 'b', 'K' => 'c', 'B' => 'a'],
|
||||
['A' => 0, 'B' => 'a', 'C' => 'b', 'F' => 1, 'K' => 'c'],
|
||||
];
|
||||
foreach ($tests as $test) {
|
||||
print "IMMUTABLE HASH FOR ARRAY: " . Hash::generateImmutableHashForArray($test) . "<br>";
|
||||
print "IMMUTABLE HASH FOR ARRAY: " . Hash::generateImmutableHashForArray($test, sort_keys:false) . "<br>";
|
||||
print "SERIALIZED HASH FOR ARRAY: " . hash(Hash::DEFAULT_HASH, serialize($test)) . "<br>";
|
||||
}
|
||||
|
||||
print "</body></html>";
|
||||
|
||||
// __END__
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@
|
||||
]
|
||||
},
|
||||
"repositories": {
|
||||
"git.egplusww.jp.Composer": {
|
||||
"packages.omnicomproduction.jp.Composer": {
|
||||
"type": "composer",
|
||||
"url": "https://packages.omnicomproduction.jp/api/packages/Composer/composer"
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ class File
|
||||
* @param string $read_file File to read, relative or absolute path
|
||||
* @return string mime type
|
||||
* @throws \UnexpectedValueException if file cannot be read or is not a file
|
||||
* @throws \RangeException if we cannot get a mime type and throw exception is on
|
||||
* @throws \RangeException if we cannot get a mime type
|
||||
*/
|
||||
public static function getMimeType(string $read_file): string
|
||||
{
|
||||
|
||||
@@ -475,8 +475,7 @@ class ArrayHandler
|
||||
throw new \ArgumentCountError(__FUNCTION__ . ' needs two or more array arguments');
|
||||
}
|
||||
$merged = [];
|
||||
while ($in_arrays) {
|
||||
$in_array = array_shift($in_arrays);
|
||||
foreach ($in_arrays as $in_array) {
|
||||
if (!is_array($in_array)) {
|
||||
throw new \TypeError(__FUNCTION__ . ' encountered a non array argument');
|
||||
}
|
||||
@@ -811,6 +810,93 @@ class ArrayHandler
|
||||
);
|
||||
return $in_array;
|
||||
}
|
||||
|
||||
/**
|
||||
* return one random entry from an array (value)
|
||||
* the return entry is null if the incoming array is empty
|
||||
* the array can also be an array of arrays
|
||||
*
|
||||
* @param array<mixed> $array
|
||||
* @return string|int|float|bool|array<mixed>|null
|
||||
*/
|
||||
public static function getRandomEntryFromArray(array $array): string|int|float|bool|array|null
|
||||
{
|
||||
if (empty($array)) {
|
||||
return null;
|
||||
}
|
||||
$random_index = array_rand($array);
|
||||
return $array[$random_index];
|
||||
}
|
||||
|
||||
/**
|
||||
* find and remove one value
|
||||
* on default does not strict compare
|
||||
*
|
||||
* @param array<mixed> $array
|
||||
* @param string|int|float|bool|array<mixed> $value
|
||||
* @param bool $strict [false]
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public static function removeArrayEntryByValue(
|
||||
array $array,
|
||||
string|int|float|bool|array $value,
|
||||
bool $strict = false,
|
||||
): array {
|
||||
if (empty($array)) {
|
||||
return $array;
|
||||
}
|
||||
return array_filter($array, function ($element) use ($value, $strict) {
|
||||
return $strict ?
|
||||
$element !== $value :
|
||||
$element != $value;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* add a string to each element in an array, default is at the end of the value,
|
||||
* can be switched with the prefix flag
|
||||
*
|
||||
* @param array<string> $array
|
||||
* @param string $string_to_add
|
||||
* @param bool $prefix [false]
|
||||
* @return array<string>
|
||||
*/
|
||||
public static function addStringToEachValueInArray(array $array, string $string_to_add, bool $prefix = false): array
|
||||
{
|
||||
// nothing set, skip
|
||||
if (empty($string_to_add) || empty($array)) {
|
||||
return $array;
|
||||
}
|
||||
return array_map(function ($value) use ($string_to_add, $prefix) {
|
||||
return $prefix ?
|
||||
$string_to_add . $value :
|
||||
$value . $string_to_add;
|
||||
}, $array);
|
||||
}
|
||||
|
||||
/**
|
||||
* sort by key any array, even if it is nested
|
||||
*
|
||||
* @param array<mixed> $data
|
||||
* @return array<mixed>
|
||||
*/
|
||||
public static function createSortedArrayByKey(array $data): array
|
||||
{
|
||||
if (empty($data)) {
|
||||
return $data;
|
||||
}
|
||||
// Sort by keys
|
||||
ksort($data);
|
||||
|
||||
// Recursively sort nested arrays
|
||||
foreach ($data as $key => $value) {
|
||||
if (is_array($value)) {
|
||||
$data[$key] = self::createSortedArrayByKey($value);
|
||||
}
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
// __END__
|
||||
|
||||
@@ -8,6 +8,8 @@ declare(strict_types=1);
|
||||
|
||||
namespace CoreLibs\Create;
|
||||
|
||||
use CoreLibs\Combined\ArrayHandler;
|
||||
|
||||
class Hash
|
||||
{
|
||||
/** @var string default short hash -> deprecated use STANDARD_HASH_SHORT */
|
||||
@@ -210,6 +212,27 @@ class Hash
|
||||
{
|
||||
return self::hash($string, self::STANDARD_HASH);
|
||||
}
|
||||
|
||||
/**
|
||||
* generate a hash over any array data
|
||||
* optional will not sort keys and so create hashes based on the original data.
|
||||
* for correct array comapre it is recommended to keep sort keys on
|
||||
*
|
||||
* @param array<mixed> $data
|
||||
* @param bool $sort_keys [true] Whether to sort the array keys before hashing
|
||||
* @return string
|
||||
*/
|
||||
public static function generateImmutableHashForArray(array $data, bool $sort_keys = true): string
|
||||
{
|
||||
// Create a sorted copy to ensure consistent hashing
|
||||
// Generate hash using serialize for better accuracy
|
||||
return hash(
|
||||
self::DEFAULT_HASH,
|
||||
serialize(
|
||||
$sort_keys ? ArrayHandler::createSortedArrayByKey($data) : $data
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// __END__
|
||||
|
||||
@@ -154,11 +154,11 @@ class RandomKey
|
||||
* if override key length is set, it will check on valid key and use this
|
||||
* this will not set the class key length variable
|
||||
*
|
||||
* @param int $key_length [default=-1] key length override,
|
||||
* if not set use default [LEGACY]
|
||||
* @param array<string> $key_range a list of key ranges as array,
|
||||
* if not set use previous set data
|
||||
* @return string random key
|
||||
* @param int $key_length [default=-1] key length override,
|
||||
* if not set use default [LEGACY]
|
||||
* @param array<string> ...$key_range a list of key ranges as array,
|
||||
* if not set use previous set data
|
||||
* @return string random key
|
||||
*/
|
||||
public static function randomKeyGen(
|
||||
int $key_length = self::KEY_LENGTH_DEFAULT,
|
||||
|
||||
+36
-22
@@ -520,7 +520,7 @@ class IO
|
||||
}
|
||||
|
||||
// *************************************************************
|
||||
// PRIVATE METHODS
|
||||
// MARK: PRIVATE METHODS
|
||||
// *************************************************************
|
||||
|
||||
/**
|
||||
@@ -1703,11 +1703,11 @@ class IO
|
||||
}
|
||||
|
||||
// *************************************************************
|
||||
// PUBLIC METHODS
|
||||
// MARK: PUBLIC METHODS
|
||||
// *************************************************************
|
||||
|
||||
// ***************************
|
||||
// CLOSE, STATUS, SETTINGS VARIABLE READ
|
||||
// MARK: CLOSE, STATUS, SETTINGS VARIABLE READ
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
@@ -1950,7 +1950,7 @@ class IO
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// DEBUG DATA DUMP
|
||||
// MARK: DEBUG DATA DUMP
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
@@ -1978,7 +1978,7 @@ class IO
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// CHECK QUERY TYPE
|
||||
// MARK: CHECK QUERY TYPE
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
@@ -2035,7 +2035,7 @@ class IO
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// DATA WRITE CONVERSION
|
||||
// MARK: DATA WRITE CONVERSION
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
@@ -2156,7 +2156,7 @@ class IO
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// DATA READ/WRITE CONVERSION
|
||||
// MARK: DATA READ/WRITE CONVERSION
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
@@ -2194,7 +2194,7 @@ class IO
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// DATA READ CONVERSION
|
||||
// MARK: DATA READ CONVERSION
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
@@ -2263,8 +2263,22 @@ class IO
|
||||
return is_array($__db_array_parse) ? $__db_array_parse : [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Will strip all single numberic entries from the array.
|
||||
* This is for database return
|
||||
*
|
||||
* @param array<mixed> $res
|
||||
* @return array<string,mixed>
|
||||
*/
|
||||
public function stripAssocOnly(array $res): array
|
||||
{
|
||||
return array_filter($res, function ($key) {
|
||||
return !is_numeric($key);
|
||||
}, ARRAY_FILTER_USE_KEY);
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// TABLE META DATA READ
|
||||
// MARK: TABLE META DATA READ
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
@@ -2290,7 +2304,7 @@ class IO
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// QUERY EXECUSION AND DATA READ
|
||||
// MARK: QUERY EXECUSION AND DATA READ
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
@@ -2927,7 +2941,7 @@ class IO
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// CURSOR RETURN
|
||||
// MARK: CURSOR RETURN
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
@@ -2941,7 +2955,7 @@ class IO
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// CURSOR EXT CACHE RESET
|
||||
// MARK: CURSOR EXT CACHE RESET
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
@@ -2971,7 +2985,7 @@ class IO
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// CURSOR EXT DATA CHECK
|
||||
// MARK: CURSOR EXT DATA CHECK
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
@@ -3066,7 +3080,7 @@ class IO
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// MAXIMUM QUERY EXECUTION CHECK HELPERS
|
||||
// MARK: MAXIMUM QUERY EXECUTION CHECK HELPERS
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
@@ -3102,7 +3116,7 @@ class IO
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// PREPARED QUERY WORK
|
||||
// MARK: PREPARED QUERY WORK
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
@@ -3379,7 +3393,7 @@ class IO
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// ASYNCHRONUS EXECUTION/CHECK
|
||||
// MARK: ASYNCHRONUS EXECUTION/CHECK
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
@@ -3539,7 +3553,7 @@ class IO
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// COMPLEX WRITE WITH CONFIG ARRAYS
|
||||
// MARK: COMPLEX WRITE WITH CONFIG ARRAYS
|
||||
// ***************************
|
||||
|
||||
// ** REMARK **
|
||||
@@ -3720,7 +3734,7 @@ class IO
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// INTERNAL SETTINGS READ/CHANGE
|
||||
// MARK: INTERNAL SETTINGS READ/CHANGE
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
@@ -4048,7 +4062,7 @@ class IO
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// QUERY DATA AND DB HANDLER
|
||||
// MARK: QUERY DATA AND DB HANDLER
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
@@ -4151,7 +4165,7 @@ class IO
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// INTERNAL VARIABLES READ POST QUERY RUN
|
||||
// MARK: INTERNAL VARIABLES READ POST QUERY RUN
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
@@ -4442,7 +4456,7 @@ class IO
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// ERROR AND WARNING DATA
|
||||
// MARK: ERROR AND WARNING DATA
|
||||
// ***************************
|
||||
|
||||
/**
|
||||
@@ -4499,7 +4513,7 @@ class IO
|
||||
}
|
||||
|
||||
// ***************************
|
||||
// DEPEREACTED CALLS
|
||||
// MARK: DEPEREACTED CALLS
|
||||
// all call below are no longer in use and throw deprecated errors
|
||||
// ***************************
|
||||
|
||||
|
||||
@@ -536,7 +536,7 @@ class PgSQL implements Interface\SqlFunctions
|
||||
$connection_string[] = 'sslmode=' . $db_ssl;
|
||||
}
|
||||
// connect
|
||||
$this->dbh = pg_connect(join(' ', $connection_string));
|
||||
$this->dbh = @pg_connect(join(' ', $connection_string));
|
||||
return $this->dbh;
|
||||
}
|
||||
|
||||
|
||||
@@ -290,7 +290,7 @@ class ConvertPlaceholder
|
||||
}
|
||||
$match = $matches[self::MATCHING_POS];
|
||||
// only count pos up for actual replacements we will do
|
||||
if (!empty($match)) {
|
||||
if (strlen((string)$match) > 0) {
|
||||
$pos++;
|
||||
$params_lookup[] = '$' . $pos;
|
||||
}
|
||||
|
||||
@@ -32,11 +32,11 @@ class FileWriter
|
||||
if (!is_writeable($folder)) {
|
||||
return false;
|
||||
}
|
||||
// if last is not / then add
|
||||
if (substr($folder, -1, 1) != DIRECTORY_SEPARATOR) {
|
||||
$folder .= DIRECTORY_SEPARATOR;
|
||||
if (!is_dir($folder)) {
|
||||
return false;
|
||||
}
|
||||
self::$debug_folder = $folder;
|
||||
// if last is not / then add
|
||||
self::$debug_folder = rtrim($folder, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user