diff --git a/sources/autoNum/assignvariables.cpp b/sources/autoNum/assignvariables.cpp index ac92a4e9f..633fe7da3 100644 --- a/sources/autoNum/assignvariables.cpp +++ b/sources/autoNum/assignvariables.cpp @@ -482,7 +482,10 @@ namespace autonum m_seq_struct.wrap.size())) ); - for (int i=1; i<=max ; i++) + // Highest number first: "%sequ_1" is also the start of + // "%sequ_10", so replacing 1 before 10 would turn %sequ_10 + // into the first value followed by a "0". + for (int i=max; i>=1 ; i--) { if (m_assigned_label.contains("%sequ_" + QString::number(i)) && m_seq_struct.unit.size() >= i) { m_assigned_label.replace("%sequ_" + QString::number(i),m_seq_struct.unit.at(i-1)); diff --git a/tests/qttest/CMakeLists.txt b/tests/qttest/CMakeLists.txt index bd8a82c01..bf6448d29 100644 --- a/tests/qttest/CMakeLists.txt +++ b/tests/qttest/CMakeLists.txt @@ -557,6 +557,18 @@ target_compile_definitions(tst_wiringlistexport PRIVATE "QET_TEST_BINARY_PATH=\"$\"" "QET_EXAMPLES_DIR=\"${QET_DIR}/examples\"") +# A label formula with ten or more sequential numbers gets the tenth value +# for %sequ_10 (not the first one and a "0"): the real binary's +# --export-bom on fixtures/ten_sequential_numbers.qet. +add_executable( + tst_tensequentialnumbers + tst_tensequentialnumbers.cpp) +add_test(NAME tst_tensequentialnumbers COMMAND tst_tensequentialnumbers) +add_dependencies(tst_tensequentialnumbers qelectrotech) +target_link_libraries(tst_tensequentialnumbers PRIVATE Qt::Test) +target_compile_definitions(tst_tensequentialnumbers PRIVATE + "QET_TEST_BINARY_PATH=\"$\"") + # --export-dxf writes a wrapped symbol text line by line, as it is drawn. add_executable( tst_dxfwrappedtext diff --git a/tests/qttest/fixtures/ten_sequential_numbers.qet b/tests/qttest/fixtures/ten_sequential_numbers.qet new file mode 100644 index 000000000..bbadee1d4 --- /dev/null +++ b/tests/qttest/fixtures/ten_sequential_numbers.qet @@ -0,0 +1,359 @@ + + + 10/4/26 + 04-10-2026 + 2026-10-04 + skeleton + 10:28 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %sequ_10-%sequ_1 + + + A;B;C;D;E;F;G;H;I;J + + + + 14 + + + 11 + + + + label + + + + + + + + + + + + + 14 + + + 11 + + + + label + + + + + + + + + + + + + 14 + + + 11 + + + + label + + + + + + + + + + + + + 14 + + + 11 + + + + label + + + + + + + + + + + + + + + + + + + + + Elements importats + Zavedené prvky + Importerede elementer + Importierte Elemente + Εισηγμένα στοιχεία + Imported elements + Elementos importados + Éléments importés + Uvezeni elementi + Elementi importati + インバートされた要素 + 전기 심볼 요소 + 전기 심볼 요소 + Elementen geïmporteerd + Elementen geïmporteerd + Elementy importowane + Elementos importados + Elementos importados + Elemente importate + Импортированные элементы + Uvoženi elementi + Importerade element + İthal öğeler + Імпортовані елементи + 导入元件 + + + + كهربائي + Elèctric + Elektrotechnika + Elektrisk + Elektrik + Ηλεκτρικά + Electric + Eléctrica + Sähkö + Electrique + Električno + Elektromos + Elettrica + 電気 + 전기 + Цахилгаан + Elektrisk + Elektrotechniek + Elektrisch + Elektrotechnika + Elétrico + Elétrica + Electric + Электротехника + Elektrické + Elektrika + Електрика + El + Elektrik + Електрика + 10_电气 + 电气工程 + + + + متعدد الأقطاب + Multifilar + Vícežilový + Flere ledere + Allpolig + Πολυγραμμικό + All-pole + Multifilar + Yleisnapa + Multifilaire + Univerzalni + Többvonalas szimbólumok + Multifilare + 複線 + 다-극 + Бүх туйл + Alle poler + Veel polig + All-pole + Schematy wieloliniowe + Multipolar + Multifilar + Bipolar + Многополюсные + Všepólové + Vsi poli + Свe-полни + Allpolig + Çok kutuplu + Багатополюсні + 10_全极 + + + + المرحّلات والموصّلات وجهات الاتصال + Relés, contactors i contactes + Relé, stykače a kontakty + Relæer, kontaktorer og kontakter + Relais, Schütze und Kontakte + Ηλεκτρονόμοι και επαφές + Relays, contactors and contacts + Relevadores, contactores y contactos + Releet, kontaktorit ja koskettimet + Relais, contacteurs et contacts + Releji, kontaktori i kontakti + Relék, kontaktorok és érintkezők + Relè, contattori e contatti + 継電器、接触器、接点 + 릴레이, 커넥터및 접점 + Реле, контактор болон контакт + Reléer, kontaktorere og kontakter + Relais, contactoren en contacten + Relais, contacteurs en contacten + Przekaźniki i styczniki + Relés, contatores e contactos + Relés, Contatores e contatos + Relee, contactoare și contacte + Реле, пускатели и контакты + Relé, stykače a kontakty + Releji, kontaktorji in kontakti + Релеји, контактори и контакти + Reläer, kontaktorer och kontakter + Röleler, kontaktörler ve kontaklar + Реле, контактори та контакти + 继电器、接触器与触点 + + + + جهات الاتصال + Contactes + Kontakty + Kontaktpersoner + Kontakte + Επαφές + Contacts + Contactos + Kosketimet + Contacts + Kontakti + Kapcsolatok + Contatti + 連絡先 + 접점 + Харилцагчид + Kontakter + Contacten + Contacten + Łączność + Contatos + Contatos + Contacte + Контакты + Kontakty + Stiki + Контакти + Kontakter + Kişiler + Контакти + 触点 + + + + + + عدّاد مفتوح عادة + Taulell normalment obert + Kontakt čítače (NO) + Normalt åben tæller + Öffner Zähler betätigt + Ανοικτή επαφή μετρητή + Normally open counter + Contador NA + Normaalisti avoin laskuri + Actionné par comptage NO + Brojač normalno otvoren + Alaphelyzetben nyitott számláló + Contatto azionato da un contatore (NO) + 常開カウンター + 평상시 열림 카운터 + Ихэвчлэн нээлттэй тоолуур + Normalt åpen teller + Teller contact (NO) + Normaal open teller + Zestyk zwierny licznika + Contador normalmente aberto + Contato NA acionado por contador + Contor normal deschis + Счётчик с нормально открытым контактом + Počítadlo s kontaktom NO + Števec normalno odprt + Бројач нормално отворен + Räknare med slutande kontakt + Normalde açık sayaç + Лічильник нормально розімкнений + 计数驱动常开触点 + + Author: The QElectroTech team +License: see http://qelectrotech.org/wiki/doc/elements_license + + + + + 14 + + + 11 + + + + label + + + + + + + + + + + + + + + + diff --git a/tests/qttest/tst_tensequentialnumbers.cpp b/tests/qttest/tst_tensequentialnumbers.cpp new file mode 100644 index 000000000..ff56982e0 --- /dev/null +++ b/tests/qttest/tst_tensequentialnumbers.cpp @@ -0,0 +1,77 @@ +/* + Copyright 2006-2026 The QElectroTech Team + This file is part of QElectroTech. + + QElectroTech is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + QElectroTech is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with QElectroTech. If not, see . +*/ +#include +#include +#include + +/** + A label formula with ten or more sequential numbers: %sequ_10 must get + the tenth value, not the first value followed by a "0". The values are + put in by AssignVariables::assignSequence(), which the bill of + materials uses for every label, so the real binary's --export-bom on + fixtures/ten_sequential_numbers.qet shows the result: its element has + the formula %sequ_10-%sequ_1 and the unit values A to J. +*/ +class tst_tensequentialnumbers : public QObject +{ + Q_OBJECT + + QTemporaryDir m_dir; + + static bool runQet(const QStringList &arguments) + { + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + env.insert(QStringLiteral("QT_QPA_PLATFORM"), QStringLiteral("offscreen")); + QProcess proc; + proc.setProcessEnvironment(env); + proc.start(QStringLiteral(QET_TEST_BINARY_PATH), arguments); + return proc.waitForFinished(60000) + && proc.exitStatus() == QProcess::NormalExit + && proc.exitCode() == 0; + } + +private slots: + void initTestCase() + { + QVERIFY2(QFile::exists(QStringLiteral(QET_TEST_BINARY_PATH)), "qelectrotech binary not found"); + QVERIFY(m_dir.isValid()); + } + + void tenthValueIsUsed() + { + const QString fixture = QFINDTESTDATA("fixtures/ten_sequential_numbers.qet"); + QVERIFY2(!fixture.isEmpty(), "fixture project not found"); + const QString out = m_dir.filePath(QStringLiteral("bom.csv")); + QVERIFY2(runQet({QStringLiteral("--export-bom"), fixture, out}), "--export-bom failed"); + + QFile file(out); + QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Text)); + const QStringList lines = QString::fromUtf8(file.readAll()).split(QLatin1Char('\n')); + QStringList labels; + for (const QString &line : lines) { + if (line.startsWith(QLatin1Char('"'))) + labels << line.section(QLatin1Char(';'), 0, 0); + } + QVERIFY2(labels.contains(QStringLiteral("\"J-A\"")), + qPrintable(QStringLiteral("labels: %1").arg(labels.join(QLatin1Char(' '))))); + QVERIFY2(!labels.contains(QStringLiteral("\"A0-A\"")), "the first value with a 0 appended"); + } +}; + +QTEST_MAIN(tst_tensequentialnumbers) +#include "tst_tensequentialnumbers.moc"