void DeliciousTest::testMovies2() { QUrl url = QUrl::fromLocalFile(QFINDTESTDATA("data/delicious2_movies.xml")); Tellico::Import::DeliciousImporter importer(url); Tellico::Data::CollPtr coll = importer.collection(); QVERIFY(coll); QCOMPARE(coll->type(), Tellico::Data::Collection::Video); QCOMPARE(coll->entryCount(), 4); Tellico::Data::EntryPtr entry = coll->entryById(2); QVERIFY(entry); QCOMPARE(entry->field("title"), QLatin1String("2001 - A Space Odyssey")); QCOMPARE(entry->field("certification"), QLatin1String("G (USA)")); QCOMPARE(entry->field("nationality"), QLatin1String("USA")); QCOMPARE(entry->field("aspect-ratio"), QLatin1String("2.35:1")); QCOMPARE(entry->field("audio-track"), QLatin1String("Dolby")); QCOMPARE(entry->field("widescreen"), QLatin1String("true")); QCOMPARE(entry->field("director"), QLatin1String("Stanley Kubrick")); QCOMPARE(entry->field("color"), QLatin1String("Color")); QCOMPARE(entry->field("format"), QLatin1String("NTSC")); QCOMPARE(entry->field("medium"), QLatin1String("DVD")); QCOMPARE(entry->field("running-time"), QLatin1String("148")); QCOMPARE(entry->field("rating"), QLatin1String("4")); QCOMPARE(entry->field("year"), QLatin1String("1968")); QCOMPARE(entry->field("pur_date"), QLatin1String("2007-12-19")); QCOMPARE(entry->field("cdate"), QLatin1String("2007-12-20")); QCOMPARE(entry->field("mdate"), QLatin1String("2009-06-11")); entry = coll->entryById(4); QVERIFY(entry); QCOMPARE(entry->field("region"), QLatin1String("Region 1")); }
void DeliciousTest::testBooks2() { QUrl url = QUrl::fromLocalFile(QFINDTESTDATA("data/delicious2_books.xml")); Tellico::Import::DeliciousImporter importer(url); Tellico::Data::CollPtr coll = importer.collection(); QVERIFY(coll); QCOMPARE(coll->type(), Tellico::Data::Collection::Book); QCOMPARE(coll->entryCount(), 7); Tellico::Data::EntryPtr entry = coll->entryById(1); QVERIFY(entry); QCOMPARE(entry->field("title"), QLatin1String("The Restaurant at the End of the Universe")); QCOMPARE(entry->field("isbn"), QLatin1String("0517545357")); QCOMPARE(entry->field("cdate"), QLatin1String("2007-12-19")); QCOMPARE(entry->field("mdate"), QLatin1String("2009-06-11")); QCOMPARE(FIELDS(entry, "author").count(), 1); QCOMPARE(FIELDS(entry, "author").first(), QLatin1String("Douglas Adams")); QCOMPARE(entry->field("binding"), QLatin1String("Hardback")); QCOMPARE(entry->field("rating"), QLatin1String("4.5")); // visually, this gets shown as 4 stars QCOMPARE(entry->field("pages"), QLatin1String("250")); QCOMPARE(entry->field("pub_year"), QLatin1String("1982")); QCOMPARE(entry->field("publisher"), QLatin1String("Harmony")); QCOMPARE(entry->field("pur_date"), QLatin1String("2007-12-18")); QCOMPARE(entry->field("pur_price"), QLatin1String("$12.95")); QCOMPARE(entry->field("signed"), QLatin1String("true")); QCOMPARE(entry->field("condition"), QLatin1String("Used")); }
// static Tellico::Data::CollPtr BibtexCollection::convertBookCollection(Tellico::Data::CollPtr coll_) { const QString bibtex = QLatin1String("bibtex"); BibtexCollection* coll = new BibtexCollection(false, coll_->title()); CollPtr collPtr(coll); FieldList fields = coll_->fields(); foreach(FieldPtr fIt, fields) { FieldPtr field(new Field(*fIt)); // if it already has a bibtex property, skip it if(!field->property(bibtex).isEmpty()) { coll->addField(field); continue; } // be sure to set bibtex property before adding it though QString name = field->name(); // this first group has bibtex field names the same as their own field name if(name == QLatin1String("title") || name == QLatin1String("author") || name == QLatin1String("editor") || name == QLatin1String("edition") || name == QLatin1String("publisher") || name == QLatin1String("isbn") || name == QLatin1String("lccn") || name == QLatin1String("url") || name == QLatin1String("language") || name == QLatin1String("pages") || name == QLatin1String("series")) { field->setProperty(bibtex, name); } else if(name == QLatin1String("series_num")) { field->setProperty(bibtex, QLatin1String("number")); } else if(name == QLatin1String("pur_price")) { field->setProperty(bibtex, QLatin1String("price")); } else if(name == QLatin1String("cr_year")) { field->setProperty(bibtex, QLatin1String("year")); } else if(name == QLatin1String("bibtex-id")) { field->setProperty(bibtex, QLatin1String("key")); } else if(name == QLatin1String("keyword")) { field->setProperty(bibtex, QLatin1String("keywords")); } else if(name == QLatin1String("comments")) { field->setProperty(bibtex, QLatin1String("note")); } coll->addField(field); }
void DeliciousTest::testGames1() { QUrl url = QUrl::fromLocalFile(QFINDTESTDATA("data/delicious1_games.xml")); Tellico::Import::DeliciousImporter importer(url); Tellico::Data::CollPtr coll = importer.collection(); QVERIFY(coll); QCOMPARE(coll->type(), Tellico::Data::Collection::Game); QCOMPARE(coll->entryCount(), 2); // first a movie Tellico::Data::EntryPtr entry = coll->entryById(1); QVERIFY(entry); QCOMPARE(entry->field("title"), QLatin1String("Spider-Man 2: The Movie 2")); QCOMPARE(entry->field("certification"), QLatin1String("Teen")); QCOMPARE(entry->field("platform"), QLatin1String("GameCube")); QCOMPARE(entry->field("year"), QLatin1String("2004")); QCOMPARE(entry->field("pur_price"), QLatin1String("$49.99")); QCOMPARE(entry->field("pur_date"), QLatin1String("25-03-2006")); QCOMPARE(entry->field("rating"), QLatin1String("4.5")); QCOMPARE(entry->field("publisher"), QLatin1String("Activision")); }
void DeliciousTest::testMusic2() { QUrl url = QUrl::fromLocalFile(QFINDTESTDATA("data/delicious2_music.xml")); Tellico::Import::DeliciousImporter importer(url); Tellico::Data::CollPtr coll = importer.collection(); QVERIFY(coll); QCOMPARE(coll->type(), Tellico::Data::Collection::Album); QCOMPARE(coll->entryCount(), 3); Tellico::Data::EntryPtr entry = coll->entryById(2); QVERIFY(entry); QCOMPARE(entry->field("title"), QLatin1String("The Ultimate Sin")); QCOMPARE(entry->field("artist"), QLatin1String("Ozzy Osbourne")); QCOMPARE(entry->field("year"), QLatin1String("1987")); QCOMPARE(entry->field("medium"), QLatin1String("Compact Disc")); QCOMPARE(entry->field("label"), QLatin1String("Epic Aus/Zoom")); QCOMPARE(entry->field("pur_price"), QLatin1String("$15.98")); QCOMPARE(entry->field("pur_date"), QLatin1String("2009-01-17")); QCOMPARE(entry->field("rating"), QLatin1String("3.5")); QCOMPARE(entry->field("keyword"), QLatin1String("Hard Rock & Metal; Rock")); }
void DeliciousTest::testMusic1() { QUrl url = QUrl::fromLocalFile(QFINDTESTDATA("data/delicious1_music.xml")); Tellico::Import::DeliciousImporter importer(url); Tellico::Data::CollPtr coll = importer.collection(); QVERIFY(coll); QCOMPARE(coll->type(), Tellico::Data::Collection::Album); QCOMPARE(coll->entryCount(), 3); // first a movie Tellico::Data::EntryPtr entry = coll->entryById(1); QVERIFY(entry); QCOMPARE(entry->field("title"), QLatin1String("Are You Listening?")); QCOMPARE(entry->field("artist"), QLatin1String("Dolores O'Riordan")); QCOMPARE(entry->field("year"), QLatin1String("2007")); QCOMPARE(entry->field("medium"), QLatin1String("Compact Disc")); QCOMPARE(entry->field("label"), QLatin1String("Sanctuary Records")); QCOMPARE(ROWS(entry, "track").count(), 12); QCOMPARE(ROWS(entry, "track").first(), QLatin1String("Ordinary Day")); QCOMPARE(entry->field("pur_price"), QLatin1String("$15.98")); QCOMPARE(entry->field("pur_date"), QLatin1String("27-06-2008")); QCOMPARE(entry->field("rating"), QLatin1String("4.5")); }
void DeliciousTest::testBooks1() { QUrl url = QUrl::fromLocalFile(QFINDTESTDATA("data/delicious1_books.xml")); Tellico::Import::DeliciousImporter importer(url); Tellico::Data::CollPtr coll = importer.collection(); QVERIFY(coll); QCOMPARE(coll->type(), Tellico::Data::Collection::Book); QCOMPARE(coll->entryCount(), 5); Tellico::Data::EntryPtr entry = coll->entryById(1); QVERIFY(entry); QCOMPARE(entry->field("title"), QLatin1String("Lost in Translation")); QCOMPARE(entry->field("pub_year"), QLatin1String("1998")); QCOMPARE(entry->field("author"), QLatin1String("Nicole Mones; Robby Stephenson")); QCOMPARE(entry->field("publisher"), QLatin1String("Delacorte Press")); QCOMPARE(entry->field("isbn"), QLatin1String("0385319347")); QCOMPARE(entry->field("binding"), QLatin1String("Hardback")); QCOMPARE(entry->field("keyword"), QLatin1String("United States; Contemporary & Robby")); QCOMPARE(entry->field("pages"), QLatin1String("384")); QCOMPARE(entry->field("rating"), QLatin1String("4")); QCOMPARE(entry->field("pur_price"), QLatin1String("$23.95")); QCOMPARE(entry->field("pur_date"), QLatin1String("07-08-2006")); QVERIFY(entry->field("comments").startsWith(QLatin1String("<p><span style=\"font-size:12pt;\">Nicole Mones doesn't"))); }
void Entry::setCollection(Tellico::Data::CollPtr coll_) { if(coll_ == m_coll) { myDebug() << "already belongs to collection!"; return; } // special case adding a book to a bibtex collection // it would be better to do this in a real OO way, but this should work const bool addEntryType = m_coll->type() == Collection::Book && coll_->type() == Collection::Bibtex && !m_coll->hasField(QLatin1String("entry-type")); m_coll = coll_; m_id = -1; // set this after changing the m_coll pointer since setField() checks field validity if(addEntryType) { setField(QLatin1String("entry-type"), QLatin1String("book")); } }
void DeliciousTest::testMovies1() { QUrl url = QUrl::fromLocalFile(QFINDTESTDATA("data/delicious1_movies.xml")); Tellico::Import::DeliciousImporter importer(url); Tellico::Data::CollPtr coll = importer.collection(); QVERIFY(coll); QCOMPARE(coll->type(), Tellico::Data::Collection::Video); QCOMPARE(coll->entryCount(), 4); // first a movie Tellico::Data::EntryPtr entry = coll->entryById(2); QVERIFY(entry); QCOMPARE(entry->field("title"), QLatin1String("Driving Miss Daisy")); QCOMPARE(entry->field("year"), QLatin1String("1990")); QCOMPARE(entry->field("nationality"), QLatin1String("USA")); QCOMPARE(entry->field("director"), QLatin1String("Bruce Beresford")); QStringList cast = QStringList() << "Morgan Freeman" << "Jessica Tandy" << "Dan Aykroyd" << "Patti LuPone" << "Esther Rolle"; QCOMPARE(entry->field("cast"), cast.join(Tellico::FieldFormat::rowDelimiterString())); QCOMPARE(entry->field("format"), QLatin1String("NTSC")); QCOMPARE(entry->field("medium"), QLatin1String("DVD")); QCOMPARE(entry->field("color"), QLatin1String("Color")); QCOMPARE(entry->field("aspect-ratio"), QLatin1String("1.85:1")); QCOMPARE(entry->field("audio-track"), QLatin1String("Dolby")); QCOMPARE(entry->field("widescreen"), QLatin1String("true")); QCOMPARE(entry->field("running-time"), QLatin1String("99")); QCOMPARE(entry->field("certification"), QLatin1String("PG (USA)")); QCOMPARE(entry->field("region"), QLatin1String("Region 1")); QCOMPARE(entry->field("rating"), QLatin1String("4.5")); QCOMPARE(entry->field("pur_price"), QLatin1String("$14.98")); QCOMPARE(entry->field("pur_date"), QLatin1String("25-03-2006")); QVERIFY(entry->field("keyword").startsWith(QLatin1String("Period Piece; Race Relations"))); // check the TV show, too entry = coll->entryById(4); QVERIFY(entry); QCOMPARE(entry->field("title"), QLatin1String("South Park - The Complete Sixth Season")); QCOMPARE(entry->field("year"), QLatin1String("1997")); QCOMPARE(entry->field("nationality"), QLatin1String("USA")); QCOMPARE(entry->field("studio"), QLatin1String("Comedy Central")); QCOMPARE(entry->field("director"), QLatin1String("Trey Parker; Matt Stone")); // the shelf name gets added to keyword list QVERIFY(entry->field("keyword").contains(QLatin1String("TV Shows"))); Tellico::FilterList filters = coll->filters(); QCOMPARE(filters.count(), 1); Tellico::FilterPtr filter = filters.first(); QVERIFY(filter); QCOMPARE(filter->name(), QLatin1String("TV Shows")); QVERIFY(filter->matches(entry)); }
void RisTest::testImport() { KUrl url(QString::fromLatin1(KDESRCDIR) + "/data/test.ris"); KUrl::List urls; urls << url; Tellico::Import::RISImporter importer(urls); Tellico::Data::CollPtr coll = importer.collection(); QVERIFY(!coll.isNull()); QCOMPARE(coll->type(), Tellico::Data::Collection::Bibtex); QCOMPARE(coll->entryCount(), 2); QCOMPARE(coll->title(), QLatin1String("Bibliography")); Tellico::Data::EntryPtr entry = coll->entryById(2); QVERIFY(!entry.isNull()); QCOMPARE(entry->field("entry-type"), QLatin1String("article")); QCOMPARE(entry->field("year"), QLatin1String("2002")); QCOMPARE(entry->field("pages"), QLatin1String("1057-1119")); QCOMPARE(Tellico::FieldFormat::splitValue(entry->field("author")).count(), 3); QCOMPARE(Tellico::FieldFormat::splitValue(entry->field("author")).first(), QLatin1String("Koglin,M.")); Tellico::Data::BibtexCollection* bColl = dynamic_cast<Tellico::Data::BibtexCollection*>(coll.data()); QVERIFY(bColl); QCOMPARE(bColl->fieldByBibtexName("entry-type")->name(), QLatin1String("entry-type")); }
void DocumentTest::testImageLocalDirectory() { Tellico::Config::setImageLocation(Tellico::Config::ImagesInLocalDir); // the default collection will use a temporary directory as a local image dir QVERIFY(!Tellico::ImageFactory::localDir().isEmpty()); QString tempDirName; QTemporaryDir tempDir; QVERIFY(tempDir.isValid()); tempDir.setAutoRemove(true); tempDirName = tempDir.path(); QString fileName = tempDirName + "/with-image.tc"; QString imageDirName = tempDirName + "/with-image_files/"; // copy a collection file that includes an image into the temporary directory QVERIFY(QFile::copy(QFINDTESTDATA("data/with-image.tc"), fileName)); Tellico::Data::Document* doc = Tellico::Data::Document::self(); QVERIFY(doc->openDocument(QUrl::fromLocalFile(fileName))); QCOMPARE(Tellico::ImageFactory::localDir(), imageDirName); Tellico::Data::CollPtr coll = doc->collection(); QVERIFY(coll); QCOMPARE(coll->type(), Tellico::Data::Collection::Book); QCOMPARE(coll->title(), QLatin1String("My Books")); QCOMPARE(coll->entries().size(), 1); Tellico::Data::EntryPtr e = coll->entries().at(0); QVERIFY(e); QCOMPARE(e->field(QLatin1String("cover")), QLatin1String("17b54b2a742c6d342a75f122d615a793.jpeg")); // save the document, so the images get copied out of the .tc file into the local image directory QVERIFY(doc->saveDocument(QUrl::fromLocalFile(fileName))); // verify that backup file gets created QVERIFY(QFile::exists(fileName + '~')); // check that the local image directory is created with the image file inside QDir imageDir(imageDirName); QVERIFY(imageDir.exists()); QVERIFY(imageDir.exists(e->field(QLatin1String("cover")))); // clear the internal image cache Tellico::ImageFactory::clean(true); // verify that the images are copied from the old directory when saving to a new file QString fileName2 = tempDirName + "/with-image2.tc"; QString imageDirName2 = tempDirName + "/with-image2_files/"; QVERIFY(doc->saveDocument(QUrl::fromLocalFile(fileName2))); QVERIFY(QFile::exists(fileName2)); QDir imageDir2(imageDirName2); QVERIFY(imageDir2.exists()); QVERIFY(imageDir2.exists(e->field(QLatin1String("cover")))); /*************************************************************************/ /* now also verify image directory when file name has multiple periods */ /* see https://bugs.kde.org/show_bug.cgi?id=348088 */ /* also have to check backwards compatibility with prior behavior */ /*************************************************************************/ QString fileName3 = tempDirName + "/with-image.1.tc"; QString imageDirName3 = tempDirName + "/with-image.1_files/"; // copy the collection file, which no longer contains the images inside QVERIFY(QFile::copy(fileName, fileName3)); QVERIFY(doc->openDocument(QUrl::fromLocalFile(fileName3))); QCOMPARE(Tellico::ImageFactory::localDir(), imageDirName3); QDir imageDir3(imageDirName3); // verify that the images can be loaded from the image directory that does NOT have multiple periods // since that was the behavior prior to the bug being fixed coll = doc->collection(); e = coll->entries().at(0); // image should not be in the next image dir yet since we haven't saved QVERIFY(!imageDir3.exists(e->field(QLatin1String("cover")))); QVERIFY(!Tellico::ImageFactory::imageById(e->field("cover")).isNull()); // now remove the first image from the first image directory, save the document, and verify that // the proper image exists and is written QVERIFY(imageDir.remove(e->field("cover"))); QVERIFY(!imageDir.exists(e->field(QLatin1String("cover")))); QVERIFY(doc->saveDocument(QUrl::fromLocalFile(fileName3))); // now the file should exist in the proper location QVERIFY(imageDir3.exists(e->field(QLatin1String("cover")))); // clear the cache Tellico::ImageFactory::clean(true); QVERIFY(!Tellico::ImageFactory::imageById(e->field("cover")).isNull()); // sanity check, the directory should not exists after QTemporaryDir destruction tempDir.remove(); QVERIFY(!QDir(tempDirName).exists()); }
void DetailedListView::addCollection(Tellico::Data::CollPtr coll_) { if(!coll_) { return; } const QString configGroup = QString::fromLatin1("Options - %1").arg(CollectionFactory::typeName(coll_)); KConfigGroup config(KGlobal::config(), configGroup); QString configN; if(coll_->type() == Data::Collection::Base) { KUrl url = Kernel::self()->URL(); for(int i = 0; i < Config::maxCustomURLSettings(); ++i) { KUrl u = config.readEntry(QString::fromLatin1("URL_%1").arg(i), KUrl()); if(u == url) { configN = QString::fromLatin1("_%1").arg(i); break; } } } // we don't want to immediately hide all these columns when adding fields disconnect(model(), SIGNAL(columnsInserted(const QModelIndex&, int, int)), this, SLOT(hideNewColumn(const QModelIndex&, int, int))); sourceModel()->setImagesAreAvailable(false); sourceModel()->setFields(coll_->fields()); connect(model(), SIGNAL(columnsInserted(const QModelIndex&, int, int)), this, SLOT(hideNewColumn(const QModelIndex&, int, int))); // we're not using saveState() and restoreState() since our columns are variable QStringList columnNames = config.readEntry(QLatin1String("ColumnNames") + configN, QStringList()); QList<int> columnWidths = config.readEntry(QLatin1String("ColumnWidths") + configN, QList<int>()); QList<int> columnOrder = config.readEntry(QLatin1String("ColumnOrder") + configN, QList<int>()); // just a broken-world check while(columnWidths.size() < columnNames.size()) { columnWidths << 0; } while(columnOrder.size() < columnNames.size()) { columnOrder << columnOrder.size(); } QList<int> currentColumnOrder; // now restore widths and order for(int ncol = 0; ncol < header()->count(); ++ncol) { int idx = columnNames.indexOf(columnFieldName(ncol)); // column width of 0 means hidden if(idx < 0 || columnWidths.at(idx) <= 0) { hideColumn(ncol); if(idx > -1) { currentColumnOrder << ncol; } } else { setColumnWidth(ncol, columnWidths.at(idx)); currentColumnOrder << ncol; } } const int maxCount = qMin(currentColumnOrder.size(), columnOrder.size()); for(int i = 0; i < maxCount; ++i) { header()->moveSection(header()->visualIndex(currentColumnOrder.at(i)), columnOrder.at(i)); } // always hide tables and paragraphs for(int ncol = 0; ncol < coll_->fields().count(); ++ncol) { Data::FieldPtr field = model()->headerData(ncol, Qt::Horizontal, FieldPtrRole).value<Data::FieldPtr>(); if(field) { if(field->type() == Data::Field::Table || field->type() == Data::Field::Para) { hideColumn(ncol); } } else { myDebug() << "no field for col" << ncol; } } // because some of the fields got hidden... updateHeaderMenu(); checkHeader(); sortModel()->setSortColumn(config.readEntry(QLatin1String("SortColumn") + configN, -1)); sortModel()->setSecondarySortColumn(config.readEntry(QLatin1String("PrevSortColumn") + configN, -1)); sortModel()->setTertiarySortColumn(config.readEntry(QLatin1String("Prev2SortColumn") + configN, -1)); const int order = config.readEntry(QLatin1String("SortOrder") + configN, static_cast<int>(Qt::AscendingOrder)); sortModel()->setSortOrder(static_cast<Qt::SortOrder>(order)); setUpdatesEnabled(false); m_loadingCollection = true; addEntries(coll_->entries()); m_loadingCollection = false; setUpdatesEnabled(true); header()->setSortIndicator(sortModel()->sortColumn(), sortModel()->sortOrder()); }