tests/auto/qscriptvalue/testgen/testgenerator.cpp
changeset 30 5dc02b23752f
parent 18 2f34d5167611
--- a/tests/auto/qscriptvalue/testgen/testgenerator.cpp	Wed Jun 23 19:07:03 2010 +0300
+++ b/tests/auto/qscriptvalue/testgen/testgenerator.cpp	Tue Jul 06 15:10:48 2010 +0300
@@ -50,10 +50,17 @@
 #include <QtCore/qvariant.h>
 #include <QtScript/qscriptvalue.h>
 
-void TestGenerator::save(const QString& data)
+void TestGenerator::save(const QHash<QString, QString>& data)
 {
-    QTextStream out(&m_ofile);
-    out << data;
+    foreach(const QString& name, data.keys()) {
+        QFile ofile(m_opath + "tst_qscriptvalue_generated_" + name + ".cpp");
+        if (!ofile.open(QIODevice::WriteOnly | QIODevice::Text)) {
+            qWarning() << "Can't open output file: " << ofile.fileName();
+            exit(2);
+        }
+        QTextStream out(&ofile);
+        out << data[name];
+    }
 }
 
 static QString escape(QString txt)
@@ -98,6 +105,55 @@
 template<>
 QString typeName<QString>() {return "QString";}
 
+static QString generateLicence()
+{
+    return  "/****************************************************************************\n"
+            "**\n"
+            "** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).\n"
+            "** All rights reserved.\n"
+            "** Contact: Nokia Corporation (qt-info@nokia.com)\n"
+            "**\n"
+            "** This file is part of the test suite of the Qt Toolkit.\n"
+            "**\n"
+            "** $QT_BEGIN_LICENSE:LGPL$\n"
+            "** No Commercial Usage\n"
+            "** This file contains pre-release code and may not be distributed.\n"
+            "** You may use this file in accordance with the terms and conditions\n"
+            "** contained in the Technology Preview License Agreement accompanying\n"
+            "** this package.\n"
+            "**\n"
+            "** GNU Lesser General Public License Usage\n"
+            "** Alternatively, this file may be used under the terms of the GNU Lesser\n"
+            "** General Public License version 2.1 as published by the Free Software\n"
+            "** Foundation and appearing in the file LICENSE.LGPL included in the\n"
+            "** packaging of this file.  Please review the following information to\n"
+            "** ensure the GNU Lesser General Public License version 2.1 requirements\n"
+            "** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n"
+            "**\n"
+            "** In addition, as a special exception, Nokia gives you certain additional\n"
+            "** rights.  These rights are described in the Nokia Qt LGPL Exception\n"
+            "** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.\n"
+            "**\n"
+            "** If you have questions regarding the use of this file, please contact\n"
+            "** Nokia at qt-info@nokia.com.\n"
+            "**\n"
+            "**\n"
+            "**\n"
+            "**\n"
+            "**\n"
+            "**\n"
+            "**\n"
+            "**\n"
+            "** $QT_END_LICENSE$\n"
+            "**\n"
+            "****************************************************************************/\n"
+            "\n"\
+            "/****************************************************************************\n"\
+            "*************** This file has been generated. DO NOT MODIFY! ****************\n"
+            "****************************************************************************/\n\n"\
+            "#include \"tst_qscriptvalue.h\"\n\n";
+}
+
 static QString generateIsXXXDef(const QString& name, const QList<QString>& list)
 {
     static const QString templ("void tst_QScriptValue::%1_initData()\n"\
@@ -106,11 +162,14 @@
                                "    initScriptValues();\n"\
                                "}\n"\
                                "\n"\
+                               "static QString %1_array [] = {%2};\n\n"\
                                "void tst_QScriptValue::%1_makeData(const char* expr)\n"\
                                "{\n"\
                                "    static QSet<QString> %1;\n"\
                                "    if (%1.isEmpty()) {\n"\
-                               "        %1%2\n"\
+                               "        %1.reserve(%3);\n"\
+                               "        for (unsigned i = 0; i < %3; ++i)\n"\
+                               "            %1.insert(%1_array[i]);\n"\
                                "    }\n"\
                                "    newRow(expr) << %1.contains(expr);\n"\
                                "}\n"\
@@ -119,6 +178,7 @@
                                "{\n"\
                                "    QFETCH(bool, expected);\n"\
                                "    QCOMPARE(value.%1(), expected);\n"\
+                               "    QCOMPARE(value.%1(), expected);\n"\
                                "}\n"\
                                "\n"\
                                "DEFINE_TEST_FUNCTION(%1)\n"\
@@ -131,16 +191,14 @@
 
     QString result = templ;
     QStringList set;
-    foreach(QString t, list) {
-        t = escape(t);
-        t.append('\"');
-        t.prepend('\"');
-        set.append(QString(" << "));
-        set.append(t);
-        set.append("\n               ");
+    set.reserve(3 * list.count());
+    foreach(const QString& t, list) {
+        set.append("\n    \"");
+        set.append(escape(t));
+        set.append("\",");
     }
-    set.append(";");
-    return result.arg(name, set.join(QString()));
+
+    return result.arg(name, set.join(QString()), QString::number(list.count()));
 }
 
 template<typename T>
@@ -153,11 +211,15 @@
                                  "    initScriptValues();\n"\
                                  "}\n"\
                                  "\n"\
+                                 "static QString %1_tagArray [] = {%4};\n\n"\
+                                 "static %2 %1_valueArray [] = {%5};\n\n"\
                                  "void tst_QScriptValue::%1_makeData(const char* expr)\n"\
                                  "{\n"\
                                  "    static QHash<QString, %2> %1;\n"\
                                  "    if (%1.isEmpty()) {\n"\
-                                 "%3"\
+                                 "        %1.reserve(%3);\n"\
+                                 "        for (unsigned i = 0; i < %3; ++i)\n"\
+                                 "            %1.insert(%1_tagArray[i], %1_valueArray[i]);\n"\
                                  "    }\n"\
                                  "    newRow(expr) << %1.value(expr);\n"\
                                  "}\n"\
@@ -166,25 +228,33 @@
                                  "{\n"\
                                  "    QFETCH(%2, expected);\n"\
                                  "    QCOMPARE(value.%1(), expected);\n"\
+                                 "    QCOMPARE(value.%1(), expected);\n"\
                                  "}\n"\
                                  "\n"\
                                  "DEFINE_TEST_FUNCTION(%1)\n";
     QString result = templ;
 
     typename QList<QPair<QString, T> >::const_iterator i = list.constBegin();
-    QStringList set;
+    QStringList tagSet, valueSet;
+    tagSet.reserve(list.count());
+    valueSet.reserve(list.count());
+    int tmp = -1;
     for(; i != list.constEnd(); ++i) {
         QPair<QString, T> t = *i;
         t.first = escape(t.first);
-        set.append(QString("        "));
-        set.append(name);
-        set.append(".insert(\"");
-        set.append(t.first);
-        set.append(QString::fromAscii("\", "));
-        set.append(prepareToInsert<T>(t.second));
-        set.append(QString::fromAscii(");\n"));
+        tagSet.append(QString("\n    \""));
+        tagSet.append(t.first);
+        tagSet.append(QString::fromAscii("\","));
+        if (!((++tmp)%2))
+            valueSet.append(QString("\n    "));
+        valueSet.append(prepareToInsert<T>(t.second));
+        valueSet.append(QString::fromAscii(", "));
     }
-    return result.arg(name, typeName<T>(), set.join(QString()));
+    return result.arg(name,
+                      typeName<T>(),
+                      QString::number(list.count()),
+                      tagSet.join(QString()),
+                      valueSet.join(QString()));
 }
 
 
@@ -198,11 +268,15 @@
                                  "    initScriptValues();\n"\
                                  "}\n"\
                                  "\n"\
+                                 "static QString %1_tagArray [] = {%3};\n"\
+                                 "static %2 %1_valueArray [] = {%4};\n"\
                                  "void tst_QScriptValue::%1_makeData(const char* expr)\n"\
                                  "{\n"\
                                  "    static QHash<QString, %2> %1;\n"\
                                  "    if (%1.isEmpty()) {\n"\
-                                 "%3"\
+                                 "        %1.reserve(%5);\n"\
+                                 "        for (unsigned i = 0; i < %5; ++i)\n"\
+                                 "            %1.insert(%1_tagArray[i], %1_valueArray[i]);\n"\
                                  "    }\n"\
                                  "    newRow(expr) << %1.value(expr);\n"\
                                  "}\n"\
@@ -213,26 +287,31 @@
                                  "%666"
                                  "    if (qIsInf(expected)) {\n"\
                                  "        QVERIFY(qIsInf(value.%1()));\n"\
+                                 "        QVERIFY(qIsInf(value.%1()));\n"\
                                  "        return;\n"\
                                  "    }\n"\
                                  "    QCOMPARE(value.%1(), expected);\n"\
+                                 "    QCOMPARE(value.%1(), expected);\n"\
                                  "}\n"\
                                  "\n"\
                                  "DEFINE_TEST_FUNCTION(%1)\n";
     QString result = templ;
 
     QList<QPair<QString, qsreal> >::const_iterator i = list.constBegin();
-    QStringList set;
+    QStringList tagSet, valueSet;
+    tagSet.reserve(list.count());
+    valueSet.reserve(list.count());
+    int tmp = -1;
     for(; i != list.constEnd(); ++i) {
         QPair<QString, qsreal> t = *i;
         t.first = escape(t.first);
-        set.append(QString("        "));
-        set.append(name);
-        set.append(".insert(\"");
-        set.append(t.first);
-        set.append(QString::fromAscii("\", "));
-        set.append(prepareToInsert<qsreal>(t.second));
-        set.append(QString::fromAscii(");\n"));
+        tagSet.append(QString("\n    \""));
+        tagSet.append(t.first);
+        tagSet.append(QString::fromAscii("\","));
+        if (!((++tmp)%10))
+            valueSet.append(QString("\n    "));
+        valueSet.append(prepareToInsert<qsreal>(t.second));
+        valueSet.append(QString::fromAscii(", "));
     }
     // toInteger shouldn't return NaN, so it would be nice to catch the case.
     QString hook;
@@ -243,101 +322,129 @@
         "        return;\n"\
         "    }\n";
     }
-    return result.arg(name, typeName<qsreal>(), set.join(QString()), hook);
+    return result.arg(name,
+          typeName<qsreal>(),
+          tagSet.join(QString()),
+          valueSet.join(QString()),
+          QString::number(list.count()),
+          hook);
 }
 
 template<typename T>
 static QString generateCastDef(const QList<QPair<QString, T> >& list)
 {
     static const QString templ = "\n"\
-                                 "void tst_QScriptValue::qscriptvalue_cast%2_initData()\n"\
+                                 "void tst_QScriptValue::qscriptvalue_cast%1_initData()\n"\
                                  "{\n"\
-                                 "    QTest::addColumn<%2>(\"expected\");\n"\
+                                 "    QTest::addColumn<%1>(\"expected\");\n"\
                                  "    initScriptValues();\n"\
                                  "}\n"\
                                  "\n"\
-                                 "void tst_QScriptValue::qscriptvalue_cast%2_makeData(const char* expr)\n"\
+                                 "static QString qscriptvalue_cast%1_tagArray [] = {%2};\n"\
+                                 "static %1 qscriptvalue_cast%1_valueArray [] = {%3};\n"\
+                                 "void tst_QScriptValue::qscriptvalue_cast%1_makeData(const char* expr)\n"\
                                  "{\n"\
-                                 "    static QHash<QString, %2> value;\n"\
+                                 "    static QHash<QString, %1> value;\n"\
                                  "    if (value.isEmpty()) {\n"\
-                                 "%3"\
+                                 "        value.reserve(%4);\n"\
+                                 "        for (unsigned i = 0; i < %4; ++i)\n"\
+                                 "            value.insert(qscriptvalue_cast%1_tagArray[i], qscriptvalue_cast%1_valueArray[i]);\n"\
                                  "    }\n"\
                                  "    newRow(expr) << value.value(expr);\n"\
                                  "}\n"\
                                  "\n"\
-                                 "void tst_QScriptValue::qscriptvalue_cast%2_test(const char*, const QScriptValue& value)\n"\
+                                 "void tst_QScriptValue::qscriptvalue_cast%1_test(const char*, const QScriptValue& value)\n"\
                                  "{\n"\
-                                 "    QFETCH(%2, expected);\n"\
-                                 "    QCOMPARE(qscriptvalue_cast<%2>(value), expected);\n"\
+                                 "    QFETCH(%1, expected);\n"\
+                                 "    QCOMPARE(qscriptvalue_cast<%1>(value), expected);\n"\
+                                 "    QCOMPARE(qscriptvalue_cast<%1>(value), expected);\n"\
                                  "}\n"\
                                  "\n"\
-                                 "DEFINE_TEST_FUNCTION(qscriptvalue_cast%2)\n";
+                                 "DEFINE_TEST_FUNCTION(qscriptvalue_cast%1)\n";
     QString result = templ;
 
     typename QList<QPair<QString, T> >::const_iterator i = list.constBegin();
-    QStringList set;
+    QStringList tagSet, valueSet;
+    tagSet.reserve(list.count());
+    valueSet.reserve(list.count());
+    int tmp = -1;
     for(; i != list.constEnd(); ++i) {
         QPair<QString, T> t = *i;
         t.first = escape(t.first);
-        set.append(QString("        "));
-        set.append("value.insert(\"");
-        set.append(t.first);
-        set.append(QString::fromAscii("\", "));
-        set.append(prepareToInsert<T>(t.second));
-        set.append(QString::fromAscii(");\n"));
+        tagSet.append(QString("\n    \""));
+        tagSet.append(t.first);
+        tagSet.append(QString::fromAscii("\","));
+        if (!((++tmp)%2))
+            valueSet.append(QString("\n    "));
+        valueSet.append(prepareToInsert<T>(t.second));
+        valueSet.append(QString::fromAscii(", "));
     }
-    return result.arg(typeName<T>(), set.join(QString()));
+    return result.arg(typeName<T>(), tagSet.join(QString()), valueSet.join(QString()), QString::number(list.count()));
 }
 
 template<>
 QString generateCastDef<qsreal>(const QList<QPair<QString, qsreal> >& list)
 {
     static const QString templ = "\n"\
-                                 "void tst_QScriptValue::qscriptvalue_cast%2_initData()\n"\
+                                 "void tst_QScriptValue::qscriptvalue_cast%1_initData()\n"\
                                  "{\n"\
-                                 "    QTest::addColumn<%2>(\"expected\");\n"\
+                                 "    QTest::addColumn<%1>(\"expected\");\n"\
                                  "    initScriptValues();\n"\
                                  "}\n"\
                                  "\n"\
-                                 "void tst_QScriptValue::qscriptvalue_cast%2_makeData(const char* expr)\n"\
+                                 "static QString qscriptvalue_cast%1_tagArray [] = {%2};\n"\
+                                 "static %1 qscriptvalue_cast%1_valueArray [] = {%3};\n"\
+                                 "void tst_QScriptValue::qscriptvalue_cast%1_makeData(const char* expr)\n"\
                                  "{\n"\
-                                 "    static QHash<QString, %2> value;\n"\
+                                 "    static QHash<QString, %1> value;\n"\
                                  "    if (value.isEmpty()) {\n"\
-                                 "%3"\
+                                 "        value.reserve(%4);\n"\
+                                 "        for (unsigned i = 0; i < %4; ++i)\n"\
+                                 "            value.insert(qscriptvalue_cast%1_tagArray[i], qscriptvalue_cast%1_valueArray[i]);\n"\
                                  "    }\n"\
                                  "    newRow(expr) << value.value(expr);\n"\
                                  "}\n"\
                                  "\n"\
-                                 "void tst_QScriptValue::qscriptvalue_cast%2_test(const char*, const QScriptValue& value)\n"\
+                                 "void tst_QScriptValue::qscriptvalue_cast%1_test(const char*, const QScriptValue& value)\n"\
                                  "{\n"\
-                                 "    QFETCH(%2, expected);\n"\
+                                 "    QFETCH(%1, expected);\n"\
                                  "    if (qIsNaN(expected)) {\n"
-                                 "        QVERIFY(qIsNaN(qscriptvalue_cast<%2>(value)));\n"
+                                 "        QVERIFY(qIsNaN(qscriptvalue_cast<%1>(value)));\n"
+                                 "        QVERIFY(qIsNaN(qscriptvalue_cast<%1>(value)));\n"
                                  "        return;\n"
                                  "    }\n"\
                                  "    if (qIsInf(expected)) {\n"
-                                 "        QVERIFY(qIsInf(qscriptvalue_cast<%2>(value)));\n"
+                                 "        QVERIFY(qIsInf(qscriptvalue_cast<%1>(value)));\n"
+                                 "        QVERIFY(qIsInf(qscriptvalue_cast<%1>(value)));\n"
                                  "        return;\n"
                                  "    }\n"
-                                 "    QCOMPARE(qscriptvalue_cast<%2>(value), expected);\n"\
+                                 "    QCOMPARE(qscriptvalue_cast<%1>(value), expected);\n"\
+                                 "    QCOMPARE(qscriptvalue_cast<%1>(value), expected);\n"\
                                  "}\n"\
                                  "\n"\
-                                 "DEFINE_TEST_FUNCTION(qscriptvalue_cast%2)\n";
+                                 "DEFINE_TEST_FUNCTION(qscriptvalue_cast%1)\n";
     QString result = templ;
 
     QList<QPair<QString, qsreal> >::const_iterator i = list.constBegin();
-    QStringList set;
+    QStringList tagSet, valueSet;
+    tagSet.reserve(list.count());
+    valueSet.reserve(list.count());
+    int tmp = -1;
     for(; i != list.constEnd(); ++i) {
         QPair<QString, qsreal> t = *i;
         t.first = escape(t.first);
-        set.append(QString("        "));
-        set.append("value.insert(\"");
-        set.append(t.first);
-        set.append(QString::fromAscii("\", "));
-        set.append(prepareToInsert<qsreal>(t.second));
-        set.append(QString::fromAscii(");\n"));
+        tagSet.append(QString("\n    \""));
+        tagSet.append(t.first);
+        tagSet.append(QString::fromAscii("\","));
+        if (!((++tmp)%10))
+            valueSet.append(QString("\n    "));
+        valueSet.append(prepareToInsert<qsreal>(t.second));
+        valueSet.append(QString::fromAscii(", "));
     }
-    return result.arg(typeName<qsreal>(), set.join(QString()));
+    return result.arg(typeName<qsreal>(),
+                      tagSet.join(QString()),
+                      valueSet.join(QString()),
+                      QString::number(list.count()));
 }
 
 static QString generateCompareDef(const QString& comparisionType, const QList<QString> tags)
@@ -350,11 +457,14 @@
                                  "    initScriptValues();\n"\
                                  "}\n"\
                                  "\n"\
+                                 "static QString %1_array [] = {%2};\n\n"\
                                  "void tst_QScriptValue::%1_makeData(const char *expr)\n"\
                                  "{\n"\
                                  "    static QSet<QString> equals;\n"\
                                  "    if (equals.isEmpty()) {\n"\
-                                 "%2\n"\
+                                 "        equals.reserve(%3);\n"\
+                                 "        for (unsigned i = 0; i < %3; ++i)\n"\
+                                 "            equals.insert(%1_array[i]);\n"\
                                  "    }\n"\
                                  "    QHash<QString, QScriptValue>::const_iterator it;\n"\
                                  "    for (it = m_values.constBegin(); it != m_values.constEnd(); ++it) {\n"\
@@ -378,59 +488,16 @@
     QString result = templ;
 
     QStringList set;
+    set.reserve(tags.count());
     foreach(const QString& tmp, tags) {
-        set.append("        equals.insert(\"" + escape(tmp) + "\");");
+        set.append("\n    \"" + escape(tmp) + "\",");
     }
-    return result.arg(comparisionType, set.join("\n"));
+    return result.arg(comparisionType, set.join(""), QString::number(tags.count()));
 }
 
 static QString generateInitDef(const QVector<QString>& allDataTags)
 {
-    static const QString templ = "/****************************************************************************\n"
-                                 "**\n"
-                                 "** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).\n"
-                                 "** All rights reserved.\n"
-                                 "** Contact: Nokia Corporation (qt-info@nokia.com)\n"
-                                 "**\n"
-                                 "** This file is part of the test suite of the Qt Toolkit.\n"
-                                 "**\n"
-                                 "** $QT_BEGIN_LICENSE:LGPL$\n"
-                                 "** No Commercial Usage\n"
-                                 "** This file contains pre-release code and may not be distributed.\n"
-                                 "** You may use this file in accordance with the terms and conditions\n"
-                                 "** contained in the Technology Preview License Agreement accompanying\n"
-                                 "** this package.\n"
-                                 "**\n"
-                                 "** GNU Lesser General Public License Usage\n"
-                                 "** Alternatively, this file may be used under the terms of the GNU Lesser\n"
-                                 "** General Public License version 2.1 as published by the Free Software\n"
-                                 "** Foundation and appearing in the file LICENSE.LGPL included in the\n"
-                                 "** packaging of this file.  Please review the following information to\n"
-                                 "** ensure the GNU Lesser General Public License version 2.1 requirements\n"
-                                 "** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.\n"
-                                 "**\n"
-                                 "** In addition, as a special exception, Nokia gives you certain additional\n"
-                                 "** rights.  These rights are described in the Nokia Qt LGPL Exception\n"
-                                 "** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.\n"
-                                 "**\n"
-                                 "** If you have questions regarding the use of this file, please contact\n"
-                                 "** Nokia at qt-info@nokia.com.\n"
-                                 "**\n"
-                                 "**\n"
-                                 "**\n"
-                                 "**\n"
-                                 "**\n"
-                                 "**\n"
-                                 "**\n"
-                                 "**\n"
-                                 "** $QT_END_LICENSE$\n"
-                                 "**\n"
-                                 "****************************************************************************/\n"
-                                 "\n"\
-                                 "#include \"tst_qscriptvalue.h\"\n\n"\
-                                 "#define DEFINE_TEST_VALUE(expr) m_values.insert(QString::fromLatin1(#expr), expr)\n"\
-                                 "\n"\
-                                 "void tst_QScriptValue::initScriptValues()\n"\
+    static const QString templ = "void tst_QScriptValue::initScriptValues()\n"\
                                  "{\n"\
                                  "    m_values.clear();\n"\
                                  "    if (engine) \n"\
@@ -455,7 +522,7 @@
 }
 
 
-QString TestGenerator::generateTest()
+QHash<QString, QString> TestGenerator::generateTest()
 {
     // All data tags keept in one place.
     QVector<QString> dataTags;
@@ -635,47 +702,63 @@
     Q_ASSERT(in.atEnd());
 
     // Generate.
-    QStringList result;
-    result.append(generateInitDef(dataTags));
-    result.append(generateIsXXXDef("isValid", isValidList));
-    result.append(generateIsXXXDef("isBool", isBoolList));
-    result.append(generateIsXXXDef("isBoolean", isBooleanList));
-    result.append(generateIsXXXDef("isNumber", isNumberList));
-    result.append(generateIsXXXDef("isFunction", isFunctionList));
-    result.append(generateIsXXXDef("isNull", isNullList));
-    result.append(generateIsXXXDef("isString", isStringList));
-    result.append(generateIsXXXDef("isUndefined", isUndefinedList));
-    result.append(generateIsXXXDef("isVariant", isVariantList));
-    result.append(generateIsXXXDef("isQObject", isQObjectList));
-    result.append(generateIsXXXDef("isQMetaObject", isQMetaObjectList));
-    result.append(generateIsXXXDef("isObject", isObjectList));
-    result.append(generateIsXXXDef("isDate", isDateList));
-    result.append(generateIsXXXDef("isRegExp", isRegExpList));
-    result.append(generateIsXXXDef("isArray", isArrayList));
-    result.append(generateIsXXXDef("isError", isErrorList));
+    QHash<QString, QString> result;
+    QStringList tmp;
+    tmp.append(generateLicence());
+    tmp.append(generateInitDef(dataTags));
+    result.insert("init", tmp.join("\n"));
+    tmp.clear();
+
+    tmp.append(generateLicence());
+    tmp.append(generateIsXXXDef("isValid", isValidList));
+    tmp.append(generateIsXXXDef("isBool", isBoolList));
+    tmp.append(generateIsXXXDef("isBoolean", isBooleanList));
+    tmp.append(generateIsXXXDef("isNumber", isNumberList));
+    tmp.append(generateIsXXXDef("isFunction", isFunctionList));
+    tmp.append(generateIsXXXDef("isNull", isNullList));
+    tmp.append(generateIsXXXDef("isString", isStringList));
+    tmp.append(generateIsXXXDef("isUndefined", isUndefinedList));
+    tmp.append(generateIsXXXDef("isVariant", isVariantList));
+    tmp.append(generateIsXXXDef("isQObject", isQObjectList));
+    tmp.append(generateIsXXXDef("isQMetaObject", isQMetaObjectList));
+    tmp.append(generateIsXXXDef("isObject", isObjectList));
+    tmp.append(generateIsXXXDef("isDate", isDateList));
+    tmp.append(generateIsXXXDef("isRegExp", isRegExpList));
+    tmp.append(generateIsXXXDef("isArray", isArrayList));
+    tmp.append(generateIsXXXDef("isError", isErrorList));
+    result.insert("isXXX", tmp.join("\n"));
+    tmp.clear();
 
-    result.append(generateToXXXDef<QString>("toString", toStringList));
-    result.append(generateToXXXDef<qsreal>("toNumber", toNumberList));
-    result.append(generateToXXXDef<bool>("toBool", toBoolList));
-    result.append(generateToXXXDef<bool>("toBoolean", toBooleanList));
-    result.append(generateToXXXDef<qsreal>("toInteger", toIntegerList));
-    result.append(generateToXXXDef<qint32>("toInt32", toInt32List));
-    result.append(generateToXXXDef<quint32>("toUInt32", toUInt32List));
-    result.append(generateToXXXDef<quint16>("toUInt16", toUInt16List));
+    tmp.append(generateLicence());
+    tmp.append(generateToXXXDef<QString>("toString", toStringList));
+    tmp.append(generateToXXXDef<qsreal>("toNumber", toNumberList));
+    tmp.append(generateToXXXDef<bool>("toBool", toBoolList));
+    tmp.append(generateToXXXDef<bool>("toBoolean", toBooleanList));
+    tmp.append(generateToXXXDef<qsreal>("toInteger", toIntegerList));
+    tmp.append(generateToXXXDef<qint32>("toInt32", toInt32List));
+    tmp.append(generateToXXXDef<quint32>("toUInt32", toUInt32List));
+    tmp.append(generateToXXXDef<quint16>("toUInt16", toUInt16List));
+    result.insert("toXXX", tmp.join("\n"));
+    tmp.clear();
 
-    result.append(generateCompareDef("equals", equalsList));
-    result.append(generateCompareDef("strictlyEquals", strictlyEqualsList));
-    result.append(generateCompareDef("lessThan", lessThanList));
-    result.append(generateCompareDef("instanceOf", instanceOfList));
+    tmp.append(generateLicence());
+    tmp.append(generateCompareDef("equals", equalsList));
+    tmp.append(generateCompareDef("strictlyEquals", strictlyEqualsList));
+    tmp.append(generateCompareDef("lessThan", lessThanList));
+    tmp.append(generateCompareDef("instanceOf", instanceOfList));
+    result.insert("comparison", tmp.join("\n"));
+    tmp.clear();
 
-    result.append(generateCastDef(castStringList));
-    result.append(generateCastDef(castSRealList));
-    result.append(generateCastDef(castBoolList));
-    result.append(generateCastDef(castInt32List));
-    result.append(generateCastDef(castUInt32List));
-    result.append(generateCastDef(castUInt16List));
+    tmp.append(generateLicence());
+    tmp.append(generateCastDef(castStringList));
+    tmp.append(generateCastDef(castSRealList));
+    tmp.append(generateCastDef(castBoolList));
+    tmp.append(generateCastDef(castInt32List));
+    tmp.append(generateCastDef(castUInt32List));
+    tmp.append(generateCastDef(castUInt16List));
+    result.insert("cast", tmp.join("\n"));
 
-    return result.join("\n");
+    return result;
 }