int QDeclarativeOrganizerItemMetaObject::createProperty(const char * name,  const char *)
{
    OrganizerItemDetailNameMap* detailMetaData = detailMetaDataByDetailName(name);;

    if (detailMetaData) {
        int propId = -1;
        if (detailMetaData->group) {
            QOrganizerItemDetailDefinition def = m_defs.value(detailMetaData->definitionName);

            //do not allow multiple details property for non unique details
            if (m_defs.isEmpty() || (!def.isEmpty() && !def.isUnique()))
                propId = QDeclarativeOpenMetaObject::createProperty(name, "QDeclarativeListProperty<QDeclarativeOrganizerItemDetail>");
        }
        else {
            propId = QDeclarativeOpenMetaObject::createProperty(name, "QVariant");
        }
        m_properties.insert(propId, detailMetaData);
        return propId;
    }
    return -1;
}
void tst_QOrganizerItemDetailDefinition::testDebugStreamOut()
{
    // Testing QOrganizerItemDetailDefinition

    QOrganizerItemDetailDefinition def;

    // Test the empty case
    QVERIFY(def.isEmpty());
    QVERIFY(def.name().isEmpty());
    QVERIFY(def.fields().isEmpty());
    QVERIFY(def.isUnique() == false);
    QTest::ignoreMessage(QtDebugMsg, "QOrganizerItemDetailDefinition(name=\"\",isUnique=false,isEmpty=true,fields=QMap() )");
    qDebug() << def;


    // Test the completely filled-in case
    QMap<QString, QOrganizerItemDetailFieldDefinition> map;
    QOrganizerItemDetailFieldDefinition currField;
    currField.setAllowableValues(QVariantList() << "One" << "Two" << "Three");
    currField.setDataType(QVariant::String);
    map.insert("string", currField);
    currField.setDataType(QVariant::DateTime);
    map.insert("datetime", currField);
    def.setName("Test ID");
    def.setUnique(true);
    def.setFields(map);
    QTest::ignoreMessage(QtDebugMsg, "QOrganizerItemDetailDefinition(name=\"Test ID\",isUnique=true,isEmpty=false,fields=QMap((\"datetime\", QOrganizerItemDetailFieldDefinition(dataType=16,allowableValues=(QVariant(QString, \"One\") ,  QVariant(QString, \"Two\") ,  QVariant(QString, \"Three\") )  ))(\"string\", QOrganizerItemDetailFieldDefinition(dataType=10,allowableValues=(QVariant(QString, \"One\") ,  QVariant(QString, \"Two\") ,  QVariant(QString, \"Three\") )  ))) )");
    qDebug() << def;

    // Testing QOrganizerItemDetailFieldDefinition

    QOrganizerItemDetailFieldDefinition f;

    // Test the empty case
    QTest::ignoreMessage(QtDebugMsg, "QOrganizerItemDetailFieldDefinition(dataType=0,allowableValues=() )");
    qDebug() << f;

    // Test the completely filled case
    QMap<QString, QOrganizerItemDetailFieldDefinition> allFields;
    QVariantList allowedStrings;
    allowedStrings << QString("First") << QString("Second");
    QOrganizerItemDetailFieldDefinition dfd;
    dfd.setDataType(QVariant::String);
    dfd.setAllowableValues(allowedStrings);
    allFields.insert("TestFieldDefinition", dfd);
    QTest::ignoreMessage(QtDebugMsg, "QOrganizerItemDetailFieldDefinition(dataType=10,allowableValues=(QVariant(QString, \"First\") ,  QVariant(QString, \"Second\") )  )");
    qDebug() << dfd;

}
void tst_QOrganizerItemDetailDefinition::testCtor()
{
    QOrganizerItemDetailDefinition def;

    /* Check the ctor sets sane things */
    QVERIFY(def.isEmpty());
    QVERIFY(def.name().isEmpty());
    QVERIFY(def.fields().isEmpty());
    QVERIFY(def.isUnique() == false);

    /* Set a few things */
    QMap<QString, QOrganizerItemDetailFieldDefinition> map;
    QOrganizerItemDetailFieldDefinition currField;
    currField.setDataType(QVariant::String);
    map.insert("string", currField);
    currField.setDataType(QVariant::DateTime);
    map.insert("datetime", currField);

    def.setName("Test ID");
    def.setUnique(true);
    def.setFields(map);

    QVERIFY(def.name() == "Test ID");
    QVERIFY(def.isUnique());
    QVERIFY(def.fields() == map);

    QOrganizerItemDetailDefinition def2(def);

    QVERIFY(def2.name() == "Test ID");
    QVERIFY(def2.isUnique());
    QVERIFY(def2.fields() == map);

    QOrganizerItemDetailDefinition def3;
    def3 = def2;

    QVERIFY(def3.name() == "Test ID");
    QVERIFY(def3.isUnique());
    QVERIFY(def3.fields() == map);

    /* Make sure they aren't improperly shared */
    def.setName("id one");
    QVERIFY(def2.name() != def.name());
    QVERIFY(def3.name() != def.name());

    def2.setName("id two");
    QVERIFY(def2.name() != def3.name());
}
void tst_QOrganizerItemDetailDefinition::testStreaming()
{
    QMap<QString, QOrganizerItemDetailFieldDefinition> allFields;

    QVariantList allowedStrings;
    allowedStrings << QString("First") << QString("Second");

    // generate some field definitions
    QOrganizerItemDetailFieldDefinition dfd;
    dfd.setDataType(QVariant::String);
    dfd.setAllowableValues(allowedStrings);
    allFields.insert("TestFieldDefinition", dfd);

    dfd.setDataType(QVariant::Int);
    dfd.setAllowableValues(QVariantList());
    allFields.insert("TestCount", dfd);

    // now create our detail definition
    QOrganizerItemDetailDefinition dd;
    dd.setName("TestDefinitionName");
    dd.setUnique(true);
    dd.setFields(allFields);

    // testing streaming of field definition, with no allowable values set
    {
        QByteArray buffer;
        QOrganizerItemDetailFieldDefinition fieldDefIn = allFields.value("TestCount");
        QOrganizerItemDetailFieldDefinition fieldDefOut;
        QDataStream stream1(&buffer, QIODevice::WriteOnly);
        stream1 << fieldDefIn;
        QVERIFY(buffer.size() > 0);
        QDataStream stream2(buffer);
        stream2 >> fieldDefOut;
        QVERIFY(fieldDefIn == fieldDefOut);
    }

    // testing streaming of field definition, with specific allowable values set
    {
        QByteArray buffer;
        QOrganizerItemDetailFieldDefinition fieldDefIn = allFields.value("TestFieldDefinition");
        QOrganizerItemDetailFieldDefinition fieldDefOut;
        QDataStream stream1(&buffer, QIODevice::WriteOnly);
        stream1 << fieldDefIn;
        QVERIFY(buffer.size() > 0);
        QDataStream stream2(buffer);
        stream2 >> fieldDefOut;
        QVERIFY(fieldDefIn == fieldDefOut);
    }

    // testing streaming of detail definition
    {
        QByteArray buffer;
        QOrganizerItemDetailDefinition defIn = dd;
        QOrganizerItemDetailDefinition defOut;
        QDataStream stream1(&buffer, QIODevice::WriteOnly);
        stream1 << defIn;
        QVERIFY(buffer.size() > 0);
        QDataStream stream2(buffer);
        stream2 >> defOut;
        QVERIFY(defIn == defOut);
    }

    // now try inserting and removing a field, streaming again, and testing.
    {
        // remove the field
        QByteArray buffer;
        QOrganizerItemDetailDefinition defIn = dd;
        defIn.removeField("TestCount");
        QVERIFY(defIn != dd);
        QOrganizerItemDetailDefinition defOut;
        QDataStream stream1(&buffer, QIODevice::WriteOnly);
        stream1 << defIn;
        QVERIFY(buffer.size() > 0);
        QDataStream stream2(buffer);
        stream2 >> defOut;
        QVERIFY(defIn == defOut);
    }

    {
        // re-add the field.
        QByteArray buffer;
        QOrganizerItemDetailDefinition defIn = dd;
        defIn.removeField("TestCount"); // remove and reinsert the field
        QVERIFY(defIn != dd);
        defIn.insertField("TestCount", dfd);
        QVERIFY(defIn == dd);
        QOrganizerItemDetailDefinition defOut;
        QDataStream stream1(&buffer, QIODevice::WriteOnly);
        stream1 << defIn;
        QVERIFY(buffer.size() > 0);
        QDataStream stream2(buffer);
        stream2 >> defOut;
        QVERIFY(defIn == defOut);
        QVERIFY(defOut == dd); // should be equal to the original.
    }
}
void tst_QOrganizerItemDetailDefinition::testEmpty()
{
    QOrganizerItemDetailDefinition def;

    QVERIFY(def.isEmpty());

    def.setName("Name");
    QVERIFY(!def.isEmpty());
    def.setName(QString());
    QVERIFY(def.isEmpty());
    QMap<QString, QOrganizerItemDetailFieldDefinition> fields;
    QOrganizerItemDetailFieldDefinition f;
    f.setDataType(QVariant::String);
    fields.insert("Field", f);
    def.setFields(fields);
    QVERIFY(!def.isEmpty());

    def.setName("Name");
    QVERIFY(!def.isEmpty());

    fields.clear();
    def.setFields(fields);
    QVERIFY(!def.isEmpty());

    def.setName(QString());
    QVERIFY(def.isEmpty());
}
void tst_QOrganizerItemDetailDefinition::testGetSet()
{
    QOrganizerItemDetailDefinition def;

    /* Id */
    def.setName("this is the id");
    QVERIFY(def.name() == "this is the id");

    def.setName(QString());
    QVERIFY(def.name() == QString());

    /* Uniqueness */
    def.setUnique(true);
    QVERIFY(def.isUnique() == true);

    def.setUnique(false);
    QVERIFY(def.isUnique() == false);

    /* Type map */
    QMap<QString, QOrganizerItemDetailFieldDefinition> map;
    QOrganizerItemDetailFieldDefinition currField;
    currField.setDataType(QVariant::String);
    map.insert("string", currField);
    currField.setDataType(QVariant::DateTime);
    map.insert("datetime", currField);

    def.setFields(map);
    QVERIFY(def.fields() == map);

    def.setFields(QMap<QString, QOrganizerItemDetailFieldDefinition>());
    QVERIFY(def.fields().isEmpty());
}