qtcontactsmobility/tests/auto/qvcard21writer/ut_qvcard21writer.cpp
changeset 25 76a2435edfd4
parent 24 0ba2181d7c28
equal deleted inserted replaced
24:0ba2181d7c28 25:76a2435edfd4
    40 ****************************************************************************/
    40 ****************************************************************************/
    41 
    41 
    42 #include "ut_qvcard21writer.h"
    42 #include "ut_qvcard21writer.h"
    43 #include "qvcard21writer_p.h"
    43 #include "qvcard21writer_p.h"
    44 #include "qversitproperty.h"
    44 #include "qversitproperty.h"
       
    45 #include "qversitdocument.h"
    45 #include <QtTest/QtTest>
    46 #include <QtTest/QtTest>
    46 #include <QByteArray>
    47 #include <QByteArray>
       
    48 #include <QVariant>
       
    49 
       
    50 // This says "NOKIA" in Katakana
       
    51 const QString KATAKANA_NOKIA(QString::fromUtf8("\xe3\x83\x8e\xe3\x82\xad\xe3\x82\xa2"));
    47 
    52 
    48 QTM_USE_NAMESPACE
    53 QTM_USE_NAMESPACE
    49 
    54 
    50 
       
    51 class MyQVCard21Writer : public QVCard21Writer
       
    52 {
       
    53 public:
       
    54     // expose some protected functions as public
       
    55     QByteArray encodeVersitProperty(const QVersitProperty& property) {return QVCard21Writer::encodeVersitProperty(property);}
       
    56     QByteArray encodeParameters(const QMultiHash<QString,QString>& parameters) const {return QVCard21Writer::encodeParameters(parameters);}
       
    57     bool quotedPrintableEncode(const QVersitProperty& property, QByteArray& value) const {return QVCard21Writer::quotedPrintableEncode(property, value);}
       
    58     QByteArray encodeGroupsAndName(const QVersitProperty& property) const {return QVCard21Writer::encodeGroupsAndName(property);}
       
    59 };
       
    60 
       
    61 void UT_QVCard21Writer::init()
    55 void UT_QVCard21Writer::init()
    62 {
    56 {
    63     mWriter = new MyQVCard21Writer;
    57     mWriter = new QVCard21Writer;
       
    58     mWriter->setCodec(QTextCodec::codecForName("ISO_8859-1"));
    64 }
    59 }
    65 
    60 
    66 void UT_QVCard21Writer::cleanup()
    61 void UT_QVCard21Writer::cleanup()
    67 {
    62 {
    68     delete mWriter;
    63     delete mWriter;
    69 }
    64 }
    70 
    65 
    71 void UT_QVCard21Writer::testEncodeVersitProperty()
    66 void UT_QVCard21Writer::testEncodeVersitProperty()
    72 {
    67 {
       
    68     QByteArray encodedProperty;
       
    69     QBuffer buffer(&encodedProperty);
       
    70     mWriter->setDevice(&buffer);
       
    71     buffer.open(QIODevice::WriteOnly);
       
    72 
    73     // No parameters
    73     // No parameters
    74     QByteArray expectedResult = "FN:John Citizen\r\n";
    74     QByteArray expectedResult = "FN:John Citizen\r\n";
    75     QVersitProperty property;
    75     QVersitProperty property;
    76     property.setName(QString::fromAscii("FN"));
    76     property.setName(QString::fromAscii("FN"));
    77     property.setValue(QByteArray("John Citizen"));
    77     property.setValue(QString::fromAscii("John Citizen"));
    78     QCOMPARE(mWriter->encodeVersitProperty(property), expectedResult);
    78     mWriter->encodeVersitProperty(property);
       
    79     QCOMPARE(encodedProperty, expectedResult);
    79 
    80 
    80     // With parameter(s). No special characters in the value.
    81     // With parameter(s). No special characters in the value.
    81     // -> No need to Quoted-Printable encode the value.
    82     // -> No need to Quoted-Printable encode the value.
       
    83     mWriter->writeCrlf(); // so it doesn't start folding
       
    84     buffer.close();
       
    85     encodedProperty.clear();
       
    86     buffer.open(QIODevice::WriteOnly);
    82     expectedResult = "TEL;HOME:123\r\n";
    87     expectedResult = "TEL;HOME:123\r\n";
    83 
       
    84     property.setName(QString::fromAscii("TEL"));
    88     property.setName(QString::fromAscii("TEL"));
    85     property.setValue(QByteArray("123"));
    89     property.setValue(QString::fromAscii("123"));
    86     property.addParameter(QString::fromAscii("TYPE"),QString::fromAscii("HOME"));
    90     property.insertParameter(QString::fromAscii("TYPE"),QString::fromAscii("HOME"));
    87     QByteArray encodedProperty = mWriter->encodeVersitProperty(property);
    91     mWriter->encodeVersitProperty(property);
    88     QCOMPARE(QString::fromAscii(encodedProperty), QString::fromAscii(expectedResult));
    92     QCOMPARE(encodedProperty, expectedResult);
    89     QCOMPARE(mWriter->encodeVersitProperty(property), expectedResult);
       
    90     
    93     
    91     // With parameter(s). Special characters in the value.
    94     // With parameter(s). Special characters in the value.
    92     // -> The value needs to be Quoted-Printable encoded.
    95     // -> The value needs to be Quoted-Printable encoded.
       
    96     mWriter->writeCrlf(); // so it doesn't start folding
       
    97     buffer.close();
       
    98     encodedProperty.clear();
       
    99     buffer.open(QIODevice::WriteOnly);
    93     expectedResult = "EMAIL;HOME;ENCODING=QUOTED-PRINTABLE:john.citizen=40example.com\r\n";
   100     expectedResult = "EMAIL;HOME;ENCODING=QUOTED-PRINTABLE:john.citizen=40example.com\r\n";
    94     property.setName(QString::fromAscii("EMAIL"));
   101     property.setName(QString::fromAscii("EMAIL"));
    95     property.setValue(QByteArray("john.citizen@example.com"));
   102     property.setValue(QString::fromAscii("john.citizen@example.com"));
    96     QCOMPARE(QString::fromAscii(mWriter->encodeVersitProperty(property)),
   103     mWriter->encodeVersitProperty(property);
    97              QString::fromAscii(expectedResult));
   104     QCOMPARE(encodedProperty, expectedResult);
    98     
   105     
    99     // AGENT property with parameter
   106     // AGENT property with parameter
       
   107     mWriter->writeCrlf(); // so it doesn't start folding
       
   108     buffer.close();
       
   109     encodedProperty.clear();
       
   110     buffer.open(QIODevice::WriteOnly);
   100     expectedResult = 
   111     expectedResult = 
   101 "AGENT;X-PARAMETER=VALUE:\r\n\
   112 "AGENT;X-PARAMETER=VALUE:\r\n\
   102 BEGIN:VCARD\r\n\
   113 BEGIN:VCARD\r\n\
   103 VERSION:2.1\r\n\
   114 VERSION:2.1\r\n\
   104 FN:Secret Agent\r\n\
   115 FN:Secret Agent\r\n\
   105 END:VCARD\r\n\
   116 END:VCARD\r\n\
   106 \r\n";
   117 \r\n";
   107     property.setParameters(QMultiHash<QString,QString>());
   118     property.setParameters(QMultiHash<QString,QString>());
   108     property.setName(QString::fromAscii("AGENT"));
   119     property.setName(QString::fromAscii("AGENT"));
   109     property.setValue(QByteArray());
   120     property.setValue(QString());
   110     property.addParameter(QString::fromAscii("X-PARAMETER"),QString::fromAscii("VALUE"));
   121     property.insertParameter(QString::fromAscii("X-PARAMETER"),QString::fromAscii("VALUE"));
   111     QVersitDocument document;
   122     QVersitDocument document;
   112     QVersitProperty embeddedProperty;
   123     QVersitProperty embeddedProperty;
   113     embeddedProperty.setName(QString(QString::fromAscii("FN")));
   124     embeddedProperty.setName(QString(QString::fromAscii("FN")));
   114     embeddedProperty.setValue(QByteArray("Secret Agent"));
   125     embeddedProperty.setValue(QString::fromAscii("Secret Agent"));
   115     document.addProperty(embeddedProperty);
   126     document.addProperty(embeddedProperty);
   116     property.setEmbeddedDocument(document);
   127     property.setValue(QVariant::fromValue(document));
   117     QCOMPARE(mWriter->encodeVersitProperty(property), expectedResult);
   128     mWriter->encodeVersitProperty(property);
       
   129     QCOMPARE(encodedProperty, expectedResult);
   118 
   130 
   119     // Value is base64 encoded.
   131     // Value is base64 encoded.
   120     // Check that the extra folding and the line break are added
   132     // Check that the extra folding and the line break are added
   121     QByteArray value = QByteArray("value").toBase64();
   133     mWriter->writeCrlf(); // so it doesn't start folding
   122     expectedResult = "Springfield.HOUSE.PHOTO;ENCODING=BASE64:\r\n " + value + "\r\n\r\n";
   134     buffer.close();
       
   135     encodedProperty.clear();
       
   136     buffer.open(QIODevice::WriteOnly);
       
   137     QByteArray value("value");
       
   138     expectedResult = "Springfield.HOUSE.PHOTO;ENCODING=BASE64:\r\n " + value.toBase64() + "\r\n\r\n";
   123     QStringList groups(QString::fromAscii("Springfield"));
   139     QStringList groups(QString::fromAscii("Springfield"));
   124     groups.append(QString::fromAscii("HOUSE"));
   140     groups.append(QString::fromAscii("HOUSE"));
   125     property.setGroups(groups);
   141     property.setGroups(groups);
   126     property.setParameters(QMultiHash<QString,QString>());
   142     property.setParameters(QMultiHash<QString,QString>());
   127     property.setName(QString::fromAscii("PHOTO"));
   143     property.setName(QString::fromAscii("PHOTO"));
   128     property.setValue(value);
   144     property.setValue(value);
   129     property.addParameter(QString::fromAscii("ENCODING"),QString::fromAscii("BASE64"));
   145     mWriter->encodeVersitProperty(property);
   130     QCOMPARE(QString::fromAscii(mWriter->encodeVersitProperty(property).data()),
   146     QCOMPARE(encodedProperty, expectedResult);
   131              QString::fromAscii(expectedResult.data()));
   147 
   132 
   148     // Characters other than ASCII:
       
   149     mWriter->writeCrlf(); // so it doesn't start folding
       
   150     buffer.close();
       
   151     encodedProperty.clear();
       
   152     buffer.open(QIODevice::WriteOnly);
       
   153     expectedResult = "ORG;CHARSET=UTF-8:" + KATAKANA_NOKIA.toUtf8() + "\r\n";
       
   154     property = QVersitProperty();
       
   155     property.setName(QLatin1String("ORG"));
       
   156     property.setValue(KATAKANA_NOKIA);
       
   157     mWriter->encodeVersitProperty(property);
       
   158     QCOMPARE(encodedProperty, expectedResult);
       
   159 
       
   160     // In Shift-JIS codec.
       
   161     mWriter->writeCrlf(); // so it doesn't start folding
       
   162     buffer.close();
       
   163     encodedProperty.clear();
       
   164     buffer.open(QIODevice::WriteOnly);
       
   165     QTextCodec* jisCodec = QTextCodec::codecForName("Shift-JIS");
       
   166     expectedResult = jisCodec->fromUnicode(
       
   167             QLatin1String("ORG:") + KATAKANA_NOKIA + QLatin1String("\r\n"));
       
   168     property = QVersitProperty();
       
   169     property.setName(QLatin1String("ORG"));
       
   170     property.setValue(KATAKANA_NOKIA);
       
   171     mWriter->setCodec(jisCodec);
       
   172     mWriter->encodeVersitProperty(property);
       
   173     QCOMPARE(encodedProperty, expectedResult);
       
   174 
       
   175     // CHARSET and QUOTED-PRINTABLE
       
   176     mWriter->writeCrlf(); // so it doesn't start folding
       
   177     buffer.close();
       
   178     encodedProperty.clear();
       
   179     buffer.open(QIODevice::WriteOnly);
       
   180     expectedResult = "EMAIL;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:john=40"
       
   181                      + KATAKANA_NOKIA.toUtf8() + ".com\r\n";
       
   182     property = QVersitProperty();
       
   183     property.setName(QLatin1String("EMAIL"));
       
   184     property.setValue(QString::fromAscii("john@%1.com").arg(KATAKANA_NOKIA));
       
   185     mWriter->setCodec(QTextCodec::codecForName("ISO_8859-1"));
       
   186     mWriter->encodeVersitProperty(property);
       
   187     QCOMPARE(encodedProperty, expectedResult);
   133 }
   188 }
   134 
   189 
   135 void UT_QVCard21Writer::testEncodeParameters()
   190 void UT_QVCard21Writer::testEncodeParameters()
   136 {
   191 {
       
   192     QByteArray encodedParameters;
       
   193     QBuffer buffer(&encodedParameters);
       
   194     mWriter->setDevice(&buffer);
       
   195     buffer.open(QIODevice::WriteOnly);
       
   196 
   137     QString typeParameterName(QString::fromAscii("TYPE"));
   197     QString typeParameterName(QString::fromAscii("TYPE"));
   138     QString encodingParameterName(QString::fromAscii("ENCODING"));
   198     QString encodingParameterName(QString::fromAscii("ENCODING"));
   139 
   199 
   140     // No parameters
   200     // No parameters
   141     QMultiHash<QString,QString> parameters;
   201     QMultiHash<QString,QString> parameters;
   142     QCOMPARE(QString::fromAscii(mWriter->encodeParameters(parameters)),
   202     mWriter->encodeParameters(parameters);
   143              QString());
   203     QCOMPARE(encodedParameters, QByteArray(""));
   144 
   204 
   145     // One TYPE parameter
   205     // One TYPE parameter
       
   206     mWriter->writeCrlf(); // so it doesn't start folding
       
   207     buffer.close();
       
   208     encodedParameters.clear();
       
   209     buffer.open(QIODevice::WriteOnly);
   146     parameters.insert(typeParameterName,QString::fromAscii("HOME"));
   210     parameters.insert(typeParameterName,QString::fromAscii("HOME"));
   147     QCOMPARE(QString::fromAscii(mWriter->encodeParameters(parameters)),
   211     mWriter->encodeParameters(parameters);
   148              QString::fromAscii(";HOME"));
   212     QCOMPARE(encodedParameters, QByteArray(";HOME"));
   149 
   213 
   150     // Two TYPE parameters
   214     // Two TYPE parameters
       
   215     mWriter->writeCrlf(); // so it doesn't start folding
       
   216     buffer.close();
       
   217     encodedParameters.clear();
       
   218     buffer.open(QIODevice::WriteOnly);
   151     parameters.insert(typeParameterName,QString::fromAscii("VOICE"));
   219     parameters.insert(typeParameterName,QString::fromAscii("VOICE"));
   152     QCOMPARE(QString::fromAscii(mWriter->encodeParameters(parameters)),
   220     mWriter->encodeParameters(parameters);
   153              QString::fromAscii(";VOICE;HOME"));
   221     QCOMPARE(encodedParameters, QByteArray(";VOICE;HOME"));
   154 
   222 
   155     // One ENCODING parameter
   223     // One ENCODING parameter
       
   224     mWriter->writeCrlf(); // so it doesn't start folding
       
   225     buffer.close();
       
   226     encodedParameters.clear();
       
   227     buffer.open(QIODevice::WriteOnly);
   156     parameters.clear();
   228     parameters.clear();
   157     parameters.insert(encodingParameterName,QString::fromAscii("8BIT"));
   229     parameters.insert(encodingParameterName,QString::fromAscii("8BIT"));
   158     QCOMPARE(QString::fromAscii(mWriter->encodeParameters(parameters)),
   230     mWriter->encodeParameters(parameters);
   159              QString::fromAscii(";ENCODING=8BIT"));
   231     QCOMPARE(encodedParameters, QByteArray(";ENCODING=8BIT"));
   160 
   232 
   161     // Two parameters
   233     // Two parameters
       
   234     mWriter->writeCrlf(); // so it doesn't start folding
       
   235     buffer.close();
       
   236     encodedParameters.clear();
       
   237     buffer.open(QIODevice::WriteOnly);
   162     parameters.insert(QString::fromAscii("X-PARAM"),QString::fromAscii("VALUE"));
   238     parameters.insert(QString::fromAscii("X-PARAM"),QString::fromAscii("VALUE"));
   163     QCOMPARE(QString::fromAscii(mWriter->encodeParameters(parameters)),
   239     mWriter->encodeParameters(parameters);
   164              QString::fromAscii(";X-PARAM=VALUE;ENCODING=8BIT"));
   240     QCOMPARE(encodedParameters, QByteArray(";X-PARAM=VALUE;ENCODING=8BIT"));
   165 }
   241 }
   166 
   242 
   167 void UT_QVCard21Writer::testQuotedPrintableEncode()
   243 void UT_QVCard21Writer::testEncodeGroupsAndName()
   168 {
   244 {
   169     QByteArray encodedValue;
       
   170     
       
   171     // The property doesn't contain ENCODING parameter, 
       
   172     // no special characters in the encodedValue -> no need to use Quoted-Printable encode
       
   173     QVersitProperty property;
   245     QVersitProperty property;
   174     property.setName(QString::fromAscii("N"));
   246     QByteArray result;
   175     property.setValue(QByteArray("Citizen;John"));
   247     QBuffer buffer(&result);
   176     QVERIFY(!mWriter->quotedPrintableEncode(property,encodedValue));
   248     mWriter->setDevice(&buffer);
   177     QVERIFY(encodedValue == property.value());
   249     buffer.open(QIODevice::WriteOnly);
   178     
       
   179     // The property doesn't contain ENCODING parameter,
       
   180     // special characters in the encodedValue -> needs to be Quoted-Printable encoded
       
   181     property.setName(QString::fromAscii("EMAIL"));
       
   182     property.setValue(QByteArray("john.citizen@example.com"));
       
   183     QVERIFY(mWriter->quotedPrintableEncode(property,encodedValue));
       
   184     QCOMPARE(QString::fromAscii(encodedValue), QString::fromAscii("john.citizen=40example.com"));
       
   185     
       
   186     // The property contains ENCODING parameter
       
   187     // -> Value should not be Quoted-Printable encoded
       
   188     property.setName(QString::fromAscii("PHOTO"));
       
   189     property.setValue(QByteArray("the data").toBase64());
       
   190     property.addParameter(QString::fromAscii("ENCODING"),QString::fromAscii("BASE64"));
       
   191     QVERIFY(!mWriter->quotedPrintableEncode(property,encodedValue));
       
   192     QVERIFY(encodedValue == property.value());
       
   193 }
       
   194 
       
   195 void UT_QVCard21Writer::testEncodeGroupsAndName()
       
   196 {
       
   197     QVersitProperty property;
       
   198 
   250 
   199     // No groups
   251     // No groups
       
   252 
   200     property.setName(QString::fromAscii("name"));
   253     property.setName(QString::fromAscii("name"));
   201     QByteArray result("NAME");
   254     QByteArray expected("NAME");
   202     QCOMPARE(mWriter->encodeGroupsAndName(property),result);
   255     mWriter->encodeGroupsAndName(property);
       
   256     QCOMPARE(result, expected);
   203 
   257 
   204     // One group
   258     // One group
       
   259     mWriter->writeCrlf(); // so it doesn't start folding
       
   260     buffer.close();
       
   261     result.clear();
       
   262     buffer.open(QIODevice::WriteOnly);
   205     property.setGroups(QStringList(QString::fromAscii("group")));
   263     property.setGroups(QStringList(QString::fromAscii("group")));
   206     result = "group.NAME";
   264     expected = "group.NAME";
   207     QCOMPARE(mWriter->encodeGroupsAndName(property),result);
   265     mWriter->encodeGroupsAndName(property);
       
   266     QCOMPARE(result, expected);
   208 
   267 
   209     // Two groups
   268     // Two groups
       
   269     mWriter->writeCrlf(); // so it doesn't start folding
       
   270     buffer.close();
       
   271     result.clear();
       
   272     buffer.open(QIODevice::WriteOnly);
   210     QStringList groups(QString::fromAscii("group1"));
   273     QStringList groups(QString::fromAscii("group1"));
   211     groups.append(QString::fromAscii("group2"));
   274     groups.append(QString::fromAscii("group2"));
   212     property.setGroups(groups);
   275     property.setGroups(groups);
   213     result = "group1.group2.NAME";
   276     expected = "group1.group2.NAME";
   214     QCOMPARE(mWriter->encodeGroupsAndName(property),result);
   277     mWriter->encodeGroupsAndName(property);
   215 }
   278     QCOMPARE(result, expected);
   216 
   279 }
       
   280 
       
   281 
       
   282 void UT_QVCard21Writer::testQuotedPrintableEncode()
       
   283 {
       
   284     QByteArray encodedBytes;
       
   285 
       
   286     // Nothing to encode
       
   287     QString nothingToEncode(QLatin1String("nothing to encode"));
       
   288     QVERIFY(!mWriter->quotedPrintableEncode(nothingToEncode));
       
   289 
       
   290     // Special characters
       
   291     QString inputOutput(QLatin1String("\n"));
       
   292     QVERIFY(mWriter->quotedPrintableEncode(inputOutput));
       
   293     QCOMPARE(inputOutput, QLatin1String("=0A"));
       
   294     inputOutput = QLatin1String("\r");
       
   295     QVERIFY(mWriter->quotedPrintableEncode(inputOutput));
       
   296     QCOMPARE(inputOutput, QLatin1String("=0D"));
       
   297     inputOutput = QLatin1String("!");
       
   298     QVERIFY(mWriter->quotedPrintableEncode(inputOutput));
       
   299     QCOMPARE(inputOutput, QLatin1String("=21"));
       
   300     inputOutput = QLatin1String("\"");
       
   301     QVERIFY(mWriter->quotedPrintableEncode(inputOutput));
       
   302     QCOMPARE(inputOutput, QLatin1String("=22"));
       
   303     inputOutput = QLatin1String("#");
       
   304     QVERIFY(mWriter->quotedPrintableEncode(inputOutput));
       
   305     QCOMPARE(inputOutput, QLatin1String("=23"));
       
   306     inputOutput = QLatin1String("$");
       
   307     QVERIFY(mWriter->quotedPrintableEncode(inputOutput));
       
   308     QCOMPARE(inputOutput, QLatin1String("=24"));
       
   309     inputOutput = QLatin1String("=");
       
   310     QVERIFY(mWriter->quotedPrintableEncode(inputOutput));
       
   311     QCOMPARE(inputOutput, QLatin1String("=3D"));
       
   312     inputOutput = QLatin1String("@");
       
   313     QVERIFY(mWriter->quotedPrintableEncode(inputOutput));
       
   314     QCOMPARE(inputOutput, QLatin1String("=40"));
       
   315     inputOutput = QLatin1String("[");
       
   316     QVERIFY(mWriter->quotedPrintableEncode(inputOutput));
       
   317     QCOMPARE(inputOutput, QLatin1String("=5B"));
       
   318     inputOutput = QLatin1String("\\");
       
   319     QVERIFY(mWriter->quotedPrintableEncode(inputOutput));
       
   320     QCOMPARE(inputOutput, QLatin1String("=5C"));
       
   321     inputOutput = QLatin1String("]");
       
   322     QVERIFY(mWriter->quotedPrintableEncode(inputOutput));
       
   323     QCOMPARE(inputOutput, QLatin1String("=5D"));
       
   324     inputOutput = QLatin1String("^");
       
   325     QVERIFY(mWriter->quotedPrintableEncode(inputOutput));
       
   326     QCOMPARE(inputOutput, QLatin1String("=5E"));
       
   327     inputOutput = QLatin1String("`");
       
   328     QVERIFY(mWriter->quotedPrintableEncode(inputOutput));
       
   329     QCOMPARE(inputOutput, QLatin1String("=60"));
       
   330     inputOutput = QLatin1String("{");
       
   331     QVERIFY(mWriter->quotedPrintableEncode(inputOutput));
       
   332     QCOMPARE(inputOutput, QLatin1String("=7B"));
       
   333     inputOutput = QLatin1String("|");
       
   334     QVERIFY(mWriter->quotedPrintableEncode(inputOutput));
       
   335     QCOMPARE(inputOutput, QLatin1String("=7C"));
       
   336     inputOutput = QLatin1String("}");
       
   337     QVERIFY(mWriter->quotedPrintableEncode(inputOutput));
       
   338     QCOMPARE(inputOutput, QLatin1String("=7D"));
       
   339     inputOutput = QLatin1String("~");
       
   340     QVERIFY(mWriter->quotedPrintableEncode(inputOutput));
       
   341     QCOMPARE(inputOutput, QLatin1String("=7E"));
       
   342 }
   217 
   343 
   218 QTEST_MAIN(UT_QVCard21Writer)
   344 QTEST_MAIN(UT_QVCard21Writer)
   219 
   345