Esempio n. 1
0
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 << ")";
}
Esempio n. 2
0
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;
    }