void doClass(ClassModelItem &item) { cout << "(" << item->name().toStdString() << " ("; QListIterator<ClassModelItem> ci(item->classes()); while(ci.hasNext()) { ClassModelItem item = ci.next(); doClass(item); } cout << ") ("; QListIterator<FunctionModelItem> fi(item->functions()); while(fi.hasNext()) { FunctionModelItem item = fi.next(); doFunction(item); } cout << ")"; }
void outputFile(ClassModelItem clazz, FunctionList functions, QList<QPair<QString,QString> > extraFunctions) { // setup QString className = clazz->name(); QString shortName = className.mid(className.lastIndexOf(QRegExp("[A-Z][a-z]*"))).toLower(); QString tstClassName = "tst_" + className; QString indent = " "; QTextStream out(stdout); // Includes out << endl; out << "#include <QtTest/QtTest>" << endl; QString classFileName = clazz->fileName().mid(clazz->fileName().indexOf('/')); if (classFileName[0] == '/') classFileName = classFileName.mid(1); out << "#include <" << classFileName << ">" << endl; // Generate class definition out << endl; out << QString("class %1 : public QObject").arg(tstClassName) << endl; out << "{" << endl; { out << indent << "Q_OBJECT" << endl; out << endl; out << "public slots:" << endl; for(int i = 0; i < extraFunctions.count(); ++i) { out << indent << QString("void %1();").arg(extraFunctions.at(i).first) << endl; } out << endl; out << "private slots:" << endl; out << indent << QString("void %1_data();").arg(className.toLower()) << endl; out << indent << QString("void %1();").arg(className.toLower()) << endl; out << endl; QStringList done; foreach (FunctionModelItem fun, functions) { if (done.contains(fun->name())) continue; out << indent << QString("void %1_data();").arg(fun->name()) << endl; out << indent << QString("void %1();").arg(fun->name()) << endl; done.append(fun->name()); } } out << "};" << endl; // Generate subclass out << endl; out << "// Subclass that exposes the protected functions." << endl; out << "class Sub" + className + " : public " << className << endl; out << "{" << endl; { out << "public:" << endl; foreach (FunctionModelItem fun, functions) { // implement protected or virtual functions if (fun->accessPolicy() != CodeModel::Protected && !fun->isAbstract()) continue; if (fun->isAbstract()) out << indent << QString("// %1::%2 is a pure virtual function.").arg(className).arg(fun->name()) << endl; out << indent << makeFunction(fun, fun->isAbstract() ? "" : "call_") << endl; out << indent << indent << "{ "; { ArgumentList arguments = fun->arguments(); if (!fun->isAbstract()) { QStringList args; for (int j = 0; j < arguments.count(); ++j) { QString arg = arguments[j]->name(); if (arg.isEmpty()) arg = QString("arg%1").arg(j); args += arg; } out << QString("return Sub%1::%2(%3);").arg(className).arg(fun->name()).arg(args.join(", ")); } } out << " }" << endl; out << endl; } } out << "};" << endl; // Generate extra functions for(int i = 0; i < extraFunctions.count(); ++i) { out << endl; out << QString("// %1").arg(extraFunctions.at(i).second) << endl; out << QString("void %1::%2()\n{\n}").arg(tstClassName).arg(extraFunctions.at(i).first) << endl; } QStringList declared; // Make the test that calls every function out << endl; out << QString("void %1::%2_data()\n{\n}\n").arg(tstClassName).arg(className.toLower()) << endl; out << QString("void %1::%2()").arg(tstClassName).arg(className.toLower()) << endl; out << "{" << endl; { out << indent << QString("Sub%1 %2;").arg(className).arg(shortName) << endl; out << "#if 0" << endl; foreach (FunctionModelItem fun, functions) { QStringList args; for (int i = 0; i < fun->arguments().count(); ++i) { QString type= fun->arguments()[i]->type().toString(); args += makeArg(type); } QString returnType = makeArg(fun->type().toString()); out << indent; if (returnType != "void") out << "QCOMPARE("; out << shortName << "."; if (fun->accessPolicy() == CodeModel::Protected) out << "call_"; out << fun->name() << "("; QString functionArgs = args.join(", "); if (functionArgs.endsWith("*")) out << "(" << functionArgs << ")0"; else if (functionArgs == "int") out << "0"; else if (functionArgs == "QString const&") out << "QString()"; else out << functionArgs; out << ")"; if (returnType != "void") { out << ", "; if (returnType == "int") out << "0"; else if (returnType == "int") out << "0"; else out << returnType; out << ")"; } out << ";" << endl; } out << "#endif" << endl; out << indent << "QSKIP(\"Test is not implemented.\", SkipAll);" << endl; }