mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-09-28 13:24:14 +02:00
bd5cff4211
Follow-up to the positionKey() fix merged directly in #779
(b2f4ef5d2): per review request, add a small regression test so this
class of bug (fixed-precision "%.4f" formatting compares out of
numeric order once the integer part's digit count differs) can't
silently reappear.
positionKey()/coordinateKey() move out of diagram.cpp's anonymous
namespace into a small header-only diagramsortkeys.h so the test can
link against the exact same code Diagram::toXml() uses, instead of
duplicating the algorithm. Behavior is unchanged.
tst_diagramsortkeys covers: single- vs double-digit, double- vs
triple-digit, negative-vs-negative, negative-vs-positive, and
negative-vs-zero coordinate pairs, plus sub-precision deltas.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
54 lines
1.9 KiB
C++
54 lines
1.9 KiB
C++
/*
|
|
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 <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#ifndef DIAGRAMSORTKEYS_H
|
|
#define DIAGRAMSORTKEYS_H
|
|
|
|
#include <QPointF>
|
|
#include <QString>
|
|
#include <QtGlobal>
|
|
|
|
/// Sort-key helpers used by Diagram::toXml() to serialize elements and
|
|
/// conductors in a deterministic order. Pulled into their own header
|
|
/// (instead of an anonymous namespace in diagram.cpp) so they can be
|
|
/// unit-tested directly -- see tests/qttest/tst_diagramsortkeys.cpp.
|
|
namespace DiagramSortKeys {
|
|
|
|
/// Format a coordinate as a string that sorts the same way the number
|
|
/// does. Plain fixed-precision formatting ("%.4f") does NOT do this --
|
|
/// e.g. "15.0000" sorts before "5.0000" as text even though 15 > 5 --
|
|
/// so shift into a non-negative range and zero-pad to a fixed width
|
|
/// before comparing.
|
|
inline QString coordinateKey(double v)
|
|
{
|
|
//Diagram coordinates are nowhere near this range; the offset and
|
|
//width just need to be big enough that shifted values are always
|
|
//non-negative and always the same digit count.
|
|
constexpr double offset = 1e9;
|
|
qint64 scaled = qint64(qRound64((v + offset) * 10000.0));
|
|
return QStringLiteral("%1").arg(scaled, 20, 10, QLatin1Char('0'));
|
|
}
|
|
|
|
inline QString positionKey(const QPointF &pos)
|
|
{
|
|
return coordinateKey(pos.x()) + QLatin1Char('|') + coordinateKey(pos.y());
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|