diff -r e686773b3f54 -r 0ba2181d7c28 qtcontactsmobility/tests/auto/qversitutils/ut_versitutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtcontactsmobility/tests/auto/qversitutils/ut_versitutils.cpp Fri Mar 19 09:27:18 2010 +0200 @@ -0,0 +1,745 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "ut_versitutils.h" +#include +#include + +#include "versitutils_p.h" + +QTM_USE_NAMESPACE + +void UT_VersitUtils::testCountLeadingWhiteSpaces() +{ + // Empty string + QByteArray text; + QCOMPARE(VersitUtils::countLeadingWhiteSpaces(text), 0); + + // Only whitespaces + text = " \r \n\t \t"; + QCOMPARE(VersitUtils::countLeadingWhiteSpaces(text), 7); + + // One whitespace with other characters + text = " text"; + QCOMPARE(VersitUtils::countLeadingWhiteSpaces(text), 1); + + // Several whitespaces with other characters + text = "\t\r\n\r\n text"; + QCOMPARE(VersitUtils::countLeadingWhiteSpaces(text), 6); + + // No whitespaces + text = "text"; + QCOMPARE(VersitUtils::countLeadingWhiteSpaces(text), 0); + + // Start counting whitespaces in the middle of the string + text = "something \r\n\r\n"; + QCOMPARE(VersitUtils::countLeadingWhiteSpaces(text,9), 5); +} + +void UT_VersitUtils::testFindHardLineBreakInQuotedPrintable() +{ + // Empty string + QCOMPARE(-1, VersitUtils::findHardLineBreakInQuotedPrintable(QByteArray())); + + // No line breaks + QCOMPARE(-1, VersitUtils::findHardLineBreakInQuotedPrintable(QByteArray("just text"))); + + // No soft line breaks + QCOMPARE(4, VersitUtils::findHardLineBreakInQuotedPrintable(QByteArray("text\r\n"))); + + // One soft line break + QCOMPARE(7, VersitUtils::findHardLineBreakInQuotedPrintable(QByteArray("te=\r\nxt\r\n"))); + + // Two soft line breaks + QCOMPARE(10, VersitUtils::findHardLineBreakInQuotedPrintable(QByteArray("t=\r\ne=\r\nxt\r\n"))); +} + +void UT_VersitUtils::testParamName() +{ + // Empty value + QByteArray param; + QCOMPARE(VersitUtils::paramName(param),QByteArray()); + + // Only value present + param = "WORK"; + QCOMPARE(QString::fromAscii(VersitUtils::paramName(param)), + QString::fromAscii("TYPE")); + + // Both name and value, spaces after the name + param = "TYPE \t =WORK"; + QCOMPARE(QString::fromAscii(VersitUtils::paramName(param)), + QString::fromAscii("TYPE")); + + // Both name and value, no spaces after the name + param = "TYPE=WORK"; + QCOMPARE(QString::fromAscii(VersitUtils::paramName(param)), + QString::fromAscii("TYPE")); +} + +void UT_VersitUtils::testParamValue() +{ + // Empty value + QByteArray param; + QCOMPARE(VersitUtils::paramValue(param),QByteArray()); + + // Only value present + param = "WORK"; + QCOMPARE(QString::fromAscii(VersitUtils::paramValue(param)), + QString::fromAscii("WORK")); + + // Name and equals sign, but no value + param = "TYPE="; + QCOMPARE(VersitUtils::paramValue(param),QByteArray()); + + // Name and equals sign, but value has only spaces + param = "TYPE= \t "; + QCOMPARE(VersitUtils::paramValue(param),QByteArray()); + + // Both name and value, spaces before the value + param = "TYPE= \t WORK"; + QCOMPARE(QString::fromAscii(VersitUtils::paramValue(param)), + QString::fromAscii("WORK")); + + // Both name and value, no spaces before the value + param = "ENCODING=QUOTED-PRINTABLE"; + QCOMPARE(QString::fromAscii(VersitUtils::paramValue(param)), + QString::fromAscii("QUOTED-PRINTABLE")); +} + +void UT_VersitUtils::testExtractPart() +{ + QByteArray originalStr; + + // Negative starting position + QCOMPARE(VersitUtils::extractPart(originalStr,-1,1), QByteArray()); + + // Empty original string + QCOMPARE(VersitUtils::extractPart(originalStr,0,1), QByteArray()); + + // Trimmed substring empty + originalStr = " \t \t"; + QCOMPARE(VersitUtils::extractPart(originalStr,0,4), QByteArray()); + + // The given substring length is greater than the original string length + originalStr = "ENCODING=7BIT"; + QCOMPARE(VersitUtils::extractPart(originalStr,0,100), originalStr); + + // Non-empty substring, from the beginning + originalStr = " TYPE=WORK ; X-PARAM=X-VALUE; ENCODING=8BIT"; + QCOMPARE(VersitUtils::extractPart(originalStr,0,11), + QByteArray("TYPE=WORK")); + + // Non-empty substring, from the middle + QCOMPARE(VersitUtils::extractPart(originalStr,12,16), + QByteArray("X-PARAM=X-VALUE")); + + // Non-empty substring, from the middle to the end + QCOMPARE(VersitUtils::extractPart(originalStr,29), + QByteArray("ENCODING=8BIT")); +} + +void UT_VersitUtils::testExtractParts() +{ + QList parts; + + // Empty value + QByteArray text; + parts = VersitUtils::extractParts(text,';'); + QVERIFY(parts.isEmpty()); + + // Only separator + text = ";"; + parts = VersitUtils::extractParts(text,';'); + QVERIFY(parts.isEmpty()); + + // One part + text = "part"; + parts = VersitUtils::extractParts(text,';'); + QCOMPARE(parts.count(),1); + QCOMPARE(QString::fromAscii(parts[0]),QString::fromAscii("part")); + + // Separator in the beginning, one part + text = ";part"; + parts = VersitUtils::extractParts(text,';'); + QCOMPARE(parts.count(),1); + QCOMPARE(QString::fromAscii(parts[0]),QString::fromAscii("part")); + + // Separator in the end, one part + text = "part;"; + parts = VersitUtils::extractParts(text,';'); + QCOMPARE(parts.count(),1); + QCOMPARE(QString::fromAscii(parts[0]),QString::fromAscii("part")); + + // One part that contains escaped separator + text = "part\\;"; + parts = VersitUtils::extractParts(text,';'); + QCOMPARE(parts.count(),1); + QCOMPARE(QString::fromAscii(parts[0]),QString::fromAscii("part\\;")); + + // Two parts + text = "part1;part2"; + parts = VersitUtils::extractParts(text,';'); + QCOMPARE(parts.count(),2); + QCOMPARE(QString::fromAscii(parts[0]),QString::fromAscii("part1")); + QCOMPARE(QString::fromAscii(parts[1]),QString::fromAscii("part2")); + + // Two parts that contain escaped separators + text = "pa\\;rt1;par\\;t2"; + parts = VersitUtils::extractParts(text,';'); + QCOMPARE(parts.count(),2); + QCOMPARE(QString::fromAscii(parts[0]),QString::fromAscii("pa\\;rt1")); + QCOMPARE(QString::fromAscii(parts[1]),QString::fromAscii("par\\;t2")); +} + +void UT_VersitUtils::testFold() +{ + int maxCharsForLine = 3; + + // Empty string + QByteArray unfolded; + QByteArray folded; + QCOMPARE( + QString::fromAscii(VersitUtils::fold(unfolded,maxCharsForLine)), + QString::fromAscii(folded)); + + // String that needs one folding + unfolded = "12345"; + folded = "123\r\n 45"; + QCOMPARE( + QString::fromAscii(VersitUtils::fold(unfolded,maxCharsForLine)), + QString::fromAscii(folded)); + + // String that needs multiple foldings + unfolded = "1234567"; + folded = "123\r\n 45\r\n 67"; + QCOMPARE( + QString::fromAscii(VersitUtils::fold(unfolded,maxCharsForLine)), + QString::fromAscii(folded)); + + // String that has line breaks and needs foldings + unfolded = "12\r\n3456789"; + folded = "12\r\n345\r\n 67\r\n 89"; + QCOMPARE( + QString::fromAscii(VersitUtils::fold(unfolded,maxCharsForLine)), + QString::fromAscii(folded)); + + // Line break in the beginning of the string + unfolded = "\r\n12345"; + folded = "\r\n123\r\n 45"; + QCOMPARE( + QString::fromAscii(VersitUtils::fold(unfolded,maxCharsForLine)), + QString::fromAscii(folded)); + + // Input contains the amount of characters after which a folding + // would normally be added -> Folding not added + unfolded = "123"; + folded = "123"; + QCOMPARE( + QString::fromAscii(VersitUtils::fold(unfolded,maxCharsForLine)), + QString::fromAscii(folded)); + + // CR in the end of the string -> Folding not added + unfolded = "123\r"; + folded = "123\r"; + QCOMPARE( + QString::fromAscii(VersitUtils::fold(unfolded,maxCharsForLine)), + QString::fromAscii(folded)); + + // CRLF in the end of the string -> Folding not added + unfolded = "123\r\n"; + folded = "123\r\n"; + QCOMPARE( + QString::fromAscii(VersitUtils::fold(unfolded,maxCharsForLine)), + QString::fromAscii(folded)); +} + +void UT_VersitUtils::testUnfold() +{ + // No folding + QCOMPARE(QByteArray("no folding\r\n"), QByteArray("no folding\r\n")); + + // Single space + QByteArray folded("unfol\r\n ded\r\n"); + QByteArray unfolded("unfolded\r\n"); + QCOMPARE(unfolded, VersitUtils::unfold(folded)); + + // Multiple spaces + folded = "unfol\r\n ded\r\n"; + unfolded = "unfol ded\r\n"; + QCOMPARE(unfolded, VersitUtils::unfold(folded)); + + // Single tab + folded = "unfol\r\n\tded\r\n"; + unfolded = "unfolded\r\n"; + QCOMPARE(unfolded, VersitUtils::unfold(folded)); + + // Multiple tabs + folded = "unfol\r\n\t\tded\r\n"; + unfolded = "unfol\tded\r\n"; + QCOMPARE(unfolded, VersitUtils::unfold(folded)); + + // One space and one tab + folded = "unfol\r\n \tded\r\n"; + QCOMPARE(unfolded, VersitUtils::unfold(folded)); + + // One tab and one space + folded = "unfol\r\n\t ded\r\n"; + unfolded = "unfol ded\r\n"; + QCOMPARE(unfolded, VersitUtils::unfold(folded)); + + // Multiple spaces and tabs + folded = "unfol\r\n\t \t \t\t ded\r\n"; + unfolded = "unfol \t \t\t ded\r\n"; + QCOMPARE(unfolded, VersitUtils::unfold(folded)); + + // Two foldings + folded = "un\r\n\tfol\r\n ded\r\n"; + unfolded = "unfolded\r\n"; + QCOMPARE(unfolded, VersitUtils::unfold(folded)); + + // Three foldings + folded = "un\r\n fol\r\n\tde\r\n d\r\n"; + unfolded = "unfolded\r\n"; + QCOMPARE(unfolded, VersitUtils::unfold(folded)); + + // Two actual lines containing foldings + folded = "li\r\n\tne1\r\nl\r\n ine2\r\n"; + unfolded = "line1\r\nline2\r\n"; + QCOMPARE(unfolded, VersitUtils::unfold(folded)); +} + +void UT_VersitUtils::testQuotedPrintableEncode() +{ + QByteArray encodedBytes; + + // Nothing to encode + QByteArray nothingToEncode("nothing to encode"); + QVERIFY(!VersitUtils::quotedPrintableEncode(nothingToEncode)); + + // Special characters + QByteArray inputOutput("\n"); + QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QByteArray("=0A")); + inputOutput = "\r"; + QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QByteArray("=0D")); + inputOutput = "!"; + QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QByteArray("=21")); + inputOutput = "\""; + QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QByteArray("=22")); + inputOutput = "#"; + QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QByteArray("=23")); + inputOutput = "$"; + QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QByteArray("=24")); + inputOutput = "="; + QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QByteArray("=3D")); + inputOutput = "@"; + QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QByteArray("=40")); + inputOutput = "["; + QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QByteArray("=5B")); + inputOutput = "\\"; + QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QByteArray("=5C")); + inputOutput = "]"; + QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QByteArray("=5D")); + inputOutput = "^"; + QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QByteArray("=5E")); + inputOutput = "`"; + QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QByteArray("=60")); + inputOutput = "{"; + QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QByteArray("=7B")); + inputOutput = "|"; + QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QByteArray("=7C")); + inputOutput = "}"; + QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QByteArray("=7D")); + inputOutput = "~"; + QVERIFY(VersitUtils::quotedPrintableEncode(inputOutput)); + QCOMPARE(inputOutput, QByteArray("=7E")); +} + +void UT_VersitUtils::testDecodeQuotedPrintable() +{ + // Soft line breaks + QByteArray encoded("This=\r\n is =\r\none line."); + QByteArray decoded("This is one line."); + VersitUtils::decodeQuotedPrintable(encoded); + QCOMPARE(encoded, decoded); + + // Characters recommended to be encoded according to RFC 1521: + encoded = "To be decoded: =0A=0D=21=22=23=24=3D=40=5B=5C=5D=5E=60=7B=7C=7D=7E"; + decoded = "To be decoded: \n\r!\"#$=@[\\]^`{|}~"; + VersitUtils::decodeQuotedPrintable(encoded); + QCOMPARE(encoded, decoded); + + // Other random characters encoded. + // Some implementation may encode these too, as it is allowed. + encoded = "=45=6E=63=6F=64=65=64 =64=61=74=61"; + decoded = "Encoded data"; + VersitUtils::decodeQuotedPrintable(encoded); + QCOMPARE(encoded, decoded); +} + +void UT_VersitUtils::testBackSlashEscape() +{ + // Empty string + QByteArray input; + QVERIFY(!VersitUtils::backSlashEscape(input)); + QCOMPARE(input,QByteArray()); + + // Nothing to escape in the string + input = "Nothing to escape"; + QVERIFY(!VersitUtils::backSlashEscape(input)); + QCOMPARE(QString::fromAscii(input),QString::fromAscii("Nothing to escape")); + + // Line break in the beginning + input = "\r\n input"; + QVERIFY(VersitUtils::backSlashEscape(input)); + QCOMPARE(QString::fromAscii(input),QString::fromAscii("\\n input")); + + // Line break in the end + input = "input\r\n"; + QVERIFY(VersitUtils::backSlashEscape(input)); + QCOMPARE(QString::fromAscii(input),QString::fromAscii("input\\n")); + + // Semicolon in the beginning + input = ";input"; + QVERIFY(VersitUtils::backSlashEscape(input)); + QCOMPARE(QString::fromAscii(input),QString::fromAscii("\\;input")); + + // Semicolon in the end + input = "input;"; + QVERIFY(VersitUtils::backSlashEscape(input)); + QCOMPARE(QString::fromAscii(input),QString::fromAscii("input\\;")); + + // Comma in the beginning + input = ",input"; + QVERIFY(VersitUtils::backSlashEscape(input)); + QCOMPARE(QString::fromAscii(input),QString::fromAscii("\\,input")); + + // Comma in the end + input = "input,"; + QVERIFY(VersitUtils::backSlashEscape(input)); + QCOMPARE(QString::fromAscii(input),QString::fromAscii("input\\,")); + + // Backslash in the beginning + input = "\\input"; + QVERIFY(VersitUtils::backSlashEscape(input)); + QCOMPARE(QString::fromAscii(input),QString::fromAscii("\\\\input")); + + // Backslash in the end + input = "input\\"; + QVERIFY(VersitUtils::backSlashEscape(input)); + QCOMPARE(QString::fromAscii(input),QString::fromAscii("input\\\\")); + + // Line break, semicolon, backslash and comma in the middle of the string + input = "Escape these \r\n ; , \\ "; + QVERIFY(VersitUtils::backSlashEscape(input)); + QCOMPARE(QString::fromAscii(input), + QString::fromAscii("Escape these \\n \\; \\, \\\\ ")); + + // Escaping not done for an already escaped string + QVERIFY(!VersitUtils::backSlashEscape(input)); + QCOMPARE(QString::fromAscii(input), + QString::fromAscii("Escape these \\n \\; \\, \\\\ ")); + + // Don't escape special characters within quotes + input = "Quoted \"\r\n ; , \\ \""; + QVERIFY(!VersitUtils::backSlashEscape(input)); + QCOMPARE(QString::fromAscii(input), + QString::fromAscii("Quoted \"\r\n ; , \\ \"")); + +} + +void UT_VersitUtils::testRemoveBackSlashEscaping() +{ + // Empty string + QByteArray input; + VersitUtils::removeBackSlashEscaping(input); + QCOMPARE(input,QByteArray()); + + // Nothing to escape in the string + input = "Nothing to escape"; + VersitUtils::removeBackSlashEscaping(input); + QCOMPARE(QString::fromAscii(input),QString::fromAscii("Nothing to escape")); + + // Line break, semicolon, backslash and comma in the string + input = "These should be unescaped \\n \\N \\; \\, \\\\"; + VersitUtils::removeBackSlashEscaping(input); + QCOMPARE(QString::fromAscii(input), + QString::fromAscii("These should be unescaped \r\n \r\n ; , \\")); + + // Don't remove escaping within quotes + input = "Quoted \"\\n \\N \\; \\,\""; + QVERIFY(!VersitUtils::backSlashEscape(input)); + QCOMPARE(QString::fromAscii(input), + QString::fromAscii("Quoted \"\\n \\N \\; \\,\"")); +} + +void UT_VersitUtils::testExtractPropertyGroupsAndName() +{ + QPair groupsAndName; + + // Empty string + groupsAndName = VersitUtils::extractPropertyGroupsAndName(QByteArray()); + QCOMPARE(groupsAndName.first.count(),0); + QCOMPARE(groupsAndName.second,QString()); + + // No value -> returns empty string and no groups + QByteArray property("TEL"); + groupsAndName = VersitUtils::extractPropertyGroupsAndName(property); + QCOMPARE(groupsAndName.first.count(),0); + QCOMPARE(groupsAndName.second,QString()); + + // Simple name and value + property = "TEL:123"; + groupsAndName = VersitUtils::extractPropertyGroupsAndName(property); + QCOMPARE(groupsAndName.first.count(),0); + QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); + + // One whitespace before colon + property = "TEL :123"; + groupsAndName = VersitUtils::extractPropertyGroupsAndName(property); + QCOMPARE(groupsAndName.first.count(),0); + QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); + + // Several whitespaces before colon + property = "TEL \t :123"; + groupsAndName = VersitUtils::extractPropertyGroupsAndName(property); + QCOMPARE(groupsAndName.first.count(),0); + QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); + + // Name contains a group + property = "group1.TEL:1234"; + groupsAndName = VersitUtils::extractPropertyGroupsAndName(property); + QCOMPARE(groupsAndName.first.count(),1); + QCOMPARE(groupsAndName.first.takeFirst(),QString::fromAscii("group1")); + QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); + + // Name contains more than one group + property = "group1.group2.TEL:12345"; + groupsAndName = VersitUtils::extractPropertyGroupsAndName(property); + QCOMPARE(groupsAndName.first.count(),2); + QCOMPARE(groupsAndName.first.takeFirst(),QString::fromAscii("group1")); + QCOMPARE(groupsAndName.first.takeFirst(),QString::fromAscii("group2")); + QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); + + // Property contains one parameter + property = "TEL;WORK:123"; + groupsAndName = VersitUtils::extractPropertyGroupsAndName(property); + QCOMPARE(groupsAndName.first.count(),0); + QCOMPARE(groupsAndName.second,QString::fromAscii("TEL")); + + // Property contains several parameters + property = "EMAIL;INTERNET;ENCODING=QUOTED-PRINTABLE:user=40ovi.com"; + groupsAndName = VersitUtils::extractPropertyGroupsAndName(property); + QCOMPARE(groupsAndName.first.count(),0); + QCOMPARE(groupsAndName.second,QString::fromAscii("EMAIL")); + + // Name contains an escaped semicolon + property = "X-proper\\;ty:value"; + groupsAndName = VersitUtils::extractPropertyGroupsAndName(property); + QCOMPARE(groupsAndName.first.count(),0); + QCOMPARE(groupsAndName.second,QString::fromAscii("X-proper\\;ty")); +} + +void UT_VersitUtils::testExtractPropertyValue() +{ + // Empty string + QCOMPARE(VersitUtils::extractPropertyValue(QByteArray()), QByteArray()); + + // No colon found + QCOMPARE(VersitUtils::extractPropertyValue(QByteArray("TEL")), QByteArray()); + + // Colon in the end + QCOMPARE(VersitUtils::extractPropertyValue(QByteArray("TEL:")), QByteArray()); + + // Simple name and value + QByteArray property("TEL:123"); + QCOMPARE(VersitUtils::extractPropertyValue(property), QByteArray("123")); + + // Simple name and the value contains colons + property = "X-property:12:3"; + QCOMPARE(VersitUtils::extractPropertyValue(property), QByteArray("12:3")); +} + +void UT_VersitUtils::testExtractVCard21PropertyParams() +{ + // No parameters + QByteArray property("TEL:123"); + QCOMPARE(VersitUtils::extractVCard21PropertyParams(property).count(), 0); + + // "Empty" parameter + property ="TEL;:123"; + QCOMPARE(VersitUtils::extractVCard21PropertyParams(property).count(), 0); + + // Semicolon found, but no value for the property + property = "X-property;TYPE=X-TYPE"; + QCOMPARE(VersitUtils::extractVCard21PropertyParams(property).count(), 0); + + // The property name contains an escaped semicolon, no parameters + property = "X-proper\\;ty:value"; + QCOMPARE(VersitUtils::extractVCard21PropertyParams(property).count(), 0); + + // The property value contains a semicolon, no parameters + property = "X-property:va;lue"; + QCOMPARE(VersitUtils::extractVCard21PropertyParams(property).count(), 0); + + // One parameter + property = "TEL;HOME:123"; + QMultiHash params = + VersitUtils::extractVCard21PropertyParams(property); + QCOMPARE(1, params.count()); + QCOMPARE(1, params.values(QString::fromAscii("TYPE")).count()); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[0],QString::fromAscii("HOME")); + + // Two parameters of the same type + property = "TEL;HOME;VOICE:123"; + params = VersitUtils::extractVCard21PropertyParams(property); + QCOMPARE(2, params.count()); + QCOMPARE(2, params.values(QString::fromAscii("TYPE")).count()); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[0],QString::fromAscii("HOME")); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[1],QString::fromAscii("VOICE")); + + // Two parameters, several empty parameters (extra semicolons) + property = "TEL;;;;HOME;;;;;VOICE;;;:123"; + params = VersitUtils::extractVCard21PropertyParams(property); + QCOMPARE(2, params.count()); + QCOMPARE(2, params.values(QString::fromAscii("TYPE")).count()); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[0],QString::fromAscii("HOME")); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[1],QString::fromAscii("VOICE")); + + // Two parameters with different types + property = "EMAIL;INTERNET;ENCODING=QUOTED-PRINTABLE:user=40ovi.com"; + params.clear(); + params = VersitUtils::extractVCard21PropertyParams(property); + QCOMPARE(2, params.count()); + QList typeParams = params.values(QString::fromAscii("TYPE")); + QCOMPARE(1, typeParams.count()); + QCOMPARE(typeParams[0],QString::fromAscii("INTERNET")); + QList encodingParams = params.values(QString::fromAscii("ENCODING")); + QCOMPARE(1, encodingParams.count()); + QCOMPARE(encodingParams[0],QString::fromAscii("QUOTED-PRINTABLE")); +} + +void UT_VersitUtils::testExtractVCard30PropertyParams() +{ + // No parameters + QByteArray property("TEL:123"); + QCOMPARE(VersitUtils::extractVCard30PropertyParams(property).count(), 0); + + // One parameter + property = "TEL;TYPE=HOME:123"; + QMultiHash params = + VersitUtils::extractVCard30PropertyParams(property); + QCOMPARE(params.count(), 1); + QCOMPARE(params.values(QString::fromAscii("TYPE")).count(), 1); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[0], + QString::fromAscii("HOME")); + + // One parameter with an escaped semicolon + property = "X-property;para\\;meter:value"; + params = VersitUtils::extractVCard30PropertyParams(property); + QCOMPARE(params.count(), 1); + QCOMPARE(params.values(QString::fromAscii("TYPE")).count(), 1); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[0], + QString::fromAscii("para;meter")); + + // One parameter with and escaped comma in the name and the value + property = "TEL;X-PA\\,RAM=VAL\\,UE:123"; + params = VersitUtils::extractVCard30PropertyParams(property); + QCOMPARE(params.count(), 1); + QCOMPARE(params.values(QString::fromAscii("X-PA,RAM")).count(), 1); + QCOMPARE(params.values(QString::fromAscii("X-PA,RAM"))[0], + QString::fromAscii("VAL,UE")); + + // Two parameters of the same type + property = "TEL;TYPE=HOME,VOICE:123"; + params = VersitUtils::extractVCard30PropertyParams(property); + QCOMPARE(params.count(), 2); + QCOMPARE(params.values(QString::fromAscii("TYPE")).count(), 2); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[0],QString::fromAscii("HOME")); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[1],QString::fromAscii("VOICE")); + + // Two parameters of the same type in separate name-values + property = "TEL;TYPE=HOME;TYPE=VOICE:123"; + params = VersitUtils::extractVCard30PropertyParams(property); + QCOMPARE(params.count(), 2); + QCOMPARE(params.values(QString::fromAscii("TYPE")).count(), 2); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[0],QString::fromAscii("HOME")); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[1],QString::fromAscii("VOICE")); + + // Three parameters of the same type + property = "TEL;TYPE=PREF,HOME,VOICE:123"; + params = VersitUtils::extractVCard30PropertyParams(property); + QCOMPARE(params.count(), 3); + QCOMPARE(params.values(QString::fromAscii("TYPE")).count(), 3); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[0],QString::fromAscii("PREF")); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[1],QString::fromAscii("HOME")); + QCOMPARE(params.values(QString::fromAscii("TYPE"))[2],QString::fromAscii("VOICE")); + + // Two parameters with different types + property = "ADR;TYPE=HOME;X-PARAM=X-VALUE:Home Street 1"; + params.clear(); + params = VersitUtils::extractVCard30PropertyParams(property); + QCOMPARE(params.count(), 2); + QList typeParams = params.values(QString::fromAscii("TYPE")); + QCOMPARE(typeParams.count(), 1); + QCOMPARE(typeParams[0],QString::fromAscii("HOME")); + QList encodingParams = params.values(QString::fromAscii("X-PARAM")); + QCOMPARE(encodingParams.count(), 1); + QCOMPARE(encodingParams[0],QString::fromAscii("X-VALUE")); +} + +QTEST_MAIN(UT_VersitUtils) +