File indexing completed on 2024-04-21 14:55:14
0001 /* This file is part of the KDE project 0002 0003 Copyright 1999-2008 David Faure <faure@kde.org> 0004 Copyright 2000-2005 Stephan Kulow <coolo@kde.org> 0005 Copyright 2007 Thiago Macieira <thiago@kde.org> 0006 0007 This library is free software; you can redistribute it and/or modify 0008 it under the terms of the GNU Library General Public License as published 0009 by the Free Software Foundation; either version 2 of the License or 0010 ( at your option ) version 3 or, at the discretion of KDE e.V. 0011 ( which shall act as a proxy as in section 14 of the GPLv3 ), any later version. 0012 0013 This library is distributed in the hope that it will be useful, 0014 but WITHOUT ANY WARRANTY; without even the implied warranty of 0015 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0016 Library General Public License for more details. 0017 0018 You should have received a copy of the GNU Library General Public License 0019 along with this library; see the file COPYING.LIB. If not, write to 0020 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0021 Boston, MA 02110-1301, USA. 0022 */ 0023 0024 // to test debug messages, kdebug should be enabled regardless of build mode 0025 0026 #include <QCoreApplication> 0027 #include <QStringList> 0028 #include <QDebug> 0029 #undef QT_NO_DEBUG 0030 0031 #include "kdebug.h" 0032 #include <kcomponentdata.h> 0033 #include <iostream> 0034 #include <QPoint> 0035 #include <QRect> 0036 #include <QVariant> 0037 #include <map> 0038 #include <list> 0039 0040 class TestClass1 0041 { 0042 public: 0043 enum Something { foo }; 0044 0045 void func_void() 0046 { 0047 KWARNING_NOTIMPLEMENTED 0048 } 0049 int func_int() 0050 { 0051 kDebug(); 0052 return 0; 0053 } 0054 unsigned func_unsigned() 0055 { 0056 kDebug(); 0057 return 0; 0058 } 0059 long func_long() 0060 { 0061 kDebug(); 0062 return 0; 0063 } 0064 long long func_ll() 0065 { 0066 kDebug(); 0067 return 0; 0068 } 0069 unsigned long long func_ull() 0070 { 0071 kDebug(); 0072 return 0; 0073 } 0074 char func_char() 0075 { 0076 kDebug(); 0077 return 0; 0078 } 0079 signed char func_schar() 0080 { 0081 kDebug(); 0082 return 0; 0083 } 0084 unsigned char func_uchar() 0085 { 0086 kDebug(); 0087 return 0; 0088 } 0089 char *func_Pchar() 0090 { 0091 kDebug(); 0092 return nullptr; 0093 } 0094 const char *func_KPchar() 0095 { 0096 kDebug(); 0097 return nullptr; 0098 } 0099 const volatile char *func_VKPchar() 0100 { 0101 kDebug(); 0102 return nullptr; 0103 } 0104 const volatile unsigned long long *const volatile func_KVPKVull() 0105 { 0106 kDebug(); 0107 return nullptr; 0108 } 0109 const void *const volatile *func_KPKVvoid() 0110 { 0111 kDebug(); 0112 return nullptr; 0113 } 0114 0115 QList<int> func_ai() 0116 { 0117 kDebug(); 0118 return QList<int>(); 0119 } 0120 QList<unsigned long long const volatile *> func_aptr() 0121 { 0122 kDebug(); 0123 return QList<unsigned long long const volatile *>(); 0124 } 0125 0126 QList<Something> func_aenum() 0127 { 0128 kDebug(); 0129 return QList<Something>(); 0130 } 0131 QList<QList<const void *> > func_aaptr() 0132 { 0133 kDebug(); 0134 return QList<QList<const void *> >(); 0135 } 0136 0137 QMap<int, Something> func_ienummap() 0138 { 0139 kDebug(); 0140 return QMap<int, Something>(); 0141 } 0142 0143 template<typename T> 0144 T *func_template1() 0145 { 0146 kDebug(); 0147 return nullptr; 0148 } 0149 template<Something val> 0150 long func_template2() 0151 { 0152 kDebug(); 0153 return long(val); 0154 } 0155 0156 typedef unsigned long long *(*fptr)(); 0157 typedef unsigned long long *(TestClass1::* pmf)(); 0158 typedef fptr(TestClass1::* uglypmf)(); 0159 fptr func_fptr() 0160 { 0161 kDebug(); 0162 return nullptr; 0163 } 0164 pmf func_pmf() 0165 { 0166 kDebug(); 0167 return nullptr; 0168 } 0169 uglypmf func_uglypmf(uglypmf = nullptr) 0170 { 0171 kDebug(); 0172 return nullptr; 0173 } 0174 QMap<QString, uglypmf> func_uglypmf2() 0175 { 0176 kDebug(); 0177 return QMap<QString, uglypmf>(); 0178 } 0179 0180 void testBlock() 0181 { 0182 KDEBUG_BLOCK 0183 func_int(); 0184 testNestedBlock(); 0185 } 0186 0187 void testNestedBlock() 0188 { 0189 KDEBUG_BLOCK 0190 func_void(); 0191 deprecatedMethod(); 0192 } 0193 0194 void testCharStarBlock() 0195 { 0196 KDebug::Block myBlock(qPrintable(QString::fromLatin1("Block"))); // the char* goes out of scope 0197 func_void(); 0198 deprecatedMethod(); 0199 } 0200 0201 void deprecatedMethod() 0202 { 0203 KWARNING_DEPRECATED 0204 } 0205 0206 public: 0207 TestClass1() 0208 { 0209 // instantiate 0210 func_void(); 0211 func_int(); 0212 func_unsigned(); 0213 func_long(); 0214 func_ll(); 0215 func_ull(); 0216 func_char(); 0217 func_schar(); 0218 func_uchar(); 0219 func_Pchar(); 0220 func_KPchar(); 0221 func_VKPchar(); 0222 func_KVPKVull(); 0223 func_KPKVvoid(); 0224 func_ai(); 0225 func_aptr(); 0226 func_aenum(); 0227 func_aaptr(); 0228 func_ienummap(); 0229 func_template1<TestClass1>(); 0230 func_template2<foo>(); 0231 func_fptr(); 0232 func_pmf(); 0233 func_uglypmf(); 0234 func_uglypmf2(); 0235 } 0236 }; 0237 0238 template<typename T> class TestClass2 0239 { 0240 long func_long() 0241 { 0242 kDebug(); 0243 return 0; 0244 } 0245 template<typename S> 0246 T *func_template1() 0247 { 0248 kDebug(); 0249 return nullptr; 0250 } 0251 template<TestClass1::Something val> 0252 long func_template2() 0253 { 0254 kDebug(); 0255 return long(val); 0256 } 0257 public: 0258 TestClass2() 0259 { 0260 func_long(); 0261 func_template1<TestClass2>(); 0262 func_template2<TestClass1::foo>(); 0263 } 0264 }; 0265 0266 template<typename T, TestClass1::Something v> class TestClass3 0267 { 0268 long func_long() 0269 { 0270 kDebug(); 0271 return 0; 0272 } 0273 template<typename S> 0274 S *func_template1() 0275 { 0276 kDebug(); 0277 return nullptr; 0278 } 0279 template<TestClass1::Something val> 0280 long func_template2() 0281 { 0282 kDebug(); 0283 return long(val); 0284 } 0285 public: 0286 struct Foo { 0287 TestClass3 foo; 0288 }; 0289 TestClass3() 0290 { 0291 func_long(); 0292 func_template1<TestClass2<T> >(); 0293 func_template2<TestClass1::foo>(); 0294 } 0295 }; 0296 0297 class TestClass4 0298 { 0299 TestClass1 c1; 0300 0301 TestClass2<std::map<long, const void *> > func2() 0302 { 0303 kDebug(); 0304 return TestClass2<std::map<long, const void *> >(); 0305 } 0306 TestClass3<std::map<std::list<int>, const void *>, TestClass1::foo>::Foo func3() 0307 { 0308 kDebug(); 0309 return TestClass3<std::map<std::list<int>, const void *>, TestClass1::foo>::Foo(); 0310 } 0311 public: 0312 TestClass4() 0313 { 0314 func2(); 0315 func3(); 0316 kDebug(); 0317 } 0318 ~TestClass4() 0319 { 0320 kDebug(); 0321 } 0322 }; 0323 0324 namespace 0325 { 0326 class TestClass5 0327 { 0328 public: 0329 TestClass5() 0330 { 0331 kDebug(); 0332 } 0333 }; 0334 TestClass5 func5() 0335 { 0336 kDebug(); 0337 return TestClass5(); 0338 } 0339 } // namespace 0340 0341 namespace N 0342 { 0343 namespace 0344 { 0345 class TestClass6 0346 { 0347 public: 0348 TestClass6() 0349 { 0350 kDebug(); 0351 } 0352 }; 0353 TestClass6 func6() 0354 { 0355 kDebug(); 0356 return TestClass6(); 0357 } 0358 } // namespace 0359 } // namespace N 0360 0361 void testKDebug() 0362 { 0363 QString test = "%20C this is a string"; 0364 kDebug(180) << test; 0365 QByteArray cstr = test.toLatin1(); 0366 kDebug(180) << test; 0367 QChar ch = 'a'; 0368 kDebug() << "QChar a: " << ch; 0369 ch = '\r'; 0370 kDebug() << "QChar \\r: " << ch; 0371 kDebug() << k_lineinfo << "error on this line"; 0372 kDebug(2 == 2) << "this is right " << perror; 0373 kDebug() << "Before instance creation"; 0374 kDebug(1202) << "Before instance creation"; 0375 KComponentData i("kdebugtest"); 0376 kDebug(1) << "kDebugInfo with inexisting area number"; 0377 kDebug(1202) << "This number has a value of " << 5; 0378 // kDebug() << "This number should come out as appname " << 5 << " " << "test"; 0379 kWarning() << "1+1 = " << 1 + 1 + 1; 0380 kError(1 + 1 != 2) << "there is something really odd!"; 0381 QString s = "mystring"; 0382 kDebug() << s; 0383 kError(1202) << "Error !!!"; 0384 kError() << "Error with no area"; 0385 0386 kDebug() << "Printing a null QObject pointer: " << (QObject *)nullptr; 0387 0388 kDebug() << "char " << '^' << " " << char(26); 0389 QPoint p(0, 9); 0390 kDebug() << p; 0391 0392 QRect r(9, 12, 58, 234); 0393 kDebug() << r; 0394 0395 QStringList sl; 0396 sl << "hi" << "this" << "list" << "is" << "short"; 0397 kDebug() << sl; 0398 0399 QList<int> il; 0400 kDebug() << "Empty QList<int>: " << il; 0401 il << 1 << 2 << 3 << 4 << 5; 0402 kDebug() << "QList<int> filled: " << il; 0403 0404 qint64 big = 65536LL * 65536 * 500; 0405 kDebug() << big; 0406 0407 QVariant v(0.12345); 0408 kDebug() << "Variant: " << v; 0409 0410 QByteArray data; 0411 data.resize(6); 0412 data[0] = 42; 0413 data[1] = 'H'; 0414 data[2] = 'e'; 0415 data[3] = 'l'; 0416 data[4] = 'l'; 0417 data[5] = 'o'; 0418 kDebug() << data; 0419 data.resize(80); 0420 data.fill(42); 0421 kDebug() << data; 0422 0423 #ifdef Q_CC_GNU 0424 bool dotest = true; 0425 #else 0426 bool dotest = false; 0427 #endif 0428 if (dotest) { 0429 kDebug() << "Testing the function names. The following should display only the base name of the functions"; 0430 TestClass4 c4; 0431 func5(); 0432 using namespace N; 0433 func6(); 0434 } 0435 0436 TestClass1 c1; 0437 c1.testBlock(); 0438 c1.testCharStarBlock(); 0439 } 0440 0441 // Concurrency testing, based on code from bug 133026 0442 // Copyright 2006 Marcel Wiesweg <marcel.wiesweg@gmx.de> 0443 0444 //#define THREAD_TEST 1 0445 0446 #ifdef THREAD_TEST 0447 #include <QThread> 0448 class DebugKDebug : public QThread 0449 { 0450 public: 0451 DebugKDebug(int num) : m_num(num) {} 0452 protected: 0453 virtual void run() 0454 { 0455 int count = 1000; 0456 while (--count) { 0457 kDebug() << "Test" << m_num; 0458 //usleep(1); 0459 } 0460 } 0461 private: 0462 int m_num; 0463 }; 0464 0465 static void startThreads() 0466 { 0467 QVector<DebugKDebug *> threads; 0468 threads.resize(100); 0469 for (int i = 0; i < threads.size(); i++) { 0470 threads[i] = new DebugKDebug(i); 0471 threads[i]->start(); 0472 } 0473 for (int i = 0; i < threads.size(); i++) { 0474 threads[i]->wait(); 0475 } 0476 } 0477 #endif 0478 0479 int main(int argc, char **argv) 0480 { 0481 QCoreApplication app(argc, argv); 0482 KComponentData mainData("kdebugtest"); 0483 testKDebug(); 0484 #ifdef THREAD_TEST 0485 startThreads(); 0486 #else 0487 Q_UNUSED(argc); 0488 Q_UNUSED(argv); 0489 #endif 0490 return 0; 0491 } 0492