Compare commits
22 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1e3ce162e5 | |||
| 22806d6add | |||
| 46e39fa85d | |||
| 8eb8e33dc4 | |||
| afcb953d2d | |||
| 742b4087aa | |||
| f0c8daf26a | |||
| ee32a90ff9 | |||
| 1823fd369b | |||
| 116f0a770c | |||
| b2123a183d | |||
| e92c585638 | |||
| 82c982c2c7 | |||
| 6b3ef52c5d | |||
| f2271313fc | |||
| a7f81766bf | |||
| 7a4c905ae3 | |||
| 0531b29749 | |||
| 5cf06f5b51 | |||
| bb23e760d0 | |||
| 45487b0039 | |||
| bfc82e12a5 |
+2
-2
@@ -54,8 +54,8 @@ return [
|
|||||||
// Note that the **only** effect of choosing `'5.6'` is to infer that functions removed in php 7.0 exist.
|
// Note that the **only** effect of choosing `'5.6'` is to infer that functions removed in php 7.0 exist.
|
||||||
// (See `backward_compatibility_checks` for additional options)
|
// (See `backward_compatibility_checks` for additional options)
|
||||||
// Automatically inferred from composer.json requirement for "php" of ">=8.2"
|
// Automatically inferred from composer.json requirement for "php" of ">=8.2"
|
||||||
'target_php_version' => '8.2',
|
'target_php_version' => '8.3',
|
||||||
"minimum_target_php_version" => "8.2",
|
"minimum_target_php_version" => "8.3",
|
||||||
// turn color on (-C)
|
// turn color on (-C)
|
||||||
"color_issue_messages_if_supported" => true,
|
"color_issue_messages_if_supported" => true,
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ Run `publish/publish.sh` script to create composer packages.
|
|||||||
|
|
||||||
This will automatically run all commands to create the packages
|
This will automatically run all commands to create the packages
|
||||||
|
|
||||||
### composer.egplusww.jp web host
|
### composer.omnicomproduction.jp web host
|
||||||
|
|
||||||
For the local composer package host.
|
For the local composer package host.
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ The entry is a copy of the `composer.json` with the following new entries:
|
|||||||
"version": "X.Y.Z",
|
"version": "X.Y.Z",
|
||||||
...
|
...
|
||||||
"dist": {
|
"dist": {
|
||||||
"url": "https://git.egplusww.jp/Composer/CoreLibs-Composer-All/archive/vX.Y.Z.zip",
|
"url": "https://packages.omnicomproduction.jp/Composer/CoreLibs-Composer-All/archive/vX.Y.Z.zip",
|
||||||
"type": "zip"
|
"type": "zip"
|
||||||
},
|
},
|
||||||
...
|
...
|
||||||
+9
-9
@@ -15,10 +15,11 @@
|
|||||||
"email": "clemens.schwaighofer@egplusww.com"
|
"email": "clemens.schwaighofer@egplusww.com"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"minimum-stability": "dev",
|
"minimum-stability": "stable",
|
||||||
|
"prefer-stable": true,
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=8.2",
|
"php": ">=8.3",
|
||||||
"psr/log": "^3.0@dev"
|
"psr/log": "^3.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpstan/phpstan": "^2.0",
|
"phpstan/phpstan": "^2.0",
|
||||||
@@ -26,13 +27,12 @@
|
|||||||
"phpstan/phpstan-deprecation-rules": "^2.0",
|
"phpstan/phpstan-deprecation-rules": "^2.0",
|
||||||
"phan/phan": "^5.4",
|
"phan/phan": "^5.4",
|
||||||
"egrajp/smarty-extended": "^5.4",
|
"egrajp/smarty-extended": "^5.4",
|
||||||
"gullevek/dotenv": "dev-master",
|
"gullevek/dotenv": "^3",
|
||||||
"phpunit/phpunit": "^9"
|
"phpunit/phpunit": "^9"
|
||||||
},
|
},
|
||||||
"repositories": {
|
"repositories": [{
|
||||||
"git.egplusww.jp.Composer": {
|
"name": "packages.omnicomproduction.Composer",
|
||||||
"type": "composer",
|
"type": "composer",
|
||||||
"url": "https://git.egplusww.jp/api/packages/Composer/composer"
|
"url": "https://packages.omnicomproduction.jp/api/packages/Composer/composer"
|
||||||
}
|
}]
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-1
@@ -1,7 +1,8 @@
|
|||||||
<phpunit
|
<phpunit
|
||||||
cacheResultFile="/tmp/phpunit-corelibs-composer.result.cache"
|
cacheResultFile="/tmp/phpunit-corelibs-composer.result.cache"
|
||||||
colors="true"
|
colors="true"
|
||||||
verbose="true"
|
verbose="false"
|
||||||
|
convertDeprecationsToExceptions="true"
|
||||||
bootstrap="test/phpunit/bootstrap.php"
|
bootstrap="test/phpunit/bootstrap.php"
|
||||||
>
|
>
|
||||||
<testsuites>
|
<testsuites>
|
||||||
@@ -9,4 +10,17 @@
|
|||||||
<directory>test/phpunit</directory>
|
<directory>test/phpunit</directory>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
</testsuites>
|
</testsuites>
|
||||||
|
<coverage processUncoveredFiles="true">
|
||||||
|
<include>
|
||||||
|
<directory suffix=".php">./www/lib/CoreLibs</directory>
|
||||||
|
</include>
|
||||||
|
<!-- <report>
|
||||||
|
<html outputDirectory="build/coverage-report"/>
|
||||||
|
</report> -->
|
||||||
|
</coverage>
|
||||||
|
<!-- <source>
|
||||||
|
<include>
|
||||||
|
<directory>./src</directory>
|
||||||
|
</include>
|
||||||
|
</source> -->
|
||||||
</phpunit>
|
</phpunit>
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
9.37.0
|
9.41.0.2
|
||||||
|
|||||||
+21
-3
@@ -11,6 +11,9 @@ go_flag="$1";
|
|||||||
|
|
||||||
function gitea_publish
|
function gitea_publish
|
||||||
{
|
{
|
||||||
|
# MUST have in app.ini, else upload will fail
|
||||||
|
# [repository]
|
||||||
|
# PREFIX_ARCHIVE_FILES = false
|
||||||
_GITEA_PUBLISH="${1}"
|
_GITEA_PUBLISH="${1}"
|
||||||
_GITEA_UPLOAD_FILENAME="${2}"
|
_GITEA_UPLOAD_FILENAME="${2}"
|
||||||
_GITEA_URL_DL="${3}"
|
_GITEA_URL_DL="${3}"
|
||||||
@@ -28,11 +31,24 @@ function gitea_publish
|
|||||||
[ -n "${_GITEA_URL_DL}" ] && [ -n "${_GITEA_URL_PUSH}" ] &&
|
[ -n "${_GITEA_URL_DL}" ] && [ -n "${_GITEA_URL_PUSH}" ] &&
|
||||||
[ -n "${_GITEA_USER}" ] && [ -n "${_GITEA_TOKEN}" ]; then
|
[ -n "${_GITEA_USER}" ] && [ -n "${_GITEA_TOKEN}" ]; then
|
||||||
echo "> Publish ${_GITEA_UPLOAD_FILENAME} with ${_VERSION} to: ${_GITEA_URL_PUSH}";
|
echo "> Publish ${_GITEA_UPLOAD_FILENAME} with ${_VERSION} to: ${_GITEA_URL_PUSH}";
|
||||||
|
error=0;
|
||||||
if [ ! -f "${_PACKAGE_DOWNLOAD}${_GITEA_UPLOAD_FILENAME}-v${_VERSION}.zip" ]; then
|
if [ ! -f "${_PACKAGE_DOWNLOAD}${_GITEA_UPLOAD_FILENAME}-v${_VERSION}.zip" ]; then
|
||||||
echo "> Download: ${_GITEA_UPLOAD_FILENAME}-v${_VERSION}.zip";
|
echo "> Download: ${_GITEA_UPLOAD_FILENAME}-v${_VERSION}.zip";
|
||||||
curl -LJO \
|
http_response=$(curl -LJO \
|
||||||
|
-w "%{http_code}" \
|
||||||
--output-dir "${_PACKAGE_DOWNLOAD}" \
|
--output-dir "${_PACKAGE_DOWNLOAD}" \
|
||||||
"${_GITEA_URL_DL}"/v"${_VERSION}".zip;
|
-H "Authorization: token ${_GITEA_TOKEN}" \
|
||||||
|
"${_GITEA_URL_DL}/v${_VERSION}.zip"
|
||||||
|
);
|
||||||
|
if [ "$http_response" -eq 200 ]; then
|
||||||
|
echo "[!] Error downloading file: ${http_response}";
|
||||||
|
error=1;
|
||||||
|
fi;
|
||||||
|
fi;
|
||||||
|
if [ $error -eq 0 ]; then
|
||||||
|
# if this is the short name rename to long name, if long name down load does not work
|
||||||
|
if [ -f "${_PACKAGE_DOWNLOAD}v${_VERSION}.zip" ]; then
|
||||||
|
mv "${_PACKAGE_DOWNLOAD}v${_VERSION}.zip" "${_PACKAGE_DOWNLOAD}${_GITEA_UPLOAD_FILENAME}-v${_VERSION}.zip";
|
||||||
fi;
|
fi;
|
||||||
if [ ! -f "${_PACKAGE_DOWNLOAD}${_GITEA_UPLOAD_FILENAME}-v${_VERSION}.zip" ]; then
|
if [ ! -f "${_PACKAGE_DOWNLOAD}${_GITEA_UPLOAD_FILENAME}-v${_VERSION}.zip" ]; then
|
||||||
echo "[!] Package file does not exist for version: ${_VERSION}";
|
echo "[!] Package file does not exist for version: ${_VERSION}";
|
||||||
@@ -46,9 +62,10 @@ function gitea_publish
|
|||||||
echo "[!] Error ${status}: ${message}";
|
echo "[!] Error ${status}: ${message}";
|
||||||
else
|
else
|
||||||
echo "> Publish completed";
|
echo "> Publish completed";
|
||||||
fi;
|
|
||||||
echo "${_VERSION}" > "${_file_last_published}";
|
echo "${_VERSION}" > "${_file_last_published}";
|
||||||
fi;
|
fi;
|
||||||
|
fi;
|
||||||
|
fi;
|
||||||
else
|
else
|
||||||
echo "[!] Missing either GITEA_UPLOAD_FILENAME, GITEA_URL_DL, GITEA_URL_PUSH, GITEA_USER or GITEA_TOKEN environment variable";
|
echo "[!] Missing either GITEA_UPLOAD_FILENAME, GITEA_URL_DL, GITEA_URL_PUSH, GITEA_USER or GITEA_TOKEN environment variable";
|
||||||
fi;
|
fi;
|
||||||
@@ -88,6 +105,7 @@ if [ -f "${file_last_published}" ]; then
|
|||||||
LAST_PUBLISHED_VERSION=$(cat "${file_last_published}");
|
LAST_PUBLISHED_VERSION=$(cat "${file_last_published}");
|
||||||
if dpkg --compare-versions "${VERSION}" le "${LAST_PUBLISHED_VERSION}"; then
|
if dpkg --compare-versions "${VERSION}" le "${LAST_PUBLISHED_VERSION}"; then
|
||||||
echo "[!] git tag version ${VERSION} is not newer than previous published version ${LAST_PUBLISHED_VERSION}";
|
echo "[!] git tag version ${VERSION} is not newer than previous published version ${LAST_PUBLISHED_VERSION}";
|
||||||
|
exit;
|
||||||
fi;
|
fi;
|
||||||
fi;
|
fi;
|
||||||
|
|
||||||
|
|||||||
+9
-3
@@ -58,15 +58,21 @@ class File
|
|||||||
* else returns '' for any other finfo read problem
|
* else returns '' for any other finfo read problem
|
||||||
*
|
*
|
||||||
* @param string $read_file File to read, relative or absolute path
|
* @param string $read_file File to read, relative or absolute path
|
||||||
* @return string
|
* @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
|
||||||
*/
|
*/
|
||||||
public static function getMimeType(string $read_file): string
|
public static function getMimeType(string $read_file): string
|
||||||
{
|
{
|
||||||
$finfo = new \finfo(FILEINFO_MIME_TYPE);
|
$finfo = new \finfo(FILEINFO_MIME_TYPE);
|
||||||
if (!is_file($read_file)) {
|
if (!is_file($read_file) || !is_readable($read_file)) {
|
||||||
throw new \UnexpectedValueException('[getMimeType] File not found: ' . $read_file);
|
throw new \UnexpectedValueException('[getMimeType] File not found: ' . $read_file);
|
||||||
}
|
}
|
||||||
return $finfo->file($read_file) ?: '';
|
$mime_type = $finfo->file($read_file);
|
||||||
|
if ($mime_type === false) {
|
||||||
|
throw new \RangeException('[getMimeType] Cannot get mime type for: ' . $read_file);
|
||||||
|
}
|
||||||
|
return $mime_type;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+48
-19
@@ -133,7 +133,7 @@ class DateTime
|
|||||||
} else {
|
} else {
|
||||||
for ($i = 0, $iMax = count($timegroups); $i < $iMax; $i++) {
|
for ($i = 0, $iMax = count($timegroups); $i < $iMax; $i++) {
|
||||||
$output = floor((float)$timestamp / $timegroups[$i]);
|
$output = floor((float)$timestamp / $timegroups[$i]);
|
||||||
$timestamp = (float)$timestamp % $timegroups[$i];
|
$timestamp = $timestamp % $timegroups[$i];
|
||||||
// output has days|hours|min|sec
|
// output has days|hours|min|sec
|
||||||
if ($output || $time_string) {
|
if ($output || $time_string) {
|
||||||
$time_string .= $output . $labels[$i] . (($i + 1) != count($timegroups) ? ' ' : '');
|
$time_string .= $output . $labels[$i] . (($i + 1) != count($timegroups) ? ' ' : '');
|
||||||
@@ -396,38 +396,67 @@ class DateTime
|
|||||||
* xd xh xm xs xms to a timestamp.microtime format
|
* xd xh xm xs xms to a timestamp.microtime format
|
||||||
*
|
*
|
||||||
* @param string|int|float $timestring formatted interval
|
* @param string|int|float $timestring formatted interval
|
||||||
|
* @param bool $throw_exception [default=false] if set to true will throw exception
|
||||||
|
* instead of returning input value as is
|
||||||
* @return string|int|float converted float interval, or string as is
|
* @return string|int|float converted float interval, or string as is
|
||||||
*/
|
*/
|
||||||
public static function stringToTime(string|int|float $timestring): string|int|float
|
public static function stringToTime(
|
||||||
{
|
string|int|float $timestring,
|
||||||
|
bool $throw_exception = false
|
||||||
|
): string|int|float {
|
||||||
$timestamp = 0;
|
$timestamp = 0;
|
||||||
if (!preg_match("/(d|h|m|s|ms)/", (string)$timestring)) {
|
|
||||||
return $timestring;
|
|
||||||
}
|
|
||||||
$timestring = (string)$timestring;
|
|
||||||
// pos for preg match read + multiply factor
|
|
||||||
$timegroups = [2 => 86400, 4 => 3600, 6 => 60, 8 => 1];
|
|
||||||
$matches = [];
|
$matches = [];
|
||||||
// if start with -, strip and set negative
|
|
||||||
$negative = false;
|
|
||||||
if (preg_match("/^-/", $timestring)) {
|
|
||||||
$negative = true;
|
|
||||||
$timestring = substr($timestring, 1);
|
|
||||||
}
|
|
||||||
// preg match: 0: full string
|
// preg match: 0: full string
|
||||||
// 2, 4, 6, 8 are the to need values
|
// 2, 4, 6, 8 are the to need values
|
||||||
preg_match("/^((\d+)d ?)?((\d+)h ?)?((\d+)m ?)?((\d+)s ?)?((\d+)ms)?$/", $timestring, $matches);
|
if (
|
||||||
|
!preg_match(
|
||||||
|
"/^\s*(-)?\s*"
|
||||||
|
. "((\d+)\s*d(?:ay(?:s)?)?)?\s*"
|
||||||
|
. "((\d+)\s*h(?:our(?:s)?)?)?\s*"
|
||||||
|
. "((\d+)\s*m(?:in(?:ute)?(?:s)?)?)?\s*"
|
||||||
|
. "((\d+)\s*s(?:ec(?:ond)?(?:s)?)?)?\s*"
|
||||||
|
. "((\d+)\s*m(?:illi)?s(?:ec(?:ond)?(?:s)?)?)?\s*"
|
||||||
|
. "$/",
|
||||||
|
(string)$timestring,
|
||||||
|
$matches
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
if ($throw_exception) {
|
||||||
|
throw new \InvalidArgumentException(
|
||||||
|
'Invalid time string format, cannot parse: "' . (string)$timestring . '"',
|
||||||
|
1
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return $timestring;
|
||||||
|
}
|
||||||
|
if (count($matches) < 2) {
|
||||||
|
if ($throw_exception) {
|
||||||
|
throw new \InvalidArgumentException(
|
||||||
|
'Invalid time string format, no interval value found: "' . (string)$timestring . '"',
|
||||||
|
2
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return $timestring;
|
||||||
|
}
|
||||||
|
// pos for preg match read + multiply factor
|
||||||
|
$timegroups = [3 => 86400, 5 => 3600, 7 => 60, 9 => 1];
|
||||||
|
// if start with -, strip and set negative
|
||||||
|
$negative = false;
|
||||||
|
if (!empty($matches[1])) {
|
||||||
|
$negative = true;
|
||||||
|
}
|
||||||
// multiply the returned matches and sum them up. the last one (ms) is added with .
|
// multiply the returned matches and sum them up. the last one (ms) is added with .
|
||||||
foreach ($timegroups as $i => $time_multiply) {
|
foreach ($timegroups as $i => $time_multiply) {
|
||||||
if (isset($matches[$i]) && is_numeric($matches[$i])) {
|
if (isset($matches[$i]) && is_numeric($matches[$i])) {
|
||||||
$timestamp += (float)$matches[$i] * $time_multiply;
|
$timestamp += (float)$matches[$i] * $time_multiply;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isset($matches[10]) && is_numeric($matches[10])) {
|
if (isset($matches[11]) && is_numeric($matches[11])) {
|
||||||
$timestamp .= '.' . $matches[10];
|
// for milliseconds, we need to divide by 1000 and add them
|
||||||
|
$timestamp += ((float)$matches[11] / 1000);
|
||||||
}
|
}
|
||||||
if ($negative) {
|
if ($negative) {
|
||||||
// cast to flaot so we can do a negative multiplication
|
// cast to float so we can do a negative multiplication
|
||||||
$timestamp = (float)$timestamp * -1;
|
$timestamp = (float)$timestamp * -1;
|
||||||
}
|
}
|
||||||
return $timestamp;
|
return $timestamp;
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ class Byte
|
|||||||
if (!empty($matches[1])) {
|
if (!empty($matches[1])) {
|
||||||
$number_negative = true;
|
$number_negative = true;
|
||||||
}
|
}
|
||||||
if (isset($matches[2]) && isset($matches[3])) {
|
if (isset($matches[2])) {
|
||||||
// remove all non valid characters from the number
|
// remove all non valid characters from the number
|
||||||
$number = preg_replace('/[^0-9\.]/', '', $matches[2]);
|
$number = preg_replace('/[^0-9\.]/', '', $matches[2]);
|
||||||
// final clean up and convert to float
|
// final clean up and convert to float
|
||||||
|
|||||||
@@ -957,9 +957,9 @@ class Color
|
|||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
* @param HWB $hwb
|
* @param HWB $hwb
|
||||||
* @return Lch
|
* @return LCH
|
||||||
*/
|
*/
|
||||||
public static function hwbToLch(HWB $hwb): Lch
|
public static function hwbToLch(HWB $hwb): LCH
|
||||||
{
|
{
|
||||||
return self::rgbToLch(
|
return self::rgbToLch(
|
||||||
self::hwbToRgb($hwb)
|
self::hwbToRgb($hwb)
|
||||||
@@ -1078,10 +1078,10 @@ class Color
|
|||||||
/**
|
/**
|
||||||
* OkLab to Lch (CIE)
|
* OkLab to Lch (CIE)
|
||||||
*
|
*
|
||||||
* @param LAB $lab
|
* @param Lab $lab
|
||||||
* @return LCH
|
* @return LCH
|
||||||
*/
|
*/
|
||||||
public static function okLabToLch(LAB $lab): LCH
|
public static function okLabToLch(Lab $lab): LCH
|
||||||
{
|
{
|
||||||
return self::labToLch(
|
return self::labToLch(
|
||||||
self::okLabToLab($lab)
|
self::okLabToLab($lab)
|
||||||
@@ -1092,9 +1092,9 @@ class Color
|
|||||||
* Lch (CIE) to OkLab
|
* Lch (CIE) to OkLab
|
||||||
*
|
*
|
||||||
* @param LCH $lch
|
* @param LCH $lch
|
||||||
* @return LAB
|
* @return Lab
|
||||||
*/
|
*/
|
||||||
public static function lchToOkLab(LCH $lch): LAB
|
public static function lchToOkLab(LCH $lch): Lab
|
||||||
{
|
{
|
||||||
return self::labToOkLab(
|
return self::labToOkLab(
|
||||||
self::lchToLab($lch)
|
self::lchToLab($lch)
|
||||||
|
|||||||
+25
-2
@@ -27,10 +27,14 @@ class Json
|
|||||||
* set original value as array
|
* set original value as array
|
||||||
* @return array<mixed> returns an array from the json values
|
* @return array<mixed> returns an array from the json values
|
||||||
*/
|
*/
|
||||||
public static function jsonConvertToArray(?string $json, bool $override = false): array
|
public static function jsonConvertToArray(?string $json, bool $override = false, int $flags = 0): array
|
||||||
{
|
{
|
||||||
if ($json !== null) {
|
if ($json !== null) {
|
||||||
$_json = json_decode($json, true);
|
// if flags has JSON_THROW_ON_ERROR remove it
|
||||||
|
if ($flags & JSON_THROW_ON_ERROR) {
|
||||||
|
$flags = $flags & ~JSON_THROW_ON_ERROR;
|
||||||
|
}
|
||||||
|
$_json = json_decode($json, true, flags:$flags);
|
||||||
if (self::$json_last_error = json_last_error()) {
|
if (self::$json_last_error = json_last_error()) {
|
||||||
if ($override == true) {
|
if ($override == true) {
|
||||||
// init return as array with original as element
|
// init return as array with original as element
|
||||||
@@ -65,6 +69,25 @@ class Json
|
|||||||
return (string)$json_string;
|
return (string)$json_string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate if a json string could be decoded.
|
||||||
|
* Weill set the internval last error state and info can be read with jsonGetLastError
|
||||||
|
*
|
||||||
|
* @param string $json
|
||||||
|
* @param int $flags only JSON_INVALID_UTF8_IGNORE is currently allowed
|
||||||
|
* @return bool
|
||||||
|
* @throws \InvalidArgumentException if flags is invalid
|
||||||
|
*/
|
||||||
|
public static function jsonValidate(string $json, int $flags = 0): bool
|
||||||
|
{
|
||||||
|
if ($flags != 0 && $flags != JSON_INVALID_UTF8_IGNORE) {
|
||||||
|
throw new \InvalidArgumentException("For flag only 0 or JSON_INVALID_UTF8_IGNORE is allwed: " . $flags);
|
||||||
|
}
|
||||||
|
$json_valid = json_validate($json, flags:$flags);
|
||||||
|
self::$json_last_error = json_last_error();
|
||||||
|
return $json_valid;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* returns human readable string for json errors thrown in jsonConvertToArray
|
* returns human readable string for json errors thrown in jsonConvertToArray
|
||||||
* Source: https://www.php.net/manual/en/function.json-last-error.php
|
* Source: https://www.php.net/manual/en/function.json-last-error.php
|
||||||
|
|||||||
@@ -287,6 +287,10 @@ class Strings
|
|||||||
// Remove all spaces
|
// Remove all spaces
|
||||||
$input = str_replace(' ', '', $input);
|
$input = str_replace(' ', '', $input);
|
||||||
$result = [];
|
$result = [];
|
||||||
|
// if there is no - inside, return unique characters as array
|
||||||
|
if (strpos($input, '-') === false) {
|
||||||
|
return array_unique(mb_str_split($input));
|
||||||
|
}
|
||||||
// Find all patterns like "A-Z" (character-dash-character)
|
// Find all patterns like "A-Z" (character-dash-character)
|
||||||
preg_match_all('/(.)-(.)/u', $input, $matches, PREG_SET_ORDER);
|
preg_match_all('/(.)-(.)/u', $input, $matches, PREG_SET_ORDER);
|
||||||
foreach ($matches as $match) {
|
foreach ($matches as $match) {
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class RandomKey
|
|||||||
private static function validateRandomKeyData(array ...$key_range): string
|
private static function validateRandomKeyData(array ...$key_range): string
|
||||||
{
|
{
|
||||||
$key_character_range = Strings::buildCharStringFromLists(...$key_range);
|
$key_character_range = Strings::buildCharStringFromLists(...$key_range);
|
||||||
if (strlen(self::$key_character_range) <= 1) {
|
if (strlen($key_character_range) <= 1) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
return $key_character_range;
|
return $key_character_range;
|
||||||
|
|||||||
+12
-6
@@ -2562,21 +2562,27 @@ class IO
|
|||||||
// set field names
|
// set field names
|
||||||
$this->cursor_ext[$query_hash]['field_names'] = [];
|
$this->cursor_ext[$query_hash]['field_names'] = [];
|
||||||
for ($i = 0; $i < $this->cursor_ext[$query_hash]['num_fields']; $i++) {
|
for ($i = 0; $i < $this->cursor_ext[$query_hash]['num_fields']; $i++) {
|
||||||
$this->cursor_ext[$query_hash]['field_names'][] =
|
if (
|
||||||
$this->db_functions->__dbFieldName(
|
($field_name = $this->db_functions->__dbFieldName(
|
||||||
$this->cursor_ext[$query_hash]['cursor'],
|
$this->cursor_ext[$query_hash]['cursor'],
|
||||||
$i
|
$i
|
||||||
);
|
)) !== false
|
||||||
|
) {
|
||||||
|
$this->cursor_ext[$query_hash]['field_names'][] = $field_name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$this->field_names = $this->cursor_ext[$query_hash]['field_names'];
|
$this->field_names = $this->cursor_ext[$query_hash]['field_names'];
|
||||||
// field types
|
// field types
|
||||||
$this->cursor_ext[$query_hash]['field_types'] = [];
|
$this->cursor_ext[$query_hash]['field_types'] = [];
|
||||||
for ($i = 0; $i < $this->cursor_ext[$query_hash]['num_fields']; $i++) {
|
for ($i = 0; $i < $this->cursor_ext[$query_hash]['num_fields']; $i++) {
|
||||||
$this->cursor_ext[$query_hash]['field_types'][] =
|
if (
|
||||||
$this->db_functions->__dbFieldType(
|
($field_type = $this->db_functions->__dbFieldType(
|
||||||
$this->cursor_ext[$query_hash]['cursor'],
|
$this->cursor_ext[$query_hash]['cursor'],
|
||||||
$i
|
$i
|
||||||
);
|
)) !== false
|
||||||
|
) {
|
||||||
|
$this->cursor_ext[$query_hash]['field_types'][] = $field_type;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$this->field_types = $this->cursor_ext[$query_hash]['field_types'];
|
$this->field_types = $this->cursor_ext[$query_hash]['field_types'];
|
||||||
// combined name => type
|
// combined name => type
|
||||||
|
|||||||
@@ -134,8 +134,8 @@ class Support
|
|||||||
* Convert bool value to string value. Short name alias for printBool
|
* Convert bool value to string value. Short name alias for printBool
|
||||||
*
|
*
|
||||||
* @param bool $bool Bool value to be transformed
|
* @param bool $bool Bool value to be transformed
|
||||||
* @param string $true [='true'] Override default string 'true'
|
* @param string $true [=true] Override default string 'true'
|
||||||
* @param string $false [=false'] Override default string 'false'
|
* @param string $false [=false] Override default string 'false'
|
||||||
* @return string $true or $false string for true/false bool
|
* @return string $true or $false string for true/false bool
|
||||||
*/
|
*/
|
||||||
public static function prBl(
|
public static function prBl(
|
||||||
|
|||||||
@@ -301,7 +301,7 @@ class L10n
|
|||||||
* Get the local as array same to the GetLocale::setLocale return
|
* Get the local as array same to the GetLocale::setLocale return
|
||||||
* This does not set from outside, but only what is set in the l10n class
|
* This does not set from outside, but only what is set in the l10n class
|
||||||
*
|
*
|
||||||
* @return array{locale: string, lang: string, lang_short: string, domain: string, encoding: string, path: string}
|
* @return array{locale:string,lang:string,lang_short:string,domain:string,encoding:string,path:string}
|
||||||
*/
|
*/
|
||||||
public function getLocaleAsArray(): array
|
public function getLocaleAsArray(): array
|
||||||
{
|
{
|
||||||
@@ -321,7 +321,7 @@ class L10n
|
|||||||
* parse the locale string for further processing
|
* parse the locale string for further processing
|
||||||
*
|
*
|
||||||
* @param string $locale Locale to parse
|
* @param string $locale Locale to parse
|
||||||
* @return array<string,string|null> array with lang, country, charset, modifier
|
* @return array{lang:string|null,country:string|null,charset:string|null,modifier:string|null} parsed locale
|
||||||
*/
|
*/
|
||||||
public static function parseLocale(string $locale = ''): array
|
public static function parseLocale(string $locale = ''): array
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ enum Flag: int
|
|||||||
/**
|
/**
|
||||||
* Get internal name from int value
|
* Get internal name from int value
|
||||||
*
|
*
|
||||||
* @param int $value
|
* @param value-of<self::VALUES> $value
|
||||||
* @return self
|
* @return self
|
||||||
*/
|
*/
|
||||||
public static function fromValue(int $value): self
|
public static function fromValue(int $value): self
|
||||||
|
|||||||
@@ -178,11 +178,11 @@ class Elements
|
|||||||
"/(href=\")?(\>)?\b($protRegex)([\w\.\-?&=+%#~,;\/]+)\b([\.\-?&=+%#~,;\/]*)(\|([^\||^#]+)(#([^\|]+))?\|)?/",
|
"/(href=\")?(\>)?\b($protRegex)([\w\.\-?&=+%#~,;\/]+)\b([\.\-?&=+%#~,;\/]*)(\|([^\||^#]+)(#([^\|]+))?\|)?/",
|
||||||
function ($matches) {
|
function ($matches) {
|
||||||
return self::createUrl(
|
return self::createUrl(
|
||||||
$matches[1] ?? '',
|
$matches[1],
|
||||||
$matches[2] ?? '',
|
$matches[2],
|
||||||
$matches[3] ?? '',
|
$matches[3],
|
||||||
$matches[4] ?? '',
|
$matches[4],
|
||||||
$matches[5] ?? '',
|
$matches[5],
|
||||||
$matches[7] ?? '',
|
$matches[7] ?? '',
|
||||||
$matches[9] ?? ''
|
$matches[9] ?? ''
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -490,11 +490,11 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
],
|
],
|
||||||
'micro interval with microtime' => [
|
'micro interval with microtime' => [
|
||||||
'18999d 0h 38m 10s 1235ms',
|
'18999d 0h 38m 10s 1235ms',
|
||||||
1641515890.1235,
|
1641515891.235,
|
||||||
],
|
],
|
||||||
'micro interval with microtime' => [
|
'micro interval with microtime' => [
|
||||||
'18999d 0h 38m 10s 1234567890ms',
|
'18999d 0h 38m 10s 1234567890ms',
|
||||||
1641515890.1234567,
|
1642750457.89,
|
||||||
],
|
],
|
||||||
'negative interval no microtime' => [
|
'negative interval no microtime' => [
|
||||||
'-18999d 0h 38m 10s',
|
'-18999d 0h 38m 10s',
|
||||||
@@ -503,23 +503,246 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
// short for mini tests
|
// short for mini tests
|
||||||
'microtime only' => [
|
'microtime only' => [
|
||||||
'0s 1235ms',
|
'0s 1235ms',
|
||||||
0.1235,
|
1.235,
|
||||||
],
|
],
|
||||||
'seconds only' => [
|
'seconds only' => [
|
||||||
'30s 1235ms',
|
'30s 1235ms',
|
||||||
30.1235,
|
31.235,
|
||||||
],
|
],
|
||||||
'minutes only' => [
|
'minutes only' => [
|
||||||
'1m 30s 1235ms',
|
'1m 30s 1235ms',
|
||||||
90.1235,
|
91.235,
|
||||||
],
|
],
|
||||||
'hours only' => [
|
'hours only' => [
|
||||||
'1h 1m 30s 1235ms',
|
'1h 1m 30s 1235ms',
|
||||||
3690.1235,
|
3691.235,
|
||||||
],
|
],
|
||||||
'days only' => [
|
'days only' => [
|
||||||
'1d 1h 1m 30s 1235ms',
|
'1d 1h 1m 30s 1235ms',
|
||||||
90090.1235,
|
90091.235,
|
||||||
|
],
|
||||||
|
'days only with long name' => [
|
||||||
|
'1day 1hour 1min 30second 1235millisecond',
|
||||||
|
90091.235,
|
||||||
|
],
|
||||||
|
// Test day variations
|
||||||
|
'day singular' => [
|
||||||
|
'5day',
|
||||||
|
432000,
|
||||||
|
],
|
||||||
|
'days plural' => [
|
||||||
|
'3days',
|
||||||
|
259200,
|
||||||
|
],
|
||||||
|
'days with space' => [
|
||||||
|
'2days 5h',
|
||||||
|
190800,
|
||||||
|
],
|
||||||
|
'day without space' => [
|
||||||
|
'1day1h',
|
||||||
|
90000,
|
||||||
|
],
|
||||||
|
// Test hour variations
|
||||||
|
'hour singular' => [
|
||||||
|
'2hour',
|
||||||
|
7200,
|
||||||
|
],
|
||||||
|
'hours plural' => [
|
||||||
|
'4hours',
|
||||||
|
14400,
|
||||||
|
],
|
||||||
|
'hours with space' => [
|
||||||
|
'3hours 30m',
|
||||||
|
12600,
|
||||||
|
],
|
||||||
|
'hour without space' => [
|
||||||
|
'1hour30m',
|
||||||
|
5400,
|
||||||
|
],
|
||||||
|
// Test minute variations
|
||||||
|
'min short' => [
|
||||||
|
'45min',
|
||||||
|
2700,
|
||||||
|
],
|
||||||
|
'minute singular' => [
|
||||||
|
'1minute',
|
||||||
|
60,
|
||||||
|
],
|
||||||
|
'minutes plural' => [
|
||||||
|
'10minutes',
|
||||||
|
600,
|
||||||
|
],
|
||||||
|
'minutes with space' => [
|
||||||
|
'5minutes 20s',
|
||||||
|
320,
|
||||||
|
],
|
||||||
|
'min without space' => [
|
||||||
|
'2min30s',
|
||||||
|
150,
|
||||||
|
],
|
||||||
|
// Test second variations
|
||||||
|
'sec short' => [
|
||||||
|
'30sec',
|
||||||
|
30,
|
||||||
|
],
|
||||||
|
'second singular' => [
|
||||||
|
'1second',
|
||||||
|
1,
|
||||||
|
],
|
||||||
|
'seconds plural' => [
|
||||||
|
'45seconds',
|
||||||
|
45,
|
||||||
|
],
|
||||||
|
'seconds with space' => [
|
||||||
|
'15seconds 500ms',
|
||||||
|
15.5,
|
||||||
|
],
|
||||||
|
'sec without space' => [
|
||||||
|
'10sec250ms',
|
||||||
|
10.25,
|
||||||
|
],
|
||||||
|
// Test millisecond variations
|
||||||
|
'ms short' => [
|
||||||
|
'500ms',
|
||||||
|
0.5,
|
||||||
|
],
|
||||||
|
'millis short' => [
|
||||||
|
'250millis',
|
||||||
|
0.25,
|
||||||
|
],
|
||||||
|
'millisec medium singular' => [
|
||||||
|
'250millisec',
|
||||||
|
0.25,
|
||||||
|
],
|
||||||
|
'millisecs medium plural' => [
|
||||||
|
'250millisecs',
|
||||||
|
0.25,
|
||||||
|
],
|
||||||
|
'misec medium singular' => [
|
||||||
|
'250millisec',
|
||||||
|
0.25,
|
||||||
|
],
|
||||||
|
'msecs medium plural' => [
|
||||||
|
'250millisecs',
|
||||||
|
0.25,
|
||||||
|
],
|
||||||
|
'millisecond long singular' => [
|
||||||
|
'1millisecond',
|
||||||
|
0.001,
|
||||||
|
],
|
||||||
|
'milliseconds long plural' => [
|
||||||
|
'999milliseconds',
|
||||||
|
0.999,
|
||||||
|
],
|
||||||
|
// Test negative values
|
||||||
|
'negative days' => [
|
||||||
|
'-5d',
|
||||||
|
-432000,
|
||||||
|
],
|
||||||
|
'negative hours' => [
|
||||||
|
'-3h',
|
||||||
|
-10800,
|
||||||
|
],
|
||||||
|
'negative minutes' => [
|
||||||
|
'-45m',
|
||||||
|
-2700,
|
||||||
|
],
|
||||||
|
'negative seconds' => [
|
||||||
|
'-30s',
|
||||||
|
-30,
|
||||||
|
],
|
||||||
|
'negative milliseconds' => [
|
||||||
|
'-500ms',
|
||||||
|
-0.5,
|
||||||
|
],
|
||||||
|
'negative complex' => [
|
||||||
|
'-2days 3hours 15minutes 30seconds 250milliseconds',
|
||||||
|
-184530.25,
|
||||||
|
],
|
||||||
|
// Test combined formats
|
||||||
|
'all components short' => [
|
||||||
|
'1d 2h 3m 4s 5ms',
|
||||||
|
93784.005,
|
||||||
|
],
|
||||||
|
'all components long' => [
|
||||||
|
'2days 3hours 4minutes 5seconds 678milliseconds',
|
||||||
|
183845.678,
|
||||||
|
],
|
||||||
|
'mixed short and long' => [
|
||||||
|
'1day 2h 3minutes 4sec 100ms',
|
||||||
|
93784.1,
|
||||||
|
],
|
||||||
|
'no spaces between components' => [
|
||||||
|
'1d2h3m4s5ms',
|
||||||
|
93784.005,
|
||||||
|
],
|
||||||
|
'only days and milliseconds' => [
|
||||||
|
'5d 123ms',
|
||||||
|
432000.123,
|
||||||
|
],
|
||||||
|
'only hours and seconds' => [
|
||||||
|
'2h 45s',
|
||||||
|
7245,
|
||||||
|
],
|
||||||
|
'only minutes and milliseconds' => [
|
||||||
|
'30m 500ms',
|
||||||
|
1800.5,
|
||||||
|
],
|
||||||
|
// Test zero values
|
||||||
|
'zero seconds' => [
|
||||||
|
'0s',
|
||||||
|
0,
|
||||||
|
],
|
||||||
|
'zero with milliseconds' => [
|
||||||
|
'0s 123ms',
|
||||||
|
0.123,
|
||||||
|
],
|
||||||
|
// Test large values
|
||||||
|
'large days' => [
|
||||||
|
'365days',
|
||||||
|
31536000,
|
||||||
|
],
|
||||||
|
'large hours' => [
|
||||||
|
'48hours',
|
||||||
|
172800,
|
||||||
|
],
|
||||||
|
'large minutes' => [
|
||||||
|
'1440minutes',
|
||||||
|
86400,
|
||||||
|
],
|
||||||
|
'large seconds' => [
|
||||||
|
'86400seconds',
|
||||||
|
86400,
|
||||||
|
],
|
||||||
|
// Test edge cases with spaces
|
||||||
|
'extra spaces' => [
|
||||||
|
'1d 2h 3m 4s 5ms',
|
||||||
|
93784.005,
|
||||||
|
],
|
||||||
|
'mixed spaces and no spaces' => [
|
||||||
|
'1d 2h3m 4s5ms',
|
||||||
|
93784.005,
|
||||||
|
],
|
||||||
|
// Test single component each
|
||||||
|
'only days short' => [
|
||||||
|
'7d',
|
||||||
|
604800,
|
||||||
|
],
|
||||||
|
'only hours short' => [
|
||||||
|
'12h',
|
||||||
|
43200,
|
||||||
|
],
|
||||||
|
'only minutes short' => [
|
||||||
|
'90m',
|
||||||
|
5400,
|
||||||
|
],
|
||||||
|
'only seconds short' => [
|
||||||
|
'120s',
|
||||||
|
120,
|
||||||
|
],
|
||||||
|
'only milliseconds short' => [
|
||||||
|
'1500ms',
|
||||||
|
1.5,
|
||||||
],
|
],
|
||||||
'already set' => [
|
'already set' => [
|
||||||
1641515890,
|
1641515890,
|
||||||
@@ -529,10 +752,18 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
'xyz',
|
'xyz',
|
||||||
'xyz',
|
'xyz',
|
||||||
],
|
],
|
||||||
|
'empty data' => [
|
||||||
|
' ',
|
||||||
|
' ',
|
||||||
|
],
|
||||||
'out of bound data' => [
|
'out of bound data' => [
|
||||||
'99999999999999999999d',
|
'99999999999999999999d',
|
||||||
8.64E+24
|
8.64E+24
|
||||||
],
|
],
|
||||||
|
'spaces inbetween' => [
|
||||||
|
' - 9 d 2h 58minutes 35 seconds 123 ms ',
|
||||||
|
-788315.123,
|
||||||
|
]
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -555,6 +786,36 @@ final class CoreLibsCombinedDateTimeTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::stringToTime
|
||||||
|
* @testdox stringToTime invalid input will throw exception if requested
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testStringToTimeException(): void
|
||||||
|
{
|
||||||
|
$this->expectException(\InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionMessageMatches("/^Invalid time string format, cannot parse: /");
|
||||||
|
\CoreLibs\Combined\DateTime::stringToTime('1x 2y 3z', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::stringToTime
|
||||||
|
* @testdox stringToTime empty input will throw exception if requested
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testStringToTimeExceptionEmpty(): void
|
||||||
|
{
|
||||||
|
$this->expectException(\InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionMessageMatches("/^Invalid time string format, no interval value found: /");
|
||||||
|
\CoreLibs\Combined\DateTime::stringToTime(' ', true);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -164,6 +164,51 @@ final class CoreLibsConvertJsonTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test with flags
|
||||||
|
*
|
||||||
|
* @covers ::jsonConvertToArray
|
||||||
|
* @testdox jsonConvertToArray flag test, if flag is used
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testJsonConvertToArrayWithFlags(): void
|
||||||
|
{
|
||||||
|
$input = '{"valid":"json","invalid":"\xB1\x31"}';
|
||||||
|
/* $expected_without_flag = [
|
||||||
|
'valid' => 'json'
|
||||||
|
];
|
||||||
|
$expected_with_flag = [
|
||||||
|
'valid' => 'json',
|
||||||
|
'invalid' => "\xB1\x31"
|
||||||
|
]; */
|
||||||
|
// no idea why in both it throws an erro
|
||||||
|
$expected_without_flag = [];
|
||||||
|
$expected_with_flag = [];
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_without_flag,
|
||||||
|
\CoreLibs\Convert\Json::jsonConvertToArray($input)
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_with_flag,
|
||||||
|
\CoreLibs\Convert\Json::jsonConvertToArray($input, flags:JSON_INVALID_UTF8_IGNORE)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testJsonConvertToArrayRemoveThrowFlag(): void
|
||||||
|
{
|
||||||
|
$input = '{"valid":"json","invalid":"\xB1\x31"}';
|
||||||
|
// show NOT throw an exception
|
||||||
|
try {
|
||||||
|
$this->assertEquals(
|
||||||
|
[],
|
||||||
|
\CoreLibs\Convert\Json::jsonConvertToArray($input, flags:JSON_THROW_ON_ERROR)
|
||||||
|
);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$this->fail('Exception was thrown despite flag removal');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* test json error states
|
* test json error states
|
||||||
*
|
*
|
||||||
@@ -189,6 +234,81 @@ final class CoreLibsConvertJsonTest extends TestCase
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test json error states
|
||||||
|
*
|
||||||
|
* @covers ::jsonValidate
|
||||||
|
* @dataProvider jsonErrorProvider
|
||||||
|
* @testdox jsonValidate $input will be $expected_i/$expected_s [$_dataName]
|
||||||
|
*
|
||||||
|
* @param string|null $input
|
||||||
|
* @param int $expected_i
|
||||||
|
* @param string $expected_s
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testJsonValidateGetLastError(?string $input, int $expected_i, string $expected_s): void
|
||||||
|
{
|
||||||
|
\CoreLibs\Convert\Json::jsonValidate($input);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_i,
|
||||||
|
\CoreLibs\Convert\Json::jsonGetLastError()
|
||||||
|
);
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected_s,
|
||||||
|
\CoreLibs\Convert\Json::jsonGetLastError(true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test json validation
|
||||||
|
*
|
||||||
|
* @covers ::jsonValidate
|
||||||
|
* @testdox jsonValidate test valid and invalid json
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testJsonValidate(): void
|
||||||
|
{
|
||||||
|
$this->assertTrue(
|
||||||
|
\CoreLibs\Convert\Json::jsonValidate('{"valid": "json"}')
|
||||||
|
);
|
||||||
|
$this->assertFalse(
|
||||||
|
\CoreLibs\Convert\Json::jsonValidate('not valid json')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if invalid flag throws exception
|
||||||
|
*
|
||||||
|
* @covers ::jsonValidate
|
||||||
|
* @testdox jsonValidate test exception thrown on invalid flag
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testJsonValidateInvalidFlag(): void
|
||||||
|
{
|
||||||
|
$this->expectException("\InvalidArgumentException");
|
||||||
|
\CoreLibs\Convert\Json::jsonValidate('{"valid": "json"}', 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if valid flag throws no exception
|
||||||
|
*
|
||||||
|
* @covers ::jsonValidate
|
||||||
|
* @testdox jsonValidate test no exception on valid flag
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testJsonValidateValidflag(): void
|
||||||
|
{
|
||||||
|
$this->assertTrue(
|
||||||
|
\CoreLibs\Convert\Json::jsonValidate('{"valid": "json"}', 0)
|
||||||
|
);
|
||||||
|
$this->assertTrue(
|
||||||
|
\CoreLibs\Convert\Json::jsonValidate('{"valid": "json"}', JSON_INVALID_UTF8_IGNORE)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Undocumented function
|
* Undocumented function
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -743,6 +743,11 @@ final class CoreLibsConvertStringsTest extends TestCase
|
|||||||
'abcdefghijklmnopqrstuvwxyz0123',
|
'abcdefghijklmnopqrstuvwxyz0123',
|
||||||
null,
|
null,
|
||||||
],
|
],
|
||||||
|
'range without dashes' => [
|
||||||
|
['abcddfff'],
|
||||||
|
'abcdf',
|
||||||
|
null,
|
||||||
|
],
|
||||||
'invalid ranges' => [
|
'invalid ranges' => [
|
||||||
['a-あ', 'A-あ', '0-あ'],
|
['a-あ', 'A-あ', '0-あ'],
|
||||||
'',
|
'',
|
||||||
|
|||||||
@@ -45,7 +45,6 @@ use CoreLibs\DB\Support\ConvertPlaceholder;
|
|||||||
* Test class for DB\IO + DB\SQL\PgSQL
|
* Test class for DB\IO + DB\SQL\PgSQL
|
||||||
* This will only test the PgSQL parts
|
* This will only test the PgSQL parts
|
||||||
* @coversDefaultClass \CoreLibs\DB\IO
|
* @coversDefaultClass \CoreLibs\DB\IO
|
||||||
* @coversDefaultClass \CoreLibs\DB\SQL\PgSQL
|
|
||||||
* @testdox \CoreLibs\DB\IO method tests for SQL\PgSQL
|
* @testdox \CoreLibs\DB\IO method tests for SQL\PgSQL
|
||||||
*/
|
*/
|
||||||
final class CoreLibsDBIOTest extends TestCase
|
final class CoreLibsDBIOTest extends TestCase
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
$set = 0;
|
$set = 0;
|
||||||
foreach (['/../../www', '/../www', '/../..', '/..', '/../../src', '/../src'] as $src) {
|
foreach (['/../../www', '/../www', '/../../src', '/../src', '/../..', '/..'] as $src) {
|
||||||
if (is_file(dirname(__DIR__) . $src . '/vendor/autoload.php')) {
|
if (is_file(dirname(__DIR__) . $src . '/vendor/autoload.php')) {
|
||||||
require dirname(__DIR__) . $src . '/vendor/autoload.php';
|
require dirname(__DIR__) . $src . '/vendor/autoload.php';
|
||||||
$set = 1;
|
$set = 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user