diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | ce4a32fe52ef09d8f5ff1dd22c001110902b60a2 (patch) | |
tree | 5ac38a06f3dde268dc7927dc155896926aaf7012 /kdecore/tests | |
download | tdelibs-ce4a32fe52ef09d8f5ff1dd22c001110902b60a2.tar.gz tdelibs-ce4a32fe52ef09d8f5ff1dd22c001110902b60a2.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdelibs@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kdecore/tests')
45 files changed, 5021 insertions, 0 deletions
diff --git a/kdecore/tests/KIDLTest.cpp b/kdecore/tests/KIDLTest.cpp new file mode 100644 index 000000000..89e2142fc --- /dev/null +++ b/kdecore/tests/KIDLTest.cpp @@ -0,0 +1,33 @@ +#include "KIDLTest.h" + +#include <kapplication.h> +#include <dcopclient.h> + +KIDLTest::KIDLTest( const QCString& id ) + : DCOPObject( id ) +{ +} + +QString KIDLTest::hello( const QString& name ) +{ + qDebug("Du heter %s", name.latin1() ); + qDebug("Ha det %s", name.latin1() ); + + return QString("Jeg heter KIDLTest"); +} + +int main( int argc, char** argv ) +{ + KApplication app( argc, argv, "kidlservertest", false /* No GUI */ ); + + app.dcopClient()->attach(); + app.dcopClient()->registerAs( "kidlservertest" ); + + qDebug("Server process started..."); + + (void) new KIDLTest( "Hello" ); + + qDebug("Server listening ..."); + + return app.exec(); +} diff --git a/kdecore/tests/KIDLTest.h b/kdecore/tests/KIDLTest.h new file mode 100644 index 000000000..f0c4aaefd --- /dev/null +++ b/kdecore/tests/KIDLTest.h @@ -0,0 +1,16 @@ +#ifndef KIDLTEST_H +#define KIDLTEST_H + +#include <dcopobject.h> + +class KIDLTest : virtual public DCOPObject +{ + K_DCOP +public: + KIDLTest( const QCString& id ); + +k_dcop: + virtual QString hello( const QString& name ); +}; + +#endif diff --git a/kdecore/tests/KIDLTestClient.cpp b/kdecore/tests/KIDLTestClient.cpp new file mode 100644 index 000000000..0b9e45768 --- /dev/null +++ b/kdecore/tests/KIDLTestClient.cpp @@ -0,0 +1,17 @@ +#include <kapplication.h> +#include <dcopclient.h> + +#include "KIDLTest_stub.h" + +int main( int argc, char** argv ) +{ + KApplication app( argc, argv, "KIDLTestClient", false /* No GUI */ ); + + kapp->dcopClient()->attach(); + // kapp->dcopClient()->registerAs( "kidlclienttest" ); + + KIDLTest_stub* t = new KIDLTest_stub( "kidlservertest", "Hello" ); + + QString ret = t->hello("Torben"); + qDebug("Server says: %s", ret.latin1() ); +} diff --git a/kdecore/tests/Makefile.am b/kdecore/tests/Makefile.am new file mode 100644 index 000000000..3d05e1ac2 --- /dev/null +++ b/kdecore/tests/Makefile.am @@ -0,0 +1,86 @@ +# This file is part of the KDE libraries +# Copyright (C) 1996-1997 Matthias Kalle Dalheimer (kalle@kde.org) +# (C) 1997-1998 Stephan Kulow (coolo@kde.org) + +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. + +# This library 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 +# Library General Public License for more details. + +# You should have received a copy of the GNU Library General Public License +# along with this library; see the file COPYING.LIB. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +INCLUDES = -I$(top_srcdir)/kdecore $(all_includes) + +AM_LDFLAGS = $(QT_LDFLAGS) $(X_LDFLAGS) $(KDE_RPATH) + +check_PROGRAMS = kconfigtestgui klocaletest kprocesstest ksimpleconfigtest \ + kstddirstest kurltest kuniqueapptest ktempfiletest krandomsequencetest \ + kdebugtest ksocktest kstringhandlertest kcmdlineargstest kapptest \ + kmemtest kidlservertest kidlclienttest dcopkonqtest kipctest \ + cplusplustest kiconloadertest kresolvertest kmdcodectest knotifytest \ + ksortablevaluelisttest krfcdatetest testqtargs kprociotest \ + kcharsetstest kcalendartest kmacroexpandertest kshelltest \ + kxerrorhandlertest startserviceby kstdacceltest kglobaltest ktimezonestest + +TESTS = kurltest kstdacceltest + +noinst_HEADERS = klocaletest.h kprocesstest.h KIDLTest.h \ + kipctest.h kprociotest.h + +METASOURCES = AUTO + +LDADD = ../libkdecore.la +kconfigtestgui_SOURCES = kconfigtestgui.cpp +kdebugtest_SOURCES = kdebugtest.cpp +klocaletest_SOURCES = klocaletest.cpp +#klocaletest2_SOURCES = klocaletest2.cpp klocale.cpp libintl.cpp kcatalogue.cpp +#kcatalogue_SOURCES = kcatalogue.cpp libintl.cpp +ksimpleconfigtest_SOURCES = ksimpleconfigtest.cpp +kurltest_SOURCES = kurltest.cpp +kstddirstest_SOURCES = kstddirstest.cpp +kprocesstest_SOURCES = kprocesstest.cpp +kuniqueapptest_SOURCES = kuniqueapptest.cpp +kapptest_SOURCES = kapptest.cpp +ksocktest_SOURCES = ksocktest.cpp +ktempfiletest_SOURCES = ktempfiletest.cpp +krandomsequencetest_SOURCES = krandomsequencetest.cpp +kstringhandlertest_SOURCES = kstringhandlertest.cpp +kcmdlineargstest_SOURCES = kcmdlineargstest.cpp +dcopkonqtest_SOURCES = dcopkonqtest.cpp +kmemtest_SOURCES = kmemtest.cpp +kidlservertest_SOURCES = KIDLTest.cpp KIDLTest.skel +kidlclienttest_SOURCES = KIDLTestClient.cpp KIDLTest.stub +$(srcdir)/KIDLTestClient.cpp: KIDLTest_stub.h +kipctest_SOURCES = kipctest.cpp +cplusplustest_SOURCES = cplusplustest.cpp +kiconloadertest_SOURCES = kiconloadertest.cpp +kresolvertest_SOURCES = kresolvertest.cpp +kmdcodectest_SOURCES = kmdcodectest.cpp +knotifytest_SOURCES = knotifytest.cpp +ksortablevaluelisttest_SOURCES = ksortablevaluelisttest.cpp +krfcdatetest_SOURCES = krfcdatetest.cpp +testqtargs_SOURCES = testqtargs.cpp +kprociotest_SOURCES = kprociotest.cpp +kcharsetstest_SOURCES = kcharsetstest.cpp +kcalendartest_SOURCES = kcalendartest.cpp +kmacroexpandertest_SOURCES = kmacroexpandertest.cpp +kshelltest_SOURCES = kshelltest.cpp +kxerrorhandlertest_SOURCES = kxerrorhandlertest.cpp +startserviceby_SOURCES = startserviceby.cpp +kstdacceltest_SOURCES = kstdacceltest.cpp +kglobaltest_SOURCES = kglobaltest.cpp +ktimezonestest_SOURCES = ktimezonestest.cpp + +check_LTLIBRARIES = kunittest_kconfig.la + +kunittest_kconfig_la_SOURCES = kconfigtest.cpp +kunittest_kconfig_la_LIBADD = $(LIB_KUNITTEST) +kunittest_kconfig_la_LDFLAGS = -module $(KDE_CHECK_PLUGIN) diff --git a/kdecore/tests/cplusplustest.cpp b/kdecore/tests/cplusplustest.cpp new file mode 100644 index 000000000..387dac014 --- /dev/null +++ b/kdecore/tests/cplusplustest.cpp @@ -0,0 +1,44 @@ +/* This file is part of the KDE libraries + Copyright (c) 1999 Waldo Bastian <bastian@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include <qstring.h> +#include <qdict.h> + +class A { int foo; }; +class B { int bar; }; +class C : public A, public B { int foobar; }; + +QDict<A> dictA; +QDict<B> dictB; + +int main(int , char *[]) +{ + C obj; + A *pA = &obj; + B *pB = &obj; + C *pC = &obj; +qWarning("pA = %p, pB = %p, pC = %p", pA, pB, pC); + if (pA == pC) qWarning("pA == pC"); + if (pB == pC) qWarning("pB == pC"); + + dictA.insert("hello", pC); + dictB.insert("hello", pC); + + if (dictA["hello"] == pC) qWarning("dictA['hello'] == pC"); + if (dictB["hello"] == pC) qWarning("dictB['hello'] == pC"); +} diff --git a/kdecore/tests/dcopkonqtest.cpp b/kdecore/tests/dcopkonqtest.cpp new file mode 100644 index 000000000..95dd726e3 --- /dev/null +++ b/kdecore/tests/dcopkonqtest.cpp @@ -0,0 +1,36 @@ +#include <kapplication.h> +#include <kdebug.h> +#include <dcopclient.h> + +int main( int argc, char** argv ) +{ + KApplication app( argc, argv, "KIDLTestClient", false ); + + kapp->dcopClient()->attach(); + // kapp->dcopClient()->registerAs( "kidlclienttest" ); + + QByteArray data; + + kdDebug() << "sending reparseConfiguration to object KonquerorIface in konqueror" << endl; + QByteArray snd; + QByteArray rcv; + QCString _type_; + kapp->dcopClient()->call( "konqueror", "KonquerorIface", "reparseConfiguration()", snd, _type_, rcv ); + kdDebug() << _type_ << endl; + if( _type_ != "void" ) kdDebug() << "void expected, " << _type_.data() << " returned" << endl; + +/* +debug("sending configure to object KonquerorIface in konqueror"); + if (kapp->dcopClient()->send( "konqueror", "KonquerorIface", "configure()", data )) + debug("ok"); + else + debug("ko"); + +/// BROADCAST +debug("sending databaseChanged to object ksycoca in all apps"); + if (kapp->dcopClient()->send( "*", "ksycoca", "databaseChanged()", data )) + debug("ok"); + else + debug("ko"); +*/ +} diff --git a/kdecore/tests/kapptest.cpp b/kdecore/tests/kapptest.cpp new file mode 100644 index 000000000..4a6465099 --- /dev/null +++ b/kdecore/tests/kapptest.cpp @@ -0,0 +1,40 @@ +/* This file is part of the KDE libraries + Copyright (c) 1999 Waldo Bastian <bastian@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#define private public +#include "kapplication.h" +#include <stdio.h> + +#include <kcmdlineargs.h> +#include <kaboutdata.h> +#include <kglobalsettings.h> +#include <ksycoca.h> + +int +main(int argc, char *argv[]) +{ + KAboutData about("kapptest", "kapptest", "version"); + KCmdLineArgs::init(argc, argv, &about); + + KApplication a; + + KSycoca *s = KSycoca::self(); + + qWarning("s->language() %s", s->language().latin1()); + qWarning("Offset of aIconName: %ld", (long) &(static_cast<KApplication *>(0)->aIconName)); +} diff --git a/kdecore/tests/kcalendartest.cpp b/kdecore/tests/kcalendartest.cpp new file mode 100644 index 000000000..18b4fc297 --- /dev/null +++ b/kdecore/tests/kcalendartest.cpp @@ -0,0 +1,152 @@ +// Simplest example using two kde calendar systems (gregorian and hijri) +// Carlos Moro <cfmoro@correo.uniovi.es> +// GNU-GPL v.2 + +#include "kcalendarsystemfactory.h" +#include "kcalendarsystem.h" + +#include <qstringlist.h> + +#include <kapplication.h> +#include <kaboutdata.h> +#include <kdebug.h> +#include <kglobal.h> +#include <klocale.h> +#include <kcmdlineargs.h> + +class KLocale; + +void test(QDate & date); + +static const char description[] = "KCalendarTest"; + +static KCmdLineOptions options[] = +{ + { "help", I18N_NOOP("Prints this help"), 0 }, + { "type hijri|gregorian|jalali|hebrew", I18N_NOOP("Supported calendar types"), 0 }, + { "date <date>", I18N_NOOP("Show day info"), 0 }, +}; + +int main(int argc, char **argv) { + + QDate date; + QString calType, option; + + KAboutData aboutData( "kcalendartest", "KCalendarTest" , + "0.1", description, KAboutData::License_GPL, + "(c) 2002, Carlos Moro", 0, 0, + "cfmoro@correo.uniovi.es"); + aboutData.addAuthor("Carlos Moro",0, "cfmoro@correo.uniovi.es"); + + + KCmdLineArgs::init( argc, argv, &aboutData ); + KCmdLineArgs::addCmdLineOptions( options ); // Add our own options. + + KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); + + KApplication app(false, false); + + QStringList lst = KCalendarSystemFactory::calendarSystems(); + kdDebug() << "Supported calendar types: " << endl; + for (QStringList::Iterator it = lst.begin(); it != lst.end(); ++it) + kdDebug() << *it << endl; + kdDebug() << endl; + + + if ( args->isSet("type") ) + calType = args->getOption("type"); + + + KGlobal::locale()->setCalendar(calType); + + /* + * If we like to see some date + * + */ + if ( args->isSet("date") ) { + option = args->getOption("date"); + date = KGlobal::locale()->readDate(option); + } else + date = QDate::currentDate(); + + args->clear(); // Free up some memory. + + test(date); + + return 0; + + + +} + +void test(QDate & date) { + + kdDebug() << "(KLocale) readDate" << endl; + + kdDebug() << "Created calendar: " << KGlobal::locale()->calendar()->calendarName() << endl; + + kdDebug() << "Day name for first day of week is " << KGlobal::locale()->calendar()->weekDayName(1) << endl; + kdDebug() << "Short month name for second month is " << KGlobal::locale()->calendar()->weekDayName(1, true) << endl; + + kdDebug() << "Month name for second month is " << KGlobal::locale()->calendar()->monthName(2, KGlobal::locale()->calendar()->year(date)) << endl; + kdDebug() << "Short month name for second month is " << KGlobal::locale()->calendar()->monthName(2, KGlobal::locale()->calendar()->year(date), true) << endl; + kdDebug() << "Month name possessive for second month is " << KGlobal::locale()->calendar()->monthNamePossessive(2, KGlobal::locale()->calendar()->year(date)) << endl; + kdDebug() << "Short month name possessive for second month is " << KGlobal::locale()->calendar()->monthNamePossessive(2, KGlobal::locale()->calendar()->year(date), true) << endl; + kdDebug() << "Month name for fifth month is " << KGlobal::locale()->calendar()->monthName(5, KGlobal::locale()->calendar()->year(date)) << endl; + kdDebug() << "Short month name for fifth month is " << KGlobal::locale()->calendar()->monthName(5, KGlobal::locale()->calendar()->year(date), true) << endl; + kdDebug() << "Month name possessive for fifth month is " << KGlobal::locale()->calendar()->monthNamePossessive(5, KGlobal::locale()->calendar()->year(date)) << endl; + kdDebug() << "Short month name possessive for fifth month is " << KGlobal::locale()->calendar()->monthNamePossessive(5, KGlobal::locale()->calendar()->year(date), true) << endl; + + kdDebug() << "Day for date " << date.toString() << " is " << KGlobal::locale()->calendar()->day(date) << endl; + kdDebug() << "Month for date " << date.toString() << " is " << KGlobal::locale()->calendar()->month(date) << endl; + kdDebug() << "Year for date " << date.toString() << " is " << KGlobal::locale()->calendar()->year(date) << endl; + + kdDebug() << "Day for date " << date.toString() << " as a string is " << KGlobal::locale()->calendar()->dayString(date, true) << endl; + kdDebug() << "Month for date " << date.toString() << " as a string is " << KGlobal::locale()->calendar()->monthString(date, true) << endl; + kdDebug() << "Year for date " << date.toString() << " as a string is " << KGlobal::locale()->calendar()->yearString(date, true) << endl; + + kdDebug() << "Day of week for date " << date.toString() << " is number " << KGlobal::locale()->calendar()->dayOfWeek(date) << endl; + kdDebug() << "Week name for date " << date.toString() << " is " << KGlobal::locale()->calendar()->weekDayName(date) << endl; + kdDebug() << "Short week name for date " << date.toString() << " is " << KGlobal::locale()->calendar()->weekDayName(date, true) << endl; + + kdDebug() << "Month name for date " << date.toString() << " is " << KGlobal::locale()->calendar()->monthName(date) << endl; + kdDebug() << "Short month name for date " << date.toString() << " is " << KGlobal::locale()->calendar()->monthName(date, true) << endl; + kdDebug() << "Month name possessive for date " << date.toString() << " is " << KGlobal::locale()->calendar()->monthNamePossessive(date) << endl; + kdDebug() << "Short month name possessive for date " << date.toString() << " is " << KGlobal::locale()->calendar()->monthNamePossessive(date, true) << endl; + + kdDebug() << "It's week number " << KGlobal::locale()->calendar()->weekNumber(date) << endl; + + + kdDebug() << "(KLocale) Formatted date: " << KGlobal::locale()->formatDate(date) << endl; + kdDebug() << "(KLocale) Short formatted date: " << KGlobal::locale()->formatDate(date, true) << endl; + + kdDebug() << "That month have : " << KGlobal::locale()->calendar()->daysInMonth(date) << " days" << endl; + + kdDebug() << "That year has " << KGlobal::locale()->calendar()->monthsInYear(date) << " months" << endl; + kdDebug() << "There are " << KGlobal::locale()->calendar()->weeksInYear(KGlobal::locale()->calendar()->year(date)) << " weeks that year" << endl; + kdDebug() << "There are " << KGlobal::locale()->calendar()->daysInYear(date) << " days that year" << endl; + + kdDebug() << "The day of pray is number " << KGlobal::locale()->calendar()->weekDayOfPray() << endl; + + kdDebug() << "Max valid year supported is " << KGlobal::locale()->calendar()->maxValidYear() << endl; + kdDebug() << "Min valid year supported is " << KGlobal::locale()->calendar()->minValidYear() << endl; + + kdDebug() << "It's the day number " << KGlobal::locale()->calendar()->dayOfYear(date) << " of year" << endl; + + kdDebug() << "Add 3 days" << endl; + date = KGlobal::locale()->calendar()->addDays(date, 3); + kdDebug() << "It's " << KGlobal::locale()->formatDate(date) << endl; + + kdDebug() << "Then add 3 months" << endl; + date = KGlobal::locale()->calendar()->addMonths(date, 3); + kdDebug() << "It's " << KGlobal::locale()->formatDate(date) << endl; + + kdDebug() << "And last, add -3 years" << endl; + date = KGlobal::locale()->calendar()->addYears(date, -3); + kdDebug() << "It's " << KGlobal::locale()->formatDate(date) << endl; + + kdDebug() << "Is lunar based: " << KGlobal::locale()->calendar()->isLunar() << endl; + kdDebug() << "Is lunisolar based: " << KGlobal::locale()->calendar()->isLunisolar() << endl; + kdDebug() << "Is solar based: " << KGlobal::locale()->calendar()->isSolar() << endl; + +} diff --git a/kdecore/tests/kcharsetstest.cpp b/kdecore/tests/kcharsetstest.cpp new file mode 100644 index 000000000..de281d3d9 --- /dev/null +++ b/kdecore/tests/kcharsetstest.cpp @@ -0,0 +1,12 @@ + +#include <kcharsets.h> + +#include <assert.h> + +int main() +{ + QString input( "<Hello &World>" ); + QString output = KCharsets::resolveEntities( input ); + assert( output == "<Hello &World>" ); + return 0; +} diff --git a/kdecore/tests/kcmdlineargstest.cpp b/kdecore/tests/kcmdlineargstest.cpp new file mode 100644 index 000000000..2d6c7ecd2 --- /dev/null +++ b/kdecore/tests/kcmdlineargstest.cpp @@ -0,0 +1,91 @@ +#include <kcmdlineargs.h> +#include <klocale.h> +#include <kapplication.h> + +#include <stdio.h> + +// we use our own macro to not bother translators +// but still demonstrate the use. You would use I18N_NOOP +#define I18N_NOP(x) x + +static const char version[] = "v0.0.2 1999 (c) Waldo Bastian"; +static const char description[] = I18N_NOP("This is a test program."); + +static KCmdLineOptions options[] = +{ + { "test", I18N_NOP("do a short test only, note that\n" + "this is rather long comment"), 0 }, + { "baud <baudrate>", I18N_NOP("set baudrate"), "9600" }, + { "+file(s)", I18N_NOP("Files to load"), 0 }, + KCmdLineLastOption +}; + +#if 1 +int +main(int argc, char *argv[]) +{ + KLocale::setMainCatalogue("kdelibs"); + KCmdLineArgs::init( argc, argv, "testapp", description, version); + + KCmdLineArgs::addCmdLineOptions( options ); // Add my own options. + + // MyWidget::addCmdLineOptions(); + + KApplication k( false, false /*true, true*/ ); + + // Get application specific arguments + KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); + // Check if an option is set + if (args->isSet("test")) + { + // Do stuff + printf("Option 'test' is set.\n"); + } + + if (args->isSet("baud")) + { + // Do stuff + printf("Option 'baud' is set.\n"); + } + + // Read the value of an option. + QCString baudrate = args->getOption("baud"); // 9600 is the default value. + + printf("Baudrate = %s\n", baudrate.data()); + + printf("Full list of baudrates:\n"); + QCStringList result = args->getOptionList("baud"); + for(QCStringList::ConstIterator it=result.begin(); + it != result.end(); + ++it) + { + printf("Baudrate = %s\n", (*it).data()); + } + printf("End of list\n"); + + for(int i = 0; i < args->count(); i++) + { + printf("%d: %s\n", i, args->arg(i)); + printf("%d: %s\n", i, args->url(i).url().ascii()); + } + + args->clear(); // Free up memory. + + +// k.exec(); + return 0; +} +#else +int +main(int argc, char *argv[]) +{ + KCmdLineArgs::init( argc, argv, "testapp", description, version); + + KApplication k( true, true ); + + k.exec(); + return 0; +} +#endif + + diff --git a/kdecore/tests/kconfigtest.cpp b/kdecore/tests/kconfigtest.cpp new file mode 100644 index 000000000..5ec4c309f --- /dev/null +++ b/kdecore/tests/kconfigtest.cpp @@ -0,0 +1,162 @@ +/* This file is part of the KDE libraries + Copyright (C) 1997 Matthias Kalle Dalheimer (kalle@kde.org) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include <kunittest/tester.h> +#include <kunittest/module.h> + +#include <kconfig.h> + +class KConfigTest : public KUnitTest::Tester +{ +public: + void allTests(); +private: + void writeConfigFile(); + void revertEntries(); +}; + +KUNITTEST_MODULE( kunittest_kconfig, "KConfigTest" ) +KUNITTEST_MODULE_REGISTER_TESTER( KConfigTest ) + +// test data +#define BOOLENTRY1 true +#define BOOLENTRY2 false +#define STRINGENTRY1 "hello" +#define STRINGENTRY2 " hello" +#define STRINGENTRY3 "hello " +#define STRINGENTRY4 " hello " +#define STRINGENTRY5 " " +#define STRINGENTRY6 "" +#define LOCAL8BITENTRY "Hello äöü" +#define POINTENTRY QPoint( 4351, 1235 ) +#define SIZEENTRY QSize( 10, 20 ) +#define RECTENTRY QRect( 10, 23, 5321, 13 ) +#define DATETIMEENTRY QDateTime( QDate( 2002, 06, 23 ), QTime( 12, 55, 40 ) ) +#define STRINGLISTENTRY QStringList( "Hello," ) + +void KConfigTest::writeConfigFile() +{ + KConfig sc( "kconfigtest" ); + + sc.setGroup("AAA"); + sc.writeEntry("stringEntry1", STRINGENTRY1, true, true); + sc.deleteEntry("stringEntry2", false, true); + + sc.setGroup("Hello"); + sc.writeEntry( "boolEntry1", BOOLENTRY1 ); + sc.writeEntry( "boolEntry2", BOOLENTRY2 ); + + sc.writeEntry( "Test", QString::fromLocal8Bit( LOCAL8BITENTRY ) ); + sc.writeEntry( "Test2", ""); + sc.writeEntry( "stringEntry1", STRINGENTRY1 ); + sc.writeEntry( "stringEntry2", STRINGENTRY2 ); + sc.writeEntry( "stringEntry3", STRINGENTRY3 ); + sc.writeEntry( "stringEntry4", STRINGENTRY4 ); + sc.writeEntry( "stringEntry5", STRINGENTRY5 ); +// sc.writeEntry( "stringEntry6", STRINGENTRY6 ); + sc.writeEntry( "keywith=equalsign", STRINGENTRY1 ); + sc.deleteEntry( "stringEntry5" ); + sc.deleteEntry( "stringEntry6" ); + + sc.deleteGroup("deleteMe", true); + + sc.setGroup("Bye"); + sc.writeEntry( "rectEntry", RECTENTRY ); + sc.writeEntry( "pointEntry", POINTENTRY ); + sc.writeEntry( "sizeEntry", SIZEENTRY ); + sc.writeEntry( "dateTimeEntry", DATETIMEENTRY ); + sc.writeEntry( "stringListEntry", STRINGLISTENTRY ); + sc.sync(); +} + +// ### TODO: call this, and test the state of things afterwards +void KConfigTest::revertEntries() +{ + qWarning("Reverting entries"); + KConfig sc( "kconfigtest" ); + + sc.setGroup("Hello"); + sc.revertToDefault( "boolEntry1"); + sc.revertToDefault( "boolEntry2"); + + sc.revertToDefault( "Test" ); + sc.revertToDefault( "Test2" ); + sc.revertToDefault( "stringEntry1" ); + sc.revertToDefault( "stringEntry2" ); + sc.revertToDefault( "stringEntry3" ); + sc.revertToDefault( "stringEntry4" ); + sc.revertToDefault( "stringEntry5" ); + sc.sync(); +} + +void KConfigTest::allTests() +{ + writeConfigFile(); + + KConfig sc2( "kconfigtest" ); + + KConfigGroup sc3( &sc2, "AAA"); + bool bImmutable = sc3.entryIsImmutable("stringEntry1"); + + CHECK( bImmutable, false ); + //qWarning("sc3.entryIsImmutable() 1: %s", bImmutable ? "true" : "false"); + + sc2.setGroup("AAA"); + CHECK( sc2.hasKey( "stringEntry1" ), true ); + CHECK( sc2.readEntry( "stringEntry1" ), QString( STRINGENTRY1 ) ); + CHECK( sc2.entryIsImmutable("stringEntry1"), bImmutable ); + CHECK( sc2.hasKey( "stringEntry2" ), false ); + CHECK( sc2.readEntry( "stringEntry2", "bla" ), QString( "bla" ) ); + + CHECK( sc2.hasDefault( "stringEntry1" ), false ); + + sc2.setGroup("Hello"); + CHECK( sc2.readEntry( "Test" ), QString::fromLocal8Bit( LOCAL8BITENTRY ) ); + CHECK( sc2.readEntry("Test2", "Fietsbel").isEmpty(), true ); + CHECK( sc2.readEntry( "stringEntry1" ), QString( STRINGENTRY1 ) ); + CHECK( sc2.readEntry( "stringEntry2" ), QString( STRINGENTRY2 ) ); + CHECK( sc2.readEntry( "stringEntry3" ), QString( STRINGENTRY3 ) ); + CHECK( sc2.readEntry( "stringEntry4" ), QString( STRINGENTRY4 ) ); + CHECK( sc2.hasKey( "stringEntry5" ), false); + CHECK( sc2.readEntry( "stringEntry5", "test" ), QString( "test" ) ); + CHECK( sc2.hasKey( "stringEntry6" ), false); + CHECK( sc2.readEntry( "stringEntry6", "foo" ), QString( "foo" ) ); + CHECK( sc2.readBoolEntry( "boolEntry1" ), BOOLENTRY1 ); + CHECK( sc2.readBoolEntry( "boolEntry2" ), BOOLENTRY2 ); + +#if 0 + QString s; + s = sc2.readEntry( "keywith=equalsign" ); + fprintf(stderr, "comparing keywith=equalsign %s with %s -> ", STRINGENTRY1, s.latin1()); + if (s == STRINGENTRY1) + fprintf(stderr, "OK\n"); + else { + fprintf(stderr, "not OK\n"); + exit(-1); + } +#endif + + sc2.setGroup("Bye"); + + CHECK( sc2.readPointEntry( "pointEntry" ), POINTENTRY ); + CHECK( sc2.readSizeEntry( "sizeEntry" ), SIZEENTRY); + CHECK( sc2.readRectEntry( "rectEntry" ), RECTENTRY ); + CHECK( sc2.readDateTimeEntry( "dateTimeEntry" ).toString(), DATETIMEENTRY.toString() ); + CHECK( sc2.readListEntry( "stringListEntry").join( "," ), STRINGLISTENTRY.join( "," ) ); +} diff --git a/kdecore/tests/kconfigtestgui.cpp b/kdecore/tests/kconfigtestgui.cpp new file mode 100644 index 000000000..6dbf98e52 --- /dev/null +++ b/kdecore/tests/kconfigtestgui.cpp @@ -0,0 +1,200 @@ +/* This file is part of the KDE libraries + Copyright (C) 1997 Matthias Kalle Dalheimer (kalle@kde.org) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "kconfigtestgui.h" +#include "kconfigtestgui.moc" + +// +// configtest.cpp: libKDEcore example +// +// demonstrates use of KConfig class +// +// adapted from Qt widgets demo + +#include <unistd.h> +#include <stdlib.h> +#include <kapplication.h> +#include <qdialog.h> +#include <qfile.h> +#include <qfileinfo.h> +#include <qdatetime.h> +#include <kdebug.h> +#include <ksimpleconfig.h> +#include <config.h> + +// Standard Qt widgets + +#include <qlabel.h> +#include <qlineedit.h> +#include <qpushbutton.h> + +// KDE includes +#include <kconfig.h> + +#ifdef HAVE_PATHS_H +#include <paths.h> +#endif + +#ifndef _PATH_TMP +#define _PATH_TMP "/tmp/" +#endif + +// +// Construct the KConfigTestView with buttons +// + +KConfigTestView::KConfigTestView( QWidget *parent, const char *name ) + : QDialog( parent, name ), + pConfig( 0L ), + pFile( 0L ), + pStream( 0L ) +{ + // Set the window caption/title + + setCaption( "KConfig test" ); + + // Label and edit for the app config file + pAppFileLabel = new QLabel( this, "appconfiglabel" ); + pAppFileLabel->setText( "Application config file:" ); + pAppFileLabel->setGeometry( 20, 20, 200, 20 ); + + pAppFileEdit = new QLineEdit( this, "appconfigedit" ); + pAppFileEdit->setGeometry( 240, 20, 160, 20 ); + connect( pAppFileEdit, SIGNAL(returnPressed()), + SLOT(appConfigEditReturnPressed())); + + // Label and edit for the group + pGroupLabel = new QLabel( this, "grouplabel" ); + pGroupLabel->setText( "Group:" ); + pGroupLabel->setGeometry( 20, 60, 80, 20 ); + + pGroupEdit = new QLineEdit( this, "groupedit" ); + pGroupEdit->setGeometry( 120, 60, 100, 20 ); + connect( pGroupEdit, SIGNAL(returnPressed()), + SLOT(groupEditReturnPressed())); + + // Edit and label for the key/value pair + pKeyEdit = new QLineEdit( this, "keyedit" ); + pKeyEdit->setGeometry( 20, 100, 80, 20 ); + connect( pKeyEdit, SIGNAL( returnPressed()), + SLOT(keyEditReturnPressed())); + + pEqualsLabel = new QLabel( this, "equalslabel" ); + pEqualsLabel->setGeometry( 105, 100, 20, 20 ); + pEqualsLabel->setText( "=" ); + + pValueEdit = new QLineEdit( this, "valueedit" ); + pValueEdit->setGeometry( 120, 100, 100, 20 ); + pValueEdit->setText( "---" ); + + pWriteButton = new QPushButton( this, "writebutton" ); + pWriteButton->setGeometry( 20,140, 80, 20 ); + pWriteButton->setText( "Write entry" ); + connect( pWriteButton, SIGNAL(clicked()), SLOT( writeButtonClicked() ) ); + + // Labels for the info line + pInfoLabel1 = new QLabel( this, "infolabel1" ); + pInfoLabel1->setGeometry( 20, 200, 60, 20 ); + pInfoLabel1->setText( "Info:" ); + + pInfoLabel2 = new QLabel( this, "infolabel2" ); + pInfoLabel2->setGeometry( 100, 200, 300, 20 ); + pInfoLabel2->setFrameStyle( QFrame::Panel | QFrame::Sunken ); + + // Quit button + pQuitButton = new QPushButton( this, "quitbutton" ); + pQuitButton->setText( "Quit" ); + pQuitButton->setGeometry( 340, 60, 60, 60 ); + connect( pQuitButton, SIGNAL(clicked()), qApp, SLOT(quit()) ); + + // create a default KConfig object in order to be able to start right away + pConfig = new KConfig( QString::null ); +} + +KConfigTestView::~KConfigTestView() +{ + delete pConfig; + delete pFile; + delete pStream; +} + +void KConfigTestView::appConfigEditReturnPressed() +{ + // if there already was a config object, delete it and its associated data + delete pConfig; + pConfig = 0L; + delete pFile; + pFile = 0L; + delete pStream; + pStream = 0L; + + // create a new config object + if( !pAppFileEdit->text().isEmpty() ) + pConfig = new KConfig( pAppFileEdit->text() ); + + pInfoLabel2->setText( "New config object created." ); +} + +void KConfigTestView::groupEditReturnPressed() +{ + pConfig->setGroup( pGroupEdit->text() ); + // according to the Qt doc, this is begging for trouble, but for a + // test program this will do + QString aText; + aText.sprintf( "Group set to %s", QString( pConfig->group() ).isEmpty() ? + QString("<default>").ascii() : pConfig->group().ascii() ); + pInfoLabel2->setText( aText ); +} + +void KConfigTestView::keyEditReturnPressed() +{ + QString aValue = pConfig->readEntry( pKeyEdit->text() ); + // just checking aValue.isNull() would be easier here, but this is + // to demonstrate the HasKey()-method. Besides, it is better data + // encapsulation because we do not make any assumption about coding + // non-values here. + if( !pConfig->hasKey( pKeyEdit->text() ) ) + { + pInfoLabel2->setText( "Key not found!" ); + pValueEdit->setText( "---" ); + } + else + { + pInfoLabel2->setText( "Key found!" ); + pValueEdit->setText( aValue ); + } +} + +void KConfigTestView::writeButtonClicked() +{ + pConfig->writeEntry( pKeyEdit->text(), QString( pValueEdit->text() ) ); + pInfoLabel2->setText( "Entry written" ); + + kdDebug() << "Entry written: " << 27 << endl; +} + + +int main( int argc, char **argv ) +{ + KApplication a( argc, argv, "bla" ); + + KConfigTestView *w = new KConfigTestView(); + a.setMainWidget( w ); + return w->exec(); +} diff --git a/kdecore/tests/kconfigtestgui.h b/kdecore/tests/kconfigtestgui.h new file mode 100644 index 000000000..e293000f5 --- /dev/null +++ b/kdecore/tests/kconfigtestgui.h @@ -0,0 +1,72 @@ +/* This file is part of the KDE libraries + Copyright (C) 1997 Matthias Kalle Dalheimer (kalle@kde.org) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ +#ifndef _KCONFIG_TEST_H +#define _KCONFIG_TEST_H + +#include <kapplication.h> +#include <qdialog.h> +#include <qfile.h> +#include <qfileinfo.h> +#include <kdebug.h> +#include <ksimpleconfig.h> +#include <qtextstream.h> + +// Standard Qt widgets + +#include <qlabel.h> +#include <qlineedit.h> +#include <qpushbutton.h> + +#include <kconfig.h> + +// +// KConfigTestView contains lots of Qt widgets. +// + +class KConfigTestView : public QDialog +{ + Q_OBJECT +public: + KConfigTestView( QWidget *parent=0, const char *name=0 ); + ~KConfigTestView(); + +private slots: + void appConfigEditReturnPressed(); + void groupEditReturnPressed(); + void keyEditReturnPressed(); + void writeButtonClicked(); + +private: + QLabel* pAppFileLabel; + QLineEdit* pAppFileEdit; + QLabel* pGroupLabel; + QLineEdit* pGroupEdit; + QLineEdit* pKeyEdit; + QLabel* pEqualsLabel; + QLineEdit* pValueEdit; + QPushButton* pWriteButton; + QLabel* pInfoLabel1, *pInfoLabel2; + QPushButton* pQuitButton; + + KConfig* pConfig; + QFile* pFile; + QTextStream* pStream; +}; + +#endif diff --git a/kdecore/tests/kdebugtest.cpp b/kdecore/tests/kdebugtest.cpp new file mode 100644 index 000000000..d97fb671b --- /dev/null +++ b/kdecore/tests/kdebugtest.cpp @@ -0,0 +1,98 @@ +#include "kdebug.h" +#include <qwidget.h> +#include <kinstance.h> +#include <iostream> +#include <qapplication.h> +#include <qpen.h> +#include <qvariant.h> + +class TestWidget : public QWidget +{ + +public: + TestWidget(QWidget* parent, const char* name) + : QWidget(parent, name) + { + kdDebug().form("mytest %s", "hello") << endl; + QString test = "%20C this is a string"; + kdDebug(150) << test << endl; + QCString cstr = test.latin1(); + kdDebug(150) << test << endl; + QChar ch = 'a'; + kdDebug() << "QChar a: " << ch << endl; + ch = '\r'; + kdDebug() << "QChar \\r: " << ch << endl; + kdDebug() << k_lineinfo << "error on this line" << endl; + kdDebug(2 == 2) << "this is right " << perror << endl; + kdDebug() << "Before instance creation" << endl; + kdDebug(1202) << "Before instance creation" << endl; + KInstance i("kdebugtest"); + kdDebug(1) << "kDebugInfo with inexisting area number" << endl; + kdDebug(1202) << "This number has a value of " << 5 << endl; + // kdDebug() << "This number should come out as appname " << 5 << " " << "test" << endl; + kdWarning() << "1+1 = " << 1+1+1 << endl; + kdError(1+1 != 2) << "there is something really odd!" << endl; + QString s = "mystring"; + kdDebug() << s << endl; + kdError(1202) << "Error !!!" << endl; + kdError() << "Error with no area" << endl; + + kdDebug() << "Printing a null QWidget pointer: " << (QWidget*)0 << endl; + + kdDebug() << "char " << '^' << " " << char(26) << endl; + QPoint p(0,9); + kdDebug() << p << endl; + + QRect r(9,12,58,234); + kdDebug() << r << endl; + + QRegion reg(r); + reg += QRect(1,60,200,59); + kdDebug() << reg << endl; + + QStringList sl; + sl << "hi" << "this" << "list" << "is" << "short"; + kdDebug() << sl << endl; + + QValueList<int> il; + kdDebug() << "Empty QValueList<int>: " << il << endl; + il << 1 << 2 << 3 << 4 << 5; + kdDebug() << "QValueList<int> filled: " << il << endl; + + Q_LLONG big = 65536LL*65536*500; + kdDebug() << big << endl; + + QVariant v( 0.12345 ); + kdDebug() << "Variant: " << v << endl; + v = QPen( Qt::red ); + kdDebug() << "Variant: " << v << endl; + + QByteArray data( 6 ); + data[0] = 42; + data[1] = 'H'; + data[2] = 'e'; + data[3] = 'l'; + data[4] = 'l'; + data[5] = 'o'; + kdDebug() << data << endl; + data.resize( 80 ); + data.fill( 42 ); + kdDebug() << data << endl; + } + void resizeEvent(QResizeEvent*) + { + kdDebug() << this << endl; + } +}; + +int main(int argc, char** argv) +{ + QApplication app(argc, argv); + TestWidget widget(0, "NoNameWidget"); + widget.setGeometry(45, 54, 120, 80); + widget.show(); + app.setMainWidget(&widget); + app.exec(); + return 0; +} + diff --git a/kdecore/tests/kglobaltest.cpp b/kdecore/tests/kglobaltest.cpp new file mode 100644 index 000000000..90332e3e6 --- /dev/null +++ b/kdecore/tests/kglobaltest.cpp @@ -0,0 +1,64 @@ +#include <config.h> + +#include <kglobal.h> +#include <stdio.h> +#include <kapplication.h> +#include <stdlib.h> +#include <kdebug.h> +#include <assert.h> +#include <kcmdlineargs.h> + +static bool check(const QString& txt, QString a, QString b) +{ + if (a.isEmpty()) + a = QString::null; + if (b.isEmpty()) + b = QString::null; + if (a == b) { + kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "ok" << endl; + } + else { + kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "KO !" << endl; + exit(1); + } + return true; +} + +void testkasciistricmp() +{ + assert( kasciistricmp( "test", "test" ) == 0 ); + assert( kasciistricmp( "test", "Test" ) == 0 ); + assert( kasciistricmp( "TeSt", "tEst" ) == 0 ); + + assert( kasciistricmp( 0, 0 ) == 0 ); + assert( kasciistricmp( "", "" ) == 0 ); + assert( kasciistricmp( 0, "" ) < 0 ); + assert( kasciistricmp( "", 0 ) > 0 ); + + assert( kasciistricmp( "", "foo" ) < 0 ); + assert( kasciistricmp( "foo", "" ) > 0 ); + + assert( kasciistricmp( "test", "testtest" ) < 0 ); + assert( kasciistricmp( "testtest", "test" ) > 0 ); + + assert( kasciistricmp( "a", "b" ) < 0 ); + assert( kasciistricmp( "b", "a" ) > 0 ); + assert( kasciistricmp( "A", "b" ) < 0 ); + assert( kasciistricmp( "b", "A" ) > 0 ); + assert( kasciistricmp( "a", "B" ) < 0 ); + assert( kasciistricmp( "B", "a" ) > 0 ); + assert( kasciistricmp( "A", "B" ) < 0 ); + assert( kasciistricmp( "B", "A" ) > 0 ); +} + +int main(int argc, char *argv[]) +{ + KApplication::disableAutoDcopRegistration(); + KCmdLineArgs::init( argc, argv, "kglobaltest", 0, 0, 0, 0 ); + KApplication app( false, false ); + + testkasciistricmp(); + + printf("\nTest OK !\n"); +} + diff --git a/kdecore/tests/kiconloadertest.cpp b/kdecore/tests/kiconloadertest.cpp new file mode 100644 index 000000000..77930218c --- /dev/null +++ b/kdecore/tests/kiconloadertest.cpp @@ -0,0 +1,34 @@ +#include <kiconloader.h> +#include <qdatetime.h> +#include <stdio.h> +#include <kapplication.h> +#include <stdlib.h> +#include <kdebug.h> + +int main(int argc, char *argv[]) +{ + KApplication app(argc,argv,"kiconloadertest"/*,false,false*/); + + KIconLoader * mpLoader = KGlobal::iconLoader(); + KIcon::Context mContext = KIcon::Application; + QTime dt; + dt.start(); + int count = 0; + for ( int mGroup = 0; mGroup < KIcon::LastGroup ; ++mGroup ) + { + kdDebug() << "queryIcons " << mGroup << "," << mContext << endl; + QStringList filelist=mpLoader->queryIcons(mGroup, mContext); + kdDebug() << " -> found " << filelist.count() << " icons." << endl; + int i=0; + for(QStringList::Iterator it = filelist.begin(); + it != filelist.end() /*&& i<10*/; + ++it, ++i ) + { + //kdDebug() << ( i==9 ? "..." : (*it) ) << endl; + mpLoader->loadIcon( (*it), (KIcon::Group)mGroup ); + ++count; + } + } + kdDebug() << "Loading " << count << " icons took " << (float)(dt.elapsed()) / 1000 << " seconds" << endl; +} + diff --git a/kdecore/tests/kipctest.cpp b/kdecore/tests/kipctest.cpp new file mode 100644 index 000000000..15daa24d9 --- /dev/null +++ b/kdecore/tests/kipctest.cpp @@ -0,0 +1,33 @@ +#include <stdio.h> +#include <stdlib.h> +#include <qobject.h> +#include <kapplication.h> +#include <kipc.h> +#include "kipctest.h" + +MyObject::MyObject() + : QObject(0L, "testobj") +{ + connect(kapp, SIGNAL(kdisplayPaletteChanged()), SLOT(slotPaletteChanged())); + connect(kapp, SIGNAL(kdisplayFontChanged()), SLOT(slotFontChanged())); + connect(kapp, SIGNAL(kdisplayStyleChanged()), SLOT(slotStyleChanged())); + connect(kapp, SIGNAL(backgroundChanged(int)), SLOT(slotBackgroundChanged(int))); + connect(kapp, SIGNAL(appearanceChanged()), SLOT(slotAppearanceChanged())); + connect(kapp, SIGNAL(kipcMessage(int,int)), SLOT(slotMessage(int,int))); +} + +int main(int argc, char **argv) +{ + KApplication app(argc, argv, "kipc"); + + if (argc == 3) + { + KIPC::sendMessageAll((KIPC::Message) atoi(argv[1]), atoi(argv[2])); + return 0; + } + + MyObject obj; + return app.exec(); +} + +#include "kipctest.moc" diff --git a/kdecore/tests/kipctest.h b/kdecore/tests/kipctest.h new file mode 100644 index 000000000..5a9a18467 --- /dev/null +++ b/kdecore/tests/kipctest.h @@ -0,0 +1,21 @@ +#ifndef __blah__h__ +#define __blah__h__ + +#include <qobject.h> + +class MyObject: public QObject +{ + Q_OBJECT +public: + MyObject(); + +public slots: + void slotPaletteChanged() { printf("SIGNAL: Palette changed\n"); } + void slotStyleChanged() { printf("SIGNAL: Style changed\n"); } + void slotFontChanged() { printf("SIGNAL: Font changed\n"); } + void slotBackgroundChanged(int i) { printf("SIGNAL: Background %d changed\n", i); } + void slotAppearanceChanged() { printf("SIGNAL: Appearance changed\n"); } + void slotMessage(int id, int arg) { printf("SIGNAL: user message: %d,%d\n", id, arg); } +}; + +#endif diff --git a/kdecore/tests/klocaletest.cpp b/kdecore/tests/klocaletest.cpp new file mode 100644 index 000000000..acec373de --- /dev/null +++ b/kdecore/tests/klocaletest.cpp @@ -0,0 +1,199 @@ +// klocaletest.cpp -*- C++ -*- +// +// $Id$ +// +// Author: Jacek Konieczny <jajcus@zeus.polsl.gliwice.pl> +// + +#include <stdlib.h> +#include <stdio.h> + +#include <qdatetime.h> +#include <qlabel.h> + +#include <kglobal.h> +#include <kglobalsettings.h> +#include "klocale.h" +#include <kapplication.h> +#include <kcharsets.h> +#include <kdebug.h> + +#include "klocaletest.h" + +bool check(QString txt, QString a, QString b) +{ + if (a.isEmpty()) + a = QString::null; + if (b.isEmpty()) + b = QString::null; + if (a == b) { + kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "ok" << endl; + } + else { + kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "KO !" << endl; + exit(1); + } + return true; +} + +bool checkDate(QString txt, QDate a, QDate b) +{ + if (a == b) { + kdDebug() << txt << " : checking '" << a.toString() << "' against expected value '" << b.toString() << "'... " << "ok" << endl; + } + else { + kdDebug() << txt << " : checking '" << a.toString() << "' against expected value '" << b.toString() << "'... " << "KO !" << endl; + exit(1); + } + return true; +} + +Test::Test( QWidget *parent, const char *name ) + : QWidget( parent, name ) +{ + setCaption("Testing KLocale"); + + QWidget *d = qApp->desktop(); + setGeometry((d->width()-320)>>1, (d->height()-160)>>1, 420, 420); + + createFields(); + show(); +} + +Test::~Test() +{ + ; +} + +void Test::createFields() +{ + QString string; + + string+="Selected languages: "; + string+=KGlobal::locale()->languages()+"\n"; + + // This will show nothing, as there is no klocaletest.mo + // but you can copy other *.mo file + string+="Used language: "; + string+=KGlobal::locale()->language()+"\n"; + string+="Locale encoding: "; + string+=QString::fromLatin1(KGlobal::locale()->encoding())+"\n"; + + string+="Localized date and time: "; + string+=KGlobal::locale()->formatDateTime(QDateTime::currentDateTime()); + string+="\nLocalized monetary numbers: "; + string+=KGlobal::locale()->formatMoney(1234567.89) + " / \n" +KGlobal::locale()->formatMoney(-1234567.89); + // This will not work + // but you can copy other *.mo file + string+="\nSome localized strings:\n"; + string+=QString::fromLatin1("Yes = ")+i18n("Yes")+"\n"; + string+=QString::fromLatin1("No = ")+i18n("No")+"\n"; + string+=QString::fromLatin1("Help = ")+i18n("Help")+"\n"; + string+=QString::fromLatin1("Cancel = ")+i18n("Cancel")+"\n"; + + label=new QLabel(string,this,"Label"); + label->setGeometry(10,10,400,400); + label->setFont(KGlobalSettings::generalFont()); + label->show(); +} + +int main( int argc, char ** argv ) +{ + KLocale::setMainCatalogue("kdelibs"); + KApplication a( argc, argv, "klocaletest" ); + + KGlobal::locale()->setLanguage(QString::fromLatin1("en_US")); + KGlobal::locale()->setCountry(QString::fromLatin1("C")); + KGlobal::locale()->setThousandsSeparator(QString::fromLatin1(",")); + + QString formatted; + formatted = KGlobal::locale()->formatNumber( 70 ); check("formatNumber(70)",formatted,"70.00"); + formatted = KGlobal::locale()->formatNumber( 70, 0 ); check("formatNumber(70, 0)",formatted,"70"); + formatted = KGlobal::locale()->formatNumber( 70.2 ); check("formatNumber(70.2)",formatted,"70.20"); + formatted = KGlobal::locale()->formatNumber( 70.24 ); check("formatNumber(70.24)",formatted,"70.24"); + formatted = KGlobal::locale()->formatNumber( 70.245 ); check("formatNumber(70.245)",formatted,"70.25"); /*rounded*/ + formatted = KGlobal::locale()->formatNumber(1234567.89123456789,8); check("formatNumber(1234567.89123456789,8)",formatted,"1,234,567.89123457"); + + formatted = KGlobal::locale()->formatNumber("70"); check("formatNumber(\"70\")",formatted,"70.00"); + formatted = KGlobal::locale()->formatNumber("70", true, 2); check("formatNumber(\"70\", true, 2)",formatted,"70.00"); + formatted = KGlobal::locale()->formatNumber("70", true, 0); check("formatNumber(\"70\", true, 0)",formatted,"70"); + formatted = KGlobal::locale()->formatNumber("70.9123", true, 0); check("formatNumber(\"70.9123\", true, 0)",formatted,"71"); /* rounded */ + formatted = KGlobal::locale()->formatNumber("-70.2", true, 2); check("formatNumber(\"-70.2\", true, 2)",formatted,"-70.20"); + formatted = KGlobal::locale()->formatNumber("+70.24", true, 2); check("formatNumber(\"+70.24\", true, 2)",formatted,"70.24"); + formatted = KGlobal::locale()->formatNumber("70.245", true, 2); check("formatNumber(\"70.245\", true, 2)",formatted,"70.25"); /*rounded*/ + formatted = KGlobal::locale()->formatNumber("99.996", true, 2); check("formatNumber(\"99.996\", true, 2)",formatted,"100.00"); /*rounded*/ + formatted = KGlobal::locale()->formatNumber("12345678901234567.89123456789", false, 0); check("formatNumber(\"12345678901234567.89123456789\", false, 0)",formatted,"12,345,678,901,234,567.89123456789"); + + + + double num; + bool ok; + num = KGlobal::locale()->readNumber( "12,1", &ok ); check("readNumber(12,1)",ok?"yes":"no","no"); + num = KGlobal::locale()->readNumber( "12,100", &ok ); check("readNumber(12,100)",ok?"yes":"no","yes"); + num = KGlobal::locale()->readNumber( "12,100000,000", &ok ); check("readNumber(12,100000,000)",ok?"yes":"no","no"); + num = KGlobal::locale()->readNumber( "12,100000000", &ok ); check("readNumber(12,100000000)",ok?"yes":"no","no"); + num = KGlobal::locale()->readNumber( "12,100000,000", &ok ); check("readNumber(12,100000,000)",ok?"yes":"no","no"); + num = KGlobal::locale()->readNumber( "12,,100,000", &ok ); check("readNumber(12,,100,000)",ok?"yes":"no","no"); + num = KGlobal::locale()->readNumber( "12,1000,000", &ok ); check("readNumber(12,1000,000)",ok?"yes":"no","no"); + num = KGlobal::locale()->readNumber( "12,0000000,000", &ok ); check("readNumber(12,0000000,000)",ok?"yes":"no","no"); + num = KGlobal::locale()->readNumber( "12,0000000", &ok ); check("readNumber(12,0000000)",ok?"yes":"no","no"); + num = KGlobal::locale()->readNumber( "12,146,131.12", &ok ); check("readNumber(12,146,131.12)",ok?"yes":"no","yes"); + num = KGlobal::locale()->readNumber( "1.12345678912", &ok ); + qDebug( "%s", QString::number( num, 'g', 12 ).latin1() ); // warning this is the only way to see all decimals + check("readNumber(1.12345678912)",ok && num==1.12345678912?"yes":"no","yes"); + // bug 95511 + KLocale locale(*KGlobal::locale()); + locale.setCurrencySymbol("$$"); + num = locale.readMoney("1,234,567.89$$", &ok); + check("readMoney(1,234,567.89$$)",ok?"yes":"no","yes"); + num = locale.readMoney("-1,234,567.89$$", &ok); + check("readMoney(-1,234,567.89$$)",ok?"yes":"no","yes"); + + QDate date; + date.setYMD( 2002, 5, 3 ); + checkDate("readDate( 3, 5, 2002 )",date,KGlobal::locale()->readDate( KGlobal::locale()->formatDate( date ) ) ); + date = QDate::currentDate(); + checkDate("readDate( QDate::currentDate() )",date,KGlobal::locale()->readDate( KGlobal::locale()->formatDate( date ) ) ); + + QTime time; + time = KGlobal::locale()->readTime( "11:22:33", &ok ); + check("readTime(\"11:22:33\")", (ok && time == QTime(11, 22, 33)) ? + "yes" : "no", "yes"); + time = KGlobal::locale()->readTime( "11:22", &ok ); + check("readTime(\"11:22\")", (ok && time == QTime(11, 22, 0)) ? + "yes" : "no", "yes"); + time = KGlobal::locale()->readTime( "foo", &ok ); + check("readTime(\"foo\")", (!ok && !time.isValid()) ? + "invalid" : "valid", "invalid"); + + time = KGlobal::locale()->readTime( "11:22:33", KLocale::WithoutSeconds, &ok ); + check("readTime(\"11:22:33\", WithoutSeconds)", (!ok && !time.isValid()) ? + "invalid" : "valid", "invalid"); + time = KGlobal::locale()->readTime( "11:22", KLocale::WithoutSeconds, &ok ); + check("readTime(\"11:22\", WithoutSeconds)", (ok && time == QTime(11, 22, 0)) ? + "yes" : "no", "yes"); + + KGlobal::locale()->setTimeFormat( "%H:%M %p" ); + time = QTime( 0, 22, 33 ); + QString timeStr = KGlobal::locale()->formatTime( time, true /*seconds*/, false /*duration*/ ); + check("formatTime(\"0:22\", as time)", timeStr, "00:22 am" ); + timeStr = KGlobal::locale()->formatTime( time, true /*seconds*/, true /*duration*/ ); + check("formatTime(\"0:22\", as duration)", timeStr, "00:22" ); + + kdDebug() << "setLanguage C\n"; + KGlobal::locale()->setLanguage(QString::fromLatin1("C")); + kdDebug() << "C: " << i18n("yes") << " " << i18n("QAccel", "Space") << endl; + + kdDebug() << "setLanguage de\n"; + KGlobal::locale()->setLanguage(QString::fromLatin1("de")); + kdDebug() << "de: " << i18n("yes") << " " << i18n("QAccel", "Space") << endl; + + + Test m; + a.setMainWidget( &m ); + m.show(); + + return a.exec(); +} + +#include "klocaletest.moc" diff --git a/kdecore/tests/klocaletest.h b/kdecore/tests/klocaletest.h new file mode 100644 index 000000000..7b6cb328e --- /dev/null +++ b/kdecore/tests/klocaletest.h @@ -0,0 +1,32 @@ +// $Id$ + +#ifndef KLOCALETEST_H +#define KLOCALETEST_H + +#include <qwidget.h> + +class QLabel; + +/** test: a small test program for KLocale + */ +class Test : public QWidget +{ + Q_OBJECT + +public: + /**@name methods */ + //@{ + /** Constructor + */ + Test( QWidget *parent=0, const char *name=0 ); + /** Destructor + */ + ~Test(); + +private: + QString showLocale(QString cat); + void createFields(); + + QLabel *label; +}; +#endif // TEST_H diff --git a/kdecore/tests/kmacroexpandertest.cpp b/kdecore/tests/kmacroexpandertest.cpp new file mode 100644 index 000000000..6c92ba935 --- /dev/null +++ b/kdecore/tests/kmacroexpandertest.cpp @@ -0,0 +1,137 @@ +#include <kmacroexpander.h> + +#include <kapplication.h> +#include <kcmdlineargs.h> +#include <kdebug.h> + +#include <stdlib.h> + +bool check(QString txt, QString s, QString a, QString b) +{ + if (a.isEmpty()) + a = QString::null; + if (b.isEmpty()) + b = QString::null; + if (a == b) + kdDebug() << txt << " (" << s << ") : '" << a << "' - ok" << endl; + else { + kdDebug() << txt << " (" << s << ") : got '" << a << "' but expected '" << b << "' - KO!" << endl; + exit(1); + } + return true; +} + +class MyCExpander : public KCharMacroExpander { +public: + MyCExpander() : KCharMacroExpander() {} +protected: + bool expandMacro(QChar chr, QStringList &ret) + { + if (chr == 'm') { + ret = QString("expanded"); + return true; + } + return false; + } +}; + +class MyWExpander : public KWordMacroExpander { +public: + MyWExpander() : KWordMacroExpander() {} +protected: + bool expandMacro(const QString &str, QStringList &ret) + { + if (str == "macro") { + ret = QString("expanded"); + return true; + } + return false; + } +}; + +int main(int argc, char *argv[]) +{ + KCmdLineArgs::init(argc, argv, ":", "", "", ""); + KApplication app(false,false); + QString s, s2; + + QMap<QChar,QStringList> map1; + map1.insert('n', "Restaurant \"Chew It\""); + QStringList li; + li << "element1" << "'element2'"; + map1.insert('l', li); + + s = "text %l %n text"; + check( "KMacroExpander::expandMacros", s, KMacroExpander::expandMacros(s, map1), "text element1 'element2' Restaurant \"Chew It\" text"); + check( "KMacroExpander::expandMacrosShellQuote", s, KMacroExpander::expandMacrosShellQuote(s, map1), "text 'element1' ''\\''element2'\\''' 'Restaurant \"Chew It\"' text"); + s = "text \"%l %n\" text"; + check( "KMacroExpander::expandMacrosShellQuote", s, KMacroExpander::expandMacrosShellQuote(s, map1), "text \"element1 'element2' Restaurant \\\"Chew It\\\"\" text"); + + QMap<QChar,QString> map; + map.insert('a', "%n"); + map.insert('f', "filename.txt"); + map.insert('u', "http://www.kde.org/index.html"); + map.insert('n', "Restaurant \"Chew It\""); + + s = "Title: %a - %f - %u - %n - %%"; + check( "KMacroExpander::expandMacros", s, KMacroExpander::expandMacros(s, map), "Title: %n - filename.txt - http://www.kde.org/index.html - Restaurant \"Chew It\" - %"); + + s = "kedit --caption %n %f"; + check( "KMacroExpander::expandMacrosShellQuote", s, KMacroExpander::expandMacrosShellQuote(s, map), "kedit --caption 'Restaurant \"Chew It\"' 'filename.txt'"); + + map.replace('n', "Restaurant 'Chew It'"); + s = "kedit --caption %n %f"; + check( "KMacroExpander::expandMacrosShellQuote", s, KMacroExpander::expandMacrosShellQuote(s, map), "kedit --caption 'Restaurant '\\''Chew It'\\''' 'filename.txt'"); + + s = "kedit --caption \"%n\" %f"; + check( "KMacroExpander::expandMacrosShellQuote", s, KMacroExpander::expandMacrosShellQuote(s, map), "kedit --caption \"Restaurant 'Chew It'\" 'filename.txt'"); + + map.replace('n', "Restaurant \"Chew It\""); + s = "kedit --caption \"%n\" %f"; + check( "KMacroExpander::expandMacrosShellQuote", s, KMacroExpander::expandMacrosShellQuote(s, map), "kedit --caption \"Restaurant \\\"Chew It\\\"\" 'filename.txt'"); + + map.replace('n', "Restaurant $HOME"); + s = "kedit --caption \"%n\" %f"; + check( "KMacroExpander::expandMacrosShellQuote", s, KMacroExpander::expandMacrosShellQuote(s, map), "kedit --caption \"Restaurant \\$HOME\" 'filename.txt'"); + + map.replace('n', "Restaurant `echo hello`"); + s = "kedit --caption \"%n\" %f"; + check( "KMacroExpander::expandMacrosShellQuote", s, KMacroExpander::expandMacrosShellQuote(s, map), "kedit --caption \"Restaurant \\`echo hello\\`\" 'filename.txt'"); + + map.replace('n', "Restaurant `echo hello`"); + s = "kedit --caption \"`echo %n`\" %f"; + check( "KMacroExpander::expandMacrosShellQuote", s, KMacroExpander::expandMacrosShellQuote(s, map), "kedit --caption \"$( echo 'Restaurant `echo hello`')\" 'filename.txt'"); + + QMap<QString,QString> smap; + smap.insert("foo", "%n"); + smap.insert("file", "filename.txt"); + smap.insert("url", "http://www.kde.org/index.html"); + smap.insert("name", "Restaurant \"Chew It\""); + + s = "Title: %foo - %file - %url - %name - %"; + check( "KMacroExpander::expandMacros", s, KMacroExpander::expandMacros(s, smap), "Title: %n - filename.txt - http://www.kde.org/index.html - Restaurant \"Chew It\" - %"); + + s = "Title: %{foo} - %{file} - %{url} - %{name} - %"; + check( "KMacroExpander::expandMacros", s, KMacroExpander::expandMacros(s, smap), "Title: %n - filename.txt - http://www.kde.org/index.html - Restaurant \"Chew It\" - %"); + + s = "Title: %foo-%file-%url-%name-%"; + check( "KMacroExpander::expandMacros", s, KMacroExpander::expandMacros(s, smap), "Title: %n-filename.txt-http://www.kde.org/index.html-Restaurant \"Chew It\"-%"); + + s = "Title: %{file} %{url"; + check( "KMacroExpander::expandMacros", s, KMacroExpander::expandMacros(s, smap), "Title: filename.txt %{url"); + + MyCExpander mx1; + s = "subst %m but not %n equ %%"; + s2 = s; + mx1.expandMacros(s2); + check( "MyCExpander::expandMacros", s, s2, "subst expanded but not %n equ %"); + + MyWExpander mx2; + s = "subst %macro but not %not equ %%"; + s2 = s; + mx2.expandMacros(s2); + check( "MyWExpander::expandMacros", s, s2, "subst expanded but not %not equ %"); + + kdDebug() << endl << "Test OK!" << endl; +} + diff --git a/kdecore/tests/kmdcodectest.cpp b/kdecore/tests/kmdcodectest.cpp new file mode 100644 index 000000000..1156f03f2 --- /dev/null +++ b/kdecore/tests/kmdcodectest.cpp @@ -0,0 +1,395 @@ +/* This file is part of the KDE libraries + Copyright (C) 2000,2001 Dawit Alemayehu <adawit@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include <config.h> +#include <unistd.h> +#include <time.h> + +#include <iostream> + +#include <qbuffer.h> +#include <qfile.h> + +#include <kdebug.h> +#include <klocale.h> +#include <kcmdlineargs.h> +#include <kapplication.h> + +#include <kmdcodec.h> + +using namespace std; + +#define TEST_BLOCK_LEN 1000 // Length of test blocks. +#define TEST_BLOCK_COUNT 10000 // Number of test blocks. +#define MAX_READ_BUF_SIZE 8192 + +enum Codec +{ + Unspecified=0, + Base64Encode, + Base64Decode, + UUEncode, + UUDecode, + QPEncode, + QPDecode +}; + +void MD5_timeTrial (); +void MD5_testSuite (); +void testCodec (const char*, Codec, bool); +void MD5_verify (const char*, const char*, bool); +void MD5_file (const char * , bool rawOutput = false); +void MD5_string (const char *, const char *expected = 0, bool rawOutput = false); + +long readContent (const QFile& f, long count, QByteArray& buf) +{ + long result; + int old_size; + + old_size = buf.size(); + buf.resize(old_size+count); + + result = read (f.handle (), buf.data()+old_size, count); + + if ( result > 0 && result < count ) + { + buf.resize( old_size + result ); + } + else if ( result == 0 ) + { + buf.resize( old_size ); + } + else if ( result == -1 ) + { + kdError() << "Could not read the file!" << endl; + } + + return result; +} + +void testCodec (const char* msg, Codec type, bool isFile) +{ + QByteArray output; + + if ( isFile ) + { + int count; + QByteArray data; + + QFile f (QFile::encodeName(msg)); + + if (!f.exists()) + { + kdError() << "Could not find: " << f.name () << endl; + return; + } + + if (!f.open(IO_ReadOnly)) + { + f.close (); + kdError() << "Could not open: " << f.name() << endl; + return; + } + + // Read contents of file... + count = 0; + + while ((count= readContent(f, MAX_READ_BUF_SIZE, data)) > 0); + + // Error! Exit! + if ( count == -1 ) + { + kdError () << "Error reading from: " << f.name() << endl; + f.close (); + return; + } + + f.close (); + + // Perform the requested encoding or decoding... + switch (type) + { + case Base64Encode: + KCodecs::base64Encode(data, output, true); + break; + case Base64Decode: + KCodecs::base64Decode(data, output); + break; + case UUEncode: + KCodecs::uuencode(data, output); + break; + case UUDecode: + KCodecs::uudecode(data, output); + break; + case QPEncode: + KCodecs::quotedPrintableEncode(data, output, true); + break; + case QPDecode: + KCodecs::quotedPrintableDecode(data, output); + break; + default: + break; + } + + QCString result (output.data(), output.size()+1); + cout << "Result: " << endl << result << endl; + } + else + { + QCString result; + + const size_t len = strlen(msg); + output.resize(len); + memcpy (output.data(), msg, len); + + switch (type) + { + case Base64Encode: + result = KCodecs::base64Encode(output); + break; + case Base64Decode: + result = KCodecs::base64Decode(output); + break; + case UUEncode: + result = KCodecs::uuencode(output); + break; + case UUDecode: + result = KCodecs::uudecode(output); + break; + case QPEncode: + result = KCodecs::quotedPrintableEncode(output); + break; + case QPDecode: + result = KCodecs::quotedPrintableDecode(output); + break; + default: + break; + } + cout << result << endl; + } +} + +void MD5_timeTrial () +{ + KMD5 context; + + time_t endTime; + time_t startTime; + + Q_UINT8 block[TEST_BLOCK_LEN]; + Q_UINT32 i; + + cout << "Timing test. Digesting " << TEST_BLOCK_COUNT << " blocks of " + << TEST_BLOCK_LEN << "-byte..." << endl; + + // Initialize block + for (i = 0; i < TEST_BLOCK_LEN; i++) + block[i] = (Q_UINT8)(i & 0xff); + + // Start timer + time (&startTime); + + // Digest blocks + for (i = 0; i < TEST_BLOCK_COUNT; i++) + context.update (block, TEST_BLOCK_LEN); + + // Stop timer + time (&endTime); + + long duration = endTime - startTime; + long speed; + if (duration) + speed = (TEST_BLOCK_LEN * (TEST_BLOCK_COUNT/duration)); + else + speed = TEST_BLOCK_COUNT; + + cout << "Result: " << endl; + cout << " Time = " << duration << " seconds" << endl; + cout << " Speed = " << speed << " bytes/second" << endl; + cout << " Digest = " << context.hexDigest() << endl; +} + +void MD5_testSuite () +{ + cout << "MD5 preset test suite as defined in RFC 1321:" << endl; + MD5_string ( "", "d41d8cd98f00b204e9800998ecf8427e" ); + MD5_string ( "a", "0cc175b9c0f1b6a831c399e269772661" ); + MD5_string ( "abc", "900150983cd24fb0d6963f7d28e17f72" ); + MD5_string ( "message digest", "f96b697d7cb7938d525a2f31aaf161d0" ); + MD5_string ( "abcdefghijklmnopqrstuvwxyz", "c3fcd3d76192e4007dfb496cca67e13b" ); + MD5_string ( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + "d174ab98d277d9f5a5611c2c9f419d9f" ); + MD5_string ( "12345678901234567890123456789012345678901234567890123456789012" + "345678901234567890", "57edf4a22be3c955ac49da2e2107b67a" ); +} + +void MD5_verify( const char *input, const char *digest, bool isFile ) +{ + bool result; + KMD5 context; + + if ( !isFile ) + { + context.update (QCString(input)); + result = context.verify( digest ); + cout << "Input string: " << input << endl; + } + else + { + QFile f (input); + + if (!f.open (IO_ReadOnly)) + { + f.close (); + kdFatal() << "Cannot open file for reading!" << endl; + } + + result = context.verify (digest); + f.close (); + + cout << "Input filename: " << input << endl; + } + + cout << "Calculated Digest = " << context.hexDigest() << endl; + cout << "Supplied Digest = " << digest << endl; + cout << "Matches: " << (result ? "TRUE":"FALSE") << endl; +} + +void MD5_file (const char *filename, bool rawOutput ) +{ + QFile f (QFile::encodeName(filename)); + + if (!f.open(IO_ReadOnly)) + { + f.close(); + kdError() << "(" << filename << ") cannot be opened!" << endl; + return; + } + + KMD5 context; + context.update( f ); + + if ( rawOutput ) + cout << "MD5 (" << filename << ") = " << context.rawDigest() << endl; + else + cout << "MD5 (" << filename << ") = " << context.hexDigest() << endl; + + f.close (); +} + +void MD5_string (const char *input, const char* expected, bool rawOutput ) +{ + KMD5 context; + context.update (QCString(input)); + + cout << "Checking MD5 for: " << input << endl; + + if ( rawOutput ) + cout << "Result: " << context.rawDigest() << endl; + else + cout << "Result: " << context.hexDigest() << endl; + + if ( expected ) + { + cout << "Expected: " << expected << endl; + cout << "Status: " << context.verify (expected) << endl; + } +} + +int main (int argc, char *argv[]) +{ + const char *version = "1.0"; + const char *description = "Unit test for md5, base64 encode/decode and uuencode/decode facilities"; + KCmdLineOptions options[] = + { + { "c <digest>", "compare <digest> with the calculated digest for a string or file.", 0 }, + { "d", "decode the given string or file using base64", 0 }, + { "e", "encode the given string or file using base64", 0 }, + { "f", "the filename to be used as input", "default" }, + { "p", "encode the given string or file using quoted-printable", 0}, + { "q", "decode the given string or file using quoted-printable", 0}, + { "r", "calculate the raw md5 for the given string or file", 0 }, + { "s", "the string to be used as input", 0 }, + { "t", "perform a timed message-digest test", 0 }, + { "u", "uuencode the given string or file", 0 }, + { "x", "uudecode the given string or file", 0 }, + { "z", "run a preset message-digest test", 0 }, + { "+command", "[input1, input2,...]", 0 }, + KCmdLineLastOption + }; + + KCmdLineArgs::init( argc, argv, "kmdcodectest", description, version ); + KCmdLineArgs::addCmdLineOptions( options ); + KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); + int count = args->count(); + + KApplication app; + + if (!count) + { + if ( args->isSet("t") ) + MD5_timeTrial (); + else if ( args->isSet("z") ) + MD5_testSuite (); + else + args->usage(); + } + else + { + bool isVerify = args->isSet("c"); + bool isString = args->isSet("s"); + bool isFile = args->isSet( "f" ); + Codec type = Unspecified; + if ( args->isSet("d") ) + type = Base64Decode; + else if ( args->isSet("e") ) + type = Base64Encode; + else if ( args->isSet("u") ) + type = UUEncode; + else if ( args->isSet("x") ) + type = UUDecode; + else if ( args->isSet("p") ) + type = QPEncode; + else if ( args->isSet("q") ) + type = QPDecode; + if ( isVerify ) + { + const char* opt = args->getOption( "c" ).data(); + for ( int i=0 ; i < count; i++ ) + MD5_verify ( QCString(args->arg(i)), opt, (isString || !isFile) ); + } + else + { + for ( int i=0 ; i < count; i++ ) + { + if ( type != Unspecified ) + testCodec( args->arg(i), type, isFile ); + else + { + if ( isString ) + MD5_string( args->arg( i ), 0, args->isSet("r") ); + else + MD5_file( args->arg( i ), args->isSet("r") ); + } + } + } + } + args->clear(); + return (0); +} diff --git a/kdecore/tests/kmemtest.cpp b/kdecore/tests/kmemtest.cpp new file mode 100644 index 000000000..83c452e50 --- /dev/null +++ b/kdecore/tests/kmemtest.cpp @@ -0,0 +1,248 @@ +#include <stdio.h> +#include <kapplication.h> +#include <stdlib.h> +#include <errno.h> +#include <string.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/mman.h> + +void showMem() +{ + char buf[257]; + + printf("Reported Memory Usage Of This Process:\n"); + + FILE *fs = fopen("/proc/self/status", "r"); + bool done = false; + while (!done) + { + fgets(buf, 256, fs); + buf[256] = 0; + if ((strncmp(buf, "VmLib", 5)==0) || + (strncmp(buf, "VmData", 6)==0) || + (strncmp(buf, "VmSize", 6)==0) || + (strncmp(buf, "VmExe", 5)==0) || + (strncmp(buf, "VmRSS", 5)==0) || + (strncmp(buf, "VmLck", 5)==0)) + printf("%s", buf); + done = (strncmp(buf, "VmLib", 5) == 0); + } + fclose(fs); +} + +long showTotalMem() +{ + long realMem = 0; + char buf[257]; + + FILE *fs = fopen("/proc/meminfo", "r"); + bool done = false; + while (!done) + { + fgets(buf, 256, fs); + buf[256] = 0; + if (strlen(buf)==0) done = true; + if (strncmp(buf, "Mem:", 4)==0) + { + long total = 0; + long used = 0; + long free = 0; + long shared = 0; + long buffers = 0; + long cached = 0; + sscanf(buf, "Mem: %ld %ld %ld %ld %ld %ld", + &total, &used, &free, &shared, &buffers, &cached); + realMem = used-buffers-cached; + printf("Actual Total Memory Usage: %0.1fKb\n", realMem/1024.0); + done = true; + } + } + fclose(fs); + return realMem; +} + +long memSize() +{ + long realMem = 0; + char buf[257]; + + FILE *fs = fopen("/proc/meminfo", "r"); + bool done = false; + while (!done) + { + fgets(buf, 256, fs); + buf[256] = 0; + if (strlen(buf)==0) done = true; + if (strncmp(buf, "Mem:", 4)==0) + { + long total = 0; + long used = 0; + long free = 0; + long shared = 0; + long buffers = 0; + long cached = 0; + sscanf(buf, "Mem: %ld %ld %ld %ld %ld %ld", + &total, &used, &free, &shared, &buffers, &cached); + realMem = total; + done = true; + } + } + fclose(fs); + return realMem; +} + +void *mmapFile(const char *file) +{ + int fd = open(file, O_RDONLY); + if (fd == 0) + { + printf("open: %s\n", strerror(errno)); + exit(-1); + } + + struct stat stat_s; + int result = fstat(fd, &stat_s); + if (result) + { + printf("stat: %s\n", strerror(errno)); + exit(-1); + } + + void *ptr = mmap(0, stat_s.st_size, PROT_READ, MAP_SHARED, fd, 0); + if (ptr == 0) + { + printf("mmap: %s\n", strerror(errno)); + exit(-1); + } + return ptr; +} + +int main(int argc, char *argv[]) +{ + if ((argc==2) && (strcmp(argv[1], "all")==0)) + { + long mem_size = memSize(); + mem_size += mem_size / 16; + printf("Malloc... %0.1fMb\n", mem_size/(1024.0*1024.0)); + char *mem = (char *) malloc(mem_size); + for(long i=0; i < mem_size; i+=1024) + { + mem[i] = 99; + } + printf("Done!\n"); + exit(1); + } + + if ((argc==3) && (strcmp(argv[1], "calc")==0)) + { + char buf[257]; + int total = 0; + long val; + while(true) + { + buf[0] = 0; + fgets(buf, sizeof(buf), stdin); + if (!strlen(buf)) + { + printf("%s total = %0.1fKb (%d bytes)\n", argv[2], total/1024.0, total); + exit(1); + } + sscanf(buf, "%lx", &val); + total += val; +// printf("Val = %ld\n", val); + } + exit(1); + } + + + if ((argc>=2) && (strcmp(argv[1], "launch")==0)) + { + showMem(); + + char buf[200]; + + if (argc >=3) + snprintf(buf, 200, "%s &", argv[2]); + else + snprintf(buf, 200, "%s &", argv[0]); + + printf("Waiting for memory usage to settle down....\n"); + long prev = showTotalMem(); + long diff = 0; + do { + sleep(15); + long next = showTotalMem(); + if (next > prev) + diff = next - prev; + else + diff = prev-next; + prev = next; + } + while (diff > 2*1024); + + for(int i=0; i < 5; i++) + { + printf("Launching #%d\n", i); + system(buf); + sleep(2); + } + + sleep(10); + printf("Waiting for memory usage to settle down....\n"); + prev = showTotalMem(); + diff = 0; + do { + sleep(15); + long next = showTotalMem(); + if (next > prev) + diff = next - prev; + else + diff = prev-next; + prev = next; + } + while (diff > 2*1024); + long fiveMem = prev; + + for(int i=5; i < 15; i++) + { + printf("Launching #%d\n", i); + system(buf); + sleep(2); + } + + sleep(10); + printf("Waiting for memory usage to settle down....\n"); + prev = showTotalMem(); + diff = 0; + do { + sleep(15); + long next = showTotalMem(); + if (next > prev) + diff = next - prev; + else + diff = prev-next; + prev = next; + } + while (diff > 2*1024); + long fifteenMem = prev; + showMem(); + + printf("Actual memory usage of 1 instance = %0.1f Kb\n", + (fifteenMem - fiveMem) /10240.0); + } +// showMem("second"); + + KApplication app(argc,argv,"kurltest"); + +// showMem("After KApplication constructor"); + +// malloc(10*1024); + +// showMem("After 10K malloc"); + + printf("Sleeping...\n"); + sleep(8000); +} diff --git a/kdecore/tests/knotifytest.cpp b/kdecore/tests/knotifytest.cpp new file mode 100644 index 000000000..8eb0586c0 --- /dev/null +++ b/kdecore/tests/knotifytest.cpp @@ -0,0 +1,10 @@ +#include <knotifyclient.h> +#include <kapplication.h> + +int main( int argc, char **argv ) +{ + KApplication app( argc, argv, "knotifytest" ); + KNotifyClient::userEvent( "This is a notification to notify you :)", + KNotifyClient::Messagebox, + KNotifyClient::Error ); +} diff --git a/kdecore/tests/kprocesstest.cpp b/kdecore/tests/kprocesstest.cpp new file mode 100644 index 000000000..79769a90d --- /dev/null +++ b/kdecore/tests/kprocesstest.cpp @@ -0,0 +1,116 @@ +// +// MAIN -- a little demo of the capabilities of the "KProcess" class +// +// version 0.2, Aug 2nd 1997 +// $Id$ +// +// (C) Christian Czezatke +// e9025461@student.tuwien.ac.at +// + + +#include "kprocess.h" + +#include <stdio.h> +#include <string.h> +#include <kapplication.h> + +#include <signal.h> + +#include "kprocesstest.h" + +#define PROCNO 10 + + +// +// A nice input for "sort"... ;- ) +// +static const char txt[] = "hat\nder\nalte\nhexenmeister\nsich\ndoch\neinmal\nwegbegeben\n\ +und\nnun\nsollen\nseine\ngeister\nsich\nnach\nmeinem\nwillen\nregen\nseine\nwort\nund\n\ +werke\nmerkt\nich\nund\nden\nbrauch\nund\nmit\ngeistesstaerke\ntu\nich\nwunder\nauch\n"; + + +int main(int argc, char *argv[]) +{ + KProcess p1, p2, p3, p4; + Dummy dummy; + KApplication app(argc, argv, "kprocesstest"); + + + printf("Welcome to the KProcess Demo Application!\n"); + + // + // The kghostview demo -- Starts a kghostview instance blocking. -- After + // kghostview has exited, kghostview is restarted non-blocking. When the process exits, + // the signal "processExited" will be emitted. + // + + p1 << "kghostview"; + QObject::connect(&p1, SIGNAL(processExited(KProcess *)), &dummy, SLOT(printMessage(KProcess *))); + + printf("starting kghostview blocking (close to continue)\n"); + p1.start(KProcess::Block); + printf("restarting kghostview non blocking\n"); + p1.start(); + + + // + // A konsole with tcsh to demonstrate how to pass command line options to a process + // with "KProcess" (is run blocking) + // + + printf("Starting konsole with /bin/tcsh as shell (close to continue)\n"); + p2 << "konsole" << "-e" << "/bin/tcsh"; + p2.setWorkingDirectory("/tmp"); + QObject::connect(&p2, SIGNAL(processExited(KProcess *)), &dummy, SLOT(printMessage(KProcess *))); + p2.start(KProcess::Block); + + // + // Getting the output from a process. "ls" with parameter "-l" is called and it output is captured + // + + p3 << "ls" << "-l"; + QObject::connect(&p3, SIGNAL(processExited(KProcess *)), + &dummy, SLOT(printMessage(KProcess *))); + + QObject::connect(&p3, SIGNAL(receivedStdout(KProcess *, char *, int)), + &dummy, SLOT(gotOutput(KProcess *, char *, int))); + QObject::connect(&p3, SIGNAL(receivedStderr(KProcess *, char *, int)), + &dummy, SLOT(gotOutput(KProcess *, char *, int))); + + p3.start(KProcess::NotifyOnExit, KProcess::AllOutput); + + + // + // An even more advanced example of communicating with a child proces. -- A "sort" command + // is started. After it has been started a list of words (as stored in "txt") is written + // to its stdin. When the sort command has absorbed all its input it will emit the signal + // "inputSent". -- This signal is connected to "outputDone" in the Dummy object. + // + // "OutputDone" will do a "sendEof" to p4. -- This will cause "sort" to perform its task. + // The output of sort is then captured once more by connecting to the signal "outputWaiting" + // + // + + p4 << "sort"; + QObject::connect(&p4, SIGNAL(processExited(KProcess *)), + &dummy, SLOT(printMessage(KProcess *))); + + QObject::connect(&p4, SIGNAL(receivedStdout(KProcess *, char *, int)), + &dummy, SLOT(gotOutput(KProcess *, char *, int))); + QObject::connect(&p4, SIGNAL(receivedStderr(KProcess *, char *, int)), + &dummy, SLOT(gotOutput(KProcess *, char *, int))); + + QObject::connect(&p4, SIGNAL(wroteStdin(KProcess *)), + &dummy, SLOT(outputDone(KProcess *))); + + p4.start(KProcess::NotifyOnExit, KProcess::All); + printf("after p4.start"); + p4.writeStdin(txt, strlen(txt)); + + printf("Entering man Qt event loop -- press <CTRL><C> to abort\n"); + app.exec(); + + return 0; +} +#include "kprocesstest.moc" diff --git a/kdecore/tests/kprocesstest.h b/kdecore/tests/kprocesstest.h new file mode 100644 index 000000000..193895510 --- /dev/null +++ b/kdecore/tests/kprocesstest.h @@ -0,0 +1,50 @@ +// +// DUMMY -- A dummy class with a slot to demonstrate KProcess signals +// +// version 0.2, Aug 2nd 1997 +// +// (C) Christian Czezatke +// e9025461@student.tuwien.ac.at +// + + +#ifndef __DUMMY_H__ +#define __DUMMY_H__ + +#include <stdio.h> +#include <qobject.h> +#include "kprocess.h" + +class Dummy : public QObject +{ + Q_OBJECT + + public slots: + void printMessage(KProcess *proc) + { + printf("Process %d exited!\n", (int)proc->getPid()); + } + + void gotOutput(KProcess*, char *buffer, int len) + { + char result[1025]; // this is ugly since it relys on the internal buffer size of KProcess, + memcpy(result, buffer, len); // NEVER do that in your own application... ;-) + result[len] = '\0'; + printf("OUTPUT>>%s", result); + } + + void outputDone(KProcess *proc) + /* + Slot Procedure for the "sort" example. -- If it is indicated that the "sort" command has + absorbed all its input, we send an "EOF" to it to indicate that there is no more + data to be processed. + */ + { + proc->closeStdin(); + } + +}; + +#endif + + diff --git a/kdecore/tests/kprociotest.cpp b/kdecore/tests/kprociotest.cpp new file mode 100644 index 000000000..7585b7657 --- /dev/null +++ b/kdecore/tests/kprociotest.cpp @@ -0,0 +1,65 @@ +// +// MAIN -- a little demo of the capabilities of the "KProcess" class +// +// version 0.2, Aug 2nd 1997 +// $Id$ +// +// (C) Christian Czezatke +// e9025461@student.tuwien.ac.at +// + + +#include "kprocess.h" + +#include <stdio.h> +#include <string.h> +#include <kapplication.h> + +#include <signal.h> + +#include "kprociotest.h" + + + +// +// A nice input for "sort"... ;- ) +// +static const char txt[] = "hat\nder\nalte\nhexenmeister\nsich\ndoch\neinmal\nwegbegeben\n\ +und\nnun\nsollen\nseine\ngeister\nsich\nnach\nmeinem\nwillen\nregen\nseine\nwort\nund\n\ +werke\nmerkt\nich\nund\nden\nbrauch\nund\nmit\ngeistesstaerke\ntu\nich\nwunder\nauch\n"; + + +int main(int argc, char *argv[]) +{ + Dummy dummy; + KApplication app(argc, argv, "kprociotest"); + + printf("Welcome to the KProcIO Demo Application!\n"); + + + KProcIO p; + + p << "rev"; + + p.connect(&p, SIGNAL(processExited(KProcess*)), &dummy, SLOT(printMessage(KProcess*))); + p.connect(&p, SIGNAL(readReady(KProcIO*)), &dummy, SLOT(gotOutput(KProcIO*))); + + bool b; + + b = p.start(); + printf("Start returns %s\n", b ? "true" : "false"); + + b = p.fputs("Hello World!"); + printf("fputs returns %s\n", b ? "true" : "false"); + + b = p.fputs("This is a test. It should come out in reverse (esrever)"); + printf("fputs returns %s\n", b ? "true" : "false"); + + p.closeWhenDone(); + + printf("Entering man Qt event loop -- press <CTRL><C> to abort\n"); + app.exec(); + + return 0; +} +#include "kprociotest.moc" diff --git a/kdecore/tests/kprociotest.h b/kdecore/tests/kprociotest.h new file mode 100644 index 000000000..a7bb36f0f --- /dev/null +++ b/kdecore/tests/kprociotest.h @@ -0,0 +1,42 @@ +// +// DUMMY -- A dummy class with a slot to demonstrate KProcess signals +// +// version 0.2, Aug 2nd 1997 +// +// (C) Christian Czezatke +// e9025461@student.tuwien.ac.at +// + + +#ifndef __DUMMY_H__ +#define __DUMMY_H__ + +#include <stdio.h> +#include <qobject.h> +#include "kprocio.h" + +class Dummy : public QObject +{ + Q_OBJECT + + public slots: + void printMessage(KProcess *proc) + { + printf("Process %d exited!\n", (int)proc->getPid()); + } + + void gotOutput(KProcIO*proc) + { + QString line; + while(true) { + int result = proc->readln(line); + if (result == -1) return; + printf("OUTPUT>> [%d] '%s'\n", result, line.latin1()); + } + } + +}; + +#endif + + diff --git a/kdecore/tests/krandomsequencetest.cpp b/kdecore/tests/krandomsequencetest.cpp new file mode 100644 index 000000000..215349a05 --- /dev/null +++ b/kdecore/tests/krandomsequencetest.cpp @@ -0,0 +1,91 @@ +/* This file is part of the KDE libraries + Copyright (c) 1999 Waldo Bastian <bastian@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include <qptrlist.h> + +#include "krandomsequence.h" +#include "kapplication.h" + +#include <stdio.h> + +int +main(int argc, char *argv[]) +{ + KApplication a(argc, argv, "krandomsequencetest"); + + long seed; + KRandomSequence seq; + + seed = 2; + seq.setSeed(seed);printf("Seed = %4ld :", seed); + for(int i = 0; i < 20; i++) + printf("%3ld ", seq.getLong(100)); + printf("\n"); + + seed = 0; + seq.setSeed(seed);printf("Seed = %4ld :", seed); + for(int i = 0; i < 20; i++) + printf("%3ld ", seq.getLong(100)); + printf("\n"); + + seed = 0; + seq.setSeed(seed);printf("Seed = %4ld :", seed); + for(int i = 0; i < 20; i++) + printf("%3ld ", seq.getLong(100)); + printf("\n"); + + seed = 2; + seq.setSeed(seed);printf("Seed = %4ld :", seed); + for(int i = 0; i < 20; i++) + printf("%3ld ", seq.getLong(100)); + + seq.setSeed(kapp->random()); + + QPtrList<QString> list; + list.append(new QString("A")); + list.append(new QString("B")); + list.append(new QString("C")); + list.append(new QString("D")); + list.append(new QString("E")); + list.append(new QString("F")); + list.append(new QString("G")); + + for(QString *str = list.first(); str; str = list.next()) + printf("%s", str->latin1()); + printf("\n\n"); + + seq.randomize(&list); + + for(QString *str = list.first(); str; str = list.next()) + printf("%s", str->latin1()); + printf("\n\n"); + + seq.randomize(&list); + + for(QString *str = list.first(); str; str = list.next()) + printf("%s", str->latin1()); + printf("\n\n"); + + seq.randomize(&list); + + for(QString *str = list.first(); str; str = list.next()) + printf("%s", str->latin1()); + printf("\n\n"); + + printf("\n"); +} diff --git a/kdecore/tests/kresolvertest.cpp b/kdecore/tests/kresolvertest.cpp new file mode 100644 index 000000000..30003265a --- /dev/null +++ b/kdecore/tests/kresolvertest.cpp @@ -0,0 +1,420 @@ +/* + * This file is part of the KDE libraries + * Copyright (C) 2001 Thiago Macieira <thiago.macieira@kdemail.net> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + **/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> + +#include <errno.h> +#include <stdio.h> +#include <string.h> +#include <netinet/in.h> +#include <sys/socket.h> +#include <unistd.h> + +#include <qptrlist.h> +#include <qstring.h> + +#include <kuniqueapplication.h> +#include <ksocks.h> +#include <ksockaddr.h> +#include <kextsock.h> +#include <kaboutdata.h> +#include <kcmdlineargs.h> + +#include "netsupp.h" + +/* + * These constants tell the flags in KDE::resolverFlags + * This is copied from ../netsupp.cpp + */ +#define KRF_KNOWS_AF_INET6 0x01 /* if present, the code knows about AF_INET6 */ +#define KRF_USING_OWN_GETADDRINFO 0x02 /* if present, we are using our own getaddrinfo */ +#define KRF_USING_OWN_INET_NTOP 0x04 /* if present, we are using our own inet_ntop */ +#define KRF_USING_OWN_INET_PTON 0x08 /* if present, we are using our own inet_pton */ +#define KRF_CAN_RESOLVE_UNIX 0x100 /* if present, the resolver can resolve Unix sockets */ +#define KRF_CAN_RESOLVE_IPV4 0x200 /* if present, the resolver can resolve to IPv4 */ +#define KRF_CAN_RESOLVE_IPV6 0x400 /* if present, the resolver can resolve to IPv6 */ + +namespace KDE +{ + extern const int resolverFlags; +} + +class TestApp : public KUniqueApplication +{ +public: + TestApp() : + KUniqueApplication() + { } + + int newInstance(QValueList<QCString> params); +}; + +bool tryLookup(const char* node, const char *serv) +{ + int error; + QString _node = QString::fromLatin1(node); + QString _serv = QString::fromLatin1(serv); + + printf("\tTrying to lookup %s|%s... ", node, serv); + QPtrList<KAddressInfo> list = KExtendedSocket::lookup(_node, _serv, 0, &error); + list.setAutoDelete(true); + if (!list.isEmpty()) + { + printf("worked\n"); + return true; + } + + printf("failed\n\tReason was: %s\n", + (const char*)KExtendedSocket::strError(IO_LookupError, error).local8Bit()); + return false; +} + +#ifdef AF_INET6 +bool try_ntop() +{ + char buf[50]; // 46 is enough + kde_in6_addr in; + + memset(&in, 0, sizeof(in)); + ((unsigned char*)&in)[15] = 1; // set this to be ::1 + + printf("\tTrying to convert ::1 into string..."); + if (inet_ntop(AF_INET6, &in, buf, sizeof(buf)) == NULL) + { + printf("failed\n"); + return false; + } + + printf("suceeded\n\treturned '%s'\n", buf); + return strcmp(buf, "::1") == 0; +} + +bool try_pton() +{ + const char *buf = "::1"; + kde_in6_addr in; + + printf("\tTrying to convert '::1' into binary form..."); + if (inet_pton(AF_INET6, buf, &in) == 0) + { + printf("failed\n"); + return false; + } + + if (KDE_IN6_IS_ADDR_LOOPBACK(&in)) + { + printf("succeeded\n"); + return true; + } + + printf("claims to have suceeded, but returned invalid value\n"); + return false; +} +#endif + +bool tryLookup6(const char *node, const char *serv) +{ + int error; + QString _node = QString::fromLatin1(node); + QString _serv = QString::fromLatin1(serv); + + printf("\tTrying to lookup IPv6 of %s|%s... ", node, serv); + QPtrList<KAddressInfo> list = KExtendedSocket::lookup(_node, _serv, KExtendedSocket::ipv6Socket, &error); + list.setAutoDelete(true); + if (!list.isEmpty()) + { + printf("worked\n"); + return true; + } + + printf("failed\n\tReason was: %s\n", + (const char*)KExtendedSocket::strError(IO_LookupError, error).local8Bit()); + return false; +} + +bool testKernel() +{ +#ifndef AF_INET6 + printf("\tAF_INET6 unknown. Can't test anything\n"); + return false; + +#else + int sock; + kde_sockaddr_in6 sin6; + socklen_t len = sizeof(sin6); + + printf("\tAF_INET6 == %d\n", AF_INET6); + printf("\tTrying to create an IPv6 socket..."); + sock = socket(AF_INET6, SOCK_STREAM, 0); + if (sock == -1) + printf("failed\n\tReason was: %s", strerror(errno)); + else + { + printf("succeeded\n"); + + if (getsockname(sock, (struct sockaddr*)&sin6, &len) == 0) + printf("\tSize of kernel's sockaddr_in6 is %d bytes\n", len); + else + printf("\tCould not get socket name\n"); + } + + printf("\tSize of KDE's internal sockaddr_in6 is %d bytes\n", + sizeof(kde_sockaddr_in6)); + +# ifdef HAVE_SOCKADDR_IN6 + printf("\tSize of system libraries' sockaddr_in6 is %d bytes\n", + sizeof(sockaddr_in6)); +# else + printf("\tSystem libraries don't define sockaddr_in6\n"); +# endif + + if (sock == -1) + return false; + + printf("\tTrying to bind the socket to an address..."); + sin6.sin6_family = AF_INET6; +# ifdef HAVE_SOCKADDR_SA_LEN + sin6.sin6_len = sizeof(sin6); +# endif + sin6.sin6_flowinfo = 0; + sin6.sin6_scope_id = 0; + sin6.sin6_port = 0; // bind to any port + memset(&sin6.sin6_addr, 0, sizeof(sin6.sin6_addr)); // any address + + if (bind(sock, (sockaddr*)&sin6, sizeof(sin6)) == -1) + { + printf("failed\n\tReason was: %s\n", strerror(errno)); + close(sock); + return false; + } + + printf("succeeded\n"); + + KSocketAddress *ksin = KExtendedSocket::localAddress(sock); + if (ksin != NULL) + { + printf("\tWe got socket %s\n", (const char*)ksin->pretty().latin1()); + delete ksin; + } + + close(sock); + return true; +#endif // AF_INET6 +} + +bool tryConnectLocal() +{ + KExtendedSocket ks1("::", "0", KExtendedSocket::ipv6Socket | KExtendedSocket::passiveSocket), + ks2; + const KInetSocketAddress *ksin1, *ksin2; + + printf("Attempting a loop-back connection\n\tTrying to listen on socket..."); + if (ks1.listen() != 0) + { + printf("failed\n\tReason was: %s\n", + (const char*)KExtendedSocket::strError(ks1.status(), ks1.systemError()).local8Bit()); + return false; + } + + ks1.setBlockingMode(false); + ksin1 = (KInetSocketAddress*)ks1.localAddress(); + + printf("succeeded\n\tWe have socket %s listening\n", + (const char*)ksin1->pretty().local8Bit()); + + ks2.setAddress("::1", ksin1->port()); + ks2.setSocketFlags(KExtendedSocket::ipv6Socket | KExtendedSocket::noResolve); + + printf("\tTrying to connect to that socket..."); + if (ks2.connect() != 0) + { + printf("failed\n\tReason was: %s\n", + (const char*)KExtendedSocket::strError(ks2.status(), ks2.systemError()).local8Bit()); + return false; + } + + printf("suceeded\n"); + + ksin2 = dynamic_cast<const KInetSocketAddress *>(ks2.localAddress()); + printf("\tIf you may flip to another terminal/xterm and run netstat to see\n" + "\tthis connection. It should be a connection from %s to %s.\n" + "\tPress any key to continue\n", + (const char*)ksin2->pretty().local8Bit(), (const char*)ksin1->pretty().local8Bit()); + getchar(); + return true; +} + +bool tryConnectRemote() +{ + KExtendedSocket ks("www.6bone.net", "80", KExtendedSocket::ipv6Socket); + + printf("\nAttempting a remote connection to www.6bone.net|80\n"); + + if (ks.connect() != 0) + { + printf("\tConnection failed with error: %s\n", + (const char*)KExtendedSocket::strError(ks.status(), ks.systemError()).local8Bit()); + return false; + } + + printf("\tConnection succeeded\n"); + return true; +} + +void go() +{ + int rf = KDE::resolverFlags; + printf("The resolver claims to:\n"); + if (rf & KRF_USING_OWN_GETADDRINFO) + { + printf(" - Be using its own version of getaddrinfo()\n"); + if (rf & KRF_CAN_RESOLVE_UNIX) + printf(" - Be able to resolve Unix-domain sockets\n"); + else + printf(" - Be unable to resolve Unix-domain sockets -- This shouldn't happen\n"); + if (rf & KRF_CAN_RESOLVE_IPV4) + printf(" - Be able to resolve IPv4 Internet sockets\n"); + else + printf(" - Be unable to resolve IPv4 Internet sockets -- This shouldn't happen\n"); + if (rf & KRF_CAN_RESOLVE_IPV6) + printf(" - Be able to resolve IPv6 Internet sockets\n"); + else + printf(" - Be unable to resolve IPv6 Internet sockets\n"); + } + else + printf(" - Be using the system getaddrinfo()\n"); + + if (rf & KRF_USING_OWN_INET_NTOP) + printf(" - Be using its own inet_ntop()\n"); + else + printf(" - Be using the system inet_ntop()\n"); + + if (rf & KRF_USING_OWN_INET_PTON) + printf(" - Be using its own inet_pton()\n"); + else + printf(" - Be using the system inet_pton()\n"); + + if (rf & KRF_KNOWS_AF_INET6) + printf(" - To know the value of AF_INET6\n"); + else + printf(" - Not to know the value of AF_INET6\n"); + + printf("\n\nGeneral conclusion is:\n"); + if ((rf & KRF_USING_OWN_GETADDRINFO) == 0 && + rf & KRF_KNOWS_AF_INET6) + printf(" Your system probably supports full IPv6 implementation.\n" + " This depends on whether your system's getaddrinfo() supports IPv6.\n" + " However, KDE Libraries were compiled to use the support whenever available.\n"); + else if ((rf & (KRF_USING_OWN_GETADDRINFO|KRF_KNOWS_AF_INET6)) == 0) + printf(" Your system supports partial IPv6 implementation.\n" + " That is, your system has a getaddrinfo() implementation, but KDE Libraries\n" + " don't know how to detect an IPv6 socket. That means that only request to" + " any kind of socket will use IPv6, if your getaddrinfo() returns them."); + else if (rf & KRF_USING_OWN_GETADDRINFO) + { + if (rf & KRF_KNOWS_AF_INET6) + { + printf(" Your system supports partial IPv6 implementation.\n"); + if (rf & KRF_CAN_RESOLVE_IPV6) + printf(" The KDE implementation of getaddrinfo() claims to be able to resolve\n" + " IPv6 lookups and the value of AF_INET6 is known.\n"); + else + printf(" The KDE implementation of getaddrinfo() cannot resolve IPv6 lookups.\n" + " That means that IPv6 support is limited to two addresses (:: and ::1)\n"); + } + else + printf(" Your system doesn't support IPv6\n"); + } + + /* Make sure KSocks doesn't interfere in testing */ + KSocks::disable(); + + /* Begin testing */ + printf("\nReady to start testing\nPress any key to continue..."); + getchar(); + printf("\n"); + + /* Start with simple lookups */ + printf("Trying simple lookups\n" + "All of the following look ups should work\n\n"); + tryLookup(NULL, "/tmp/something"); + tryLookup("127.0.0.1", "80"); + tryLookup("localhost", "http"); + +#ifdef AF_INET6 + printf("\nPress any key for next test"); + getchar(); + + printf("\nThis test determines if the inet_ntop and inet_pton functions work\n"); + try_ntop(); + try_pton(); +#endif + + printf("\nPress any key for next test"); + getchar(); + + printf("\nThis test determines how far the IPv6 resolution can go\n"); + if (!tryLookup6("::1", "80")) + printf("Your system can't resolve a numeric IPv6 address\n"); + else if (!tryLookup6("localhost", "80")) + printf("Your system can resolve a numeric IPv6 address, but not localhost\n"); + else if (!tryLookup6("www.6bone.net", "80")) + printf("Your system can resolve numeric IPv6 addresses and localhost, \n" + "but cannot resolve an external address to IPv6 (www.6bone.net)\n"); + else + printf("Your system can resolve any kind of IPv6 addresses\n"); + + printf("\nPress any key for next test"); + getchar(); + + printf("\nThis test determines how supported IPv6 is in your kernel\n"); + testKernel(); + + printf("\nPress any key for next test"); + getchar(); + + printf("\nThis test determines if you can connect to IPv6 addresses via TCP\n"); + tryConnectLocal(); + tryConnectRemote(); + + printf("\n\nTest finished\n"); +} + +int TestApp::newInstance(QValueList<QCString> /*params*/) +{ + go(); +} + +int main(int argc, char **argv) +{ + KAboutData about("socktest2", "SockTest", "1.0"); + KCmdLineArgs::init(argc, argv, &about); + KUniqueApplication::addCmdLineOptions(); + + /* TestApp a; + a.exec();*/ + go(); +} diff --git a/kdecore/tests/krfcdatetest.cpp b/kdecore/tests/krfcdatetest.cpp new file mode 100644 index 000000000..1c1957b54 --- /dev/null +++ b/kdecore/tests/krfcdatetest.cpp @@ -0,0 +1,81 @@ +#include <stdio.h> +#include <kapplication.h> +#include <stdlib.h> +#include <kdebug.h> +#include <kglobal.h> +#include <kcharsets.h> +#include <qtextcodec.h> +#include <krfcdate.h> + +bool check(QString txt, time_t a, time_t b) +{ + if (a == b) { + kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "ok" << endl; + } + else { + kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "KO !" << endl; + exit(1); + } + return true; +} + +int main(int argc, char *argv[]) +{ + KApplication app(argc,argv,"kurltest",false,false); + + time_t a; + time_t b; + + // From http://www.w3.org/TR/NOTE-datetime + b = KRFCDate::parseDateISO8601("1994-11-05T13:15:30Z"); + a = KRFCDate::parseDateISO8601("1994-11-05T08:15:30-05:00"); + check( "1994-11-05T08:15:30-05:00", a, b); + + a = KRFCDate::parseDateISO8601("1994-11-05T18:15:30+05:00"); + check( "1994-11-05T18:15:30+05:00", a, b); + + a = KRFCDate::parseDate("Thu Nov 5 1994 18:15:30 GMT+0500"); + check( "Thu Nov 5 1994 18:15:30 GMT+0500", a, b); + + a = KRFCDate::parseDate("Thu Nov 5 1994 18:15:30 GMT+05:00"); + check( "Thu Nov 5 1994 18:15:30 GMT+05:00", a, b); + + a = KRFCDate::parseDate("Wednesday, 05-Nov-94 13:15:30 GMT"); + check( "Wednesday, 05-Nov-94 13:15:30 GMT", a, b); + + a = KRFCDate::parseDate("Wed, 05-Nov-1994 13:15:30 GMT"); + check( "Wed, 05-Nov-1994 13:15:30 GMT", a, b); + + a = KRFCDate::parseDate("Wed, 05-November-1994 13:15:30 GMT"); + check( "Wed, 05-November-1994 13:15:30 GMT", a, b); + + b = KRFCDate::parseDateISO8601("1994-01-01T12:00:00"); + a = KRFCDate::parseDateISO8601("1994"); + check( "1994", a, b ); + + a = KRFCDate::parseDateISO8601("1994-01"); + check( "1994-01", a, b ); + + a = KRFCDate::parseDateISO8601("1994-01-01"); + check( "1994-01-01", a, b ); + + b = 0; + + // pass RFC date to ISO parser + a = KRFCDate::parseDateISO8601("Thu, 01 Jan 2004 19:48:21 GMT"); + check("pass RFC date \"Thu, 01 Jan 2004 19:48:21 GMT\" to parseDateISO8601", a, b); + + // pass ISO date to RFC parser + a = KRFCDate::parseDate("1994-01-01T12:00:00"); + check("pass ISO date \"1994-01-01T12:00:00\" to parseDate()", a, b); + + // empty/null strings + + check("parseDateISO8601(QString())", KRFCDate::parseDateISO8601(QString()), b); + check("parseDateISO8601(\"\")", KRFCDate::parseDateISO8601(""), b); + check("parseDate(QString())", KRFCDate::parseDate(QString()), b); + check("parseDate(\"\")", KRFCDate::parseDate(""), b); + + printf("\nTest OK !\n"); +} + diff --git a/kdecore/tests/kshelltest.cpp b/kdecore/tests/kshelltest.cpp new file mode 100644 index 000000000..eaca1fcbe --- /dev/null +++ b/kdecore/tests/kshelltest.cpp @@ -0,0 +1,55 @@ +#include <kshell.h> + +#include <iostream> + +static QCString +ps(const QString &s) +{ + if (s.isNull()) + return "(null)"; + else + return s.local8Bit(); +} + +static void +tx(const char *t) +{ + std::cout << t << " -> " << ps(KShell::tildeExpand(t)) << std::endl; +} + +static void +sj(const char *t, int flg) +{ + int err; + std::cout << t << " (" << flg << ") -> " << ps(KShell::joinArgsDQ(KShell::splitArgs(t, flg, &err))) << " (" << err << ")" << std::endl; +} + +int main() +{ +#if 1 + tx("~"); + tx("~/sulli"); + tx("~root"); + tx("~root/sulli"); + tx("~sulli"); +#endif +#if 1 + QStringList lst; + lst << "this" << "is" << "text"; + std::cout << KShell::joinArgs(lst).latin1() << std::endl; +#endif +#if 1 + sj("\"~sulli\" 'text' 'jo'\"jo\" $'crap' $'\\\\\\'\\ca\\e\\x21' ha\\ lo ", KShell::NoOptions); + sj("\"~sulli\" 'text'", KShell::TildeExpand); + sj("~\"sulli\" 'text'", KShell::TildeExpand); + sj("~/\"sulli\" 'text'", KShell::TildeExpand); + sj("~ 'text' ~", KShell::TildeExpand); + sj("~sulli ~root", KShell::TildeExpand); +#endif + sj("say \" error", KShell::NoOptions); + sj("say `echo no error`", KShell::NoOptions); + sj("say \" still error", KShell::AbortOnMeta); + sj("say `echo meta error`", KShell::AbortOnMeta); + sj("BLA=say echo meta", KShell::AbortOnMeta); + sj("B\"L\"A=say FOO=bar echo meta", KShell::AbortOnMeta); +} diff --git a/kdecore/tests/ksimpleconfigtest.cpp b/kdecore/tests/ksimpleconfigtest.cpp new file mode 100644 index 000000000..6aa93c06d --- /dev/null +++ b/kdecore/tests/ksimpleconfigtest.cpp @@ -0,0 +1,48 @@ +// $Id$ + +// +// configtest.cpp: libKDEcore example +// +// demonstrates use of KSimpleConfig class + +#include <ksimpleconfig.h> +#include <kapplication.h> +#include <unistd.h> +#include <stdio.h> + +#ifdef HAVE_PATHS_H +#include <paths.h> +#endif + +#ifndef _PATH_TMP +#define _PATH_TMP "/tmp/" +#endif + +int main( int argc, char **argv ) +{ + KApplication a( argc, argv, "kconfigtest" ); + + KSimpleConfig aConfig( _PATH_TMP"/simpleconfig.cfg" ); + + aConfig.setGroup( "Test group" ); + aConfig.writeEntry( "key1", "value1" ); + aConfig.writeEntry( "key2", "value2" ); + + aConfig.setGroup( "Another Test group" ); + aConfig.writeEntry( "akey1", "avalue1" ); + aConfig.writeEntry( "akey2", "avalue2" ); + + fprintf( stderr, "entries written, sleeping for 10 seconds\n" ); + aConfig.sync(); + sleep( 10 ); + + aConfig.setGroup( "Test group" ); + aConfig.deleteEntry( "key2", false ); + fprintf( stderr, "Deleted on entry from Test group, sleeping\n" ); + aConfig.sync(); + sleep( 10 ); + + aConfig.deleteGroup( "Another Test group", true ); + fprintf( stderr, "Deleted Another Test group\n" ); +} + diff --git a/kdecore/tests/ksocktest.cpp b/kdecore/tests/ksocktest.cpp new file mode 100644 index 000000000..89b59c62a --- /dev/null +++ b/kdecore/tests/ksocktest.cpp @@ -0,0 +1,109 @@ +/* This file is part of the KDE libraries + Copyright (c) 1999 Waldo Bastian <bastian@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "kuniqueapplication.h" +#include "kglobal.h" +#include "kdebug.h" +#include "ksock.h" +#include "ksockaddr.h" +#include "kextsock.h" + +#include <kaboutdata.h> +#include <kcmdlineargs.h> +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <dirent.h> +#include <fcntl.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> +#include <netdb.h> + +bool check(QString txt, QString a, QString b) +{ + if (a.isEmpty()) + a = QString::null; + if (b.isEmpty()) + b = QString::null; + if (a == b) { + kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "ok" << endl; + } + else { + kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "KO !" << endl; + exit(1); + } + return true; +} + + +int +main(int argc, char *argv[]) +{ + KAboutData about("socktest", "SockTest", "version"); + KCmdLineArgs::init(argc, argv, &about); + KApplication::addCmdLineOptions(); + + KApplication app; + + QString host, port; + + KInetSocketAddress host_address("213.203.58.36", 80); + + check("KInetSocketAddress(\"213.203.58.36\", 80)", host_address.pretty(), "213.203.58.36 port 80"); + + int result = KExtendedSocket::resolve(&host_address, host, port, NI_NAMEREQD); + printf( "resolve result: %d\n", result ); + check("KExtendedSocket::resolve() host=", host, "www.kde.org"); +// check("KExtendedSocket::resolve() port=", port, "http"); + QPtrList<KAddressInfo> list; + list = KExtendedSocket::lookup("www.kde.org", "http", KExtendedSocket::inetSocket); + for(KAddressInfo *info = list.first(); info; info = list.next()) + { + qWarning("Lookup: %s %s %s", info->address()->pretty().latin1(), + info->address()->isEqual(KInetSocketAddress("213.203.58.36", 80)) ? + "is equal to" : "is NOT equal to", + "213.203.58.36 port 80"); + } + check("KExtendedSocket::lookup()", list.first()->address()->pretty(), "213.203.58.36 port 80"); + + + + int err; + + QPtrList<KAddressInfo> cns = KExtendedSocket::lookup("www.kde.org", 0, KExtendedSocket::canonName, &err); + for (KAddressInfo *x = cns.first(); x; x = cns.next()) { + const char *canon = x->canonname(); + qWarning( "Lookup: %s", canon ? canon : "<Null>"); + } + check("KExtendedSocket::lookup() canonical", cns.first()->canonname(), "www.kde.org"); + + KExtendedSocket * sock2 = new KExtendedSocket( "www.kde.org", 80 ); + check( "KExtendedSocket ctor / connect", QString::number( sock2->connect() ), "0" ); + + printf("FD %d\n", sock2->fd()); + + KSocketAddress* addr = KExtendedSocket::peerAddress( sock2->fd() ); + check( "peerAddress:", addr->nodeName().latin1(), "213.203.58.36" ); + + check( "isEqual:", addr->isEqual(KInetSocketAddress("213.203.58.36", 80)) ? "TRUE" : "FALSE", "TRUE"); + check( "isEqual:", addr->isEqual(KInetSocketAddress("213.203.58.36", 8080)) ? "TRUE" : "FALSE", "FALSE"); + check( "isEqual:", addr->isCoreEqual(KInetSocketAddress("213.203.58.36", 8080)) ? "TRUE" : "FALSE", "TRUE"); +} diff --git a/kdecore/tests/ksortablevaluelisttest.cpp b/kdecore/tests/ksortablevaluelisttest.cpp new file mode 100644 index 000000000..de937c797 --- /dev/null +++ b/kdecore/tests/ksortablevaluelisttest.cpp @@ -0,0 +1,32 @@ +#include <qstring.h> +#include <ksortablevaluelist.h> + +int main( int argc, char **argv ) +{ + KSortableValueList<QString> list; + list.insert( 1, "FOO (1)" ); + list.insert( 2, "Test (2)" ); + list.insert( 1, "Huba! (1)" ); + list.insert( 5, "MAAOOAM! (5)" ); + list.insert( 10, "Teeheeest (10)" ); + list.insert( 2, "I was here :) (2)" ); + list.insert( 4, "Yeehaa... (4)" ); + + QValueListIterator<KSortableItem<QString> > it = list.begin(); + + qDebug("Insertion order:"); + qDebug("================"); + for ( ; it != list.end(); ++it ) + qDebug( "%i: %s", (*it).index(), (*it).value().latin1() ); + + list.sort(); + + qDebug("\nSorted:"); + qDebug("======="); + + it = list.begin(); + for ( ; it != list.end(); ++it ) + qDebug( "%i: %s", (*it).index(), (*it).value().latin1() ); + + return 0; +} diff --git a/kdecore/tests/kstdacceltest.cpp b/kdecore/tests/kstdacceltest.cpp new file mode 100644 index 000000000..71eff30cd --- /dev/null +++ b/kdecore/tests/kstdacceltest.cpp @@ -0,0 +1,39 @@ +#include <config.h> + +#include <kapplication.h> +#include <kdebug.h> +#include <kstdaccel.h> +#include <stdlib.h> // for exit + +static bool check(QString txt, QString a, QString b) +{ + if (a.isEmpty()) + a = QString::null; + if (b.isEmpty()) + b = QString::null; + if (a == b) { + kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "ok" << endl; + } + else { + kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "KO !" << endl; + exit(1); + } + return true; +} + +int main(int argc, char *argv[]) +{ + KApplication::disableAutoDcopRegistration(); + KApplication app(argc,argv,"kstdacceltest",false,false); + + check( "shortcutDefault FullScreen", KStdAccel::shortcutDefault( KStdAccel::FullScreen ).toString(), "Ctrl+Shift+F" ); + check( "shortcutDefault BeginningOfLine", KStdAccel::shortcutDefault( KStdAccel::BeginningOfLine ).toString(), "Home" ); + check( "shortcutDefault EndOfLine", KStdAccel::shortcutDefault( KStdAccel::EndOfLine ).toString(), "End" ); + + check( "name BeginningOfLine", KStdAccel::name( KStdAccel::BeginningOfLine ), "BeginningOfLine" ); + check( "name EndOfLine", KStdAccel::name( KStdAccel::EndOfLine ), "EndOfLine" ); + + check( "shortcut method", KStdAccel::shortcut( KStdAccel::ZoomIn ).toString(), KStdAccel::zoomIn().toString() ); + + return 0; +} diff --git a/kdecore/tests/kstddirstest.cpp b/kdecore/tests/kstddirstest.cpp new file mode 100644 index 000000000..23c0f0a1c --- /dev/null +++ b/kdecore/tests/kstddirstest.cpp @@ -0,0 +1,52 @@ +#include <kapplication.h> +#include <kdebug.h> +#include <kinstance.h> +#include <kstandarddirs.h> +#include <kconfig.h> + +int main(int argc, char **argv) +{ + KApplication a(argc, argv, "whatever", false); + KStandardDirs t; + KConfig config; // to add custom entries - a bit tricky :/ + + QStringList list; + QString s; + + t.saveLocation("icon"); + + s = t.findResource("icon", "xv.xpm"); + if (!s.isNull()) kdDebug() << s << endl; + + list = t.findAllResources("data", "kfind/toolbar", true); + for (QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) { + kdDebug() << "data " << (*it).ascii() << endl; + } + + list = t.findAllResources("config", "kcmdisplayrc"); + for (QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) { + kdDebug() << "config " << (*it).ascii() << endl; + } + + list = t.findAllResources("config", "kcmdisplayrc", false, true); + for (QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) { + kdDebug() << "config2 " << (*it).ascii() << endl; + } + + list = t.findAllResources("html", "en/*/index.html", false); + for (QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) { + kdDebug() << "docs " << (*it).ascii() << endl; + } + + list = t.findAllResources("html", "*/*/*.html", false); + for (QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) { + kdDebug() << "docs " << (*it).ascii() << endl; + } + + list = t.findDirs("data", "kwin"); + for (QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) { + kdDebug() << "kwin dirs " << (*it).ascii() << endl; + } + + kdDebug() << "hit " << t.findResourceDir("config", "kcmdisplayrc") << endl; +} diff --git a/kdecore/tests/kstringhandlertest.cpp b/kdecore/tests/kstringhandlertest.cpp new file mode 100644 index 000000000..75695309d --- /dev/null +++ b/kdecore/tests/kstringhandlertest.cpp @@ -0,0 +1,97 @@ +#include "kstringhandler.h" +#include <iostream> +using std::cout; +using std::endl; + +bool check(const QString &txt, const QString &a, const QString &b) +{ + if ( a != b ) { + cout << "ERROR: Tested " << txt.latin1() << ", expected" << endl; + cout << "'" << b.latin1() << "' (" << b.length() << " chars)" << endl; + cout << "but got" << endl; + cout << "'" << a.latin1() << "' (" << a.length() << " chars)" << endl; + exit( 1 ); + } + return true; +} + +int main(int argc, char *argv[]) +{ + QString test = "The quick brown fox jumped over the lazy bridge. "; + + check("word(test, 3)", + KStringHandler::word(test, 2), + "brown"); + check("word(test, \"3:5\")", + KStringHandler::word(test, "2:4"), + "brown fox jumped"); + check("insword(test, \"very\", 1)", + KStringHandler::insword(test, "very", 1), + "The very quick brown fox jumped over the lazy bridge. "); + check("setword(test, \"very\", 1)", + KStringHandler::setword(test, "very", 1), + "The very brown fox jumped over the lazy bridge. "); + check("remrange(test, \"4:6\")", + KStringHandler::remrange(test, "4:6"), + "The quick brown fox lazy bridge. " ); + check("remrange(test, \"4:8\")", + KStringHandler::remrange(test, "4:8"), + "The quick brown fox "); + check("remword(test, 4)", + KStringHandler::remword(test, 4), + "The quick brown fox over the lazy bridge. "); + check("remword(test, \"lazy\")", + KStringHandler::remword(test, "lazy"), + "The quick brown fox jumped over the bridge. "); + check("capwords(test)", + KStringHandler::capwords(test), + "The Quick Brown Fox Jumped Over The Lazy Bridge. "); + check("reverse(test)", + KStringHandler::reverse(test), + " bridge. lazy the over jumped fox brown quick The"); + QString result; + result = KStringHandler::ljust(test, 70); + if (result.length() != 70) + { + printf("Length = %d, expected 70.\n", result.length()); + exit(1); + } + check("ljust(test, 70)", + result, + "The quick brown fox jumped over the lazy bridge. "); + result = KStringHandler::rjust(test, 70); + if (result.length() != 70) + { + printf("Length = %d, expected 70.\n", result.length()); + exit(1); + } + check("rjust(test, 70)", + result, + " The quick brown fox jumped over the lazy bridge."); + result = KStringHandler::center(test, 70); + if (result.length() != 70) + { + printf("Length = %d, expected 70.\n", result.length()); + exit(1); + } + check("center(test, 70)", + result, + " The quick brown fox jumped over the lazy bridge. "); + + test = "Click on http://foo@bar:www.kde.org/yoyo/dyne.html#a1 for info."; + check( "tagURLs()", KStringHandler::tagURLs( test ), + "Click on <a href=\"http://foo@bar:www.kde.org/yoyo/dyne.html#a1\">http://foo@bar:www.kde.org/yoyo/dyne.html#a1</a> for info." ); + + test = "http://www.foo.org/story$806"; + check( "tagURLs()", KStringHandler::tagURLs( test ), + "<a href=\"http://www.foo.org/story$806\">http://www.foo.org/story$806</a>" ); + +#if 0 + // XFAIL - i.e. this needs to be fixed, but has never been + test = "<a href=www.foo.com>"; + check( "tagURLs()", KStringHandler::tagURLs( test ), + "<a href=<a href=\"www.foo.com\">www.foo.com</a>>" ); +#endif + + cout << "All OK!" << endl; +} diff --git a/kdecore/tests/ktempfiletest.cpp b/kdecore/tests/ktempfiletest.cpp new file mode 100644 index 000000000..aacf30255 --- /dev/null +++ b/kdecore/tests/ktempfiletest.cpp @@ -0,0 +1,48 @@ +/* This file is part of the KDE libraries + Copyright (c) 1999 Waldo Bastian <bastian@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "ktempfile.h" +#include "kapplication.h" +#include "kstandarddirs.h" +#include <qstring.h> + +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> + +int +main(int argc, char *argv[]) +{ + KApplication a(argc, argv, "ktempfiletest"); + printf("Making tempfile after KApplication constructor.\n"); + KTempFile f4; + printf("Filename = %s\n", f4.name().ascii()); + + printf("Making tempfile with \".ps\" extension.\n"); + KTempFile f2(QString::null, ".ps"); + printf("Filename = %s\n", f2.name().ascii()); + + printf("Making tempfile in home directory.\n"); + KTempFile f3(QString((const char *)getenv("HOME"))+"/testXXX", ".myEXT", 0666); + printf("Filename = %s\n", f3.name().ascii()); + + QString name = locateLocal("socket", "test"); + printf("Socket Filename = %s\n", name.ascii()); + + printf("Done.\n"); +} diff --git a/kdecore/tests/ktimezonestest.cpp b/kdecore/tests/ktimezonestest.cpp new file mode 100644 index 000000000..7be8bd621 --- /dev/null +++ b/kdecore/tests/ktimezonestest.cpp @@ -0,0 +1,62 @@ +#include "ktimezones.h" +#include <kapplication.h> +#include <stdio.h> +#include <stdlib.h> + +int main(int argc, char *argv[]) +{ + KInstance instance("ktimezonestest"); + + if ((argc==2) && (strcmp(argv[1], "local")==0)) + { + KTimezones timezones; + + // Find the local timezone. + const KTimezone *timezone = timezones.local(); + printf( "Local timezone: %s\n", timezone->name().latin1() ); + + // Find the current offset of the UTC timezone. + timezone = timezones.zone("UTC"); + printf( "UTC timezone offset should be 0: %d\n", timezone->offset(QDateTime::currentDateTime()) ); + + // Find some offsets for Europe/London. + char *london = "Europe/London"; + timezone = timezones.zone(london); + QDateTime winter(QDateTime::fromString("2005-01-01T00:00:00", Qt::ISODate)); + QDateTime summer(QDateTime::fromString("2005-06-01T00:00:00", Qt::ISODate)); + printf( "%s winter timezone offset should be 0: %d\n", london, timezone->offset(winter) ); + printf( "%s summer timezone offset should be 3600: %d\n", london, timezone->offset(summer) ); + + // Try timezone conversions. + const KTimezone *losAngeles = timezones.zone("America/Los_Angeles"); + char *bstBeforePdt = "2005-03-28T00:00:00"; + char *bstAfterPdt = "2005-05-01T00:00:00"; + char *gmtBeforePst = "2005-10-30T01:00:00"; + char *gmtAfterPst = "2005-12-01T00:00:00"; + QString result; + result = timezone->convert(losAngeles, QDateTime::fromString(bstBeforePdt, Qt::ISODate)).toString(Qt::ISODate); + printf( "BST before PDT, %s should be 2005-03-27T15:00:00: %s\n", bstBeforePdt, result.latin1() ); + result = timezone->convert(losAngeles, QDateTime::fromString(bstAfterPdt, Qt::ISODate)).toString(Qt::ISODate); + printf( "BST and PDT, %s should be 2005-04-30T16:00:00: %s\n", bstAfterPdt, result.latin1() ); + result = timezone->convert(losAngeles, QDateTime::fromString(gmtBeforePst, Qt::ISODate)).toString(Qt::ISODate); + printf( "GMT before PST, %s should be 2005-10-29T17:00:00: %s\n", gmtBeforePst, result.latin1() ); + result = timezone->convert(losAngeles, QDateTime::fromString(gmtAfterPst, Qt::ISODate)).toString(Qt::ISODate); + printf( "GMT and PST, %s should be 2005-11-30T16:00:00: %s\n", gmtAfterPst, result.latin1() ); + printf( "Latitude 89 should be valid: %svalid\n", KTimezone::isValidLatitude(89.0) ? "" : "in"); + printf( "Latitude 91 should be invalid: %svalid\n", KTimezone::isValidLatitude(91.0) ? "" : "in"); + printf( "Longitude 179 should be valid: %svalid\n", KTimezone::isValidLongitude(179.0) ? "" : "in"); + printf( "Longitude 181 should be valid: %svalid\n", KTimezone::isValidLongitude(181.0) ? "" : "in"); + return 0; + } + + if ((argc==2) && (strcmp(argv[1], "all")==0)) + { + KTimezones timezones; + KTimezones::ZoneMap allZones = timezones.allZones(); + for ( KTimezones::ZoneMap::const_iterator it = allZones.begin(), end = allZones.end(); it != end; ++it ) + printf( "%s\n", it.key().latin1() ); + } + + printf( "Usage: ktimezonestest [local|all]!\n" ); + return 1; +} diff --git a/kdecore/tests/kuniqueapptest.cpp b/kdecore/tests/kuniqueapptest.cpp new file mode 100644 index 000000000..699c99539 --- /dev/null +++ b/kdecore/tests/kuniqueapptest.cpp @@ -0,0 +1,59 @@ +/* This file is part of the KDE libraries + Copyright (c) 1999 Waldo Bastian <bastian@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "kuniqueapplication.h" +#include "kglobalsettings.h" + +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <kcmdlineargs.h> +#include <kaboutdata.h> + +class TestApp : public KUniqueApplication +{ +public: + TestApp() : KUniqueApplication("TestApp") { } + virtual int newInstance( ); +}; + + +int +TestApp::newInstance( ) +{ + qWarning("NewInstance"); + return 0; +} + +int +main(int argc, char *argv[]) +{ + KAboutData about("kuniqueapptest", "kuniqueapptest", "version"); + KCmdLineArgs::init(argc, argv, &about); + KUniqueApplication::addCmdLineOptions(); + + if (!TestApp::start()) + { + exit(0); + } + TestApp a; + + printf("Running.\n"); + kapp->exec(); + printf("Terminating.\n"); +} diff --git a/kdecore/tests/kurltest.cpp b/kdecore/tests/kurltest.cpp new file mode 100644 index 000000000..60e8ace09 --- /dev/null +++ b/kdecore/tests/kurltest.cpp @@ -0,0 +1,1124 @@ +#include <config.h> + +#include <kurl.h> +#include <stdio.h> +#include <kapplication.h> +#include <stdlib.h> +#include <kdebug.h> +#include <kglobal.h> +#include <kcharsets.h> +#include <qtextcodec.h> +#include <qdatastream.h> +#include <assert.h> +#include <kcmdlineargs.h> + +static bool check(QString txt, QString a, QString b) +{ + if (a.isEmpty()) + a = QString::null; + if (b.isEmpty()) + b = QString::null; + if (a == b) { + kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "ok" << endl; + } + else { + kdDebug() << txt << " : checking '" << a << "' against expected value '" << b << "'... " << "KO !" << endl; + exit(1); + } + return true; +} + +void testAdjustPath() +{ + KURL url1("file:///home/kde/"); + url1.adjustPath(0); + check( "adjustPath(0)", url1.path(), "/home/kde/" ); + url1.adjustPath(-1); + check( "adjustPath(-1) removes last slash", url1.path(), "/home/kde" ); + url1.adjustPath(-1); + check( "adjustPath(-1) again", url1.path(), "/home/kde" ); + url1.adjustPath(1); + check( "adjustPath(1)", url1.path(), "/home/kde/" ); + + KURL url2("file:///home/kde//"); + url2.adjustPath(0); + check( "adjustPath(0)", url2.path(), "/home/kde//" ); + url2.adjustPath(-1); + check( "adjustPath(-1) removes all trailing slashes", url2.path(), "/home/kde" ); + url2.adjustPath(1); + check( "adjustPath(1)", url2.path(), "/home/kde/" ); + + KURL ftpurl1("ftp://ftp.kde.org/"); + ftpurl1.adjustPath(0); + check( "adjustPath(0)", ftpurl1.path(), "/" ); + ftpurl1.adjustPath(-1); + check( "adjustPath(-1) preserves last slash", ftpurl1.path(), "/" ); + + KURL ftpurl2("ftp://ftp.kde.org///"); + ftpurl2.adjustPath(0); + check( "adjustPath(0)", ftpurl2.path(), "///" ); + ftpurl2.adjustPath(-1); + check( "adjustPath(-1) removes all but last slash", ftpurl2.path(), "/" ); + ftpurl2.adjustPath(1); + check( "adjustPath(1)", ftpurl2.path(), "/" ); + + // Equivalent tests written by the KDirLister maintainer :) + + KURL u3( QCString("ftp://brade@ftp.kde.org///") ); + u3.adjustPath(-1); + check("KURL::adjustPath()", u3.url(), "ftp://brade@ftp.kde.org/"); + + KURL u4( QCString("ftp://brade@ftp.kde.org/kde///") ); + u4.adjustPath(-1); + check("KURL::adjustPath()", u4.url(), "ftp://brade@ftp.kde.org/kde"); + + // applying adjustPath(-1) twice should not yield two different urls + // (follows from the above test) + KURL u5 = u4; + u5.adjustPath(-1); + check("KURL::adjustPath()", u5.url(), u4.url()); +} + +int main(int argc, char *argv[]) +{ + KApplication::disableAutoDcopRegistration(); + KCmdLineArgs::init( argc, argv, "kurltest", 0, 0, 0, 0 ); + KApplication app( false, false ); + + KURL::List lst; + + KURL emptyURL; + check( "KURL::isMalformed()", emptyURL.isMalformed() ? "TRUE":"FALSE", "TRUE"); + check( "KURL::isValid()", emptyURL.isValid() ? "TRUE":"FALSE", "FALSE"); + check( "KURL::isEmpty()", emptyURL.isEmpty() ? "TRUE":"FALSE", "TRUE"); + check( "prettyURL()", emptyURL.prettyURL(), ""); + check( "isLocalFile()", emptyURL.isLocalFile()?"TRUE":"FALSE", "FALSE" ); + + emptyURL = ""; + check( "KURL::isMalformed()", emptyURL.isMalformed() ? "TRUE":"FALSE", "TRUE"); + check( "KURL::isValid()", emptyURL.isValid() ? "TRUE":"FALSE", "FALSE"); + check( "KURL::isEmpty()", emptyURL.isEmpty() ? "TRUE":"FALSE", "TRUE"); + + KURL fileURL = "file:/"; + check( "KURL::isEmpty()", fileURL.isEmpty() ? "TRUE":"FALSE", "FALSE"); + + fileURL = "file:///"; + check( "KURL::isEmpty()", fileURL.isEmpty() ? "TRUE":"FALSE", "FALSE"); + + KURL baseURL ("hTTp://www.foo.bar:80" ); + check( "KURL::isValid()", baseURL.isValid() ? "TRUE":"FALSE", "TRUE"); + check( "KURL::protocol()", baseURL.protocol(), "http"); // lowercase + KURL url1 ( baseURL, "//www1.foo.bar" ); + check( "KURL::host()", url1.host(), "www1.foo.bar"); + check( "KURL::url()", url1.url(), "http://www1.foo.bar"); + + baseURL = "http://www.Abc.de"; + check( "KURL::host() is lowercase", baseURL.host(), "www.abc.de"); + baseURL = "donkey://Abc/DE"; + check( "KURL::host() is lowercase", baseURL.host(), "abc"); + + baseURL = "http://www.foo.bar"; + KURL rel_url( baseURL, "/top//test/../test1/file.html" ); + check( "KURL::url()", rel_url.url(), "http://www.foo.bar/top//test1/file.html" ); + + + baseURL = "http://www.foo.bar/top//test2/file2.html"; + check( "KURL::url()", baseURL.url(), "http://www.foo.bar/top//test2/file2.html" ); + + baseURL = "file:/usr/local/src/kde2/////kdelibs/kio"; + check( "KURL::url()", baseURL.url(), "file:///usr/local/src/kde2/////kdelibs/kio" ); + + baseURL = "http://www.foo.bar"; + KURL rel_url2( baseURL, "mailto:bastian@kde.org" ); + check( "KURL::url()", rel_url2.url(), "mailto:bastian@kde.org" ); + + baseURL = "mailto:bastian@kde.org?subject=hello"; + check( "KURL::url()", baseURL.url(), "mailto:bastian@kde.org?subject=hello" ); + + baseURL = "file:/usr/local/src/kde2/kdelibs/kio/"; + KURL url2( baseURL, "../../////kdebase/konqueror" ); + check( "KURL::url()", url2.url(), "file:///usr/local/src/kde2/////kdebase/konqueror" ); + + QString u1 = "file:/home/dfaure/my#myref"; + url1 = u1; + check("KURL::url()", url1.url(), "file:///home/dfaure/my#myref"); + check("KURL::hasRef()", url1.hasRef() ? "yes" : "no", "yes"); + check("KURL::hasHTMLRef()", url1.hasHTMLRef() ? "yes" : "no", "yes"); + check("KURL::hasSubURL()", url1.hasSubURL() ? "yes" : "no", "no"); + check("KURL::htmlRef()", url1.htmlRef(), "myref"); + check("KURL::upURL()", url1.upURL().url(), "file:///home/dfaure/"); + + u1 = "file:/home/dfaure/my#%2f"; + url1 = u1; + check("KURL::url()", url1.url(), "file:///home/dfaure/my#%2f"); + check("KURL::hasRef()", url1.hasRef() ? "yes" : "no", "yes"); + check("KURL::hasHTMLRef()", url1.hasHTMLRef() ? "yes" : "no", "yes"); + check("KURL::hasSubURL()", url1.hasSubURL() ? "yes" : "no", "no"); + check("KURL::encodedHtmlRef()", url1.ref(), "%2f"); + check("KURL::htmlRef()", url1.htmlRef(), "/"); + + url1 = KURL(url1, "#%6a"); + check("KURL::url()", url1.url(), "file:///home/dfaure/my#%6a"); + check("KURL::hasRef()", url1.hasRef() ? "yes" : "no", "yes"); + check("KURL::hasHTMLRef()", url1.hasHTMLRef() ? "yes" : "no", "yes"); + check("KURL::hasSubURL()", url1.hasSubURL() ? "yes" : "no", "no"); + check("KURL::encodedHtmlRef()", url1.ref(), "%6a"); + check("KURL::htmlRef()", url1.htmlRef(), "j"); + + KURL dxOffEagle( KURL("http://something/other.html"), "newpage.html?[{\"foo: bar\"}]" ); + check("isValid", dxOffEagle.isValid() ? "OK" : "KO", "OK"); + check("url", dxOffEagle.url(), QString("http://something/newpage.html?[{\"foo:%20bar\"}]") ); + + KURL javascript( KURL("javascript:window.location+\"__flashplugin_unique__\"") ); + check("isValid", javascript.isValid() ? "OK" : "KO", "OK"); + check("url", javascript.url(), QString("javascript:window.location+\"__flashplugin_unique__\"") ); + + + u1 = "file:///home/dfaure/my#myref"; + url1 = u1; + check("KURL::url()", url1.url(), "file:///home/dfaure/my#myref"); + check("KURL::hasRef()", url1.hasRef() ? "yes" : "no", "yes"); + check("KURL::hasHTMLRef()", url1.hasHTMLRef() ? "yes" : "no", "yes"); + check("KURL::hasSubURL()", url1.hasSubURL() ? "yes" : "no", "no"); + check("KURL::htmlRef()", url1.htmlRef(), "myref"); + check("KURL::upURL()", url1.upURL().url(), "file:///home/dfaure/"); + + url1 = "gg:www.kde.org"; + check("KURL::isValid()", url1.isValid()?"TRUE":"FALSE", "TRUE" ); + + url1= "KDE"; + check("KURL::isValid()", url1.isValid()?"TRUE":"FALSE", "FALSE" ); + + url1= "$HOME/.kde/share/config"; + check("KURL::isValid()", url1.isValid()?"TRUE":"FALSE", "FALSE" ); + + u1 = "file:/opt/kde2/qt2/doc/html/showimg-main-cpp.html#QObject::connect"; + url1 = u1; + check("KURL::url()", url1.url(), "file:///opt/kde2/qt2/doc/html/showimg-main-cpp.html#QObject::connect"); + check("KURL::hasRef()", url1.hasRef() ? "yes" : "no", "yes"); + check("KURL::hasHTMLRef()", url1.hasHTMLRef() ? "yes" : "no", "yes"); + check("KURL::htmlRef()", url1.htmlRef(), "QObject::connect"); + check("KURL::hasSubURL()", url1.hasSubURL() ? "yes" : "no", "no"); + check("KURL::upURL()", url1.upURL().url(), "file:///opt/kde2/qt2/doc/html/"); + + url1 = KURL( QCString( "http://www.kde.org/foo.cgi?foo=bar" ) ); + check("query", url1.query(), "?foo=bar" ); + url1.setQuery( "toto=titi&kde=rocks" ); + check("query", url1.query(), "?toto=titi&kde=rocks" ); + url1.setQuery( "?kde=rocks&a=b" ); + check("query", url1.query(), "?kde=rocks&a=b" ); + url1.setQuery( "?" ); + check("setQuery(\"?\") -> query", url1.query(), "?" ); + url1.setQuery( "" ); + check("setQuery(\"\") -> query", url1.query(), "?" ); + url1.setQuery( QString::null ); + check("setQuery(QString::null) -> query", url1.query(), QString::null ); + + u1 = "file:///opt/kde2/qt2/doc/html/showimg-main-cpp.html#QObject::connect"; + url1 = u1; + check("KURL::url()", url1.url(), "file:///opt/kde2/qt2/doc/html/showimg-main-cpp.html#QObject::connect"); + check("KURL::hasRef()", url1.hasRef() ? "yes" : "no", "yes"); + check("KURL::hasHTMLRef()", url1.hasHTMLRef() ? "yes" : "no", "yes"); + check("KURL::htmlRef()", url1.htmlRef(), "QObject::connect"); + check("KURL::hasSubURL()", url1.hasSubURL() ? "yes" : "no", "no"); + check("KURL::upURL()", url1.upURL().url(), "file:///opt/kde2/qt2/doc/html/"); + + u1 = "file:/opt/kde2/qt2/doc/html/showimg-main-cpp.html#QObject:connect"; + url1 = u1; + check("KURL::url()", url1.url(), "file:///opt/kde2/qt2/doc/html/showimg-main-cpp.html#QObject:connect"); + check("KURL::hasRef()", url1.hasRef() ? "yes" : "no", "yes"); + check("KURL::hasHTMLRef()", url1.hasHTMLRef() ? "yes" : "no", "yes"); + check("KURL::htmlRef()", url1.htmlRef(), "QObject:connect"); + check("KURL::hasSubURL()", url1.hasSubURL() ? "yes" : "no", "no"); + check("KURL::upURL()", url1.upURL().url(), "file:///opt/kde2/qt2/doc/html/"); + + u1 = "file:/home/dfaure/my%20tar%20file.tgz#gzip:/#tar:/#myref"; + url1 = u1; + check("KURL::url()", url1.url(), "file:///home/dfaure/my%20tar%20file.tgz#gzip:/#tar:/#myref"); + check("KURL::hasRef()", url1.hasRef() ? "yes" : "no", "yes"); + check("KURL::isLocalFile()", url1.isLocalFile() ? "yes" : "no", "no"); // Not strictly local! + //check("KURL::hasHTMLRef()", url1.hasHTMLRef() ? "yes" : "no", "yes"); + check("KURL::hasSubURL()", url1.hasSubURL() ? "yes" : "no", "yes"); + //check("KURL::htmlRef()", url1.htmlRef(), "myref"); + check("KURL::upURL()", url1.upURL().url(), "file:///home/dfaure/"); + + u1 = "error:/?error=14&errText=Unknown%20host%20asdfu.adgi.sdfgoi#http://asdfu.adgi.sdfgoi"; + url1 = u1; + check("KURL::url()", url1.url(), "error:/?error=14&errText=Unknown%20host%20asdfu.adgi.sdfgoi#http://asdfu.adgi.sdfgoi"); + check("KURL::hasSubURL()", url1.hasSubURL() ? "yes" : "no", "yes"); + check("KURL::hasRef()", url1.hasRef() ? "yes" : "no", "yes"); + check("KURL::isLocalFile()", url1.isLocalFile() ? "yes" : "no", "no"); + check("KURL::hasHTMLRef()", url1.hasHTMLRef() ? "yes" : "no", "no"); + //check("KURL::htmlRef()", url1.htmlRef(), "myref"); + + u1 = "file:/home/dfaure/my%20tar%20file.tgz#gzip:/#tar:/"; + url1 = u1; + check("KURL::url()", url1.url(), "file:///home/dfaure/my%20tar%20file.tgz#gzip:/#tar:/"); + check("KURL::hasRef()", url1.hasRef() ? "yes" : "no", "yes"); + check("KURL::hasHTMLRef()", url1.hasHTMLRef() ? "yes" : "no", "no"); + check("KURL::htmlRef()", url1.htmlRef(), ""); + check("KURL::hasSubURL()", url1.hasSubURL() ? "yes" : "no", "yes"); + check("KURL::upURL()", url1.upURL().url(), "file:///home/dfaure/"); + + u1 = "file:///home/dfaure/my%20tar%20file.tgz#gzip:/#tar:/"; + url1 = u1; + check("KURL::url()", url1.url(), "file:///home/dfaure/my%20tar%20file.tgz#gzip:/#tar:/"); + check("KURL::hasRef()", url1.hasRef() ? "yes" : "no", "yes"); + check("KURL::hasHTMLRef()", url1.hasHTMLRef() ? "yes" : "no", "no"); + check("KURL::htmlRef()", url1.htmlRef(), ""); + check("KURL::hasSubURL()", url1.hasSubURL() ? "yes" : "no", "yes"); + check("KURL::upURL()", url1.upURL().url(), "file:///home/dfaure/"); + +#if 0 +// This URL is broken, '#' should be escaped. + u1 = "file:/home/dfaure/cdrdao-1.1.5/dao/#CdrDriver.cc#"; + url1 = u1; + check("KURL::url()", url1.url(), "file:///home/dfaure/cdrdao-1.1.5/dao/#CdrDriver.cc#"); + check("KURL::hasRef()", url1.hasRef() ? "yes" : "no", "no"); + check("KURL::hasHTMLRef()", url1.hasHTMLRef() ? "yes" : "no", "no"); + check("KURL::htmlRef()", url1.htmlRef(), ""); + check("KURL::hasSubURL()", url1.hasSubURL() ? "yes" : "no", "yes"); + check("KURL::prettyURL()", url1.upURL().url(), "file:///home/dfaure/cdrdao-1.1.5/dao/#CdrDriver.cc#"); +#endif + + u1 = "file:/home/dfaure/my%20tar%20file.tgz#gzip:/#tar:/README"; + url1 = u1; + check("KURL::url()", url1.url(), "file:///home/dfaure/my%20tar%20file.tgz#gzip:/#tar:/README"); + check("KURL::hasRef()", url1.hasRef() ? "yes" : "no", "yes"); + check("KURL::hasHTMLRef()", url1.hasHTMLRef() ? "yes" : "no", "no"); + check("KURL::htmlRef()", url1.htmlRef(), ""); + check("KURL::hasSubURL()", url1.hasSubURL() ? "yes" : "no", "yes"); + check("KURL::upURL()", url1.upURL().url(), "file:///home/dfaure/my%20tar%20file.tgz#gzip:/#tar:/"); + + KURL notPretty("http://ferret.lmh.ox.ac.uk/%7Ekdecvs/"); + check("KURL::prettyURL()", notPretty.prettyURL(), "http://ferret.lmh.ox.ac.uk/~kdecvs/"); + KURL notPretty2("file:/home/test/directory%20with%20spaces"); + check("KURL::prettyURL()", notPretty2.prettyURL(), "file:///home/test/directory with spaces"); + KURL notPretty3("fish://foo/%23README%23"); + check("KURL::prettyURL()", notPretty3.prettyURL(), "fish://foo/%23README%23"); + KURL url15581("http://alain.knaff.linux.lu/bug-reports/kde/spaces in url.html"); + check("KURL::prettyURL()", url15581.prettyURL(), "http://alain.knaff.linux.lu/bug-reports/kde/spaces in url.html"); + check("KURL::url()", url15581.url(), "http://alain.knaff.linux.lu/bug-reports/kde/spaces%20in%20url.html"); + KURL url15582("http://alain.knaff.linux.lu/bug-reports/kde/percentage%in%url.html"); + check("KURL::prettyURL()", url15582.prettyURL(), "http://alain.knaff.linux.lu/bug-reports/kde/percentage%in%url.html"); + check("KURL::url()", url15582.url(), "http://alain.knaff.linux.lu/bug-reports/kde/percentage%25in%25url.html"); + + KURL longUserName("http://thisisaverylongusername@foobar.com/"); + check("KURL::prettyURL()", longUserName.prettyURL(), "http://thisisaverylongusername@foobar.com/"); + check("KURL(KURL::prettyURL())", KURL(longUserName.prettyURL()).url(), "http://thisisaverylongusername@foobar.com/"); + + KURL whitespaceInUser("http://google.com%20%20%20@foobar.com/"); + check("KURL::prettyURL()", whitespaceInUser.prettyURL(), "http://google.com%20%20%20@foobar.com/"); + + KURL whitespaceInPath("http://www.google.com/foo%20bar/"); + check("KURL::prettyURL()", whitespaceInPath.prettyURL(), "http://www.google.com/foo bar/"); + + KURL whitespaceInPath2("http://www.google.com/foo%20%20%20%20%20%20%20bar/"); + check("KURL::prettyURL()", whitespaceInPath2.prettyURL(), + "http://www.google.com/foo%20%20%20%20%20%20 bar/"); + + KURL carsten; + carsten.setPath("/home/gis/src/kde/kdelibs/kfile/.#kfiledetailview.cpp.1.18"); + check("KURL::path()", carsten.path(), "/home/gis/src/kde/kdelibs/kfile/.#kfiledetailview.cpp.1.18"); + + KURL charles; + charles.setPath( "/home/charles/foo%20moo" ); + check("KURL::path()", charles.path(), "/home/charles/foo%20moo"); + KURL charles2("file:/home/charles/foo%20moo"); + check("KURL::path()", charles2.path(), "/home/charles/foo moo"); + + KURL udir; + printf("\n* Empty URL\n"); + check("KURL::url()", udir.url(), QString::null); + check("KURL::isEmpty()", udir.isEmpty() ? "ok" : "ko", "ok"); + check("KURL::isValid()", udir.isValid() ? "ok" : "ko", "ko"); + udir = udir.upURL(); + check("KURL::upURL()", udir.upURL().isEmpty() ? "ok" : "ko", "ok"); + + udir.setPath("/home/dfaure/file.txt"); + printf("\n* URL is %s\n",udir.url().ascii()); + check("KURL::path()", udir.path(), "/home/dfaure/file.txt"); + check("KURL::url()", udir.url(), "file:///home/dfaure/file.txt"); + check("KURL::directory(false,false)", udir.directory(false,false), "/home/dfaure/"); + check("KURL::directory(true,false)", udir.directory(true,false), "/home/dfaure"); + + KURL u2( QCString("/home/dfaure/") ); + printf("\n* URL is %s\n",u2.url().ascii()); + // not ignoring trailing slash + check("KURL::directory(false,false)", u2.directory(false,false), "/home/dfaure/"); + check("KURL::directory(true,false)", u2.directory(true,false), "/home/dfaure"); + // ignoring trailing slash + check("KURL::directory(false,true)", u2.directory(false,true), "/home/"); + check("KURL::directory(true,true)", u2.directory(true,true), "/home"); + + // cleanPath() tests (before cd() since cd uses that) + u2.cleanPath(); + check("cleanPath(false)", u2.url(), "file:///home/dfaure/"); + u2.addPath( "/..//foo" ); + check("addPath", u2.url(), "file:///home/dfaure/..//foo"); + u2.cleanPath(false); + check("cleanPath()", u2.url(), "file:///home//foo"); + u2.cleanPath(true); + check("cleanPath()", u2.url(), "file:///home/foo"); + + u2.cd(".."); + check("KURL::cd(\"..\")", u2.url(), "file:///home"); + u2.cd("thomas"); + check("KURL::cd(\"thomas\")", u2.url(), "file:///home/thomas"); + u2.cd("../"); + check("KURL::cd(\"../\")", u2.url(), "file:///home/"); + u2.cd("/opt/kde/bin/"); + check("KURL::cd(\"/opt/kde/bin/\")", u2.url(), "file:///opt/kde/bin/"); + u2 = "ftp://ftp.kde.org/"; + printf("\n* URL is %s\n",u2.url().ascii()); + u2.cd("pub"); + check("KURL::cd(\"pub\")", u2.url(), "ftp://ftp.kde.org/pub"); + u2 = u2.upURL(); + check("KURL::upURL()", u2.url(), "ftp://ftp.kde.org/"); + u2 = u1; + printf("\n* URL is %s\n",u2.url().ascii()); + // setFileName + u2.setFileName( "myfile.txt" ); + check("KURL::setFileName()", u2.url(), "file:///home/dfaure/myfile.txt"); + u2.setFileName( "myotherfile.txt" ); + check("KURL::setFileName()", u2.url(), "file:///home/dfaure/myotherfile.txt"); + // more tricky, renaming a directory (kpropsdlg.cc, line ~ 238) + QString tmpurl = "file:/home/dfaure/myolddir/"; + if ( tmpurl.at(tmpurl.length() - 1) == '/') + // It's a directory, so strip the trailing slash first + tmpurl.truncate( tmpurl.length() - 1); + KURL newUrl = tmpurl; + newUrl.setFileName( "mynewdir" ); + check("KURL::setFileName() special", newUrl.url(), "file:///home/dfaure/mynewdir"); + // addPath tests + newUrl.addPath( "subdir" ); + check("KURL::addPath(\"subdir\")", newUrl.url(), "file:///home/dfaure/mynewdir/subdir"); + newUrl.addPath( "/foo/" ); + check("KURL::addPath(\"/foo/\")", newUrl.url(), "file:///home/dfaure/mynewdir/subdir/foo/"); + u2 = "http://www.kde.org"; // no path + u2.addPath( "subdir" ); + check("KURL::addPath(\"subdir\")", u2.url(), "http://www.kde.org/subdir"); + u2.addPath( "" ); + check("KURL::addPath(\"subdir\")", u2.url(), "http://www.kde.org/subdir"); // unchanged + + // even more tricky + u2 = "print:/specials/Print%20To%20File%20(PDF%2FAcrobat)"; + printf("\n* URL is %s\n",u2.url().ascii()); + check("KURL::path()", u2.path(), "/specials/Print To File (PDF/Acrobat)"); + check("KURL::fileName()", u2.fileName(), "Print To File (PDF/Acrobat)"); + u2.setFileName( "" ); + check("KURL::setFileName()", u2.url(), "print:/specials/"); + + u2 = "file:/specials/Print"; + printf("\n* URL is %s\n",u2.url().ascii()); + check("KURL::path()", u2.path(), "/specials/Print"); + check("KURL::fileName()", u2.fileName(), "Print"); + u2.setFileName( "" ); + check("KURL::setFileName()", u2.url(), "file:///specials/"); + + const char * u6 = "ftp://host/dir1/dir2/myfile.txt"; + printf("\n* URL is %s\n",u6); + check("KURL::hasSubURL()", KURL(u6).hasSubURL() ? "yes" : "no", "no"); + lst.clear(); + lst = KURL::split( KURL(u6) ); + check("KURL::split()", lst.count()==1 ? "1" : "error", "1"); + check("KURL::split()", lst.first().url(), "ftp://host/dir1/dir2/myfile.txt"); + // cdUp code + KURL lastUrl = lst.last(); + QString dir = lastUrl.directory( true, true ); + check( "KURL::directory(true,true)", dir, "/dir1/dir2"); + + /// Comparisons + QString ucmp1 = "ftp://ftp.de.kde.org/dir"; + QString ucmp2 = "ftp://ftp.de.kde.org/dir/"; + check("urlcmp(only slash difference)", urlcmp(ucmp1,ucmp2)?"ko":"ok","ok"); + check("urlcmp(only slash difference, ignore_trailing)", urlcmp(ucmp1,ucmp2,true,false)?"ok":"ko","ok"); + QString ucmp3 = "ftp://ftp.de.kde.org/dir/#"; + check("urlcmp(only hash difference)", urlcmp(ucmp2,ucmp3)?"ko":"ok","ok"); + check("urlcmp(only hash difference, ignore_ref)", urlcmp(ucmp2,ucmp3,false,true)?"ok":"ko","ok"); + check("urlcmp(slash and hash difference, ignore_trailing, ignore_ref)", urlcmp(ucmp2,ucmp3,true,true)?"ok":"ko","ok"); + check("urlcmp(empty, empty)", urlcmp("","",false,true)?"ok":"ko","ok"); + check("urlcmp(empty, empty)", urlcmp("","")?"ok":"ko","ok"); + check("urlcmp(empty, not empty)", urlcmp("",ucmp1)?"ok":"ko","ko"); + check("urlcmp(empty, not empty)", urlcmp("",ucmp1,false,true)?"ok":"ko","ko"); + check("urlcmp(malformed, not empty)", urlcmp("file",ucmp1)?"ok":"ko","ko"); + check("urlcmp(malformed, not empty)", urlcmp("file",ucmp1,false,true)?"ok":"ko","ko"); + + KURL ftpUrl ( "ftp://ftp.de.kde.org" ); + printf("\n* URL is %s\n",ftpUrl.url().latin1()); + check("KURL::path()", ftpUrl.path(), QString::null); + ftpUrl = "ftp://ftp.de.kde.org/"; + check("KURL::isParentOf()", ftpUrl.isParentOf( "ftp://ftp.de.kde.org/host/subdir/") ? "yes" : "no", "yes"); + ftpUrl = "ftp://ftp/host/subdir/"; + check("KURL::isParentOf()", ftpUrl.isParentOf( "ftp://ftp/host/subdir/") ? "yes" : "no", "yes"); + check("KURL::isParentOf()", ftpUrl.isParentOf( "ftp://ftp/host/subdir") ? "yes" : "no", "yes"); + check("KURL::isParentOf()", ftpUrl.isParentOf( "ftp://ftp/host/subdi") ? "yes" : "no", "no"); + check("KURL::isParentOf()", ftpUrl.isParentOf( "ftp://ftp/host/subdir/blah/") ? "yes" : "no", "yes"); + check("KURL::isParentOf()", ftpUrl.isParentOf( "ftp://ftp/blah/subdir") ? "yes" : "no", "no"); + check("KURL::isParentOf()", ftpUrl.isParentOf( "file:////ftp/host/subdir/") ? "yes" : "no", "no"); + check("KURL::isParentOf()", ftpUrl.isParentOf( "ftp://ftp/host/subdir/subsub") ? "yes" : "no", "yes"); + + // WABA: The following tests are to test the handling of relative URLs as + // found on web-pages. + + KURL waba1( "http://www.website.com/directory/?hello#ref" ); + { + KURL waba2( waba1, "relative.html"); + check("http: Relative URL, single file", waba2.url(), "http://www.website.com/directory/relative.html"); + } + { + KURL waba2( waba1, "../relative.html"); + check("http: Relative URL, single file, directory up", waba2.url(), "http://www.website.com/relative.html"); + } + { + KURL waba2( waba1, "down/relative.html"); + check("http: Relative URL, single file, directory down", waba2.url(), "http://www.website.com/directory/down/relative.html"); + } + { + KURL waba2( waba1, "/down/relative.html"); + check("http: Relative URL, full path", waba2.url(), "http://www.website.com/down/relative.html"); + } + { + KURL waba2( waba1, "//www.kde.org/relative.html"); + check("http: Relative URL, with host", waba2.url(), "http://www.kde.org/relative.html"); + } + { + KURL waba2( waba1, "relative.html?query=test&name=harry"); + check("http: Relative URL, with query", waba2.url(), "http://www.website.com/directory/relative.html?query=test&name=harry"); + waba2.removeQueryItem("query"); + check("http: Removing query item", waba2.url(), "http://www.website.com/directory/relative.html?name=harry"); + waba2.addQueryItem("age", "18"); + check("http: Adding query item", waba2.url(), "http://www.website.com/directory/relative.html?name=harry&age=18"); + waba2.addQueryItem("age", "21"); + check("http: Adding query item", waba2.url(), "http://www.website.com/directory/relative.html?name=harry&age=18&age=21"); + waba2.addQueryItem("fullname", "Harry Potter"); + check("http: Adding query item", waba2.url(), "http://www.website.com/directory/relative.html?name=harry&age=18&age=21&fullname=Harry%20Potter"); + } + { + KURL waba2( waba1, "?query=test&name=harry"); + check("http: Relative URL, with query and no filename", waba2.url(), "http://www.website.com/directory/?query=test&name=harry"); + } + { + KURL waba2( waba1, "relative.html#with_reference"); + check("http: Relative URL, with reference", waba2.url(), "http://www.website.com/directory/relative.html#with_reference"); + } + { + KURL waba2( waba1, "#"); + check("http: Relative URL, with empty reference", waba2.url(), "http://www.website.com/directory/?hello#"); + } + { + KURL waba2( waba1, ""); + check("http: Empty relative URL", waba2.url(), "http://www.website.com/directory/?hello#ref"); + } + { + KURL base( "http://faure@www.kde.org" ); // no path + KURL waba2( base, "filename.html"); + check("http: Relative URL, orig URL had no path", waba2.url(), "http://faure@www.kde.org/filename.html"); + } + { + KURL base( "http://faure:pass@www.kde.org:81?query" ); + KURL rel1( base, "http://www.kde.org/bleh/"); // same host + check("http: Relative URL, orig URL had username", rel1.url(), "http://faure:pass@www.kde.org/bleh/"); + KURL rel2( base, "http://www.yahoo.org"); // different host + check("http: Relative URL, orig URL had username", rel2.url(), "http://www.yahoo.org"); + } + + waba1 = "http://www.website.com/directory/filename?bla#blub"; + { + KURL waba2( waba1, "relative.html"); + check("http: Relative URL, single file", waba2.url(), "http://www.website.com/directory/relative.html"); + } + { + KURL waba2( waba1, "../relative.html"); + check("http: Relative URL, single file, directory up", waba2.url(), "http://www.website.com/relative.html"); + } + { + KURL waba2( waba1, "down/relative.html"); + check("http: Relative URL, single file, directory down", waba2.url(), "http://www.website.com/directory/down/relative.html"); + } + { + KURL waba2( waba1, "/down/relative.html"); + check("http: Relative URL, full path", waba2.url(), "http://www.website.com/down/relative.html"); + } + { + KURL waba2( waba1, "relative.html?query=test&name=harry"); + check("http: Relative URL, with query", waba2.url(), "http://www.website.com/directory/relative.html?query=test&name=harry"); + } + { + KURL waba2( waba1, "?query=test&name=harry"); + check("http: Relative URL, with query and no filename", waba2.url(), "http://www.website.com/directory/filename?query=test&name=harry"); + } + { + KURL waba2( waba1, "relative.html#with_reference"); + check("http: Relative URL, with reference", waba2.url(), "http://www.website.com/directory/relative.html#with_reference"); + } + { + KURL waba2( waba1, "http:/relative.html"); // "rfc 1606 loophole" + check("http: Strange relative URL", waba2.url(), "http://www.website.com/relative.html"); + } + waba1.setUser("waldo"); + check("http: Set user", waba1.url(), "http://waldo@www.website.com/directory/filename?bla#blub"); + waba1.setUser("waldo/bastian"); + check("http: Set user with slash in it", waba1.url(), "http://waldo%2Fbastian@www.website.com/directory/filename?bla#blub"); + waba1.setRef( QString::null ); + waba1.setPass( "pass" ); + waba1.setDirectory( "/foo" ); + waba1.setProtocol( "https" ); + waba1.setHost( "web.com" ); + waba1.setPort( 881 ); + check("http: setRef/setPass/setDirectory/setHost/setPort", waba1.url(), "https://waldo%2Fbastian:pass@web.com:881/foo/?bla"); + waba1.setDirectory( "/foo/" ); + check("http: setDirectory #2", waba1.url(), "https://waldo%2Fbastian:pass@web.com:881/foo/?bla"); + + // Empty queries should be preserved! + waba1 = "http://www.kde.org/cgi/test.cgi?"; + check("http: URL with empty query string", waba1.url(), + "http://www.kde.org/cgi/test.cgi?"); + + // Empty references should be preserved + waba1 = "http://www.kde.org/cgi/test.cgi#"; + check("http: URL with empty reference string", waba1.url(), + "http://www.kde.org/cgi/test.cgi#"); + check("hasRef()", waba1.hasRef()?"true":"false","true"); + check("hasHTMLRef()", waba1.hasHTMLRef()?"true":"false","true"); + check("encodedHtmlRef()", waba1.encodedHtmlRef(),QString::null); + + // URLs who forgot to encode spaces in the query. + waba1 = "http://www.kde.org/cgi/test.cgi?hello=My Value"; + check("http: URL with incorrect encoded query", waba1.url(), + "http://www.kde.org/cgi/test.cgi?hello=My%20Value"); + + // URL with ':' in query (':' should NOT be encoded!) + waba1.setQuery("hello:My Value"); + check("http: URL with ':' in query", waba1.url(), + "http://www.kde.org/cgi/test.cgi?hello:My%20Value"); + check("upURL() removes query", waba1.upURL().url(), + "http://www.kde.org/cgi/test.cgi"); + + // URLs who forgot to encode spaces in the query. + waba1 = "http://www.kde.org/cgi/test.cgi?hello=My Value+20"; + check("http: URL with incorrect encoded query", waba1.url(), + "http://www.kde.org/cgi/test.cgi?hello=My%20Value+20"); + + // Urls without path (BR21387) + waba1 = "http://meine.db24.de?link=home_c_login_login"; + check("http: URL with empty path string", waba1.url(), + "http://meine.db24.de?link=home_c_login_login"); + check("http: URL with empty path string path", waba1.path(), + ""); + check("http: URL with empty path string query", waba1.query(), + "?link=home_c_login_login"); + + waba1 = "http://a:389?b=c"; + check( "http: URL with port, query, and empty path; url", waba1.url(), "http://a:389?b=c" ); + check( "http: URL with port, query, and empty path; host", waba1.host(), "a" ); + check( "http: URL with port, query, and empty path; port", QString::number( waba1.port() ), "389" ); + check( "http: URL with port, query, and empty path; path", waba1.path(), "" ); + check( "http: URL with port, query, and empty path; query", waba1.query(), "?b=c" ); + + // Urls without path (BR21387) + waba1 = "http://meine.db24.de#link=home_c_login_login"; + check("http: URL with empty path string", waba1.url(), + "http://meine.db24.de#link=home_c_login_login"); + check("http: URL with empty path string path", waba1.path(), + ""); + + waba1 = "http://www.meinestadt.de&url_plain=http"; + check("http: URL with empty path string", waba1.host(), + "www.meinestadt.de&url_plain=http"); + check("http: URL with empty path string", waba1.htmlURL(), + "http://www.meinestadt.de&url_plain=http"); + + check("http: URL with empty path string", waba1.path(), + ""); + + waba1 = "http://a:389#b=c"; + check( "http: URL with port, ref, and empty path; url", waba1.url(), "http://a:389#b=c" ); + check( "http: URL with port, ref, and empty path; host", waba1.host(), "a" ); + check( "http: URL with port, ref, and empty path; port", QString::number( waba1.port() ), "389" ); + check( "http: URL with port, ref, and empty path; path", waba1.path(), "" ); + check( "http: URL with port, ref, and empty path; ref", waba1.ref(), "b=c" ); + check( "http: URL with port, ref, and empty path; query", waba1.query(), "" ); + + // IPV6 + waba1 = "http://[::FFFF:129.144.52.38]:81/index.html"; + check("http: IPV6 host", waba1.host(), + "::ffff:129.144.52.38"); + check("http: IPV6 port", QString("%1").arg(waba1.port()), + "81"); + + // IPV6 + waba1 = "http://waba:pass@[::FFFF:129.144.52.38]:81/index.html"; + check("http: IPV6 host", waba1.host(), + "::ffff:129.144.52.38"); + check("http: IPV6 host", waba1.user(), + "waba"); + check("http: IPV6 host", waba1.pass(), + "pass"); + check("http: IPV6 port", QString("%1").arg(waba1.port()), + "81"); + + // IPV6 + waba1 = "http://www.kde.org/cgi/test.cgi"; + waba1.setHost("::ffff:129.144.52.38"); + check("http: IPV6 host", waba1.url(), + "http://[::ffff:129.144.52.38]/cgi/test.cgi"); + waba1 = "http://[::ffff:129.144.52.38]/cgi/test.cgi"; + assert( waba1.isValid() ); + + // IPV6 without path + waba1 = "http://[::ffff:129.144.52.38]?query"; + assert( waba1.isValid() ); + check("http: IPV6 without path", waba1.url(), + "http://[::ffff:129.144.52.38]?query"); + check("http: IPV6 without path; query", waba1.query(), + "?query"); + waba1 = "http://[::ffff:129.144.52.38]#ref"; + assert( waba1.isValid() ); + check("http: IPV6 without path", waba1.url(), + "http://[::ffff:129.144.52.38]#ref"); + check("http: IPV6 without path; ref", waba1.ref(), + "ref"); + // IPV6 without path but with a port + waba1 = "http://[::ffff:129.144.52.38]:81?query"; + assert( waba1.isValid() ); + check("http: IPV6 without path", waba1.url(), + "http://[::ffff:129.144.52.38]:81?query"); + check("http: IPV6 without path; port", QString::number( waba1.port() ), "81" ); + check("http: IPV6 without path; query", waba1.query(), "?query"); + waba1 = "http://[::ffff:129.144.52.38]:81#ref"; + assert( waba1.isValid() ); + check("http: IPV6 without path", waba1.url(), + "http://[::ffff:129.144.52.38]:81#ref"); + check("http: IPV6 without path; port", QString::number( waba1.port() ), "81" ); + check("http: IPV6 without path; ref", waba1.ref(), "ref"); + + // Streaming operators + KURL origURL( "http://www.website.com/directory/?#ref" ); + waba1 = "http://[::ffff:129.144.52.38]:81?query"; + QByteArray buffer; + { + QDataStream stream( buffer, IO_WriteOnly ); + stream << origURL + << KURL( "file:" ) // an invalid one + << waba1; // the IPv6 one + } + { + QDataStream stream( buffer, IO_ReadOnly ); + KURL restoredURL; + stream >> restoredURL; + check( "Streaming valid URL", origURL.url(), restoredURL.url() ); + stream >> restoredURL; + check( "Streaming invalid URL", restoredURL.isValid()?"valid":"malformed", "malformed" ); + check( "Streaming invalid URL", restoredURL.url(), "file:" ); + stream >> restoredURL; + check( "Streaming ipv6 URL with query", restoredURL.url(), waba1.url() ); + } + + // Broken stuff + waba1 = "file:a"; + check("Broken stuff #1 path", waba1.path(), "a"); + check("Broken stuff #1 fileName(false)", waba1.fileName(false), "a"); + check("Broken stuff #1 fileName(true)", waba1.fileName(true), "a"); + check("Broken stuff #1 directory(false, false)", waba1.directory(false, false), ""); + check("Broken stuff #1 directory(true, false)", waba1.directory(true, false), ""); + check("Broken stuff #1 directory(false, true)", waba1.directory(true, true), ""); + + waba1 = "file:a/"; + check("Broken stuff #2 path", waba1.path(), "a/"); + check("Broken stuff #2 fileName(false)", waba1.fileName(false), ""); + check("Broken stuff #2 fileName(true)", waba1.fileName(true), "a"); + check("Broken stuff #2 directory(false, false)", waba1.directory(false, false), "a/"); + check("Broken stuff #2 directory(true, false)", waba1.directory(true, false), "a"); + check("Broken stuff #2 directory(false, true)", waba1.directory(true, true), ""); + + waba1 = "file:"; + check("Broken stuff #3 empty", waba1.isEmpty()?"EMPTY":"NOT", "NOT"); + check("Broken stuff #3 valid", waba1.isValid()?"VALID":"MALFORMED", "MALFORMED"); + check("Broken stuff #3 path", waba1.path(), ""); + check("Broken stuff #3 fileName(false)", waba1.fileName(false), ""); + check("Broken stuff #3 fileName(true)", waba1.fileName(true), ""); + check("Broken stuff #3 directory(false, false)", waba1.directory(false, false), ""); + check("Broken stuff #3 directory(true, false)", waba1.directory(true, false), ""); + check("Broken stuff #3 directory(false, true)", waba1.directory(true, true), ""); + KURL broken; + broken.setPath( QString::null ); + check("Broken stuff #4 empty", broken.isEmpty()?"EMPTY":"NOT", "NOT"); + // It's valid: because isValid refers to parsing, not to what happens afterwards. + check("Broken stuff #4 valid", broken.isValid()?"VALID":"MALFORMED", "VALID"); + check("Broken stuff #4 path", broken.path(), ""); + broken = "file://"; // just because coolo wondered + check("Broken stuff #5 empty", broken.isEmpty()?"EMPTY":"NOT", "NOT"); + check("Broken stuff #5 valid", broken.isValid()?"VALID":"MALFORMED", "MALFORMED"); + check("Broken stuff #5 path", broken.path(), ""); + broken = "file"; + check("Broken stuff #6 valid", broken.isValid()?"VALID":"MALFORMED", "MALFORMED"); + broken = "/"; + check("Broken stuff #7 valid", broken.isValid()?"VALID":"MALFORMED", "VALID"); + check("Broken stuff #7 path", broken.path(), "/" ); + check("Broken stuff #7 url", broken.url(), "file:///" ); + check("Broken stuff #7 file", broken.protocol(), "file" ); + + broken = "LABEL=USB_STICK"; // 71430, can we use KURL for this? + check("Broken stuff #6 valid", broken.isValid()?"VALID":"MALFORMED", "MALFORMED"); + check("Broken stuff #6 empty", broken.isEmpty()?"EMPTY":"NOT", "NOT"); + check("Broken stuff #6 path", broken.path(), ""); + +#if 0 // BROKEN? + // UNC like names + KURL unc1("FILE://localhost/home/root"); + check("UNC, with localhost", unc1.path(), "/home/root"); + check("UNC, with localhost", unc1.url(), "file:///home/root"); +#endif + KURL unc2("file:///home/root"); + check("UNC, with empty host", unc2.path(), "/home/root"); + check("UNC, with empty host", unc2.url(), "file:///home/root"); + + { + KURL unc3("FILE://remotehost/home/root"); +#if 0 // BROKEN? + check("UNC, with remote host", unc3.path(), "//remotehost/home/root"); +#endif + check("UNC, with remote host", unc3.url(), "file://remotehost/home/root"); + KURL url2("file://atlas/dfaure"); + check("KURL::host()", url2.host(), "atlas"); + check("KURL::path()", url2.path(), "/dfaure"); + //check("KURL::path()", url3.path(), "//atlas/dfaure"); // says Waba + //KURL url3("file:////atlas/dfaure"); + //check("KURL::path()", url3.path(), "//atlas/dfaure"); // says Waba + + KURL url4(url2, "//remotehost/home/root"); + check("KURL::host()", url4.host(), "remotehost"); + check("KURL::path()", url4.path(), "/home/root"); + } + + KURL umail1 ( "mailto:faure@kde.org" ); + check("mailto: URL, general form", umail1.protocol(), "mailto"); + check("mailto: URL, general form", umail1.path(), "faure@kde.org"); + check("mailto: URL, is relative", KURL::isRelativeURL("mailto:faure@kde.org") ? "true" : "false", "false"); + KURL umail2 ( "mailto:Faure David <faure@kde.org>" ); + check("mailto: URL, general form", umail2.protocol(), "mailto"); + check("mailto: URL, general form", umail2.path(), "Faure David <faure@kde.org>"); + check("isRelativeURL(\"mailto:faure@kde.org\")", KURL::isRelativeURL("mailto:faure@kde.org") ? "yes" : "no", "no"); + KURL umail3 ( "mailto:" ); + check("mailto: invalid URL", umail3.isValid()?"valid":"malformed", "malformed"); + + check("man: URL, is relative", KURL::isRelativeURL("man:mmap") ? "true" : "false", "false"); + check("javascript: URL, is relative", KURL::isRelativeURL("javascript:doSomething()") ? "true" : "false", "false"); + // more isRelative + check("file: URL, is relative", KURL::isRelativeURL("file:///blah") ? "true" : "false", "false"); + check("/path, is relative", KURL::isRelativeURL("/path") ? "true" : "false", "true"); // arguable, but necessary for KURL( baseURL, "//www1.foo.bar" ); + check("something, is relative", KURL::isRelativeURL("something") ? "true" : "false", "true"); + KURL about("about:konqueror"); + check("about:",about.path(),"konqueror"); + + KURL ulong("https://swww.gad.de:443/servlet/CookieAccepted?MAIL=s@gad.de&VER=25901"); + check("host",ulong.host(),"swww.gad.de"); + check("path",ulong.path(),"/servlet/CookieAccepted"); + +#if QT_VERSION < 300 + qt_set_locale_codec( KGlobal::charsets()->codecForName( "iso-8859-1" ) ); +#else + QTextCodec::setCodecForLocale( KGlobal::charsets()->codecForName( "iso-8859-1" ) ); +#endif + QString raw = "data:text/html,%00%2540%00"; + check("data URL: encode-decode of %00", KURL(raw).url(), raw ); + + // UTF8 tests + KURL uloc("/home/dfaure/konqtests/Matériel"); + check("url",uloc.url().latin1(),"file:///home/dfaure/konqtests/Mat%E9riel"); + check("pretty",uloc.prettyURL(),"file:///home/dfaure/konqtests/Matériel"); // escaping the letter would be correct too + check("pretty + strip",uloc.prettyURL(0, KURL::StripFileProtocol),"/home/dfaure/konqtests/Matériel"); // escaping the letter would be correct too + // 106 is MIB for UTF-8 + check("UTF8",uloc.url(0, 106),"file:///home/dfaure/konqtests/Mat%C3%A9riel"); + uloc = KURL("file:///home/dfaure/konqtests/Mat%C3%A9riel", 106); + check("UTF8 path", uloc.path(), "/home/dfaure/konqtests/Matériel"); + check("encodedPathAndQuery", uloc.encodedPathAndQuery(), "/home/dfaure/konqtests/Mat%E9riel"); + + // fromPathOrURL tests + uloc = KURL::fromPathOrURL( "/home/dfaure/konqtests/Mat%E9riel" ); + check("fromPathOrURL path", uloc.path(), "/home/dfaure/konqtests/Mat%E9riel"); + uloc = KURL::fromPathOrURL( "http://www.kde.org" ); + check("pathOrURL url", uloc.pathOrURL(), uloc.url() ); + uloc = KURL::fromPathOrURL( "www.kde.org" ); + check("fromPathOrURL malformed", uloc.isValid()?"valid":"malformed", "malformed"); + uloc = KURL::fromPathOrURL( "index.html" ); + check("fromPathOrURL malformed", uloc.isValid()?"valid":"malformed", "malformed"); + uloc = KURL::fromPathOrURL( "" ); + check("fromPathOrURL malformed", uloc.isValid()?"valid":"malformed", "malformed"); + + // pathOrURL tests + uloc = KURL::fromPathOrURL( "/home/dfaure/konqtests/Mat%E9riel" ); + check("pathOrURL path", uloc.pathOrURL(), uloc.path() ); + uloc = "http://www.kde.org"; + check("pathOrURL url", uloc.url(), "http://www.kde.org"); + uloc = "file:///home/dfaure/konq%20tests/Mat%E9riel#ref"; + check("pathOrURL local file with ref", uloc.pathOrURL(), "file:///home/dfaure/konq tests/Matériel#ref" ); + uloc = "file:///home/dfaure/konq%20tests/Mat%E9riel?query"; + check("pathOrURL local file with query", uloc.pathOrURL(), "file:///home/dfaure/konq tests/Matériel?query" ); + uloc = KURL::fromPathOrURL( "/home/dfaure/file#with#hash" ); + check("pathOrURL local path with #", uloc.pathOrURL(), "/home/dfaure/file#with#hash" ); + + testAdjustPath(); + +#if QT_VERSION < 300 + qt_set_locale_codec( KGlobal::charsets()->codecForName( "koi8-r" ) ); +#else + QTextCodec::setCodecForLocale( KGlobal::charsets()->codecForName( "koi8-r" ) ); +#endif + baseURL = "file:/home/coolo"; + KURL russian = baseURL.directory(false, true) + QString::fromLocal8Bit( "ÆÇÎ7" ); + check( "russian", russian.url(), "file:///home/%C6%C7%CE7" ); + + KURL tobi1("http://some.host.net/path/to/file#fragmentPrecedes?theQuery"); + check("wrong order of query and hypertext reference #1", tobi1.ref(), "fragmentPrecedes"); + check("wrong order of query and hypertext reference #2", tobi1.query(), "?theQuery"); + + tobi1 = "http://host.net/path/?#http://brokenäadsfküpoij31ü029muß2890zupycÜ*!*'O´+ß0i"; + check("zero-length query",tobi1.query(),"?"); + + tobi1 = "http://host.net/path/#no-query"; + check("no query", tobi1.query(),""); + check("encodedPathAndQuery", tobi1.encodedPathAndQuery(), "/path/"); + + tobi1 = "http://host.net/path?myfirstquery#andsomeReference"; + tobi1.setEncodedPathAndQuery("another/path/?another&query"); + check("setEncodedPathAndQuery test#1", tobi1.query(), "?another&query"); + check("setEncodedPathAndQuery test#2", tobi1.path(), "another/path/"); // with trailing slash + check("encodedPathAndQuery", tobi1.encodedPathAndQuery(), "another/path/?another&query"); + tobi1.setEncodedPathAndQuery("another/path?another&query"); + check("setEncodedPathAndQuery test#1", tobi1.query(), "?another&query"); + check("setEncodedPathAndQuery test#2", tobi1.path(), "another/path"); // without trailing slash + check("encodedPathAndQuery", tobi1.encodedPathAndQuery(), "another/path?another&query"); + + KURL theKow = "http://www.google.de/search?q=frerich&hlx=xx&hl=de&empty=&lr=lang+de&test=%2B%20%3A%25"; + check("queryItem (first item)", theKow.queryItem("q"), "frerich"); + check("queryItem (middle item)", theKow.queryItem("hl"), "de"); + check("queryItem (last item)", theKow.queryItem("lr"), "lang de"); + check("queryItem (invalid item)", theKow.queryItem("InterstellarCounselor"), QString::null); + check("queryItem (empty item)", theKow.queryItem("empty"), ""); + check("queryItem (item with encoded chars)", theKow.queryItem("test"), "+ :%"); + check("encodedPathAndQuery", theKow.encodedPathAndQuery(), "/search?q=frerich&hlx=xx&hl=de&empty=&lr=lang+de&test=%2B%20%3A%25"); + + // checks for queryItems(), which returns a QMap<QString,QString>: + KURL queryUrl( "mailto:Marc%20Mutz%20%3cmutz@kde.org%3E?" + "Subject=subscribe+me&" + "body=subscribe+mutz%40kde.org&" + "Cc=majordomo%40lists.kde.org" ); + check("queryItems (c.s. keys)", + QStringList(queryUrl.queryItems().keys()).join(", "), + "Cc, Subject, body" ); + check("queryItems (c.i.s. keys)", + QStringList(queryUrl.queryItems(KURL::CaseInsensitiveKeys).keys()).join(", "), + "body, cc, subject" ); + check("queryItems (values; c.s. keys)", + QStringList(queryUrl.queryItems().values()).join(", "), + "majordomo@lists.kde.org, subscribe me, subscribe mutz@kde.org" ); + check("queryItems (values; c.i.s. keys)", + QStringList(queryUrl.queryItems(KURL::CaseInsensitiveKeys).values()).join(", "), + "subscribe mutz@kde.org, majordomo@lists.kde.org, subscribe me" ); + + KURL umlaut1("http://www.clever-tanken.de/liste.asp?ort=N%FCrnberg&typ=Diesel"); + check("umlaut1.url()", umlaut1.url(), "http://www.clever-tanken.de/liste.asp?ort=N%FCrnberg&typ=Diesel"); + + KURL umlaut2("http://www.clever-tanken.de/liste.asp?ort=N%FCrnberg&typ=Diesel", 106); + check("umlaut2.url()", umlaut2.url(), "http://www.clever-tanken.de/liste.asp?ort=N%FCrnberg&typ=Diesel"); + + // Needed for #49616 + check( "encode_string('C++')", KURL::encode_string( "C++" ), "C%2B%2B" ); + check( "decode_string('C%2B%2B')", KURL::decode_string( "C%2B%2B" ), "C++" ); + check( "decode_string('C%00A')", KURL::decode_string( "C%00%A" ), "C" ); // we stop at %00 + + check( "encode_string('%')", KURL::encode_string( "%" ), "%25" ); + check( "encode_string(':')", KURL::encode_string( ":" ), "%3A" ); + + KURL amantia( "http://%E1.foo.de" ); + check("amantia.isValid()", amantia.isValid() ? "true" : "false", "true"); +#ifdef HAVE_IDNA_H + check("amantia.url()", amantia.url(), "http://xn--80a.foo.de"); // Non-ascii is allowed in IDN domain names. +#else + check("amantia.url()", amantia.url(), "http://?.foo.de"); // why not +#endif + + KURL thiago( QString::fromUtf8( "http://\303\244.de" ) ); // ä in utf8 + check("thiago.isValid()", thiago.isValid() ? "true" : "false", "true"); +#ifdef HAVE_IDNA_H + check("thiago.url()", thiago.url(), "http://xn--4ca.de"); // Non-ascii is allowed in IDN domain names. +#else + check("thiago.url()", thiago.url(), QString::fromUtf8( "http://\303\244.de" ) ); +#endif + + + KURL smb("smb://domain;username:password@server/share"); + check("smb.isValid()", smb.isValid() ? "true" : "false", "true"); + check("smb.user()", smb.user(), "domain;username"); + smb = "smb:/"; + check("smb:/", smb.isValid()?"VALID":"MALFORMED", "VALID"); + smb = "smb://"; // kurl.cpp rev 1.106 + check("smb://", smb.isValid()?"VALID":"MALFORMED", "MALFORMED"); + smb = "smb://host"; + check("smb://host", smb.isValid()?"VALID":"MALFORMED", "VALID"); + smb = "smb:///"; + check("smb:///", smb.isValid()?"VALID":"MALFORMED", "VALID"); + + KURL weird; + weird = "http://strange<hostname>/"; + check("weird.isValid()", weird.isValid() ? "true" : "false", "false"); + + weird = "http://strange<username>@strange<hostname>/"; + check("weird.isValid()", weird.isValid() ? "true" : "false", "false"); + + weird = "http://strange<username>@ok_hostname/"; + check("weird.isValid()", weird.isValid() ? "true" : "false", "true"); + check("weird.host()", weird.host(), "ok_hostname"); + + weird = "http://strange;hostname/"; + check("weird.isValid()", weird.isValid() ? "true" : "false", "false"); + + weird = "http://strange;username@strange;hostname/"; + check("weird.isValid()", weird.isValid() ? "true" : "false", "false"); + + weird = "http://strange;username@ok_hostname/"; + check("weird.isValid()", weird.isValid() ? "true" : "false", "true"); + check("weird.host()", weird.host(), "ok_hostname"); + + weird = "http://strange;username:password@strange;hostname/"; + check("weird.isValid()", weird.isValid() ? "true" : "false", "false"); + + weird = "http://strange;username:password@ok_hostname/"; + check("weird.isValid()", weird.isValid() ? "true" : "false", "true"); + check("weird.host()", weird.host(), "ok_hostname"); + + weird = "http://[strange;hostname]/"; + check("weird.isValid()", weird.isValid() ? "true" : "false", "false"); + + weird = "http://[::fff:1:23]/"; + check("weird.isValid()", weird.isValid() ? "true" : "false", "true"); + check("weird.host()", weird.host(), "::fff:1:23"); + + KURL com1("http://server.com/dir/", "."); + check("com1.url()", com1.url(), "http://server.com/dir/"); + + KURL com2("http://server.com/dir/blubb/", "blah/"); + check("com2.url()", com2.url(), "http://server.com/dir/blubb/blah/"); + + KURL utf8_1("audiocd:/By%20Name/15%20Geantra%C3%AE.wav", 106); + check("utf8_1.fileName()", utf8_1.fileName(), QString::fromLatin1("15 Geantraî.wav")); + + KURL utf8_2("audiocd:/By%20Name/15%2fGeantra%C3%AE.wav", 106); + check("utf8_2.fileName()", utf8_2.fileName(), QString::fromLatin1("15/Geantraî.wav")); + + KURL url_newline_1("http://www.foo.bar/foo/bar\ngnork"); + check("url_newline_1.url()", url_newline_1.url(), QString::fromLatin1("http://www.foo.bar/foo/bar%0Agnork")); + + KURL url_newline_2("http://www.foo.bar/foo?bar\ngnork"); + check("url_newline_2.url()", url_newline_2.url(), QString::fromLatin1("http://www.foo.bar/foo?bar%0Agnork")); + + KURL local_file_1("file://localhost/my/file"); + check("local_file_1.isLocalFile()", local_file_1.isLocalFile() ? "true" : "false", "true"); + + KURL local_file_2("file://www.kde.org/my/file"); + check("local_file_2.isLocalFile()", local_file_2.isLocalFile() ? "true" : "false", "false"); + + KURL local_file_3; + local_file_3.setHost(getenv("HOSTNAME")); + local_file_3.setPath("/my/file"); + printf("\nURL=%s\n", local_file_3.url().latin1()); + check("local_file_3.isLocalFile()", local_file_3.isLocalFile() ? "true" : "false", "true"); + + KURL local_file_4("file:///my/file"); + check("local_file_4.isLocalFile()", local_file_4.isLocalFile() ? "true" : "false", "true"); + + KURL local_file_5; + local_file_5.setPath("/foo?bar"); + check("local_file_5.url()", local_file_5.url(), "file:///foo%3Fbar"); + + QString basePath = "/home/bastian"; + + check("relativePath(\"/home/bastian\", \"/home/bastian\")", KURL::relativePath(basePath, "/home/bastian"), "./"); + bool b; + check("relativePath(\"/home/bastian\", \"/home/bastian/src/plugins\")", KURL::relativePath(basePath, "/home/bastian/src/plugins", &b), "./src/plugins"); + check("Is a subdirectory?", b ? "true" : "false", "true"); + check("relativePath(\"/home/bastian\", \"./src/plugins\")", KURL::relativePath(basePath, "./src/plugins"), "./src/plugins"); + check("relativePath(\"/home/bastian\", \"/home/waba/src/plugins\")", KURL::relativePath(basePath, "/home/waba/src/plugins", &b), "../waba/src/plugins"); + check("Is a subdirectory?", b ? "true" : "false", "false"); + check("relativePath(\"/home/bastian\", \"/\")", KURL::relativePath(basePath, "/"), "../../"); + + check("relativePath(\"/\", \"/\")", KURL::relativePath("/", "/"), "./"); + check("relativePath(\"/\", \"/home/bastian\")", KURL::relativePath("/", "/home/bastian"), "./home/bastian"); + check("relativePath(\"\", \"/home/bastian\")", KURL::relativePath("", "/home/bastian"), "/home/bastian"); + + baseURL = "http://www.kde.org/index.html"; + check("relativeURL(\"http://www.kde.org/index.html\", \"http://www.kde.org/index.html#help\")", KURL::relativeURL(baseURL, "http://www.kde.org/index.html#help"), "#help"); + check("relativeURL(\"http://www.kde.org/index.html\", \"http://www.kde.org/index.html?help=true\")", KURL::relativeURL(baseURL, "http://www.kde.org/index.html?help=true"), "index.html?help=true"); + check("relativeURL(\"http://www.kde.org/index.html\", \"http://www.kde.org/contact.html\")", KURL::relativeURL(baseURL, "http://www.kde.org/contact.html"), "contact.html"); + check("relativeURL(\"http://www.kde.org/index.html\", \"ftp://ftp.kde.org/pub/kde\")", KURL::relativeURL(baseURL, "ftp://ftp.kde.org/pub/kde"), "ftp://ftp.kde.org/pub/kde"); + check("relativeURL(\"http://www.kde.org/index.html\", \"http://www.kde.org/index.html\")", KURL::relativeURL(baseURL, "http://www.kde.org/index.html"), "./"); + + baseURL = "http://www.kde.org/info/index.html"; + check("relativeURL(\"http://www.kde.org/info/index.html\", \"http://www.kde.org/bugs/contact.html\")", KURL::relativeURL(baseURL, "http://www.kde.org/bugs/contact.html"), "../bugs/contact.html"); + + baseURL = "ptal://mlc:usb:PC_970"; + check("isValid()?", baseURL.isValid() ? "true" : "false", "false"); + check("url()", baseURL.url(), "ptal://mlc:usb:PC_970"); + + baseURL = "http://mlc:80/"; + check("isValid()?", baseURL.isValid() ? "true" : "false", "true"); + check("port()?", QString::number(baseURL.port()), "80"); + check("path()?", baseURL.path(), "/"); + + baseURL = "ptal://mlc:usb@PC_970"; // User=mlc, password=usb, host=PC_970 + check("isValid()?", baseURL.isValid() ? "true" : "false", "true"); + check("host()?", baseURL.host(), "pc_970"); + check("user()?", baseURL.user(), "mlc"); + check("pass()?", baseURL.pass(), "usb"); + + weird = "ftp://user%40host.com@ftp.host.com/var/www/"; + check("user()?", weird.user(), "user@host.com" ); + check("host()?", weird.host(), "ftp.host.com" ); + KURL up = weird.upURL(); + check("KURL::upURL()", up.url(), "ftp://user%40host.com@ftp.host.com/var/"); + up = up.upURL(); + check("KURL::upURL()", up.url(), "ftp://user%40host.com@ftp.host.com/"); + up = up.upURL(); + check("KURL::upURL()", up.url(), "ftp://user%40host.com@ftp.host.com/"); // unchanged + + KURL ldap = "ldap://host.com:6666/o=University%20of%20Michigan,c=US??sub?(cn=Babs%20Jensen)"; + check("host()?", ldap.host(), "host.com"); + check("port()?", QString("%1").arg(ldap.port()), "6666"); + check("path()?", ldap.path(), "/o=University of Michigan,c=US"); + check("query()?", ldap.query(), "??sub?(cn=Babs%20Jensen)"); + check("url()?", ldap.url(), "ldap://host.com:6666/o=University%20of%20Michigan,c=US??sub?(cn=Babs%20Jensen)"); + ldap.setQuery("??sub?(cn=Karl%20Marx)"); + check("query()?", ldap.query(), "??sub?(cn=Karl%20Marx)"); + check("url()?", ldap.url(), "ldap://host.com:6666/o=University%20of%20Michigan,c=US??sub?(cn=Karl%20Marx)"); + + KURL leo = "data:text/html,http://www.invalid/"; + check("data URL: isValid", leo.isValid()?"valid":"malformed", "valid" ); + check("data URL: protocol", leo.protocol(), "data" ); + check("data URL: url", leo.url(), "data:text/html,http://www.invalid/" ); + check("data URL: path", leo.path(), "text/html,http://www.invalid/" ); + + // URI Mode tests + url1 = "http://www.foobar.com/"; + check("KURL(\"http://www.foobar.com/\").uriMode()", QString::number(url1.uriMode()), QString::number(KURL::URL)); + url1 = "mailto:user@host.com"; + check("KURL(\"mailto:user@host.com\").uriMode()", QString::number(url1.uriMode()), QString::number(KURL::Mailto)); + check("KURL(\"mailto:user@host.com\").url()", url1.url(), "mailto:user@host.com"); + check("KURL(\"mailto:user@host.com\").url(0, 106)", url1.url(0, 106), "mailto:user@host.com"); + url1 = "data:text/plain,foobar?gazonk=flarp"; + check("KURL(\"data:text/plain,foobar?gazonk=flarp\").uriMode()", QString::number(url1.uriMode()), QString::number(KURL::RawURI)); + check("KURL(\"data:text/plain,foobar?gazonk=flarp\").path()", url1.path(), "text/plain,foobar?gazonk=flarp"); + url1 = "mailto:User@Host.COM?subject=Hello"; + check("KURL(\"mailto:User@Host.COM?subject=Hello\").path()", url1.path(), "User@host.com"); + + KURL emptyUserTest1("http://www.foobar.com/"); + KURL emptyUserTest2("http://www.foobar.com/"); + emptyUserTest2.setUser(""); + check("Empty vs. null fields: user", emptyUserTest1==emptyUserTest2?"TRUE":"FALSE","TRUE"); + emptyUserTest2.setPass(""); + check("Empty vs. null fields: password", emptyUserTest1==emptyUserTest2?"TRUE":"FALSE","TRUE"); + + printf("\nTest OK !\n"); +} + diff --git a/kdecore/tests/kxerrorhandlertest.cpp b/kdecore/tests/kxerrorhandlertest.cpp new file mode 100644 index 000000000..cb97be170 --- /dev/null +++ b/kdecore/tests/kxerrorhandlertest.cpp @@ -0,0 +1,54 @@ +#include <qwidget.h> +#include <X11/Xlib.h> +#include <iostream> +using namespace std; + +#include <kxerrorhandler.h> + +int handler1( Display*, XErrorEvent* e ) + { + cout << "ERR1:" << e->resourceid << ":" << (int)e->error_code << ":" << (int)e->request_code << ":" << e->serial << endl; + return 1; + } + +bool handler3( int request, int error_code, unsigned long resourceid ) + { + cout << "ERR3:" << resourceid << ":" << error_code << ":" << request << endl; + return true; + } + +int main() + { + Display* dpy = XOpenDisplay( NULL ); + XSetWindowAttributes attrs; + Window w = XCreateWindow( dpy, DefaultRootWindow( dpy ), 0, 0, 100, 100, 0, CopyFromParent, CopyFromParent, + CopyFromParent, 0, &attrs ); + cout << w << ":" << XNextRequest( dpy ) << endl; + XMapWindow( dpy, w ); + ++w; +// XSetInputFocus( dpy, w, RevertToParent, CurrentTime ); + { + KXErrorHandler handle1( handler1, dpy ); + cout << w << ":" << XNextRequest( dpy ) << endl; + XMapWindow( dpy, w ); + XWindowAttributes attr; + { + KXErrorHandler handle2( dpy ); + XGetWindowAttributes(dpy, w, &attr); + { + KXErrorHandler handle3( handler3, dpy ); + XSetInputFocus( dpy, w, RevertToParent, CurrentTime ); + cout << "WAS3:" << handle3.error( /*false*/ true ) << endl; + } + cout << "WAS2:" << handle2.error( false ) << endl; + } +// XSync( dpy, False ); + cout << "WAS1:" << handle1.error( false ) << endl; + } + for(;;) + { + XEvent ev; + XNextEvent( dpy, &ev ); + } + XCloseDisplay( dpy ); + } diff --git a/kdecore/tests/startserviceby.cpp b/kdecore/tests/startserviceby.cpp new file mode 100644 index 000000000..4411eed53 --- /dev/null +++ b/kdecore/tests/startserviceby.cpp @@ -0,0 +1,41 @@ +/* This file is part of the KDE libraries + Copyright (c) 1999 Waldo Bastian <bastian@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2 as published by the Free Software Foundation. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "kapplication.h" +#include <stdio.h> + +#include <kcmdlineargs.h> +#include <kaboutdata.h> +#include <kglobalsettings.h> +#include <kdebug.h> + +int +main(int argc, char *argv[]) +{ + KAboutData about("kapptest", "kapptest", "version"); + KCmdLineArgs::init(argc, argv, &about); + + KApplication a; + + QString error; + QCString dcopService; + int pid; + a.startServiceByDesktopName( "kaddressbook", QString::null, &error, &dcopService, &pid ); + kdDebug() << "Started. error=" << error << " dcopService=" << dcopService << " pid=" << pid << endl; + a.exec(); +} diff --git a/kdecore/tests/testqtargs.cpp b/kdecore/tests/testqtargs.cpp new file mode 100644 index 000000000..918b07735 --- /dev/null +++ b/kdecore/tests/testqtargs.cpp @@ -0,0 +1,104 @@ +/* + testqtargs -- is there really a bug in KCmdLineArgs or am I on crack? + + I used the following compile options: + + g++ -g -Wall -o testqtargs testqtargs.cpp -I/usr/X11R6/include \ + -I/opt/qt3/include -I/opt/kde3/include -L/usr/X11R6/lib -L/opt/qt3/lib \ + -L/opt/kde3/lib -lqt -lkdecore + + if invoked like this ./testqtargs --bg blue --caption something --hello hi + + The program should list argv[] then produce output like this: + + qt arg[0] = background + qt arg[1] = blue + arg bg = blue + arg caption = something + arg hello = hi + + Instead for me it prints: + + qt arg[0] = -background + qt arg[1] = blue + arg caption = something + arg hello = hi + + See the extra dash in qt arg[0]? I believe that is the cause of the problem. + --bg is aliased to --background but If you try it with --background or + -background, you get the same thing. + + in kdecore/kapplication.cpp, KCmdLineOption qt_options is defined and used + by the static method Kapplication::addCmdLineOptions to add the Qt options + but its' entries look like this: + + { "background <color>", I18N_NOOP("sets the default background color and an\n +application palette (light and dark shades are\ncalculated)."), 0}, + + it looks for "background" instead of "-background" so never find the arg. + + Software: g++ 2.95, kdelibs from CVS Jan 28, Qt 3.01 + OS: Debian GNU/Linux 3.0 (sid) + + +*/ + +#include <kapplication.h> +#include <kcmdlineargs.h> +#include <kaboutdata.h> +#include <klocale.h> + +static const KCmdLineOptions options[] = +{ + { "hello ", I18N_NOOP("Says hello"), 0 }, + KCmdLineLastOption +}; + +int main(int argc, char *argv[]) +{ + for (int i = 0; i < argc; i++) + { + qDebug("argv[%d] = %s", i, argv[i]); + } + KAboutData aboutData( "testqtargs", I18N_NOOP("testqtargs"), + "1.0", I18N_NOOP("testqtargs"), KAboutData::License_GPL, + "", "", "", ""); + + KCmdLineArgs::init(argc, argv, &aboutData); + KCmdLineArgs::addCmdLineOptions(options); + + KCmdLineArgs *qtargs = KCmdLineArgs::parsedArgs("qt"); + for (int i = 0; i < qtargs->count(); i++) + { + qDebug("qt arg[%d] = %s", i, qtargs->arg(i)); + } + + KApplication app; + + KCmdLineArgs *kdeargs = KCmdLineArgs::parsedArgs("kde"); + KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); + + // An arg set by Qt + if(qtargs->isSet("background")) + { + qDebug("arg bg = %s", (const char*)qtargs->getOption("background")); + } + // An arg set by KDE + if(kdeargs->isSet("caption")) + { + qDebug("arg caption = %s", (const char*)kdeargs->getOption("caption")); + } + // An arg set by us. + if(args->isSet("hello")) + { + qDebug("arg hello = %s", (const char*)args->getOption("hello")); + } + args->clear(); + + QWidget *w = new QWidget(); + app.setMainWidget(w); + w->show(); + + return app.exec(); +} + |