117 bic.addBlacklistedClass(QLatin1String("QBrushData")); |
119 bic.addBlacklistedClass(QLatin1String("QBrushData")); |
118 bic.addBlacklistedClass(QLatin1String("QObjectData")); |
120 bic.addBlacklistedClass(QLatin1String("QObjectData")); |
119 bic.addBlacklistedClass(QLatin1String("QAtomic")); |
121 bic.addBlacklistedClass(QLatin1String("QAtomic")); |
120 bic.addBlacklistedClass(QLatin1String("QBasicAtomic")); |
122 bic.addBlacklistedClass(QLatin1String("QBasicAtomic")); |
121 bic.addBlacklistedClass(QLatin1String("QRegion::QRegionData")); |
123 bic.addBlacklistedClass(QLatin1String("QRegion::QRegionData")); |
|
124 bic.addBlacklistedClass(QLatin1String("QtConcurrent::ThreadEngineSemaphore")); |
|
125 bic.addBlacklistedClass(QLatin1String("QDrawPixmaps::Data")); |
|
126 bic.addBlacklistedClass(QLatin1String("QS60Style")); |
122 |
127 |
123 /* Jambi-related classes in Designer */ |
128 /* Jambi-related classes in Designer */ |
124 bic.addBlacklistedClass(QLatin1String("QDesignerLanguageExtension")); |
129 bic.addBlacklistedClass(QLatin1String("QDesignerLanguageExtension")); |
125 |
130 |
126 /* Harald says it's undocumented and private :) */ |
131 /* Harald says it's undocumented and private :) */ |
136 { |
141 { |
137 QTest::addColumn<QString>("libName"); |
142 QTest::addColumn<QString>("libName"); |
138 |
143 |
139 QTest::newRow("QtCore") << "QtCore"; |
144 QTest::newRow("QtCore") << "QtCore"; |
140 QTest::newRow("QtGui") << "QtGui"; |
145 QTest::newRow("QtGui") << "QtGui"; |
|
146 |
|
147 QTest::newRow("Qt3Support") << "Qt3Support"; |
|
148 #ifndef QT_NO_DBUS |
|
149 QTest::newRow("QtDBus") << "QtDBus"; |
|
150 #endif |
|
151 QTest::newRow("QtDesigner") << "QtDesigner"; |
|
152 QTest::newRow("QtMultimedia") << "QtMultimedia"; |
|
153 QTest::newRow("QtNetwork") << "QtNetwork"; |
|
154 QTest::newRow("QtOpenGL") << "QtOpenGL"; |
141 QTest::newRow("QtScript") << "QtScript"; |
155 QTest::newRow("QtScript") << "QtScript"; |
|
156 QTest::newRow("QtScriptTools") << "QtScriptTools"; |
142 QTest::newRow("QtSql") << "QtSql"; |
157 QTest::newRow("QtSql") << "QtSql"; |
143 QTest::newRow("QtSvg") << "QtSvg"; |
158 QTest::newRow("QtSvg") << "QtSvg"; |
144 QTest::newRow("QtNetwork") << "QtNetwork"; |
159 QTest::newRow("QtTest") << "QtTest"; |
145 QTest::newRow("QtOpenGL") << "QtOpenGL"; |
160 QTest::newRow("QtWebKit") << "QtWebKit"; |
146 QTest::newRow("QtXml") << "QtXml"; |
161 QTest::newRow("QtXml") << "QtXml"; |
147 QTest::newRow("QtXmlPatterns") << "QtXmlPatterns"; |
162 QTest::newRow("QtXmlPatterns") << "QtXmlPatterns"; |
148 QTest::newRow("Qt3Support") << "Qt3Support"; |
163 QTest::newRow("phonon") << "phonon"; |
149 QTest::newRow("QtTest") << "QtTest"; |
|
150 QTest::newRow("QtDBus") << "QtDBus"; |
|
151 QTest::newRow("QtDesigner") << "QtDesigner"; |
|
152 } |
164 } |
153 |
165 |
154 void tst_Bic::initTestCase() |
166 void tst_Bic::initTestCase() |
155 { |
167 { |
156 QString qtDir = QString::fromLocal8Bit(qgetenv("QTDIR")); |
168 QString qtDir = QString::fromLocal8Bit(qgetenv("QTDIR")); |
164 { |
176 { |
165 #if !defined(Q_CC_GNU) || defined(Q_CC_INTEL) |
177 #if !defined(Q_CC_GNU) || defined(Q_CC_INTEL) |
166 QSKIP("Test not implemented for this compiler/platform", SkipAll); |
178 QSKIP("Test not implemented for this compiler/platform", SkipAll); |
167 #else |
179 #else |
168 |
180 |
169 QString archFileName400; |
|
170 QString archFileName410; |
|
171 QString archFileName420; |
|
172 QString archFileName430; |
|
173 |
|
174 #if defined Q_OS_LINUX && defined Q_WS_X11 |
181 #if defined Q_OS_LINUX && defined Q_WS_X11 |
175 # if defined(__powerpc__) && !defined(__powerpc64__) |
182 # if defined(__powerpc__) && !defined(__powerpc64__) |
176 archFileName400 = SRCDIR "data/%1.4.0.0.linux-gcc-ppc32.txt"; |
183 # define FILESUFFIX "linux-gcc-ppc32" |
177 archFileName410 = SRCDIR "data/%1.4.1.0.linux-gcc-ppc32.txt"; |
|
178 archFileName420 = SRCDIR "data/%1.4.2.0.linux-gcc-ppc32.txt"; |
|
179 # elif defined(__amd64__) |
184 # elif defined(__amd64__) |
180 archFileName400 = SRCDIR "data/%1.4.0.0.linux-gcc-amd64.txt"; |
185 # define FILESUFFIX "linux-gcc-amd64" |
181 # elif defined(__i386__) |
186 # elif defined(__i386__) |
182 archFileName400 = SRCDIR "data/%1.4.0.0.linux-gcc-ia32.txt"; |
187 # define FILESUFFIX "linux-gcc-ia32" |
183 archFileName410 = SRCDIR "data/%1.4.1.0.linux-gcc-ia32.txt"; |
|
184 archFileName420 = SRCDIR "data/%1.4.2.0.linux-gcc-ia32.txt"; |
|
185 archFileName430 = SRCDIR "data/%1.4.3.0.linux-gcc-ia32.txt"; |
|
186 # endif |
188 # endif |
187 #elif defined Q_OS_AIX |
|
188 if (sizeof(void*) == 4) |
|
189 archFileName400 = SRCDIR "data/%1.4.0.0.aix-gcc-power32.txt"; |
|
190 #elif defined Q_OS_MAC && defined(__powerpc__) |
189 #elif defined Q_OS_MAC && defined(__powerpc__) |
191 archFileName400 = SRCDIR "data/%1.4.0.0.macx-gcc-ppc32.txt"; |
190 # define FILESUFFIX "macx-gcc-ppc32" |
192 archFileName410 = SRCDIR "data/%1.4.1.0.macx-gcc-ppc32.txt"; |
|
193 archFileName420 = SRCDIR "data/%1.4.2.0.macx-gcc-ppc32.txt"; |
|
194 #elif defined Q_OS_MAC && defined(__i386__) |
191 #elif defined Q_OS_MAC && defined(__i386__) |
195 archFileName410 = SRCDIR "data/%1.4.1.0.macx-gcc-ia32.txt"; |
192 # define FILESUFFIX "macx-gcc-ia32" |
196 archFileName420 = SRCDIR "data/%1.4.2.0.macx-gcc-ia32.txt"; |
193 #elif defined Q_OS_MAC && defined(__amd64__) |
|
194 # define FILESUFFIX "macx-gcc-amd64" |
197 #elif defined Q_OS_WIN && defined Q_CC_GNU |
195 #elif defined Q_OS_WIN && defined Q_CC_GNU |
198 archFileName410 = SRCDIR "data/%1.4.1.0.win32-gcc-ia32.txt"; |
196 # define FILESUFFIX "win32-gcc-ia32" |
199 archFileName420 = SRCDIR "data/%1.4.2.0.win32-gcc-ia32.txt"; |
197 #else |
200 #endif |
198 # define FILESUFFIX "nonsuch" |
201 |
199 QSKIP("No reference files found for this platform", SkipAll); |
202 if (archFileName400.isEmpty() && archFileName410.isEmpty() |
200 #endif |
203 && archFileName420.isEmpty()) |
|
204 QSKIP("No reference files found for this platform", SkipAll); |
|
205 |
|
206 bool isPatchRelease400 = false; |
|
207 bool isPatchRelease410 = false; |
|
208 bool isPatchRelease420 = false; |
|
209 bool isPatchRelease430 = false; |
|
210 |
201 |
211 QTest::addColumn<QString>("oldLib"); |
202 QTest::addColumn<QString>("oldLib"); |
212 QTest::addColumn<bool>("isPatchRelease"); |
203 QTest::addColumn<bool>("isPatchRelease"); |
213 |
204 |
214 QTest::newRow("4.0") << archFileName400 << isPatchRelease400; |
205 int minor = (QT_VERSION >> 8) & 0xFF; |
215 QTest::newRow("4.1") << archFileName410 << isPatchRelease410; |
206 int patch = QT_VERSION & 0xFF; |
216 QTest::newRow("4.2") << archFileName420 << isPatchRelease420; |
207 for (int i = 0; i <= minor; ++i) { |
217 QTest::newRow("4.3") << archFileName430 << isPatchRelease430; |
208 if (i != minor || patch) |
|
209 QTest::newRow("4." + QByteArray::number(i)) |
|
210 << (QString(SRCDIR "data/%1.4.") |
|
211 + QString::number(i) |
|
212 + QString(".0." FILESUFFIX ".txt")) |
|
213 << (i == minor && patch); |
|
214 } |
218 #endif |
215 #endif |
219 } |
216 } |
220 |
217 |
221 QBic::Info tst_Bic::getCurrentInfo(const QString &libName) |
218 QBic::Info tst_Bic::getCurrentInfo(const QString &libName) |
222 { |
219 { |
|
220 QBic::Info &inf = cachedCurrentInfo[libName]; |
|
221 if (!inf.classSizes.isEmpty()) |
|
222 return inf; |
|
223 |
223 QTemporaryFile tmpQFile; |
224 QTemporaryFile tmpQFile; |
224 tmpQFile.open(); |
225 tmpQFile.open(); |
225 QString tmpFileName = tmpQFile.fileName(); |
226 QString tmpFileName = tmpQFile.fileName(); |
226 |
227 |
227 QByteArray tmpFileContents = "#include<" + libName.toLatin1() + "/" + libName.toLatin1() + ">\n"; |
228 QByteArray tmpFileContents = "#include<" + libName.toLatin1() + "/" + libName.toLatin1() + ">\n"; |
315 qWarning() << "VTables for the following classes were removed" << diff.removedVTables; |
319 qWarning() << "VTables for the following classes were removed" << diff.removedVTables; |
316 isFailed = true; |
320 isFailed = true; |
317 } |
321 } |
318 |
322 |
319 if (!diff.modifiedVTables.isEmpty()) { |
323 if (!diff.modifiedVTables.isEmpty()) { |
320 foreach(QStringPair entry, diff.modifiedVTables) |
324 if (diff.modifiedVTables.size() != 1 || |
321 qWarning() << "modified VTable:\n Old: " << entry.first |
325 strcmp(QTest::currentDataTag(), "4.4") != 0 || |
322 << "\n New: " << entry.second; |
326 diff.modifiedVTables.at(0).first != "QGraphicsProxyWidget") { |
323 isFailed = true; |
327 foreach(QStringPair entry, diff.modifiedVTables) |
|
328 qWarning() << "modified VTable:\n Old: " << entry.first |
|
329 << "\n New: " << entry.second; |
|
330 isFailed = true; |
|
331 } |
324 } |
332 } |
325 |
333 |
326 if (isPatchRelease && !diff.addedVTables.isEmpty()) { |
334 if (isPatchRelease && !diff.addedVTables.isEmpty()) { |
327 qWarning() << "VTables for the following classes were added in a patch release:" |
335 qWarning() << "VTables for the following classes were added in a patch release:" |
328 << diff.addedVTables; |
336 << diff.addedVTables; |