--- /dev/null
+#include <QTest>
+#include <QObject>
+#include <qxtmetaobject.h>
+#include <qxtboundcfunction.h>
+#include <QSignalSpy>
+
+void unaryVoidFunction(QObject* obj);
+
+void nullaryVoidFunction() {
+ qDebug() << "If you don't see this, it's broken.";
+}
+
+int nullaryIntFunction()
+{
+ return 5;
+}
+
+int unaryIntFunction(int x)
+{
+ return x * 2;
+}
+
+class QxtMetaObjectTest: public QObject
+{
+ Q_OBJECT
+
+signals:
+ void say(QString);
+ void doit();
+ void success();
+
+public:
+ void unaryVoidFunctionSuccess() {
+ emit success();
+ }
+
+private slots:
+ void readwrite()
+ {
+ QxtMetaObject::connect(this, SIGNAL(doit()), QxtMetaObject::bind(this, SLOT(say(QString)), Q_ARG(QString,"hello")));
+ QSignalSpy spy(this, SIGNAL(say(QString)));
+ emit(doit());
+ QVERIFY2 (spy.count()> 0, "no signal received" );
+ QVERIFY2 (spy.count()< 2, "wtf, two signals received?" );
+
+ QList<QVariant> arguments = spy.takeFirst();
+ QVERIFY2(arguments.at(0).toString()=="hello","argument missmatch");
+
+ QxtBoundFunction* nullaryVoid = QxtMetaObject::bind<void>(qxtFuncPtr(nullaryVoidFunction));
+ QxtBoundFunction* unaryVoid = QxtMetaObject::bind<void, QObject*>(qxtFuncPtr(unaryVoidFunction), Q_ARG(QObject*, this));
+ QxtBoundFunction* nullaryInt = QxtMetaObject::bind<int>(qxtFuncPtr(nullaryIntFunction));
+ QxtBoundFunction* unaryIntFixed = QxtMetaObject::bind<int, int>(qxtFuncPtr(unaryIntFunction), Q_ARG(int, 7));
+ QxtBoundFunction* unaryIntBound = QxtMetaObject::bind<int, int>(qxtFuncPtr(unaryIntFunction), QXT_BIND(1));
+ QVERIFY2(nullaryVoid != 0, "nullaryVoidFunction bind failed");
+ QVERIFY2(unaryVoid != 0, "unaryVoidFunction bind failed");
+ QVERIFY2(nullaryInt != 0, "nullaryIntFunction bind failed");
+ QVERIFY2(unaryIntFixed != 0, "unaryIntFunction bind failed with Q_ARG");
+ QVERIFY2(unaryIntBound != 0, "unaryIntFunction bind failed with QXT_BIND");
+
+ bool ok;
+ ok = nullaryVoid->invoke();
+ QVERIFY2(ok, "nullaryVoid invoke failed");
+
+ QSignalSpy spy2(this, SIGNAL(success()));
+ ok = unaryVoid->invoke(this);
+ QVERIFY2(ok, "unaryVoid invoke failed");
+ QVERIFY2(spy2.count() == 1, "unaryVoid did not emit success");
+
+ int v1 = nullaryIntFunction();
+ int v2 = nullaryInt->invoke<int>();
+ QVERIFY2(v1 == v2, "nullaryInt returned wrong value");
+
+ v1 = unaryIntFunction(7);
+ v2 = unaryIntFixed->invoke<int>();
+ QVERIFY2(v1 == v2, "unaryIntFixed returned wrong value");
+
+ v1 = unaryIntFunction(12);
+ v2 = unaryIntBound->invoke<int>(12);
+ QVERIFY2(v1 == v2, "unaryIntBound returned wrong value");
+
+
+ }
+
+};
+
+void unaryVoidFunction(QObject* obj)
+{
+ QxtMetaObjectTest* o = qobject_cast<QxtMetaObjectTest*>(obj);
+ if(!o) return;
+ o->unaryVoidFunctionSuccess();
+}
+
+
+
+QTEST_MAIN(QxtMetaObjectTest)
+#include "main.moc"
+