diff --git a/sources/dataBase/projectdatabase.cpp b/sources/dataBase/projectdatabase.cpp index 7c6d29d8a..865deab89 100644 --- a/sources/dataBase/projectdatabase.cpp +++ b/sources/dataBase/projectdatabase.cpp @@ -1741,9 +1741,12 @@ void projectDataBase::bindDiagramInfoValues(QSqlQuery &query, Diagram *diagram) for (auto key : QETInformation::diagramInfoKeys()) { if (key == "date") { - query.bindValue( ":date", - QLocale::system().toDate(infos.value("date").toString(), - QLocale::ShortFormat)); + //The folio's own date, not the title block's text read + //back: that text is the locale's short format, and where + //it has a two-digit year (en_US "M/d/yy") toDate() reads + //2010 back as 1910. + query.bindValue(QStringLiteral(":date"), + diagram->border_and_titleblock.date()); } else { auto value = infos.value(key); auto bind = key.prepend(":"); diff --git a/tests/qttest/CMakeLists.txt b/tests/qttest/CMakeLists.txt index e10e2ad16..1d37ab8d8 100644 --- a/tests/qttest/CMakeLists.txt +++ b/tests/qttest/CMakeLists.txt @@ -344,6 +344,18 @@ if(QET_HAS_SCRIPTING) target_compile_definitions(tst_scriptconductoruuid PRIVATE "QET_TEST_BINARY_PATH=\"$\"") + # The project database keeps a folio's date with its century: 741.qet's + # 2010-09-21, read through project_summary_view under LC_ALL=en_US.UTF-8. + add_executable( + tst_dbfoliodate + tst_dbfoliodate.cpp) + add_test(NAME tst_dbfoliodate COMMAND tst_dbfoliodate) + add_dependencies(tst_dbfoliodate qelectrotech) + target_link_libraries(tst_dbfoliodate PRIVATE Qt::Test) + target_compile_definitions(tst_dbfoliodate PRIVATE + "QET_TEST_BINARY_PATH=\"$\"" + "QET_EXAMPLES_DIR=\"${QET_DIR}/examples\"") + # qet.elementTerminals() lists each terminal's uuid and qet.terminalIndex() # turns element uuid + terminal uuid back into the index the conductor # calls take, on examples/perceuse.qet (two terminals at one point). diff --git a/tests/qttest/tst_dbfoliodate.cpp b/tests/qttest/tst_dbfoliodate.cpp new file mode 100644 index 000000000..4a99dce71 --- /dev/null +++ b/tests/qttest/tst_dbfoliodate.cpp @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#include + +#include +#include +#include +#include +#include +#include +#include + +// The project database holds each folio's own date. It used to hold the +// title block's text read back through the locale's short format, which in a +// locale with a two-digit year (en_US "M/d/yy") turned 2010 into 1910 -- in +// diagram_info and in project_summary_view, which the summary table reads. +// Runs a script through the real binary's --run on examples/741.qet, whose +// folio is dated 20100921, with LC_ALL=en_US.UTF-8. +class tst_dbfoliodate : public QObject +{ + Q_OBJECT + + QTemporaryDir m_dir; + +private slots: + void initTestCase() + { + QVERIFY(m_dir.isValid()); + QVERIFY(QFile::exists(QStringLiteral(QET_TEST_BINARY_PATH))); + } + + void folioDateKeepsItsCentury() + { + const QString path = m_dir.filePath(QStringLiteral("probe.js")); + const QString home = m_dir.filePath(QStringLiteral("home")); + QDir().mkpath(home); + QFile f(path); + QVERIFY(f.open(QIODevice::WriteOnly)); + f.write("qet.log('PROBE ' + JSON.stringify(" + "qet.query('SELECT date FROM project_summary_view')));\n"); + f.close(); + + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + env.insert(QStringLiteral("QT_QPA_PLATFORM"), QStringLiteral("offscreen")); + env.insert(QStringLiteral("QET_ENABLE_SCRIPTING"), QStringLiteral("1")); + env.insert(QStringLiteral("HOME"), home); + env.insert(QStringLiteral("XDG_CONFIG_HOME"), home + QStringLiteral("/config")); + env.insert(QStringLiteral("XDG_DATA_HOME"), home + QStringLiteral("/data")); + env.insert(QStringLiteral("TMPDIR"), m_dir.path()); + env.insert(QStringLiteral("LC_ALL"), QStringLiteral("en_US.UTF-8")); + QProcess proc; + proc.setProcessEnvironment(env); + proc.start(QStringLiteral(QET_TEST_BINARY_PATH), + {QStringLiteral("--run"), path, + QStringLiteral(QET_EXAMPLES_DIR "/741.qet")}); + QVERIFY(proc.waitForFinished(120000)); + const QString out = QString::fromUtf8(proc.readAllStandardOutput() + + proc.readAllStandardError()); + QJsonArray rows; + for (const QString &line : out.split(QLatin1Char('\n'))) { + const int i = line.indexOf(QStringLiteral("PROBE ")); + if (i >= 0) + rows = QJsonDocument::fromJson(line.mid(i + 6).toUtf8()).array(); + } + QCOMPARE(rows.size(), 1); + QCOMPARE(rows.at(0).toObject().value(QStringLiteral("date")).toString(), + QStringLiteral("2010-09-21")); + } +}; + +QTEST_APPLESS_MAIN(tst_dbfoliodate) + +#include "tst_dbfoliodate.moc"