void TestAbstractMetaType::testCharType()
{
    const char* cppCode ="char justAtest(); class A {};";
    const char* xmlCode = "<typesystem package=\"Foo\">\
    <primitive-type name='char'/>\
    <value-type name='A' />\
    <function signature='justAtest()' />\
    </typesystem>";
    TestUtil t(cppCode, xmlCode);

    AbstractMetaClassList classes = t.builder()->classes();
    QCOMPARE(classes.size(), 1);
    QCOMPARE(classes.first()->package(), QString("Foo"));

    AbstractMetaFunctionList functions = t.builder()->globalFunctions();
    QCOMPARE(functions.size(), 1);
    AbstractMetaFunction* func = functions.first();
    AbstractMetaType* rtype = func->type();
    // Test properties of const char*
    QVERIFY(rtype);
    QCOMPARE(rtype->package(), QString("Foo"));
    QCOMPARE(rtype->name(), QString("char"));
    QVERIFY(!rtype->isConstant());
    QVERIFY(!rtype->isArray());
    QVERIFY(!rtype->isContainer());
    QVERIFY(!rtype->isObject());
    QVERIFY(rtype->isPrimitive());
    QVERIFY(!rtype->isNativePointer());
    QVERIFY(!rtype->isQObject());
    QVERIFY(!rtype->isReference());
    QVERIFY(!rtype->isValue());
    QVERIFY(!rtype->isValuePointer());
}
示例#2
0
void TestTypeRevision::testRevisionAttr()
{
    const char* cppCode = "class Rev_0 {};"
                          "class Rev_1 {};"
                          "class Rev_2 { public: enum Rev_3 { X }; enum Rev_5 { Y }; };";
    const char* xmlCode = "<typesystem package=\"Foo\">"
                          "<value-type name=\"Rev_0\"/>"
                          "<value-type name=\"Rev_1\" revision=\"1\"/>"
                          "<object-type name=\"Rev_2\" revision=\"2\">"
                          "    <enum-type name=\"Rev_3\" revision=\"3\" flags=\"Flag_4\" flags-revision=\"4\" />"
                          "    <enum-type name=\"Rev_5\" revision=\"5\" flags=\"Flag_5\" />"
                          "</object-type>"
                          "</typesystem>";
    TestUtil t(cppCode, xmlCode);
    AbstractMetaClassList classes = t.builder()->classes();
    AbstractMetaClass* rev0 = classes.findClass("Rev_0");
    QCOMPARE(getTypeRevision(rev0->typeEntry()), 0);

    AbstractMetaClass* rev1 = classes.findClass("Rev_1");
    QCOMPARE(getTypeRevision(rev1->typeEntry()), 1);

    AbstractMetaClass* rev2 = classes.findClass("Rev_2");
    QCOMPARE(getTypeRevision(rev2->typeEntry()), 2);

    AbstractMetaEnum* rev3 = rev2->findEnum("Rev_3");
    QCOMPARE(getTypeRevision(rev3->typeEntry()), 3);
    FlagsTypeEntry* rev4 = rev3->typeEntry()->flags();
    QCOMPARE(getTypeRevision(rev4), 4);
    AbstractMetaEnum* rev5 = rev2->findEnum("Rev_5");
    QCOMPARE(getTypeRevision(rev5->typeEntry()), 5);
    QCOMPARE(getTypeRevision(rev5->typeEntry()->flags()), 5);
}
void TestValueTypeDefaultCtorTag::testValueTypeDefaultCtorTagArgument()
{
    const char* cppCode ="\
    struct A {\
        A(int,int);\
    };\
    struct B {};\
    ";
    const char* xmlCode = "\
    <typesystem package='Foo'>\
        <primitive-type name='int' />\
        <value-type name='A' default-constructor='A(0, 0)' />\
        <value-type name='B' />\
    </typesystem>";
    TestUtil t(cppCode, xmlCode, false);
    AbstractMetaClassList classes = t.builder()->classes();

    AbstractMetaClass* classA = classes.findClass("A");
    QVERIFY(classA);
    QVERIFY(classA->typeEntry()->hasDefaultConstructor());
    QCOMPARE(classA->typeEntry()->defaultConstructor(), QString("A(0, 0)"));

    AbstractMetaClass* classB = classes.findClass("B");
    QVERIFY(classB);
    QVERIFY(!classB->typeEntry()->hasDefaultConstructor());
}
void TestAbstractMetaType::testApiVersionNotSupported()
{
    const char* cppCode ="class object {};";
    const char* xmlCode = "<typesystem package='Foo'>\
        <value-type name='object' since='0.1'/>\
    </typesystem>";
    TestUtil t(cppCode, xmlCode, true, "0.1");

    AbstractMetaClassList classes = t.builder()->classes();
    QCOMPARE(classes.size(), 1);
}
void TestAbstractMetaType::testTypedef()
{
    const char* cppCode ="\
    struct A {\
        void someMethod();\
    };\
    typedef A B;\
    typedef B C;";
    const char* xmlCode = "<typesystem package=\"Foo\">\
    <value-type name='C' />\
    </typesystem>";
    TestUtil t(cppCode, xmlCode);

    AbstractMetaClassList classes = t.builder()->classes();
    QCOMPARE(classes.size(), 1);
    AbstractMetaClass* c = classes.findClass("C");
    QVERIFY(c);
    QVERIFY(c->isTypeAlias());
}
void TestAbstractMetaType::testApiVersionSupported()
{
    const char* cppCode ="class foo {}; class foo2 {};\
                          void justAtest(); void justAtest3();";
    const char* xmlCode = "<typesystem package='Foo'>\
        <value-type name='foo' since='0.1'/>\
        <value-type name='foo2' since='1.0'/>\
        <value-type name='foo3' since='1.1'/>\
        <function signature='justAtest()' since='0.1'/>\
        <function signature='justAtest2()' since='1.1'/>\
        <function signature='justAtest3()'/>\
    </typesystem>";
    TestUtil t(cppCode, xmlCode, false, "1.0");

    AbstractMetaClassList classes = t.builder()->classes();
    QCOMPARE(classes.size(), 2);


    AbstractMetaFunctionList functions = t.builder()->globalFunctions();
    QCOMPARE(functions.size(), 2);
}
void TestPrimitiveTypeTag::testPrimitiveTypeDefaultConstructor()
{
    const char* cppCode ="\
    struct A {};\
    struct B {};\
    ";
    const char* xmlCode = "\
    <typesystem package=\"Foo\"> \
        <primitive-type name='A' default-constructor='A()'/> \
        <object-type name='B' /> \
    </typesystem>";
    TestUtil t(cppCode, xmlCode, false);

    AbstractMetaClassList classes = t.builder()->classes();
    QCOMPARE(classes.count(), 1);
    AbstractMetaClass* classB = classes.findClass("B");
    QVERIFY(classB);

    PrimitiveTypeEntry* typeEntry = TypeDatabase::instance()->findPrimitiveType("A");
    QVERIFY(typeEntry);
    QVERIFY(typeEntry->hasDefaultConstructor());
    QCOMPARE(typeEntry->defaultConstructor(), QString("A()"));
}
示例#8
0
void ClassListGenerator::generate()
{
    QFile f(fileName());
    if (f.open(QFile::WriteOnly)) {
        QTextStream s(&f);

        s << "/****************************************************************************" << endl
          << "**" << endl
          << "** This is a generated file, please don't touch." << endl
          << "**" << endl
          << "****************************************************************************/" << endl << endl;

        s << "/*!" << endl
          << "\\page qtjambi-classes.html" << endl << endl
          << "\\title Qt Jambi's classes" << endl << endl
          << "This is a list of all Qt Jambi classes." << endl << endl
          << "\\table 100%" << endl;

        AbstractMetaClassList classes = Generator::classes();
        qSort(classes.begin(), classes.end(), class_sorter);

        int numColumns = 4;
        int numRows = (classes.size() + numColumns - 1) / numColumns;

        for (int i = 0; i < numRows; ++i) {
            s << endl << "\\row ";
            for (int j=0; j<numColumns; ++j) {
                if (classes.value(i + j * numRows)) {
                    s << "\\o \\l{" << classes.value(i + j * numRows)->qualifiedCppName()
                      << "}{" << classes.value(i + j * numRows)->name() << "} ";
                }
            }

        }

        s << endl << "\\endtable" << endl
          << "*/" << endl;
    }
}
    template<typename T>\
    class A {};\
    \
    class B {};\
    typedef A<B> C;\
    \
    void func(C c);\
    ";
    const char* xmlCode = "<typesystem package=\"Foo\">\
    <container-type name='A' type='list'/>\
    <value-type name='B' />\
    <function signature='func(A&lt;B&gt;)' />\
    </typesystem>";
    TestUtil t(cppCode, xmlCode);

    AbstractMetaClassList classes = t.builder()->classes();
    QCOMPARE(classes.size(), 1);
    AbstractMetaFunctionList functions = t.builder()->globalFunctions();
    QCOMPARE(functions.count(), 1);
    AbstractMetaFunction* function = functions.first();
    AbstractMetaArgumentList args = function->arguments();
    QCOMPARE(args.count(), 1);
    AbstractMetaArgument* arg = args.first();
    AbstractMetaType* metaType = arg->type();
    QCOMPARE(metaType->cppSignature(), QString("A<B >"));
}


void TestAbstractMetaType::testObjectTypeUsedAsValue()
{
    const char* cppCode ="\
示例#10
0
void TestInsertTemplate::testInsertTemplateOnClassInjectCode()
{
    const char* cppCode ="struct A{};";
    const char* xmlCode = "\
    <typesystem package='Foo'>\
        <template name='code_template'>\
        code template content\
        </template>\
        <value-type name='A'>\
            <inject-code class='native'>\
                <insert-template name='code_template'/>\
            </inject-code>\
        </value-type>\
    </typesystem>";
    TestUtil t(cppCode, xmlCode, false);
    AbstractMetaClassList classes = t.builder()->classes();
    QCOMPARE(classes.count(), 1);
    AbstractMetaClass* classA = classes.findClass("A");
    QVERIFY(classA);
    QCOMPARE(classA->typeEntry()->codeSnips().count(), 1);
    QString code = classA->typeEntry()->codeSnips().first().code();
    QVERIFY(code.contains("code template content"));
}

void TestInsertTemplate::testInsertTemplateOnModuleInjectCode()
{
    const char* cppCode ="";
    const char* xmlCode = "\
    <typesystem package='Foo'>\
        <template name='code_template'>\
        code template content\