File indexing completed on 2024-05-12 05:09:54
0001 /*************************************************************************** 0002 Copyright (C) 2009 Robby Stephenson <robby@periapsis.org> 0003 ***************************************************************************/ 0004 0005 /*************************************************************************** 0006 * * 0007 * This program is free software; you can redistribute it and/or * 0008 * modify it under the terms of the GNU General Public License as * 0009 * published by the Free Software Foundation; either version 2 of * 0010 * the License or (at your option) version 3 or any later version * 0011 * accepted by the membership of KDE e.V. (or its successor approved * 0012 * by the membership of KDE e.V.), which shall act as a proxy * 0013 * defined in Section 14 of version 3 of the license. * 0014 * * 0015 * This program is distributed in the hope that it will be useful, * 0016 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 0017 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 0018 * GNU General Public License for more details. * 0019 * * 0020 * You should have received a copy of the GNU General Public License * 0021 * along with this program. If not, see <http://www.gnu.org/licenses/>. * 0022 * * 0023 ***************************************************************************/ 0024 0025 #undef QT_NO_CAST_FROM_ASCII 0026 0027 #include <config.h> 0028 #include "bibtextest.h" 0029 0030 #include "../collections/bibtexcollection.h" 0031 #include "../translators/bibteximporter.h" 0032 #include "../translators/bibtexexporter.h" 0033 #include "../utils/bibtexhandler.h" 0034 #include "../utils/datafileregistry.h" 0035 0036 #include <KSharedConfig> 0037 #include <KConfigGroup> 0038 #include <KLocalizedString> 0039 0040 #include <QTest> 0041 0042 QTEST_GUILESS_MAIN( BibtexTest ) 0043 0044 #define QL1(x) QStringLiteral(x) 0045 0046 void BibtexTest::initTestCase() { 0047 KLocalizedString::setApplicationDomain("tellico"); 0048 // since we use the bibtex mapping file 0049 Tellico::DataFileRegistry::self()->addDataLocation(QFINDTESTDATA("../translators/bibtex-translation.xml")); 0050 } 0051 0052 void BibtexTest::testImport() { 0053 #ifdef ENABLE_BTPARSE 0054 KSharedConfigPtr config = KSharedConfig::openConfig(QString(), KConfig::SimpleConfig); 0055 KConfigGroup cg = config->group(QStringLiteral("ExportOptions - Bibtex")); 0056 cg.writeEntry("URL Package", true); 0057 0058 QList<QUrl> urls; 0059 urls << QUrl::fromLocalFile(QFINDTESTDATA("data/test.bib")); 0060 0061 Tellico::Import::BibtexImporter importer(urls); 0062 // shut the importer up about current collection 0063 Tellico::Data::CollPtr tmpColl(new Tellico::Data::BibtexCollection(true)); 0064 importer.setCurrentCollection(tmpColl); 0065 0066 Tellico::Data::CollPtr coll = importer.collection(); 0067 Tellico::Data::BibtexCollection* bColl = static_cast<Tellico::Data::BibtexCollection*>(coll.data()); 0068 0069 QVERIFY(coll); 0070 QCOMPARE(coll->type(), Tellico::Data::Collection::Bibtex); 0071 QCOMPARE(coll->entryCount(), 36); 0072 QVERIFY(coll->hasField(QStringLiteral("issn"))); 0073 0074 QCOMPARE(bColl->preamble(), QL1("preamble")); 0075 0076 Tellico::Data::EntryPtr entry = coll->entryById(2); 0077 QCOMPARE(entry->field("entry-type"), QL1("article")); 0078 QCOMPARE(entry->field("bibtex-key"), QL1("article-full")); 0079 QCOMPARE(entry->field("author"), QString::fromUtf8("L[eslie] A. Aamport")); 0080 QCOMPARE(entry->field("month"), QL1("jul")); 0081 QCOMPARE(entry->field("url"), QL1("http://example.com/~user/")); 0082 QCOMPARE(entry->field("keyword"), QL1("keyword1; keyword2; keyword3")); 0083 QCOMPARE(entry->field("issn"), QL1("1334-2345")); 0084 QCOMPARE(bColl->macroList().value("ACM"), QL1("The OX Association for Computing Machinery")); 0085 0086 Tellico::BibtexHandler::s_quoteStyle = Tellico::BibtexHandler::QUOTES; 0087 0088 Tellico::Export::BibtexExporter exporter(coll); 0089 exporter.setEntries(coll->entries()); 0090 exporter.readOptions(config); 0091 Tellico::Import::BibtexImporter importer2(exporter.text()); 0092 importer2.setCurrentCollection(tmpColl); 0093 Tellico::Data::CollPtr coll2 = importer2.collection(); 0094 Tellico::Data::BibtexCollection* bColl2 = static_cast<Tellico::Data::BibtexCollection*>(coll2.data()); 0095 0096 QVERIFY(coll2); 0097 QCOMPARE(coll2->type(), coll->type()); 0098 QCOMPARE(coll2->entryCount(), coll->entryCount()); 0099 0100 foreach(Tellico::Data::EntryPtr e1, coll->entries()) { 0101 Tellico::Data::EntryPtr e2 = bColl2->entryByBibtexKey(e1->field(QStringLiteral("bibtex-key"))); 0102 QVERIFY(e2); 0103 foreach(Tellico::Data::FieldPtr f, coll->fields()) { 0104 // entry ids will be different 0105 if(f->name() != QStringLiteral("id")) { 0106 QCOMPARE(f->name() + e1->field(f), f->name() + e2->field(f)); 0107 } 0108 } 0109 } 0110 #endif 0111 } 0112 0113 void BibtexTest::testPages() { 0114 // small test to check the pages value ends up with 2 hyphens 0115 Tellico::Data::CollPtr coll(new Tellico::Data::BibtexCollection(true)); 0116 Tellico::Data::EntryPtr entry1(new Tellico::Data::Entry(coll)); 0117 coll->addEntries(entry1); 0118 entry1->setField(QStringLiteral("title"), QStringLiteral("Title 1")); 0119 entry1->setField(QStringLiteral("entry-type"), QStringLiteral("article")); 0120 entry1->setField(QStringLiteral("pages"), QStringLiteral("2-8")); 0121 0122 Tellico::Export::BibtexExporter exporter(coll); 0123 exporter.setEntries(coll->entries()); 0124 QString text = exporter.text(); 0125 QVERIFY(text.contains(QStringLiteral("2--8"))); 0126 } 0127 0128 void BibtexTest::testDuplicateKeys() { 0129 Tellico::Data::CollPtr coll(new Tellico::Data::BibtexCollection(true)); 0130 Tellico::Data::BibtexCollection* bColl = static_cast<Tellico::Data::BibtexCollection*>(coll.data()); 0131 0132 Tellico::Data::EntryList dupes = bColl->duplicateBibtexKeys(); 0133 QVERIFY(dupes.isEmpty()); 0134 0135 Tellico::Data::EntryPtr entry1(new Tellico::Data::Entry(coll)); 0136 entry1->setField(QStringLiteral("title"), QStringLiteral("Title 1")); 0137 entry1->setField(QStringLiteral("bibtex-key"), QStringLiteral("title1")); 0138 0139 Tellico::Data::EntryPtr entry2(new Tellico::Data::Entry(coll)); 0140 entry2->setField(QStringLiteral("title"), QStringLiteral("Title 2")); 0141 entry2->setField(QStringLiteral("bibtex-key"), QStringLiteral("title1")); 0142 0143 Tellico::Data::EntryPtr entry3(new Tellico::Data::Entry(coll)); 0144 entry3->setField(QStringLiteral("title"), QStringLiteral("Title 3")); 0145 entry3->setField(QStringLiteral("bibtex-key"), QStringLiteral("title3")); 0146 0147 coll->addEntries(Tellico::Data::EntryList() << entry1 << entry2 << entry3); 0148 0149 QCOMPARE(coll->entries().count(), 3); 0150 0151 dupes = bColl->duplicateBibtexKeys(); 0152 QCOMPARE(dupes.count(), 2); 0153 0154 entry2->setField(QStringLiteral("bibtex-key"), QStringLiteral("title2")); 0155 dupes = bColl->duplicateBibtexKeys(); 0156 QCOMPARE(dupes.count(), 0); 0157 } 0158 0159 void BibtexTest::testMapping() { 0160 // test a few strings from the bibtex mapping file 0161 QCOMPARE(Tellico::BibtexHandler::exportText(QString::fromUtf8("™"), QStringList()), QStringLiteral("{{\\texttrademark}}")); 0162 QCOMPARE(Tellico::BibtexHandler::exportText(QString::fromUtf8("ß"), QStringList()), QStringLiteral("{{\\ss}}")); 0163 QCOMPARE(Tellico::BibtexHandler::exportText(QString::fromUtf8("…"), QStringList()), QStringLiteral("{{\\ldots}}")); 0164 QCOMPARE(Tellico::BibtexHandler::exportText(QString::fromUtf8("°"), QStringList()), QStringLiteral("{$^{\\circ}$}")); 0165 } 0166 0167 void BibtexTest::testMaybe() { 0168 QUrl u(QUrl::fromLocalFile(QFINDTESTDATA("data/test.bib"))); 0169 QVERIFY(Tellico::Import::BibtexImporter::maybeBibtex(u)); 0170 } 0171 0172 void BibtexTest::testModify() { 0173 Tellico::Data::BibtexCollection coll(true); // add default fields 0174 auto field = coll.fieldByBibtexName(QStringLiteral("key")); 0175 QVERIFY(field); 0176 QCOMPARE(field->name(), QLatin1String("bibtex-key")); 0177 0178 field->setProperty(QStringLiteral("bibtex"), QStringLiteral("new-key")); 0179 QVERIFY(coll.modifyField(field)); 0180 0181 field = coll.fieldByBibtexName(QStringLiteral("key")); 0182 QVERIFY(!field); // no longer exists in collection by this bibtex name 0183 field = coll.fieldByBibtexName(QStringLiteral("new-key")); 0184 QVERIFY(field); 0185 QCOMPARE(field->name(), QLatin1String("bibtex-key")); 0186 }