Skip to content

Commit e1d93af

Browse files
committed
Format: Use QMap instead of QHash
As the items of QHash are arbitrarily ordered, so the same formats may generate different formatKey
1 parent 77d7277 commit e1d93af

File tree

4 files changed

+63
-38
lines changed

4 files changed

+63
-38
lines changed

src/xlsx/xlsxformat.cpp

+9-1
Original file line numberDiff line numberDiff line change
@@ -903,7 +903,7 @@ QByteArray Format::formatKey() const
903903
QByteArray key;
904904
QDataStream stream(&key, QIODevice::WriteOnly);
905905

906-
QHashIterator<int, QVariant> i(d->property);
906+
QMapIterator<int, QVariant> i(d->property);
907907
while (i.hasNext()) {
908908
i.next();
909909
stream<<i.key()<<i.value();
@@ -1108,4 +1108,12 @@ QColor Format::colorProperty(int propertyId) const
11081108
return qvariant_cast<QColor>(prop);
11091109
}
11101110

1111+
#ifndef QT_NO_DEBUG_STREAM
1112+
QDebug operator<<(QDebug dbg, const Format &f)
1113+
{
1114+
dbg.nospace() << "QXlsx::Format(" << f.d->property << ")";
1115+
return dbg.space();
1116+
}
1117+
#endif
1118+
11111119
QT_END_NAMESPACE_XLSX

src/xlsx/xlsxformat.h

+5
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ class Q_XLSX_EXPORT Format
237237
friend class RichStringPrivate;
238238
friend class SharedStrings;
239239
friend class ::FormatTest;
240+
friend Q_XLSX_EXPORT QDebug operator<<(QDebug, const Format &f);
240241

241242
bool fontIndexValid() const;
242243
int fontIndex() const;
@@ -274,6 +275,10 @@ class Q_XLSX_EXPORT Format
274275
QExplicitlySharedDataPointer<FormatPrivate> d;
275276
};
276277

278+
#ifndef QT_NO_DEBUG_STREAM
279+
Q_XLSX_EXPORT QDebug operator<<(QDebug dbg, const Format &f);
280+
#endif
281+
277282
QT_END_NAMESPACE_XLSX
278283

279284
#endif // QXLSX_FORMAT_H

src/xlsx/xlsxformat_p.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
#define XLSXFORMAT_P_H
2727
#include "xlsxformat.h"
2828
#include <QSharedData>
29-
#include <QHash>
29+
#include <QMap>
3030

3131
namespace QXlsx {
3232

@@ -148,7 +148,7 @@ class FormatPrivate : public QSharedData
148148

149149
int theme;
150150

151-
QHash<int, QVariant> property;
151+
QMap<int, QVariant> property;
152152
};
153153

154154
}

tests/auto/document/tst_documenttest.cpp

+47-35
Original file line numberDiff line numberDiff line change
@@ -29,45 +29,52 @@ DocumentTest::DocumentTest()
2929

3030
void DocumentTest::testDocumentProperty()
3131
{
32+
QBuffer device;
33+
device.open(QIODevice::WriteOnly);
34+
3235
Document xlsx1;
3336
xlsx1.setDocumentProperty("creator", "Debao");
3437
xlsx1.setDocumentProperty("company", "Test");
35-
xlsx1.saveAs("test.xlsx");
38+
xlsx1.saveAs(&device);
3639

37-
Document xlsx2("test.xlsx");
40+
device.open(QIODevice::ReadOnly);
41+
Document xlsx2(&device);
3842
QCOMPARE(xlsx2.documentProperty("creator"), QString("Debao"));
3943
QCOMPARE(xlsx2.documentProperty("company"), QString("Test"));
40-
41-
QFile::remove("test.xlsx");
4244
}
4345

4446
void DocumentTest::testReadWriteString()
4547
{
48+
QBuffer device;
49+
device.open(QIODevice::WriteOnly);
50+
4651
Document xlsx1;
4752
xlsx1.write("A1", "Hello Qt!");
4853
Format format;
4954
format.setFontColor(Qt::blue);
5055
format.setBorderStyle(Format::BorderDashDotDot);
5156
format.setFillPattern(Format::PatternSolid);
5257
xlsx1.write("A2", "Hello Qt again!", format);
53-
xlsx1.saveAs("test.xlsx");
58+
xlsx1.saveAs(&device);
5459

55-
Document xlsx2("test.xlsx");
60+
device.open(QIODevice::ReadOnly);
61+
Document xlsx2(&device);
5662
QCOMPARE(xlsx2.cellAt("A1")->dataType(), Cell::String);
5763
QCOMPARE(xlsx2.cellAt("A1")->value().toString(), QString("Hello Qt!"));
5864
QCOMPARE(xlsx2.cellAt("A2")->dataType(), Cell::String);
5965
QCOMPARE(xlsx2.cellAt("A2")->value().toString(), QString("Hello Qt again!"));
60-
QVERIFY(xlsx2.cellAt("A2")->format().isValid());
61-
QCOMPARE(xlsx2.cellAt("A2")->format().fontColor(), format.fontColor());
62-
QCOMPARE(xlsx2.cellAt("A2")->format().leftBorderStyle(), format.leftBorderStyle());
63-
QCOMPARE(xlsx2.cellAt("A2")->format().fillPattern(), format.fillPattern());
64-
// QCOMPARE(xlsx2.cellAt("A2")->format(), format);
65-
66-
QFile::remove("test.xlsx");
66+
Format format2 = xlsx2.cellAt("A2")->format();
67+
QVERIFY(format2.isValid());
68+
// qDebug()<<format2;
69+
// qDebug()<<format;
70+
QCOMPARE(format2, format);
6771
}
6872

6973
void DocumentTest::testReadWriteNumeric()
7074
{
75+
QBuffer device;
76+
device.open(QIODevice::WriteOnly);
77+
7178
Document xlsx1;
7279
xlsx1.write("A1", 123);
7380
Format format;
@@ -76,53 +83,58 @@ void DocumentTest::testReadWriteNumeric()
7683
format.setFillPattern(Format::PatternSolid);
7784
format.setNumberFormatIndex(10);
7885
xlsx1.write("A2", 12345, format);
79-
xlsx1.saveAs("test.xlsx");
86+
xlsx1.saveAs(&device);
8087

81-
Document xlsx2("test.xlsx");
88+
device.open(QIODevice::ReadOnly);
89+
Document xlsx2(&device);
8290
QCOMPARE(xlsx2.cellAt("A1")->dataType(), Cell::Numeric);
8391
QCOMPARE(xlsx2.cellAt("A1")->value().toDouble(), 123.0);
8492
QCOMPARE(xlsx2.cellAt("A2")->dataType(), Cell::Numeric);
8593
QCOMPARE(xlsx2.cellAt("A2")->value().toDouble(), 12345.0);
8694
QVERIFY(xlsx2.cellAt("A2")->format().isValid());
8795
QCOMPARE(xlsx2.cellAt("A2")->format(), format);
88-
89-
QFile::remove("test.xlsx");
9096
}
9197

9298
void DocumentTest::testReadWriteBool()
9399
{
100+
QBuffer device;
101+
device.open(QIODevice::WriteOnly);
102+
94103
Document xlsx1;
95104
xlsx1.write("A1", true);
96105
Format format;
97106
format.setFontColor(Qt::blue);
98107
format.setBorderStyle(Format::BorderDashDotDot);
99108
format.setFillPattern(Format::PatternSolid);
100109
xlsx1.write("A2", false, format);
101-
xlsx1.saveAs("test.xlsx");
110+
xlsx1.saveAs(&device);
102111

103-
Document xlsx2("test.xlsx");
112+
device.open(QIODevice::ReadOnly);
113+
Document xlsx2(&device);
104114
QCOMPARE(xlsx2.cellAt("A1")->dataType(), Cell::Boolean);
105115
QCOMPARE(xlsx2.cellAt("A1")->value().toBool(), true);
106116
QCOMPARE(xlsx2.cellAt("A2")->dataType(), Cell::Boolean);
107117
QCOMPARE(xlsx2.cellAt("A2")->value().toBool(), false);
108118
QVERIFY(xlsx2.cellAt("A2")->format().isValid());
109119
QCOMPARE(xlsx2.cellAt("A2")->format(), format);
110-
111-
QFile::remove("test.xlsx");
112120
}
113121

114122
void DocumentTest::testReadWriteBlank()
115123
{
124+
QBuffer device;
125+
device.open(QIODevice::WriteOnly);
126+
116127
Document xlsx1;
117128
xlsx1.write("A1", QVariant());
118129
Format format;
119130
format.setFontColor(Qt::blue);
120131
format.setBorderStyle(Format::BorderDashDotDot);
121132
format.setFillPattern(Format::PatternSolid);
122133
xlsx1.write("A2", QVariant(), format);
123-
xlsx1.saveAs("test.xlsx");
134+
xlsx1.saveAs(&device);
124135

125-
Document xlsx2("test.xlsx");
136+
device.open(QIODevice::ReadOnly);
137+
Document xlsx2(&device);
126138
QVERIFY(xlsx2.cellAt("A1"));
127139
QCOMPARE(xlsx2.cellAt("A1")->dataType(), Cell::Blank);
128140
QVERIFY(!xlsx2.cellAt("A1")->value().isValid());
@@ -131,23 +143,25 @@ void DocumentTest::testReadWriteBlank()
131143
QVERIFY(!xlsx2.cellAt("A2")->value().isValid());
132144
QVERIFY(xlsx2.cellAt("A2")->format().isValid());
133145
QCOMPARE(xlsx2.cellAt("A2")->format(), format);
134-
135-
QFile::remove("test.xlsx");
136146
}
137147

138148
void DocumentTest::testReadWriteFormula()
139149
{
150+
QBuffer device;
151+
device.open(QIODevice::WriteOnly);
152+
140153
Document xlsx1;
141154
xlsx1.write("A1", "=11+22");
142155
Format format;
143156
format.setFontColor(Qt::blue);
144157
format.setBorderStyle(Format::BorderDashDotDot);
145158
format.setFillPattern(Format::PatternSolid);
146159
xlsx1.write("A2", "=22+33", format);
147-
xlsx1.saveAs("test.xlsx");
160+
xlsx1.saveAs(&device);
148161

149162

150-
Document xlsx2("test.xlsx");
163+
device.open(QIODevice::ReadOnly);
164+
Document xlsx2(&device);
151165
QCOMPARE(xlsx2.cellAt("A1")->dataType(), Cell::Formula);
152166
// QCOMPARE(xlsx2.cellAt("A1")->value().toDouble(), 0.0);
153167
QCOMPARE(xlsx2.cellAt("A1")->formula(), QStringLiteral("11+22"));
@@ -156,12 +170,13 @@ void DocumentTest::testReadWriteFormula()
156170
QCOMPARE(xlsx2.cellAt("A2")->formula(), QStringLiteral("22+33"));
157171
QVERIFY(xlsx2.cellAt("A2")->format().isValid());
158172
QCOMPARE(xlsx2.cellAt("A2")->format(), format);
159-
160-
QFile::remove("test.xlsx");
161173
}
162174

163175
void DocumentTest::testReadWriteDateTime()
164176
{
177+
QBuffer device;
178+
device.open(QIODevice::WriteOnly);
179+
165180
Document xlsx1;
166181
QDateTime dt(QDate(2012, 11, 12), QTime(6, 0), Qt::UTC);
167182

@@ -177,10 +192,10 @@ void DocumentTest::testReadWriteDateTime()
177192
format3.setNumberFormat("dd/mm/yyyy");
178193
xlsx1.write("A3", dt, format3);
179194

180-
xlsx1.saveAs("test.xlsx");
181-
182-
Document xlsx2("test.xlsx");
195+
xlsx1.saveAs(&device);
183196

197+
device.open(QIODevice::ReadOnly);
198+
Document xlsx2(&device);
184199
QCOMPARE(xlsx2.cellAt("A1")->dataType(), Cell::Numeric);
185200
QCOMPARE(xlsx2.cellAt("A1")->isDateTime(), true);
186201
QCOMPARE(xlsx2.cellAt("A1")->dateTime(), dt);
@@ -195,9 +210,6 @@ void DocumentTest::testReadWriteDateTime()
195210
QCOMPARE(xlsx2.cellAt("A3")->isDateTime(), true);
196211
QCOMPARE(xlsx2.cellAt("A3")->dateTime(), dt);
197212
QCOMPARE(xlsx2.cellAt("A3")->format().numberFormat(), QString("dd/mm/yyyy"));
198-
199-
QFile::remove("test.xlsx");
200-
201213
}
202214

203215
QTEST_APPLESS_MAIN(DocumentTest)

0 commit comments

Comments
 (0)