2020-01-27 13:45:07 +05:00
|
|
|
|
#include "test_utilsmisc.h"
|
|
|
|
|
|
|
|
|
|
#include <QTest>
|
|
|
|
|
|
|
|
|
|
#include "utils/misc.h"
|
2020-02-13 17:35:54 +01:00
|
|
|
|
|
2020-01-27 13:45:07 +05:00
|
|
|
|
using namespace Utils::Misc;
|
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
void TestUtilsMisc::initTestCase() {}
|
2020-01-27 13:45:07 +05:00
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
void TestUtilsMisc::testRemoveIfStartsWith() {
|
2020-01-27 13:45:07 +05:00
|
|
|
|
QString s = QStringLiteral("--*--testString");
|
|
|
|
|
QString result = removeIfStartsWith(s, QStringLiteral("--*--"));
|
|
|
|
|
QString expected = QStringLiteral("testString");
|
|
|
|
|
QVERIFY(result == expected);
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
void TestUtilsMisc::testRemoveIfEndsWith() {
|
2020-01-27 13:45:07 +05:00
|
|
|
|
QString s = QStringLiteral("testString--*--");
|
|
|
|
|
QString result = removeIfEndsWith(s, QStringLiteral("--*--"));
|
|
|
|
|
QString expected = QStringLiteral("testString");
|
|
|
|
|
QVERIFY(result == expected);
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
void TestUtilsMisc::testPrependIfDoesNotStartWith() {
|
2020-01-27 13:45:07 +05:00
|
|
|
|
QString s = QStringLiteral("testString");
|
|
|
|
|
QString result = prependIfDoesNotStartWith(s, QStringLiteral("--*--"));
|
|
|
|
|
QString expected = QStringLiteral("--*--testString");
|
|
|
|
|
QVERIFY(result == expected);
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
void TestUtilsMisc::testAppendIfDoesNotEndWith() {
|
2020-01-27 13:45:07 +05:00
|
|
|
|
QString s = QStringLiteral("testString");
|
|
|
|
|
QString result = appendIfDoesNotEndWith(s, QStringLiteral("--*--"));
|
|
|
|
|
QString expected = QStringLiteral("testString--*--");
|
|
|
|
|
QVERIFY(result == expected);
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
void TestUtilsMisc::testStartDetachedProcess() {
|
2020-01-27 13:45:07 +05:00
|
|
|
|
#ifdef Q_OS_UNIX
|
|
|
|
|
auto result = startDetachedProcess("pwd", {});
|
|
|
|
|
QVERIFY2(result == true, "Failed to start detached process");
|
|
|
|
|
#else
|
|
|
|
|
QSKIP("This test is skipped on non unix OS");
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
void TestUtilsMisc::testShorten() {
|
2020-01-27 13:45:07 +05:00
|
|
|
|
QString s = QStringLiteral("A Long test string with lots of words");
|
|
|
|
|
const auto result = shorten(s, 10);
|
|
|
|
|
QString expected = QStringLiteral("A Long ...");
|
|
|
|
|
QVERIFY(result == expected);
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
void TestUtilsMisc::testCycleTextCase() {
|
|
|
|
|
// test empty string
|
2020-01-27 13:45:07 +05:00
|
|
|
|
QString s = "";
|
|
|
|
|
QString result = cycleTextCase(s);
|
|
|
|
|
QString expected = "";
|
|
|
|
|
QVERIFY(result == expected);
|
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
// lower
|
2020-01-27 13:45:07 +05:00
|
|
|
|
s = "lower case sentence";
|
|
|
|
|
result = cycleTextCase(s);
|
|
|
|
|
expected = "LOWER CASE SENTENCE";
|
|
|
|
|
QVERIFY(result == expected);
|
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
// upper
|
2020-01-27 13:45:07 +05:00
|
|
|
|
s = "LOWER CASE SENTENCE";
|
|
|
|
|
result = cycleTextCase(s);
|
|
|
|
|
expected = "Lower Case Sentence";
|
|
|
|
|
QVERIFY(result == expected);
|
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
// start case
|
2020-01-27 13:45:07 +05:00
|
|
|
|
s = "Lower Case Sentence";
|
|
|
|
|
result = cycleTextCase(s);
|
|
|
|
|
expected = "Lower case sentence";
|
|
|
|
|
QVERIFY(result == expected);
|
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
// sentence case
|
2020-01-27 13:45:07 +05:00
|
|
|
|
s = "Lower case sentence";
|
|
|
|
|
result = cycleTextCase(s);
|
|
|
|
|
expected = "lower case sentence";
|
|
|
|
|
QVERIFY(result == expected);
|
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
// random 1
|
2020-01-27 13:45:07 +05:00
|
|
|
|
s = "LOWER CASE Sentence";
|
|
|
|
|
result = cycleTextCase(s);
|
|
|
|
|
expected = "lower case sentence";
|
|
|
|
|
QVERIFY(result == expected);
|
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
// random 2
|
2020-01-27 13:45:07 +05:00
|
|
|
|
s = "lower CASE Sentence";
|
|
|
|
|
result = cycleTextCase(s);
|
|
|
|
|
expected = "lower case sentence";
|
|
|
|
|
QVERIFY(result == expected);
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
void TestUtilsMisc::testHtmlToMarkdown() {
|
2020-01-27 13:45:07 +05:00
|
|
|
|
QString html = "<head><meta charset=\"utf-8\"></head>";
|
|
|
|
|
html += "<script>script</script>";
|
|
|
|
|
html += "<style>style</style>";
|
|
|
|
|
html += "<h1>Heading <em>italic</em></h1>";
|
|
|
|
|
html += "<h2>Heading <strong>italic</strong></h2>";
|
|
|
|
|
html += "<h3>Heading <em>italic</em></h3>";
|
|
|
|
|
html += "<h4>Heading <em>italic</em></h4";
|
|
|
|
|
html += "<h5>Heading <em>italic</em></h5>";
|
|
|
|
|
html += "<h6>Heading <em>italic</em></h6>";
|
|
|
|
|
html += "<code>hello</code>";
|
|
|
|
|
html += "<i>hello</i>";
|
|
|
|
|
|
|
|
|
|
QString result = htmlToMarkdown(html);
|
2020-02-10 18:23:25 +01:00
|
|
|
|
QString expected =
|
|
|
|
|
"\n# Heading *italic*\n\n## Heading **italic**\n\n### Heading "
|
|
|
|
|
"*italic*\n<h4>Heading *italic*</h4\n##### Heading *italic*\n\n###### "
|
|
|
|
|
"Heading *italic*\n\n```\nhello\n```\n*hello*";
|
2020-01-27 13:45:07 +05:00
|
|
|
|
QVERIFY(result == expected);
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
void TestUtilsMisc::testParseTaskList() {
|
2020-05-21 09:04:10 +02:00
|
|
|
|
const auto listTag = QStringLiteral("<li style=\"list-style-type:square\">");
|
|
|
|
|
const QString &t1 = "<li> [ ] task 1</li>";
|
|
|
|
|
const QString &r1 = parseTaskList(t1, true);
|
|
|
|
|
QString expec = listTag +
|
2023-01-26 16:58:47 +05:00
|
|
|
|
" <a class=\"task-list-item-checkbox\" "
|
|
|
|
|
"href=\"checkbox://_0\">☐</a> task 1</li>";
|
2020-01-27 13:45:07 +05:00
|
|
|
|
QVERIFY(r1 == expec);
|
|
|
|
|
|
2020-05-21 09:04:10 +02:00
|
|
|
|
const QString &t2 = "<li> [x] task 2</li>";
|
|
|
|
|
const QString &r2 = parseTaskList(t2, true);
|
|
|
|
|
expec = listTag +
|
2023-01-26 16:58:47 +05:00
|
|
|
|
" <a class=\"task-list-item-checkbox\" "
|
|
|
|
|
"href=\"checkbox://_0\">☑</a> task 2</li>";
|
2020-01-27 13:45:07 +05:00
|
|
|
|
QVERIFY(r2 == expec);
|
|
|
|
|
|
2020-05-21 09:04:10 +02:00
|
|
|
|
const QString &t3 = "<li> [x] task 3</li>";
|
|
|
|
|
const QString &r3 = parseTaskList(t3, false);
|
|
|
|
|
expec = listTag + " ☑ task 3</li>";
|
2020-01-27 13:45:07 +05:00
|
|
|
|
QVERIFY(r3 == expec);
|
|
|
|
|
|
2020-05-21 09:04:10 +02:00
|
|
|
|
const QString &t4 = "<li> [ ] task 4</li>";
|
|
|
|
|
const QString &r4 = parseTaskList(t4, false);
|
|
|
|
|
expec = listTag + " ☐ task 4</li>";
|
2020-01-27 13:45:07 +05:00
|
|
|
|
QVERIFY(r4 == expec);
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
void TestUtilsMisc::testUnescapeHtml() {
|
2020-01-27 13:45:07 +05:00
|
|
|
|
QString html = "<h1>hello</h1>\n<p>hello</p>";
|
|
|
|
|
QString result = unescapeHtml(html);
|
|
|
|
|
QString expected = "hello\n\n\nhello";
|
|
|
|
|
QVERIFY(result == expected);
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
void TestUtilsMisc::testHtmlSpecialChars() {
|
2020-01-27 13:45:07 +05:00
|
|
|
|
QString str = "& \" \' < >";
|
|
|
|
|
QString result = htmlspecialchars(str);
|
|
|
|
|
QString expected = "& " ' < >";
|
|
|
|
|
QVERIFY(result == expected);
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-10 18:23:25 +01:00
|
|
|
|
void TestUtilsMisc::testToHumanReadableByteSize() {
|
2020-01-27 13:45:07 +05:00
|
|
|
|
qint64 bytes = 8712492;
|
|
|
|
|
QString result = toHumanReadableByteSize(bytes);
|
|
|
|
|
QString expected = "8.31 MB";
|
|
|
|
|
QVERIFY(result == expected);
|
|
|
|
|
}
|
2021-09-27 21:30:06 +02:00
|
|
|
|
|
|
|
|
|
void TestUtilsMisc::testTransformEvernoteImportCodeBlock() {
|
|
|
|
|
QString content = R"(<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
|
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export2.dtd">
|
|
|
|
|
<en-export export-date="20181021T174838Z" application="Evernote/Windows" version="6.x">
|
|
|
|
|
<note><title>test</title><content><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
|
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
|
|
|
|
|
|
|
|
|
|
<en-note><div>This is a test note with some code blocks</div><div style="box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 12px; color: rgb(51, 51, 51); border-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.15);-en-codeblock:true;"><div><?php</div><div><br/></div><div>phpinfo();</div><div><br/></div><div>?></div></div><div><br/></div></en-note>]]></content><created>20181021T111619Z</created><updated>20181021T111738Z</updated><note-attributes><author>myemail@example.com</author><source>desktop.win</source><source-application>evernote.win32</source-application></note-attributes></note></en-export>
|
|
|
|
|
)";
|
|
|
|
|
|
2021-09-28 02:09:06 +02:00
|
|
|
|
QVERIFY(testEvernoteImportText(content) == R"(This is a test note with some code blocks
|
2021-09-27 21:30:06 +02:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
phpinfo();
|
|
|
|
|
|
|
|
|
|
?>
|
|
|
|
|
```)");
|
|
|
|
|
}
|
2021-09-27 21:51:14 +02:00
|
|
|
|
|
|
|
|
|
void TestUtilsMisc::testTransformEvernoteImportCodeBlock2() {
|
|
|
|
|
QString content = R"(<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
|
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export2.dtd">
|
|
|
|
|
<en-export export-date="20181029T161628Z" application="Evernote/Windows" version="6.x">
|
|
|
|
|
<note><title>File manager</title><content><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
|
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
|
|
|
|
|
|
|
|
|
|
<en-note><div><br/></div><div style="-en-codeblock: true; box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 12px; color: rgb(51, 51, 51); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.14902); background-position: initial initial; background-repeat: initial initial;"><div> /**</div><div> * Gets the configuration path depending on the operation system</div><div> *</div><div> * @return bool|string</div><div> */</div><div> private static function getConfigPath()</div><div> {</div><div> $file_manager = new pm_ServerFileManager();</div><div> if ($file_manager->fileExists('/etc/httpd/conf.d/pagespeed.conf')) {</div><div> // CentOS</div><div> return '/etc/httpd/conf.d/pagespeed.conf';</div><div> } elseif ($file_manager->fileExists('/etc/apache2/mods-available/pagespeed.conf')) {</div><div> // Ubuntu</div><div> return '/etc/apache2/mods-available/pagespeed.conf';</div><div> }</div><div> return false;</div><div> }</div></div><div><br/></div></en-note>]]></content><created>20170703T093015Z</created><updated>20170703T093022Z</updated><note-attributes><author>myemail@domain.com</author><source>desktop.win</source><source-application>evernote.win32</source-application></note-attributes></note></en-export>
|
|
|
|
|
)";
|
|
|
|
|
|
2021-09-28 02:09:06 +02:00
|
|
|
|
QVERIFY(testEvernoteImportText(content) == R"(```
|
2021-09-27 22:20:02 +02:00
|
|
|
|
/**
|
2021-09-27 21:51:14 +02:00
|
|
|
|
|
|
|
|
|
* Gets the configuration path depending on the operation system
|
|
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
|
|
* @return bool|string
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
private static function getConfigPath()
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
$file_manager = new pm_ServerFileManager();
|
|
|
|
|
|
|
|
|
|
if ($file_manager->fileExists('/etc/httpd/conf.d/pagespeed.conf')) {
|
|
|
|
|
|
|
|
|
|
// CentOS
|
|
|
|
|
|
|
|
|
|
return '/etc/httpd/conf.d/pagespeed.conf';
|
|
|
|
|
|
|
|
|
|
} elseif ($file_manager->fileExists('/etc/apache2/mods-available/pagespeed.conf')) {
|
|
|
|
|
|
|
|
|
|
// Ubuntu
|
|
|
|
|
|
|
|
|
|
return '/etc/apache2/mods-available/pagespeed.conf';
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
```)");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TestUtilsMisc::testTransformEvernoteImportRussian() {
|
|
|
|
|
QString content = R"(<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
|
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export2.dtd">
|
|
|
|
|
<en-export export-date="20191111T145250Z" application="Evernote/Windows" version="6.x">
|
|
|
|
|
<note><title>15-3.1</title><content><![CDATA[<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd"><en-note style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div>У меня дома две комнаты, кухня, туалет и ванна.</div></en-note>]]></content><created>20150714T065518Z</created><updated>20150714T073706Z</updated><note-attributes><source>mobile.android</source></note-attributes></note></en-export>
|
|
|
|
|
)";
|
|
|
|
|
|
2023-01-26 16:58:47 +05:00
|
|
|
|
QVERIFY(testEvernoteImportText(content) ==
|
|
|
|
|
R"(У меня дома две комнаты, кухня, туалет и ванна.)");
|
2021-09-27 21:51:14 +02:00
|
|
|
|
}
|
2021-09-27 22:26:06 +02:00
|
|
|
|
|
|
|
|
|
void TestUtilsMisc::testTransformEvernoteImportHyperlinks() {
|
|
|
|
|
QString content = R"(<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
|
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export2.dtd">
|
|
|
|
|
<en-export export-date="20210924T214029Z" application="Evernote/Windows" version="6.x">
|
|
|
|
|
<note><title>Fwd: Your 4 HIgh Value Trainings Access</title><content><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
|
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
|
|
|
|
|
<en-note bgcolor="#FFFFFF" text="#000000">
|
|
|
|
|
<br clear="none"/>
|
|
|
|
|
<div><br clear="none"/>
|
|
|
|
|
<p>
|
|
|
|
|
<a href="https://seanmize.infusionsoft.com/app/linkClick/24286/45b5a4e4c9f46ab6/13909690/64482e72b8e684a3">4 High Value Trainings Access</a>
|
|
|
|
|
</p>
|
|
|
|
|
</div>
|
|
|
|
|
<br clear="none"/>
|
|
|
|
|
</en-note>]]></content><created>20151005T190855Z</created><updated>20151005T190915Z</updated><tag>~ Reference</tag><tag>R - Purchases</tag><tag>RP - Sean Mize</tag><tag>RPSM - 4 High Value Trainings</tag><note-attributes><subject-date>20151005T190849Z</subject-date><author>Rick Smith <rick@netguerrilla.org></author><source>mail.smtp</source><application-data key="mg-post-tier">1</application-data></note-attributes></note></en-export>
|
|
|
|
|
)";
|
|
|
|
|
|
2023-01-26 16:58:47 +05:00
|
|
|
|
QVERIFY(
|
|
|
|
|
testEvernoteImportText(content) ==
|
|
|
|
|
R"([4 High Value Trainings Access](https://seanmize.infusionsoft.com/app/linkClick/24286/45b5a4e4c9f46ab6/13909690/64482e72b8e684a3))");
|
2021-09-27 22:26:06 +02:00
|
|
|
|
}
|
2021-11-01 09:06:20 +01:00
|
|
|
|
|
|
|
|
|
void TestUtilsMisc::testGetBaseUrlFromUrlString() {
|
|
|
|
|
QString url = "https://www.example.com/path/to/file.html";
|
|
|
|
|
QString baseUrl = "https://www.example.com";
|
|
|
|
|
QString baseUrlWithBasePath = "https://www.example.com/path/to/";
|
|
|
|
|
|
|
|
|
|
QVERIFY(getBaseUrlFromUrlString(url) == baseUrl);
|
|
|
|
|
QVERIFY(getBaseUrlFromUrlString(url, true) == baseUrlWithBasePath);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TestUtilsMisc::testCreateAbsolutePathsInHtml() {
|
|
|
|
|
QString url = "https://www.example.com/path/to/file.html";
|
2023-01-26 16:58:47 +05:00
|
|
|
|
QString html =
|
|
|
|
|
R"(<html><head><title>Test</title></head><body><a href="/absolute.html">Link</a> <a href="relative.html">Link</a></body></html>)";
|
|
|
|
|
QString expectedHtml =
|
|
|
|
|
R"(<html><head><title>Test</title></head><body><a href="https://www.example.com/absolute.html">Link</a> <a href="https://www.example.com/path/to/relative.html">Link</a></body></html>)";
|
2021-11-01 09:06:20 +01:00
|
|
|
|
|
|
|
|
|
QVERIFY(createAbsolutePathsInHtml(html, url) == expectedHtml);
|
|
|
|
|
}
|
2025-05-05 19:30:49 +02:00
|
|
|
|
|
|
|
|
|
void TestUtilsMisc::testDetectFileFormatTxt() {
|
|
|
|
|
QString text =
|
|
|
|
|
"This is a plain text file.\nIt doesn't match any of the specific formats.\nJust regular "
|
|
|
|
|
"text content.";
|
|
|
|
|
QCOMPARE(detectFileFormat(text), QString("txt"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TestUtilsMisc::testDetectFileFormatJson() {
|
|
|
|
|
QString text = R"({
|
|
|
|
|
"name": "John Doe",
|
|
|
|
|
"age": 30,
|
|
|
|
|
"email": "john@example.com",
|
|
|
|
|
"address": {
|
|
|
|
|
"street": "123 Main St",
|
|
|
|
|
"city": "Anytown",
|
|
|
|
|
"zip": "12345"
|
|
|
|
|
},
|
|
|
|
|
"phoneNumbers": [
|
|
|
|
|
"555-1234",
|
|
|
|
|
"555-5678"
|
|
|
|
|
]
|
|
|
|
|
})";
|
|
|
|
|
QCOMPARE(detectFileFormat(text), QString("json"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TestUtilsMisc::testDetectFileFormatXml() {
|
|
|
|
|
QString text = R"(<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
|
<root>
|
|
|
|
|
<person id="1">
|
|
|
|
|
<name>John Doe</name>
|
|
|
|
|
<age>30</age>
|
|
|
|
|
<email>john@example.com</email>
|
|
|
|
|
</person>
|
|
|
|
|
<person id="2">
|
|
|
|
|
<name>Jane Smith</name>
|
|
|
|
|
<age>28</age>
|
|
|
|
|
<email>jane@example.com</email>
|
|
|
|
|
</person>
|
|
|
|
|
</root>)";
|
|
|
|
|
QCOMPARE(detectFileFormat(text), QString("xml"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TestUtilsMisc::testDetectFileFormatXmlWithoutDeclaration() {
|
|
|
|
|
QString text = R"(<AppDeliveryID>12399_AE_W_Rsa_1</AppDeliveryID>
|
|
|
|
|
<Status>
|
|
|
|
|
<Code>0</Code>
|
|
|
|
|
<Text>SUCCESS</Text>
|
|
|
|
|
</Status>
|
|
|
|
|
<DualDeliveryID>131506</DualDeliveryID>
|
|
|
|
|
<ns4:AddressingResults/>)";
|
|
|
|
|
QCOMPARE(detectFileFormat(text), QString("xml"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TestUtilsMisc::testDetectFileFormatHtml() {
|
|
|
|
|
QString text = R"(<!DOCTYPE html>
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>Sample Page</title>
|
|
|
|
|
<meta charset="utf-8">
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
<h1>Hello World</h1>
|
|
|
|
|
<p>This is a sample HTML page.</p>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>Item 1</li>
|
|
|
|
|
<li>Item 2</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</body>
|
|
|
|
|
</html>)";
|
|
|
|
|
QCOMPARE(detectFileFormat(text), QString("html"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TestUtilsMisc::testDetectFileFormatCsv() {
|
|
|
|
|
QString text = R"(Name,Age,Email,Department
|
|
|
|
|
John Doe,30,john@example.com,Engineering
|
|
|
|
|
Jane Smith,28,jane@example.com,Marketing
|
|
|
|
|
Bob Johnson,35,bob@example.com,Finance
|
|
|
|
|
Alice Williams,32,alice@example.com,HR)";
|
|
|
|
|
QCOMPARE(detectFileFormat(text), QString("csv"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TestUtilsMisc::testDetectFileFormatIni() {
|
|
|
|
|
QString text = R"([Database]
|
|
|
|
|
host=localhost
|
|
|
|
|
port=3306
|
|
|
|
|
user=root
|
|
|
|
|
password=secret
|
|
|
|
|
|
|
|
|
|
[Application]
|
|
|
|
|
debug=true
|
|
|
|
|
log_level=info
|
|
|
|
|
cache_enabled=1
|
|
|
|
|
|
|
|
|
|
; This is a comment
|
|
|
|
|
timeout=30)";
|
|
|
|
|
QCOMPARE(detectFileFormat(text), QString("ini"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TestUtilsMisc::testDetectFileFormatNix() {
|
|
|
|
|
QString text = R"({ pkgs ? import <nixpkgs> {} }:
|
|
|
|
|
|
|
|
|
|
with pkgs;
|
|
|
|
|
|
|
|
|
|
stdenv.mkDerivation {
|
|
|
|
|
name = "my-application";
|
|
|
|
|
version = "1.0.0";
|
|
|
|
|
|
|
|
|
|
src = fetchurl {
|
|
|
|
|
url = "https://example.com/my-application-1.0.0.tar.gz";
|
|
|
|
|
sha256 = "0000000000000000000000000000000000000000000000000000";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
buildInputs = [
|
|
|
|
|
gcc
|
|
|
|
|
cmake
|
|
|
|
|
zlib
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
configurePhase = ''
|
|
|
|
|
cmake .
|
|
|
|
|
'';
|
|
|
|
|
|
|
|
|
|
buildPhase = ''
|
|
|
|
|
make
|
|
|
|
|
'';
|
|
|
|
|
|
|
|
|
|
installPhase = ''
|
|
|
|
|
make install
|
|
|
|
|
'';
|
|
|
|
|
})";
|
|
|
|
|
QCOMPARE(detectFileFormat(text), QString("nix"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TestUtilsMisc::testDetectFileFormatYaml() {
|
|
|
|
|
QString text = R"(name: project-config
|
|
|
|
|
version: 1.0.0
|
|
|
|
|
description: Sample YAML configuration file
|
|
|
|
|
|
|
|
|
|
environment:
|
|
|
|
|
production:
|
|
|
|
|
database:
|
|
|
|
|
host: db.example.com
|
|
|
|
|
port: 5432
|
|
|
|
|
user: admin
|
|
|
|
|
password: secret
|
|
|
|
|
cache:
|
|
|
|
|
enabled: true
|
|
|
|
|
ttl: 3600
|
|
|
|
|
|
|
|
|
|
development:
|
|
|
|
|
database:
|
|
|
|
|
host: localhost
|
|
|
|
|
port: 5432
|
|
|
|
|
user: dev
|
|
|
|
|
password: dev123
|
|
|
|
|
cache:
|
|
|
|
|
enabled: false
|
|
|
|
|
|
|
|
|
|
dependencies:
|
|
|
|
|
- name: library1
|
|
|
|
|
version: "^2.0.0"
|
|
|
|
|
- name: library2
|
|
|
|
|
version: "~1.5.0"
|
|
|
|
|
|
|
|
|
|
logging:
|
|
|
|
|
level: info
|
|
|
|
|
format: json
|
|
|
|
|
path: /var/log/app.log)";
|
|
|
|
|
QCOMPARE(detectFileFormat(text), QString("yaml"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TestUtilsMisc::testDetectFileFormatSql() {
|
|
|
|
|
QString text = R"(CREATE TABLE employees (
|
|
|
|
|
employee_id SERIAL PRIMARY KEY,
|
|
|
|
|
first_name VARCHAR(50) NOT NULL,
|
|
|
|
|
last_name VARCHAR(50) NOT NULL,
|
|
|
|
|
email VARCHAR(100) UNIQUE NOT NULL,
|
|
|
|
|
hire_date DATE NOT NULL,
|
|
|
|
|
salary NUMERIC(10, 2),
|
|
|
|
|
department_id INTEGER REFERENCES departments(id)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
INSERT INTO employees (first_name, last_name, email, hire_date, salary, department_id)
|
|
|
|
|
VALUES
|
|
|
|
|
('John', 'Doe', 'john.doe@example.com', '2023-01-15', 75000.00, 1),
|
|
|
|
|
('Jane', 'Smith', 'jane.smith@example.com', '2023-02-20', 82000.00, 2),
|
|
|
|
|
('Bob', 'Johnson', 'bob.johnson@example.com', '2023-03-10', 65000.00, 1);
|
|
|
|
|
|
|
|
|
|
SELECT e.first_name, e.last_name, d.name AS department
|
|
|
|
|
FROM employees e
|
|
|
|
|
JOIN departments d ON e.department_id = d.id
|
|
|
|
|
WHERE e.salary > 70000
|
|
|
|
|
ORDER BY e.last_name ASC;)";
|
|
|
|
|
QCOMPARE(detectFileFormat(text), QString("sql"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TestUtilsMisc::testDetectFileFormatJavaScript() {
|
|
|
|
|
QString text = R"(// Sample JavaScript module for data processing
|
|
|
|
|
import { formatDate } from './utils.js';
|
|
|
|
|
import * as math from 'mathjs';
|
|
|
|
|
|
|
|
|
|
const CONFIG = {
|
|
|
|
|
precision: 2,
|
|
|
|
|
dateFormat: 'YYYY-MM-DD',
|
|
|
|
|
threshold: 0.5
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class DataAnalyzer {
|
|
|
|
|
constructor(data) {
|
|
|
|
|
this.data = data;
|
|
|
|
|
this.results = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
preprocess() {
|
|
|
|
|
// Filter out invalid entries
|
|
|
|
|
return this.data.filter(item => item.value !== null && !isNaN(item.value));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
analyze() {
|
|
|
|
|
const processed = this.preprocess();
|
|
|
|
|
|
|
|
|
|
// Calculate statistics
|
|
|
|
|
const values = processed.map(item => item.value);
|
|
|
|
|
const result = {
|
|
|
|
|
mean: math.mean(values).toFixed(CONFIG.precision),
|
|
|
|
|
median: math.median(values).toFixed(CONFIG.precision),
|
|
|
|
|
stdDev: math.std(values).toFixed(CONFIG.precision),
|
|
|
|
|
timestamp: formatDate(new Date(), CONFIG.dateFormat)
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
this.results = result;
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
generateReport() {
|
|
|
|
|
if (!this.results) {
|
|
|
|
|
this.analyze();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return `
|
|
|
|
|
Data Analysis Report
|
|
|
|
|
--------------------
|
|
|
|
|
Date: ${this.results.timestamp}
|
|
|
|
|
Sample size: ${this.data.length}
|
|
|
|
|
Mean value: ${this.results.mean}
|
|
|
|
|
Median value: ${this.results.median}
|
|
|
|
|
Standard deviation: ${this.results.stdDev}
|
|
|
|
|
`;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function processDataset(dataset) {
|
|
|
|
|
const analyzer = new DataAnalyzer(dataset);
|
|
|
|
|
const results = analyzer.analyze();
|
|
|
|
|
|
|
|
|
|
if (results.mean > CONFIG.threshold) {
|
|
|
|
|
console.log("Warning: Mean value exceeds threshold");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return analyzer.generateReport();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default {
|
|
|
|
|
DataAnalyzer,
|
|
|
|
|
processDataset
|
|
|
|
|
};)";
|
|
|
|
|
QCOMPARE(detectFileFormat(text), QString("js"));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TestUtilsMisc::testDetectFileFormatEdgeCases() {
|
|
|
|
|
// Empty file
|
|
|
|
|
QCOMPARE(detectFileFormat(""), QString("txt"));
|
|
|
|
|
|
|
|
|
|
// Short text that doesn't match any format
|
|
|
|
|
QCOMPARE(detectFileFormat("Hello world"), QString("txt"));
|
|
|
|
|
|
|
|
|
|
// File with ambiguous format (INI vs CSV test case)
|
|
|
|
|
QString ambiguousText = R"(zend_extension=xdebug.so
|
|
|
|
|
xdebug.remote_enable=1
|
|
|
|
|
xdebug.remote_autostart=1)";
|
|
|
|
|
QCOMPARE(detectFileFormat(ambiguousText), QString("ini"));
|
|
|
|
|
}
|