qtmobility/tests/auto/qcontactmanagerfiltering/tst_qcontactmanagerfiltering.cpp
changeset 14 6fbed849b4f4
parent 11 06b8e2af4411
child 15 1f895d8a5b2b
equal deleted inserted replaced
11:06b8e2af4411 14:6fbed849b4f4
   164     /* Known one that will not pass */
   164     /* Known one that will not pass */
   165     managerNames.removeAll("invalid");
   165     managerNames.removeAll("invalid");
   166     managerNames.removeAll("testdummy");
   166     managerNames.removeAll("testdummy");
   167     managerNames.removeAll("teststaticdummy");
   167     managerNames.removeAll("teststaticdummy");
   168     managerNames.removeAll("maliciousplugin");
   168     managerNames.removeAll("maliciousplugin");
   169 #if defined(Q_OS_SYMBIAN)
   169     // Symbiansim backend does not support the required details for these
   170     // TODO: Analyze fails on symbiansim backend. Simply disable testing of
   170 	// tests to pass. Symbiansim backend specific unit test tst_simcm is
   171     // symbiansim backend for now to make sure the fails do not steal attention
   171 	// testing filtering instead.
   172     // from possible fails in symbian backend.
       
   173     managerNames.removeAll("symbiansim");
   172     managerNames.removeAll("symbiansim");
   174 #endif
   173 
   175 
   174 
   176     foreach(QString mgr, managerNames) {
   175     foreach(QString mgr, managerNames) {
   177         QMap<QString, QString> params;
   176         QMap<QString, QString> params;
   178         QString mgrUri = QContactManager::buildUri(mgr, params);
   177         QString mgrUri = QContactManager::buildUri(mgr, params);
   179         QContactManager* cm = QContactManager::fromUri(mgrUri);
   178         QContactManager* cm = QContactManager::fromUri(mgrUri);
   358             QTest::newRow("integer == 20, ends with, string") << manager << defAndFieldNames.first << defAndFieldNames.second << QVariant("20") << (int)(Qt::MatchFixedString | Qt::MatchEndsWith) << "bc";
   357             QTest::newRow("integer == 20, ends with, string") << manager << defAndFieldNames.first << defAndFieldNames.second << QVariant("20") << (int)(Qt::MatchFixedString | Qt::MatchEndsWith) << "bc";
   359             QTest::newRow("integer == 0, ends with, string") << manager << defAndFieldNames.first << defAndFieldNames.second << QVariant("0") << (int)(Qt::MatchFixedString | Qt::MatchEndsWith) << "abc";
   358             QTest::newRow("integer == 0, ends with, string") << manager << defAndFieldNames.first << defAndFieldNames.second << QVariant("0") << (int)(Qt::MatchFixedString | Qt::MatchEndsWith) << "abc";
   360             QTest::newRow("integer == 20, contains, string") << manager << defAndFieldNames.first << defAndFieldNames.second << QVariant("20") << (int)(Qt::MatchFixedString | Qt::MatchContains) << "bc";
   359             QTest::newRow("integer == 20, contains, string") << manager << defAndFieldNames.first << defAndFieldNames.second << QVariant("20") << (int)(Qt::MatchFixedString | Qt::MatchContains) << "bc";
   361             QTest::newRow("integer == 0, contains, string") << manager << defAndFieldNames.first << defAndFieldNames.second << QVariant("0") << (int)(Qt::MatchFixedString | Qt::MatchContains) << "abc";
   360             QTest::newRow("integer == 0, contains, string") << manager << defAndFieldNames.first << defAndFieldNames.second << QVariant("0") << (int)(Qt::MatchFixedString | Qt::MatchContains) << "abc";
   362         }
   361         }
       
   362 
       
   363         /* Detail filter semantics: empty definition or field */
       
   364         newMRow("Empty Definition Name", manager) << manager << es << lastname << QVariant("A") << (int)(Qt::MatchStartsWith) << es; // empty definition name means filter matches nothing
       
   365         newMRow("Empty Def And Field Name", manager) << manager << es << es << QVariant("A") << (int)(Qt::MatchStartsWith) << es; // as above
       
   366         newMRow("Empty Field Name", manager) << manager << name << es << QVariant("A") << (int)(Qt::MatchStartsWith) << "abcdefghijk"; // empty field name matches any with a name detail
   363     }
   367     }
   364 }
   368 }
   365 
   369 
   366 void tst_QContactManagerFiltering::detailStringFiltering()
   370 void tst_QContactManagerFiltering::detailStringFiltering()
   367 {
   371 {
   527         /* Nothings */
   531         /* Nothings */
   528         newMRow("no name", manager) << manager << es << es << false << ev << es;
   532         newMRow("no name", manager) << manager << es << es << false << ev << es;
   529         newMRow("no def name", manager) << manager << es << "value" << false << ev << es;
   533         newMRow("no def name", manager) << manager << es << "value" << false << ev << es;
   530 
   534 
   531         /* Strings (name) */
   535         /* Strings (name) */
   532         newMRow("first name presence", manager) << manager << "Name" << QString(QLatin1String(QContactName::FieldFirstName)) << false << ev << "abcdefg";
   536         newMRow("first name presence", manager) << manager << "Name" << QString(QLatin1String(QContactName::FieldFirstName)) << false << ev << "abcdefghijk";
   533         newMRow("first name == Aaron", manager) << manager << "Name" << QString(QLatin1String(QContactName::FieldFirstName)) << true << QVariant("Aaron") << "a";
   537         newMRow("first name == Aaron", manager) << manager << "Name" << QString(QLatin1String(QContactName::FieldFirstName)) << true << QVariant("Aaron") << "a";
   534 
   538 
   535         /*
   539         /*
   536          * Doubles
   540          * Doubles
   537          * B has double(4.0)
   541          * B has double(4.0)
   796     QString firstname = QContactName::FieldFirstName;
   800     QString firstname = QContactName::FieldFirstName;
   797     QString lastname = QContactName::FieldLastName;
   801     QString lastname = QContactName::FieldLastName;
   798 
   802 
   799     QString phonedef = QContactPhoneNumber::DefinitionName;
   803     QString phonedef = QContactPhoneNumber::DefinitionName;
   800     QString phonenum = QContactPhoneNumber::FieldNumber;
   804     QString phonenum = QContactPhoneNumber::FieldNumber;
       
   805     bool localeCapsFirst = (QString("aaa").localeAwareCompare(QString("AAA")) > 0);
   801 
   806 
   802     int csflag = (int)Qt::MatchCaseSensitive;
   807     int csflag = (int)Qt::MatchCaseSensitive;
   803 
   808 
   804     for (int i = 0; i < managers.size(); i++) {
   809     for (int i = 0; i < managers.size(); i++) {
   805         QContactManager *manager = managers.at(i);
   810         QContactManager *manager = managers.at(i);
   806 
   811 
   807         /* First, cover the "empty defname / fieldname / ranges" cases */
   812         /* First, cover the "empty defname / fieldname / ranges" cases */
   808         newMRow("invalid defname", manager) << manager << es << firstname << QVariant("A") << QVariant("Bob") << false << 0 << true << 0 << es;
   813         newMRow("invalid defname", manager) << manager << es << firstname << QVariant("A") << QVariant("Bob") << false << 0 << true << 0 << es;
   809         newMRow("defn presence test", manager) << manager << namedef << es << QVariant("A") << QVariant("Bob") << false << 0 << true << 0 << "abcdefg";
   814         newMRow("defn presence test", manager) << manager << namedef << es << QVariant("A") << QVariant("Bob") << false << 0 << true << 0 << "abcdefghijk";
   810         newMRow("field presence test", manager) << manager << phonedef << phonenum << QVariant() << QVariant() << false << 0 << true << 0 << "ab";
   815         newMRow("field presence test", manager) << manager << phonedef << phonenum << QVariant() << QVariant() << false << 0 << true << 0 << "ab";
   811         newMRow("good def, bad field", manager) << manager << namedef << "Bongo" << QVariant("A") << QVariant("Bob") << false << 0 << true << 0 << es;
   816         newMRow("good def, bad field", manager) << manager << namedef << "Bongo" << QVariant("A") << QVariant("Bob") << false << 0 << true << 0 << es;
   812         newMRow("bad def", manager) << manager << "Bongo" << es << QVariant("A") << QVariant("Bob") << false << 0 << true << 0 << es;
   817         newMRow("bad def", manager) << manager << "Bongo" << es << QVariant("A") << QVariant("Bob") << false << 0 << true << 0 << es;
   813 
   818 
   814         /* Presence for fields that aren't there */
   819         /* Presence for fields that aren't there */
   815         newMRow("defn presence test negative", manager) << manager << "Burgers" << es << ev << ev << false << 0 << false << 0 << es;
   820         newMRow("defn presence test negative", manager) << manager << "Burgers" << es << ev << ev << false << 0 << false << 0 << es;
   816         newMRow("field presence test negative", manager) << manager << "Burgers" << "Beef" << ev << ev << false << 0 << false << 0 << es;
   821         newMRow("field presence test negative", manager) << manager << "Burgers" << "Beef" << ev << ev << false << 0 << false << 0 << es;
   817         newMRow("defn yes, field no presence test negative", manager) << manager << namedef << "Burger" << ev << ev << false << 0 << false << 0 << es;
   822         newMRow("defn yes, field no presence test negative", manager) << manager << namedef << "Burger" << ev << ev << false << 0 << false << 0 << es;
   818 
   823 
   819         newMRow("no max, all results", manager) << manager << namedef << firstname << QVariant("a") << QVariant() << false << 0 << true << 0 << "abcdefg";
   824         newMRow("no max, all results", manager) << manager << namedef << firstname << QVariant("a") << QVariant() << false << 0 << true << 0 << "abcdefghijk";
   820         newMRow("no max, some results", manager) << manager << namedef << firstname << QVariant("BOB") << QVariant() << false << 0 << true << 0 << "bcdefg";
   825         newMRow("no max, some results", manager) << manager << namedef << firstname << QVariant("bob") << QVariant() << false << 0 << true << 0 << "bcdefghijk";
   821         newMRow("no max, no results", manager) << manager << namedef << firstname << QVariant("ZamBeZI") << QVariant() << false << 0 << true << 0 << es;
   826         newMRow("no max, no results", manager) << manager << namedef << firstname << QVariant("ZamBeZI") << QVariant() << false << 0 << true << 0 << es;
   822         newMRow("no min, all results", manager) << manager << namedef << firstname << QVariant() << QVariant("zambezi") << false << 0 << true << 0 << "abcdefg";
   827         newMRow("no min, all results", manager) << manager << namedef << firstname << QVariant() << QVariant("zambezi") << false << 0 << true << 0 << "abcdefghijk";
   823         newMRow("no min, some results", manager) << manager << namedef << firstname << QVariant() << QVariant("bOb") << false << 0 << true << 0 << "a";
   828         newMRow("no min, some results", manager) << manager << namedef << firstname << QVariant() << QVariant("bOb") << false << 0 << true << 0 << "a";
   824         newMRow("no min, no results", manager) << manager << namedef << firstname << QVariant() << QVariant("aardvark") << false << 0 << true << 0 << es;
   829         newMRow("no min, no results", manager) << manager << namedef << firstname << QVariant() << QVariant("aardvark") << false << 0 << true << 0 << es;
   825 
   830 
   826         /* now case sensitive */
   831         /* now case sensitive */
   827         newMRow("no max, cs, all results", manager) << manager << namedef << firstname << QVariant("A") << QVariant() << false << 0 << true << csflag << "abcdefg";
   832         newMRow("no max, cs, all results", manager) << manager << namedef << firstname << QVariant("A") << QVariant() << false << 0 << true << csflag << "abcdefghijk";
   828         newMRow("no max, cs, some results", manager) << manager << namedef << firstname << QVariant("Bob") << QVariant() << false << 0 << true << csflag << "bcdefg";
   833         newMRow("no max, cs, some results", manager) << manager << namedef << firstname << QVariant("Bob") << QVariant() << false << 0 << true << csflag << "bcdefghijk";
   829         newMRow("no max, cs, no results", manager) << manager << namedef << firstname << QVariant("Zambezi") << QVariant() << false << 0 << true << csflag << es;
   834         newMRow("no max, cs, no results", manager) << manager << namedef << firstname << QVariant("Xambezi") << QVariant() << false << 0 << true << csflag << "hijk";
   830         newMRow("no min, cs, all results", manager) << manager << namedef << firstname << QVariant() << QVariant("Zambezi") << false << 0 << true << csflag << "abcdefg";
   835         newMRow("no min, cs, most results", manager) << manager << namedef << firstname << QVariant() << QVariant("Xambezi") << false << 0 << true << csflag << "abcdefg";
   831         newMRow("no min, cs, some results", manager) << manager << namedef << firstname << QVariant() << QVariant("Bob") << false << 0 << true << csflag << "a";
   836         newMRow("no min, cs, some results", manager) << manager << namedef << firstname << QVariant() << QVariant("Bob") << false << 0 << true << csflag << "a";
   832         newMRow("no min, cs, no results", manager) << manager << namedef << firstname << QVariant() << QVariant("Aardvark") << false << 0 << true << csflag << es;
   837         newMRow("no min, cs, no results", manager) << manager << namedef << firstname << QVariant() << QVariant("Aardvark") << false << 0 << true << csflag << es;
   833 
   838 
   834         /* due to ascii sorting, most lower case parameters give all results, which is boring */
   839         /* due to ascii sorting, most lower case parameters give all results, which is boring */
   835         newMRow("no max, cs, badcase, all results", manager) << manager << namedef << firstname << QVariant("A") << QVariant() << false << 0 << true << csflag << "abcdefg";
   840         newMRow("no max, cs, badcase, all results", manager) << manager << namedef << firstname << QVariant("A") << QVariant() << false << 0 << true << csflag << "abcdefghijk";
   836         newMRow("no max, cs, badcase, some results", manager) << manager << namedef << firstname << QVariant("BOB") << QVariant() << false << 0 << true << csflag << "bcdefg";
   841         if(localeCapsFirst) {
   837         newMRow("no max, cs, badcase, no results", manager) << manager << namedef << firstname << QVariant("ZAMBEZI") << QVariant() << false << 0 << true << csflag << es;
   842             newMRow("no max, cs, badcase, some results", manager) << manager << namedef << firstname << QVariant("BOB") << QVariant() << false << 0 << true << csflag << "bcdefghijk";
   838         newMRow("no min, cs, badcase, all results", manager) << manager << namedef << firstname << QVariant() << QVariant("ZAMBEZI") << false << 0 << true << csflag << "abcdefg";
   843         } else {
   839         newMRow("no min, cs, badcase, some results", manager) << manager << namedef << firstname << QVariant() << QVariant("BOB") << false << 0 << true << csflag << "a";
   844             newMRow("no max, cs, badcase, some results", manager) << manager << namedef << firstname << QVariant("BOB") << QVariant() << false << 0 << true << csflag << "cdefghijk";
       
   845         }
       
   846 
       
   847         newMRow("no max, cs, badcase, no results", manager) << manager << namedef << firstname << QVariant("XAMBEZI") << QVariant() << false << 0 << true << csflag << "hijk";
       
   848         newMRow("no min, cs, badcase, all results", manager) << manager << namedef << firstname << QVariant() << QVariant("XAMBEZI") << false << 0 << true << csflag << "abcdefg";
       
   849         if(localeCapsFirst) {
       
   850             newMRow("no min, cs, badcase, some results", manager) << manager << namedef << firstname << QVariant() << QVariant("BOB") << false << 0 << true << csflag << "a";
       
   851         } else {
       
   852             newMRow("no min, cs, badcase, some results", manager) << manager << namedef << firstname << QVariant() << QVariant("BOB") << false << 0 << true << csflag << "ab";
       
   853         }
   840         newMRow("no min, cs, badcase, no results", manager) << manager << namedef << firstname << QVariant() << QVariant("AARDVARK") << false << 0 << true << csflag << es;
   854         newMRow("no min, cs, badcase, no results", manager) << manager << namedef << firstname << QVariant() << QVariant("AARDVARK") << false << 0 << true << csflag << es;
   841 
   855 
   842         /* 'a' has phone number ("5551212") */
   856         /* 'a' has phone number ("5551212") */
   843         QTest::newRow("range1") << manager << phonedef << phonenum << QVariant("5551200") << QVariant("5551220") << false << 0 << false << 0 << "a";
   857         QTest::newRow("range1") << manager << phonedef << phonenum << QVariant("5551200") << QVariant("5551220") << false << 0 << false << 0 << "a";
   844 
   858 
   865         QTest::newRow("string range - startswith - 7") << manager << namedef << firstname << QVariant("Bob") << QVariant("C") << true << (int)(QContactDetailRangeFilter::IncludeLower | QContactDetailRangeFilter::IncludeUpper) << true << (int)(Qt::MatchStartsWith) << "bc";
   879         QTest::newRow("string range - startswith - 7") << manager << namedef << firstname << QVariant("Bob") << QVariant("C") << true << (int)(QContactDetailRangeFilter::IncludeLower | QContactDetailRangeFilter::IncludeUpper) << true << (int)(Qt::MatchStartsWith) << "bc";
   866         QTest::newRow("string range - startswith - 8") << manager << namedef << firstname << QVariant("Bob") << QVariant("C") << true << (int)(QContactDetailRangeFilter::ExcludeLower | QContactDetailRangeFilter::ExcludeUpper) << true << (int)(Qt::MatchStartsWith) << "c";
   880         QTest::newRow("string range - startswith - 8") << manager << namedef << firstname << QVariant("Bob") << QVariant("C") << true << (int)(QContactDetailRangeFilter::ExcludeLower | QContactDetailRangeFilter::ExcludeUpper) << true << (int)(Qt::MatchStartsWith) << "c";
   867         QTest::newRow("string range - startswith - 9") << manager << namedef << firstname << QVariant("Barry") << QVariant("C") << true << (int)(QContactDetailRangeFilter::ExcludeLower | QContactDetailRangeFilter::ExcludeUpper) << true << (int)(Qt::MatchStartsWith) << "bc";
   881         QTest::newRow("string range - startswith - 9") << manager << namedef << firstname << QVariant("Barry") << QVariant("C") << true << (int)(QContactDetailRangeFilter::ExcludeLower | QContactDetailRangeFilter::ExcludeUpper) << true << (int)(Qt::MatchStartsWith) << "bc";
   868 
   882 
   869         // Open ended starts with
   883         // Open ended starts with
   870         QTest::newRow("string range - startswith open top - 1") << manager << namedef << firstname << QVariant("A") << ev << true << (int)(QContactDetailRangeFilter::IncludeLower) << true << (int)(Qt::MatchStartsWith) << "abcdefg";
   884         QTest::newRow("string range - startswith open top - 1") << manager << namedef << firstname << QVariant("A") << ev << true << (int)(QContactDetailRangeFilter::IncludeLower) << true << (int)(Qt::MatchStartsWith) << "abcdefghijk";
   871         QTest::newRow("string range - startswith open top - 2") << manager << namedef << firstname << QVariant("A") << ev << true << (int)(QContactDetailRangeFilter::ExcludeLower) << true << (int)(Qt::MatchStartsWith) << "abcdefg";
   885         QTest::newRow("string range - startswith open top - 2") << manager << namedef << firstname << QVariant("A") << ev << true << (int)(QContactDetailRangeFilter::ExcludeLower) << true << (int)(Qt::MatchStartsWith) << "abcdefghijk";
   872         QTest::newRow("string range - startswith open top - 3") << manager << namedef << firstname << QVariant("Aaron") << ev << true << (int)(QContactDetailRangeFilter::IncludeLower) << true << (int)(Qt::MatchStartsWith) << "abcdefg";
   886         QTest::newRow("string range - startswith open top - 3") << manager << namedef << firstname << QVariant("Aaron") << ev << true << (int)(QContactDetailRangeFilter::IncludeLower) << true << (int)(Qt::MatchStartsWith) << "abcdefghijk";
   873         QTest::newRow("string range - startswith open top - 4") << manager << namedef << firstname << QVariant("Aaron") << ev << true << (int)(QContactDetailRangeFilter::ExcludeLower) << true << (int)(Qt::MatchStartsWith) << "bcdefg";
   887         QTest::newRow("string range - startswith open top - 4") << manager << namedef << firstname << QVariant("Aaron") << ev << true << (int)(QContactDetailRangeFilter::ExcludeLower) << true << (int)(Qt::MatchStartsWith) << "bcdefghijk";
   874         QTest::newRow("string range - startswith open bottom - 1") << manager << namedef << firstname << ev << QVariant("Borit") << true << (int)(QContactDetailRangeFilter::IncludeUpper) << true << (int)(Qt::MatchStartsWith) << "abc";
   888         QTest::newRow("string range - startswith open bottom - 1") << manager << namedef << firstname << ev << QVariant("Borit") << true << (int)(QContactDetailRangeFilter::IncludeUpper) << true << (int)(Qt::MatchStartsWith) << "abc";
   875         QTest::newRow("string range - startswith open bottom - 2") << manager << namedef << firstname << ev << QVariant("Borit") << true << (int)(QContactDetailRangeFilter::ExcludeUpper) << true << (int)(Qt::MatchStartsWith) << "abc";
   889         QTest::newRow("string range - startswith open bottom - 2") << manager << namedef << firstname << ev << QVariant("Borit") << true << (int)(QContactDetailRangeFilter::ExcludeUpper) << true << (int)(Qt::MatchStartsWith) << "abc";
   876         QTest::newRow("string range - startswith open bottom - 3") << manager << namedef << firstname << ev << QVariant("Boris") << true << (int)(QContactDetailRangeFilter::IncludeUpper) << true << (int)(Qt::MatchStartsWith) << "abc";
   890         QTest::newRow("string range - startswith open bottom - 3") << manager << namedef << firstname << ev << QVariant("Boris") << true << (int)(QContactDetailRangeFilter::IncludeUpper) << true << (int)(Qt::MatchStartsWith) << "abc";
   877         QTest::newRow("string range - startswith open bottom - 4") << manager << namedef << firstname << ev << QVariant("Boris") << true << (int)(QContactDetailRangeFilter::ExcludeUpper) << true << (int)(Qt::MatchStartsWith) << "ab";
   891         QTest::newRow("string range - startswith open bottom - 4") << manager << namedef << firstname << ev << QVariant("Boris") << true << (int)(QContactDetailRangeFilter::ExcludeUpper) << true << (int)(Qt::MatchStartsWith) << "ab";
   878 
       
   879         // Qt::MatchContains with range is invalid
       
   880         QTest::newRow("string range - contains - 1") << manager << namedef << firstname << QVariant("A") << QVariant("Bob") << true << (int)(QContactDetailRangeFilter::ExcludeLower | QContactDetailRangeFilter::ExcludeUpper) << true << (int)(Qt::MatchContains) << es;
       
   881 
       
   882         // Check EndsWith with range: A == son, B == sen, C == sun
       
   883         QTest::newRow("string range - endswith - 1") << manager << namedef << lastname << QVariant("sen") << QVariant("son") << true << (int)(QContactDetailRangeFilter::ExcludeLower | QContactDetailRangeFilter::ExcludeUpper) << true << (int)(Qt::MatchEndsWith) << es;
       
   884         QTest::newRow("string range - endswith - 2") << manager << namedef << lastname << QVariant("sen") << QVariant("son") << true << (int)(QContactDetailRangeFilter::IncludeLower | QContactDetailRangeFilter::ExcludeUpper) << true << (int)(Qt::MatchEndsWith) << "b";
       
   885         QTest::newRow("string range - endswith - 3") << manager << namedef << lastname << QVariant("sen") << QVariant("son") << true << (int)(QContactDetailRangeFilter::ExcludeLower | QContactDetailRangeFilter::IncludeUpper) << true << (int)(Qt::MatchEndsWith) << "a";
       
   886         QTest::newRow("string range - endswith - 4") << manager << namedef << lastname << QVariant("sen") << QVariant("son") << true << (int)(QContactDetailRangeFilter::IncludeLower | QContactDetailRangeFilter::IncludeUpper) << true << (int)(Qt::MatchEndsWith) << "ab";
       
   887         QTest::newRow("string range - endswith - 5") << manager << namedef << lastname << QVariant("sen") << QVariant("sun") << true << (int)(QContactDetailRangeFilter::ExcludeLower | QContactDetailRangeFilter::IncludeUpper) << true << (int)(Qt::MatchEndsWith) << "ac";
       
   888         QTest::newRow("string range - endswith - 6") << manager << namedef << lastname << QVariant("sen") << QVariant("sun") << true << (int)(QContactDetailRangeFilter::ExcludeLower | QContactDetailRangeFilter::ExcludeUpper) << true << (int)(Qt::MatchEndsWith) << "a";
       
   889 
       
   890         // Endswith with open ends
       
   891         QTest::newRow("string range - endswith no max - 1") << manager << namedef << lastname << QVariant("sen") << ev << true << (int)(QContactDetailRangeFilter::ExcludeLower) << true << (int)(Qt::MatchEndsWith) << "acdg";
       
   892         QTest::newRow("string range - endswith no max - 2") << manager << namedef << lastname << QVariant("sen") << ev << true << (int)(QContactDetailRangeFilter::IncludeLower) << true << (int)(Qt::MatchEndsWith) << "abcdg";
       
   893         QTest::newRow("string range - endswith no max - 3") << manager << namedef << lastname << QVariant("sem") << ev << true << (int)(QContactDetailRangeFilter::ExcludeLower) << true << (int)(Qt::MatchEndsWith) << "abcdg";
       
   894         QTest::newRow("string range - endswith no max - 4") << manager << namedef << lastname << QVariant("sem") << ev << true << (int)(QContactDetailRangeFilter::IncludeLower) << true << (int)(Qt::MatchEndsWith) << "abcdg";
       
   895         QTest::newRow("string range - endswith no min - 1") << manager << namedef << lastname << ev << QVariant("sen") << true << (int)(QContactDetailRangeFilter::ExcludeUpper) << true << (int)(Qt::MatchEndsWith) << "ef";
       
   896         QTest::newRow("string range - endswith no min - 2") << manager << namedef << lastname << ev << QVariant("sen") << true << (int)(QContactDetailRangeFilter::IncludeUpper) << true << (int)(Qt::MatchEndsWith) << "bef";
       
   897         QTest::newRow("string range - endswith no min - 3") << manager << namedef << lastname << ev << QVariant("seo") << true << (int)(QContactDetailRangeFilter::ExcludeUpper) << true << (int)(Qt::MatchEndsWith) << "bef";
       
   898         QTest::newRow("string range - endswith no min - 4") << manager << namedef << lastname << ev << QVariant("seo") << true << (int)(QContactDetailRangeFilter::IncludeUpper) << true << (int)(Qt::MatchEndsWith) << "bef";
       
   899 
   892 
   900         /* A(10), B(20), C(-20) */
   893         /* A(10), B(20), C(-20) */
   901         // Now integer range testing
   894         // Now integer range testing
   902         QPair<QString, QString> defAndFieldNames = defAndFieldNamesForTypePerManager.value(manager).value("Integer");
   895         QPair<QString, QString> defAndFieldNames = defAndFieldNamesForTypePerManager.value(manager).value("Integer");
   903         if (!defAndFieldNames.first.isEmpty() && !defAndFieldNames.second.isEmpty()) {
   896         if (!defAndFieldNames.first.isEmpty() && !defAndFieldNames.second.isEmpty()) {
  2023     QTest::addColumn<QString>("defname");
  2016     QTest::addColumn<QString>("defname");
  2024     QTest::addColumn<QString>("fieldname");
  2017     QTest::addColumn<QString>("fieldname");
  2025     QTest::addColumn<int>("directioni");
  2018     QTest::addColumn<int>("directioni");
  2026     QTest::addColumn<bool>("setbp");
  2019     QTest::addColumn<bool>("setbp");
  2027     QTest::addColumn<int>("blankpolicyi");
  2020     QTest::addColumn<int>("blankpolicyi");
       
  2021     QTest::addColumn<int>("casesensitivityi");
  2028     QTest::addColumn<QString>("expected");
  2022     QTest::addColumn<QString>("expected");
  2029     QTest::addColumn<QString>("unstable");
  2023     QTest::addColumn<QString>("unstable");
  2030 
  2024 
  2031     QString firstname = QContactName::FieldFirstName;
  2025     QString firstname = QContactName::FieldFirstName;
  2032     QString lastname = QContactName::FieldLastName;
  2026     QString lastname = QContactName::FieldLastName;
  2033     QString namedef = QContactName::DefinitionName;
  2027     QString namedef = QContactName::DefinitionName;
  2034     QString urldef = QContactUrl::DefinitionName;
  2028     QString dldef = QContactDisplayLabel::DefinitionName;
  2035     QString urlfield = QContactUrl::FieldUrl;
  2029     QString dlfld = QContactDisplayLabel::FieldLabel;
       
  2030 
       
  2031     int asc = Qt::AscendingOrder;
       
  2032     int desc = Qt::DescendingOrder;
       
  2033     int bll = QContactSortOrder::BlanksLast;
       
  2034     int blf = QContactSortOrder::BlanksFirst;
       
  2035     int cs = Qt::CaseSensitive;
       
  2036     int ci = Qt::CaseInsensitive;
  2036 
  2037 
  2037     for (int i = 0; i < managers.size(); i++) {
  2038     for (int i = 0; i < managers.size(); i++) {
  2038         QContactManager *manager = managers.at(i);
  2039         QContactManager *manager = managers.at(i);
  2039 
  2040 
  2040         QPair<QString, QString> integerDefAndFieldNames = defAndFieldNamesForTypePerManager.value(manager).value("Integer");
  2041         QPair<QString, QString> integerDefAndFieldNames = defAndFieldNamesForTypePerManager.value(manager).value("Integer");
  2041         QPair<QString, QString> stringDefAndFieldNames = defAndFieldNamesForTypePerManager.value(manager).value("String");
  2042         QPair<QString, QString> stringDefAndFieldNames = defAndFieldNamesForTypePerManager.value(manager).value("String");
  2042 
  2043 
  2043         newMRow("first ascending", manager) << manager << namedef << firstname << (int)(Qt::AscendingOrder) << false << 0 << "abcdefg" << "efg";  // efg have the same first name
  2044         newMRow("first ascending", manager) << manager << namedef << firstname << asc << false << 0 << cs << "abcdefghjik" << "efg";  // efg have the same first name
  2044         newMRow("first descending", manager) << manager << namedef << firstname << (int)(Qt::DescendingOrder) << false << 0 << "efgdcba" << "efg";// efg have the same first name
  2045         newMRow("first descending", manager) << manager << namedef << firstname << desc << false << 0 << cs << "kijhefgdcba" << "efg";// efg have the same first name
  2045         newMRow("last ascending", manager) << manager << namedef << lastname << (int)(Qt::AscendingOrder) << false << 0 << "bacdefg" << "";       // all have a well defined, sortable last name
  2046         newMRow("last ascending", manager) << manager << namedef << lastname << asc << false << 0 << cs << "bacdefghijk" << "hijk";       // all have a well defined, sortable last name except hijk
  2046         newMRow("last descending", manager) << manager << namedef << lastname << (int)(Qt::DescendingOrder) << false << 0 << "gfedcab" << "";     // all have a well defined, sortable last name
  2047         newMRow("last descending", manager) << manager << namedef << lastname << desc << false << 0 << cs << "gfedcabhijk" << "hijk";     // all have a well defined, sortable last name except hijk
  2047         if (!integerDefAndFieldNames.first.isEmpty() && !integerDefAndFieldNames.second.isEmpty()) {
  2048         if (!integerDefAndFieldNames.first.isEmpty() && !integerDefAndFieldNames.second.isEmpty()) {
  2048             newMRow("integer ascending, blanks last", manager) << manager << integerDefAndFieldNames.first << integerDefAndFieldNames.second << (int)(Qt::AscendingOrder) << true << (int)(QContactSortOrder::BlanksLast) << "cabgfed" << "gfed"; // gfed have no integer
  2049             newMRow("integer ascending, blanks last", manager) << manager << integerDefAndFieldNames.first << integerDefAndFieldNames.second << asc << true << bll << cs << "cabgfedhijk" << "gfedhijk"; // gfedhijk have no integer
  2049             newMRow("integer descending, blanks last", manager) << manager << integerDefAndFieldNames.first << integerDefAndFieldNames.second << (int)(Qt::DescendingOrder) << true << (int)(QContactSortOrder::BlanksLast) << "bacgfed" << "gfed"; // gfed have no integer
  2050             newMRow("integer descending, blanks last", manager) << manager << integerDefAndFieldNames.first << integerDefAndFieldNames.second << desc << true << bll << cs << "bacgfedhijk" << "gfedhijk"; // gfedhijk have no integer
  2050             newMRow("integer ascending, blanks first", manager) << manager << integerDefAndFieldNames.first << integerDefAndFieldNames.second << (int)(Qt::AscendingOrder) << true << (int)(QContactSortOrder::BlanksFirst) << "defgcab" << "gfed"; // gfed have no integer
  2051             newMRow("integer ascending, blanks first", manager) << manager << integerDefAndFieldNames.first << integerDefAndFieldNames.second << asc << true << blf << cs << "hijkdefgcab" << "gfedhijk"; // gfedhijk have no integer
  2051             newMRow("integer descending, blanks first", manager) << manager << integerDefAndFieldNames.first << integerDefAndFieldNames.second << (int)(Qt::DescendingOrder) << true << (int)(QContactSortOrder::BlanksFirst) << "defgbac" << "gfed"; // gfed have no integer
  2052             newMRow("integer descending, blanks first", manager) << manager << integerDefAndFieldNames.first << integerDefAndFieldNames.second << desc << true << blf << cs << "hijkdefgbac" << "gfedhijk"; // gfedhijk have no integer
  2052         }
  2053         }
  2053         if (!stringDefAndFieldNames.first.isEmpty() && !stringDefAndFieldNames.second.isEmpty()) {
  2054         if (!stringDefAndFieldNames.first.isEmpty() && !stringDefAndFieldNames.second.isEmpty()) {
  2054             QTest::newRow("string ascending (null value), blanks first") << manager << stringDefAndFieldNames.first << stringDefAndFieldNames.second << (int)(Qt::AscendingOrder) << true << (int)(QContactSortOrder::BlanksFirst) << "feabcdg" << "fe"; // f and e have blank string
  2055             QTest::newRow("string ascending (null value), blanks first") << manager << stringDefAndFieldNames.first << stringDefAndFieldNames.second << asc << true << blf << cs << "feabcdg" << "fehijk"; // f and e have blank string
  2055             QTest::newRow("string ascending (null value), blanks last") << manager << stringDefAndFieldNames.first << stringDefAndFieldNames.second << (int)(Qt::AscendingOrder) << true << (int)(QContactSortOrder::BlanksLast) << "abcdgef" << "ef";   // f and e have blank string
  2056             QTest::newRow("string ascending (null value), blanks last") << manager << stringDefAndFieldNames.first << stringDefAndFieldNames.second << asc << true << bll << cs << "abcdgef" << "efhijk";   // f and e have blank string
  2056         }
  2057         }
       
  2058 
       
  2059         newMRow("display label insensitive", manager) << manager << dldef << dlfld << asc << false << 0 << cs << "abcdefghjik" << "efg";
       
  2060         newMRow("display label sensitive", manager) << manager << dldef << dlfld << asc << false << 0 << ci << "abcdefghjik" << "efg";
  2057     }
  2061     }
  2058 }
  2062 }
  2059 
  2063 
  2060 void tst_QContactManagerFiltering::sorting()
  2064 void tst_QContactManagerFiltering::sorting()
  2061 {
  2065 {
  2191     QString lastname = QContactName::FieldLastName;
  2195     QString lastname = QContactName::FieldLastName;
  2192     QString namedef = QContactName::DefinitionName;
  2196     QString namedef = QContactName::DefinitionName;
  2193     QString phonedef = QContactPhoneNumber::DefinitionName;
  2197     QString phonedef = QContactPhoneNumber::DefinitionName;
  2194     QString numberfield = QContactPhoneNumber::FieldNumber;
  2198     QString numberfield = QContactPhoneNumber::FieldNumber;
  2195 
  2199 
       
  2200     int asc = Qt::AscendingOrder;
       
  2201     int desc = Qt::DescendingOrder;
       
  2202 
  2196     for (int i = 0; i < managers.size(); i++) {
  2203     for (int i = 0; i < managers.size(); i++) {
  2197         QContactManager *manager = managers.at(i);
  2204         QContactManager *manager = managers.at(i);
  2198         QPair<QString, QString> stringDefAndFieldNames = defAndFieldNamesForTypePerManager.value(manager).value("String");
  2205         QPair<QString, QString> stringDefAndFieldNames = defAndFieldNamesForTypePerManager.value(manager).value("String");
  2199 
  2206 
  2200         QTest::newRow("1") << manager
  2207         QTest::newRow("1") << manager
  2201                            << true << namedef << firstname << (int)(Qt::AscendingOrder)
  2208                            << true << namedef << firstname << asc
  2202                            << true << namedef << lastname << (int)(Qt::AscendingOrder)
  2209                            << true << namedef << lastname << asc
  2203                            << "abcdefg" << false;
  2210                            << "abcdefg" << false;
  2204         QTest::newRow("2") << manager
  2211         QTest::newRow("2") << manager
  2205                            << true << namedef << firstname << (int)(Qt::AscendingOrder)
  2212                            << true << namedef << firstname << asc
  2206                            << true << namedef << lastname << (int)(Qt::DescendingOrder)
  2213                            << true << namedef << lastname << desc
  2207                            << "abcdgfe" << false;
  2214                            << "abcdgfe" << false;
  2208         QTest::newRow("3") << manager
  2215         QTest::newRow("3") << manager
  2209                            << true << namedef << firstname << (int)(Qt::DescendingOrder)
  2216                            << true << namedef << firstname << desc
  2210                            << true << namedef << lastname << (int)(Qt::AscendingOrder)
  2217                            << true << namedef << lastname << asc
  2211                            << "efgdcba" << false;
  2218                            << "efgdcba" << false;
  2212         QTest::newRow("4") << manager
  2219         QTest::newRow("4") << manager
  2213                            << true << namedef << firstname << (int)(Qt::DescendingOrder)
  2220                            << true << namedef << firstname << desc
  2214                            << true << namedef << lastname << (int)(Qt::DescendingOrder)
  2221                            << true << namedef << lastname << desc
  2215                            << "gfedcba" << false;
  2222                            << "gfedcba" << false;
  2216 
  2223 
  2217         QTest::newRow("5") << manager
  2224         QTest::newRow("5") << manager
  2218                            << true << namedef << firstname << (int)(Qt::AscendingOrder)
  2225                            << true << namedef << firstname << asc
  2219                            << false << namedef << lastname << (int)(Qt::AscendingOrder)
  2226                            << false << namedef << lastname << asc
  2220                            << "abcdefg" << true;
  2227                            << "abcdefg" << true;
  2221 
  2228 
  2222         QTest::newRow("5b") << manager
  2229         QTest::newRow("5b") << manager
  2223                            << true << namedef << firstname << (int)(Qt::AscendingOrder)
  2230                            << true << namedef << firstname << asc
  2224                            << true << es << es << (int)(Qt::AscendingOrder)
  2231                            << true << es << es << asc
  2225                            << "abcdefg" << true;
  2232                            << "abcdefg" << true;
  2226 
  2233 
  2227         QTest::newRow("6") << manager
  2234         QTest::newRow("6") << manager
  2228                            << false << namedef << firstname << (int)(Qt::AscendingOrder)
  2235                            << false << namedef << firstname << asc
  2229                            << true << namedef << lastname << (int)(Qt::AscendingOrder)
  2236                            << true << namedef << lastname << asc
  2230                            << "bacdefg" << false;
  2237                            << "bacdefg" << false;
  2231 
  2238 
  2232         // This test is completely unstable; no sort criteria means dependent upon internal sort order of manager.
  2239         // This test is completely unstable; no sort criteria means dependent upon internal sort order of manager.
  2233         //QTest::newRow("7") << manager
  2240         //QTest::newRow("7") << manager
  2234         //                   << false << namedef << firstname << (int)(Qt::AscendingOrder)
  2241         //                   << false << namedef << firstname << asc
  2235         //                   << false << namedef << lastname << (int)(Qt::AscendingOrder)
  2242         //                   << false << namedef << lastname << asc
  2236         //                   << "abcdefg" << false; // XXX Isn't this totally unstable?
  2243         //                   << "abcdefg" << false; // XXX Isn't this totally unstable?
  2237 
  2244 
  2238         if (!stringDefAndFieldNames.first.isEmpty() && !stringDefAndFieldNames.second.isEmpty()) {
  2245         if (!stringDefAndFieldNames.first.isEmpty() && !stringDefAndFieldNames.second.isEmpty()) {
  2239             QTest::newRow("8") << manager
  2246             QTest::newRow("8") << manager
  2240                                << true << stringDefAndFieldNames.first << stringDefAndFieldNames.second << (int)(Qt::AscendingOrder)
  2247                                << true << stringDefAndFieldNames.first << stringDefAndFieldNames.second << asc
  2241                                << false << stringDefAndFieldNames.first << stringDefAndFieldNames.second << (int)(Qt::DescendingOrder)
  2248                                << false << stringDefAndFieldNames.first << stringDefAndFieldNames.second << desc
  2242                                << "abcdgef" << false; // default policy = blanks last, and ef have no value (e is empty, f is null)
  2249                                << "abcdgef" << false; // default policy = blanks last, and ef have no value (e is empty, f is null)
  2243 
  2250 
  2244             QTest::newRow("8b") << manager
  2251             QTest::newRow("8b") << manager
  2245                                << true << stringDefAndFieldNames.first << stringDefAndFieldNames.second << (int)(Qt::AscendingOrder)
  2252                                << true << stringDefAndFieldNames.first << stringDefAndFieldNames.second << asc
  2246                                << false << es << es << (int)(Qt::DescendingOrder)
  2253                                << false << es << es << desc
  2247                                << "abcdgef" << false; // default policy = blanks last, and ef have no value (e is empty, f is null)
  2254                                << "abcdgef" << false; // default policy = blanks last, and ef have no value (e is empty, f is null)
  2248         }
  2255         }
  2249 
  2256 
  2250         QTest::newRow("9") << manager
  2257         QTest::newRow("9") << manager
  2251                            << true << phonedef << numberfield << (int)(Qt::AscendingOrder)
  2258                            << true << phonedef << numberfield << asc
  2252                            << true << namedef << lastname << (int)(Qt::DescendingOrder)
  2259                            << true << namedef << lastname << desc
  2253                            << "abgfedc" << false;
  2260                            << "abgfedc" << false;
  2254 
  2261 
  2255         QTest::newRow("10") << manager
  2262         QTest::newRow("10") << manager
  2256                             << true << namedef << firstname << (int)(Qt::AscendingOrder)
  2263                             << true << namedef << firstname << asc
  2257                             << true << namedef << firstname << (int)(Qt::DescendingOrder)
  2264                             << true << namedef << firstname << desc
  2258                             << "abcdefg" << true;
  2265                             << "abcdefg" << true;
  2259 
  2266 
  2260     }
  2267     }
  2261 }
  2268 }
  2262 
  2269 
  2292     if (secondsort)
  2299     if (secondsort)
  2293         sortOrders.append(ss);
  2300         sortOrders.append(ss);
  2294 
  2301 
  2295     QList<QContactLocalId> ids = cm->contactIds(sortOrders);
  2302     QList<QContactLocalId> ids = cm->contactIds(sortOrders);
  2296     QString output = convertIds(contacts, ids);
  2303     QString output = convertIds(contacts, ids);
       
  2304 
       
  2305     // Remove the display label tests
       
  2306     output.remove('h');
       
  2307     output.remove('i');
       
  2308     output.remove('j');
       
  2309     output.remove('k');
  2297 
  2310 
  2298     // Just like the single sort test, we might get some contacts back in indeterminate order
  2311     // Just like the single sort test, we might get some contacts back in indeterminate order
  2299     // (but their relative position with other contacts should not change)
  2312     // (but their relative position with other contacts should not change)
  2300     if (efgunstable) {
  2313     if (efgunstable) {
  2301         QVERIFY(output.count('e') == 1);
  2314         QVERIFY(output.count('e') == 1);
  2914     successfulSave = cm->saveContact(&g);
  2927     successfulSave = cm->saveContact(&g);
  2915     Q_ASSERT(successfulSave);
  2928     Q_ASSERT(successfulSave);
  2916     originalContactCount += 7;
  2929     originalContactCount += 7;
  2917     Q_ASSERT(cm->contactIds().count() == originalContactCount);
  2930     Q_ASSERT(cm->contactIds().count() == originalContactCount);
  2918 
  2931 
       
  2932     /* Now some for the locale aware sorting */
       
  2933     QContact h, i, j, k;
       
  2934     QContactName n2;
       
  2935     n2.setFirstName("xander");
       
  2936     n2.setCustomLabel("xander");
       
  2937     h.saveDetail(&n2);
       
  2938     n2.setFirstName("Xander");
       
  2939     n2.setCustomLabel("Xander");
       
  2940     i.saveDetail(&n2);
       
  2941     n2.setFirstName("xAnder");
       
  2942     n2.setCustomLabel("xAnder");
       
  2943     j.saveDetail(&n2);
       
  2944     n2.setFirstName("Yarrow");
       
  2945     n2.setCustomLabel("Yarrow");
       
  2946     k.saveDetail(&n2);
       
  2947 
       
  2948     // XXX add &aumlaut; or &acircum; etc to test those sort orders
       
  2949     h = cm->compatibleContact(h);
       
  2950     i = cm->compatibleContact(i);
       
  2951     j = cm->compatibleContact(j);
       
  2952     k = cm->compatibleContact(k);
       
  2953     successfulSave = cm->saveContact(&h);
       
  2954     Q_ASSERT(successfulSave);
       
  2955     successfulSave = cm->saveContact(&i);
       
  2956     Q_ASSERT(successfulSave);
       
  2957     successfulSave = cm->saveContact(&j);
       
  2958     Q_ASSERT(successfulSave);
       
  2959     successfulSave = cm->saveContact(&k);
       
  2960     Q_ASSERT(successfulSave);
       
  2961 
  2919     /* Ensure the last modified times are different */
  2962     /* Ensure the last modified times are different */
  2920     QTest::qSleep(napTime);
  2963     QTest::qSleep(napTime);
  2921     QContactName modifiedName = c.detail(QContactName::DefinitionName);
  2964     QContactName modifiedName = c.detail(QContactName::DefinitionName);
  2922     modifiedName.setCustomLabel("Clarence");
  2965     modifiedName.setCustomLabel("Clarence");
  2923     c.saveDetail(&modifiedName);
  2966     c.saveDetail(&modifiedName);
  2933     a.saveDetail(&modifiedName);
  2976     a.saveDetail(&modifiedName);
  2934     cm->saveContact(&a);
  2977     cm->saveContact(&a);
  2935     QTest::qSleep(napTime);
  2978     QTest::qSleep(napTime);
  2936 
  2979 
  2937     /* Add our newly saved contacts to our internal list of added contacts */
  2980     /* Add our newly saved contacts to our internal list of added contacts */
       
  2981     contactsAddedToManagers.insert(cm, k.id().localId());
       
  2982     contactsAddedToManagers.insert(cm, j.id().localId());
       
  2983     contactsAddedToManagers.insert(cm, i.id().localId());
       
  2984     contactsAddedToManagers.insert(cm, h.id().localId());
  2938     contactsAddedToManagers.insert(cm, g.id().localId());
  2985     contactsAddedToManagers.insert(cm, g.id().localId());
  2939     contactsAddedToManagers.insert(cm, f.id().localId());
  2986     contactsAddedToManagers.insert(cm, f.id().localId());
  2940     contactsAddedToManagers.insert(cm, e.id().localId());
  2987     contactsAddedToManagers.insert(cm, e.id().localId());
  2941     contactsAddedToManagers.insert(cm, d.id().localId());
  2988     contactsAddedToManagers.insert(cm, d.id().localId());
  2942     contactsAddedToManagers.insert(cm, c.id().localId());
  2989     contactsAddedToManagers.insert(cm, c.id().localId());
  2949     c = cm->contact(c.id().localId());
  2996     c = cm->contact(c.id().localId());
  2950     d = cm->contact(d.id().localId());
  2997     d = cm->contact(d.id().localId());
  2951     e = cm->contact(e.id().localId());
  2998     e = cm->contact(e.id().localId());
  2952     f = cm->contact(f.id().localId());
  2999     f = cm->contact(f.id().localId());
  2953     g = cm->contact(g.id().localId());
  3000     g = cm->contact(g.id().localId());
       
  3001     h = cm->contact(h.id().localId());
       
  3002     i = cm->contact(i.id().localId());
       
  3003     j = cm->contact(j.id().localId());
       
  3004     k = cm->contact(k.id().localId());
  2954 
  3005 
  2955     QList<QContactLocalId> list;
  3006     QList<QContactLocalId> list;
  2956     if (!a.isEmpty())
  3007     if (!a.isEmpty())
  2957         list << a.id().localId();
  3008         list << a.id().localId();
  2958     if (!b.isEmpty())
  3009     if (!b.isEmpty())
  2965         list << e.id().localId();
  3016         list << e.id().localId();
  2966     if (!f.isEmpty())
  3017     if (!f.isEmpty())
  2967         list << f.id().localId();
  3018         list << f.id().localId();
  2968     if (!g.isEmpty())
  3019     if (!g.isEmpty())
  2969         list << g.id().localId();
  3020         list << g.id().localId();
       
  3021     if (!h.isEmpty())
       
  3022         list << h.id().localId();
       
  3023     if (!i.isEmpty())
       
  3024         list << i.id().localId();
       
  3025     if (!j.isEmpty())
       
  3026         list << j.id().localId();
       
  3027     if (!k.isEmpty())
       
  3028         list << k.id().localId();
  2970 
  3029 
  2971     return list;
  3030     return list;
  2972 }
  3031 }
  2973 
  3032 
  2974 /* ============ Utility functions ============= */
  3033 /* ============ Utility functions ============= */