From: Frederik Gladhorn Date: Sun, 27 Jan 2008 22:37:58 +0000 (+0000) Subject: Cleanup issues with word types - deletion was buggy. X-Git-Tag: v4.0.71~76 X-Git-Url: https://git.rmz.fi/?a=commitdiff_plain;h=eab65c61de9cdb7d2e8b8ad9daac7342f657c62b;p=libqmvoc.git Cleanup issues with word types - deletion was buggy. Write UNITTESTS for the same. Start caching recursive entries, still much to do there. pino, this is for you ;) svn path=/trunk/KDE/kdeedu/libkdeedu/; revision=767390 --- diff --git a/keduvocdocument/keduvoccontainer.cpp b/keduvocdocument/keduvoccontainer.cpp index 577019f..ffc1151 100644 --- a/keduvocdocument/keduvoccontainer.cpp +++ b/keduvocdocument/keduvoccontainer.cpp @@ -33,10 +33,12 @@ public: // other lessons in the tree KEduVocContainer *m_parentContainer; - QList m_childContainers; + QList < KEduVocContainer * > m_childContainers; EnumContainerType m_type; + QSet < KEduVocExpression* > m_childLessonEntries; + /// Image url KUrl m_imageUrl; }; @@ -73,6 +75,8 @@ void KEduVocContainer::appendChildContainer(KEduVocContainer * child) { d->m_childContainers.append(child); child->d->m_parentContainer = this; + + d->m_childLessonEntries.unite(child->entries(Recursive).toSet()); } KEduVocContainer * KEduVocContainer::childContainer(int row) @@ -85,6 +89,8 @@ void KEduVocContainer::deleteChildContainer(int row) { kDebug() << "Delete of container - check entry deletion!"; delete d->m_childContainers.takeAt(row); + + resetChildLessonEntries(); } void KEduVocContainer::removeChildContainer(int row) @@ -149,6 +155,9 @@ void KEduVocContainer::removeTranslation(int translation) foreach(KEduVocExpression *entry, entries() ) { entry->removeTranslation( translation ); } + if (parent()) { + parent()->resetChildLessonEntries(); + } } QList< KEduVocExpression * > KEduVocContainer::entriesRecursive() @@ -212,5 +221,11 @@ void KEduVocContainer::insertChildContainer(int row, KEduVocContainer * child) child->d->m_parentContainer = this; } - +void KEduVocContainer::resetChildLessonEntries() +{ + d->m_childLessonEntries.clear(); + foreach(KEduVocContainer *childContainer, d->m_childContainers) { + d->m_childLessonEntries.unite(childContainer->entries(Recursive).toSet()); + } +} diff --git a/keduvocdocument/keduvoccontainer.h b/keduvocdocument/keduvoccontainer.h index 64fa110..4259aec 100644 --- a/keduvocdocument/keduvoccontainer.h +++ b/keduvocdocument/keduvoccontainer.h @@ -125,6 +125,11 @@ public: protected: QList< KEduVocExpression * > entriesRecursive(); + /** + * The cache of entries in this lessons child lessons. + */ + void resetChildLessonEntries(); + private: class Private; Private * const d; diff --git a/keduvocdocument/keduvoctranslation.cpp b/keduvocdocument/keduvoctranslation.cpp index 7c93bd2..c387acd 100644 --- a/keduvocdocument/keduvoctranslation.cpp +++ b/keduvocdocument/keduvoctranslation.cpp @@ -128,9 +128,7 @@ KEduVocTranslation::KEduVocTranslation( const KEduVocTranslation &other ) : d( n KEduVocTranslation::~KEduVocTranslation() { - if (d->m_wordType) { - d->m_wordType->removeTranslation(this); - } + setWordType(0); delete d; } @@ -357,8 +355,8 @@ void KEduVocTranslation::setWordType(KEduVocWordType * wordType) } if ( wordType ) { wordType->addTranslation(this); - d->m_wordType = wordType; } + d->m_wordType = wordType; } KEduVocExpression * KEduVocTranslation::entry() diff --git a/keduvocdocument/keduvocwordtype.cpp b/keduvocdocument/keduvocwordtype.cpp index de15b69..8d87e84 100644 --- a/keduvocdocument/keduvocwordtype.cpp +++ b/keduvocdocument/keduvocwordtype.cpp @@ -18,6 +18,8 @@ #include "keduvocexpression.h" +#include + #include #include @@ -29,25 +31,26 @@ public: QList m_translations; }; - KEduVocWordType::KEduVocWordType(const QString& name, KEduVocWordType *parent) : d( new Private ), KEduVocContainer(name, WordType, parent) { d->m_wordType = General; } -KEduVocWordType::KEduVocWordType( const KEduVocWordType &other ) - : d( new Private ), KEduVocContainer(other) -{ - d->m_translations = other.d->m_translations; -} +// KEduVocWordType::KEduVocWordType( const KEduVocWordType &other ) +// : d( new Private ), KEduVocContainer(other) +// { +// d->m_translations = other.d->m_translations; +// } KEduVocWordType::~KEduVocWordType() { + foreach(KEduVocTranslation* translation, d->m_translations) { + translation->setWordType(0); + } delete d; } - QList KEduVocWordType::entries(EnumEntriesRecursive recursive) { if (recursive == Recursive) { @@ -75,7 +78,7 @@ void KEduVocWordType::addTranslation(KEduVocTranslation* translation) void KEduVocWordType::removeTranslation(KEduVocTranslation* translation) { - d->m_translations.removeAt( d->m_translations.indexOf(translation) ); + d->m_translations.removeAt( d->m_translations.indexOf(translation)); } KEduVocTranslation * KEduVocWordType::translation(int row) @@ -115,3 +118,4 @@ KEduVocWordType* KEduVocWordType::childOfType(KEduVocWordType::EnumWordType type } return 0; } + diff --git a/keduvocdocument/keduvocwordtype.h b/keduvocdocument/keduvocwordtype.h index 6e82883..8ebb7dc 100644 --- a/keduvocdocument/keduvocwordtype.h +++ b/keduvocdocument/keduvocwordtype.h @@ -47,8 +47,9 @@ public: /** default constructor */ explicit KEduVocWordType(const QString& name, KEduVocWordType *parent = 0); - /** copy constructor for d-pointer safe copying */ - KEduVocWordType( const KEduVocWordType &other ); + /* copy constructor for d-pointer safe copying */ + // makes no sense to copy - entries only have one word type +// KEduVocWordType( const KEduVocWordType &other ); /** destructor */ ~KEduVocWordType(); diff --git a/keduvocdocument/tests/keduvocdocumentvalidatortest.cpp b/keduvocdocument/tests/keduvocdocumentvalidatortest.cpp index 9494bec..6ac854c 100644 --- a/keduvocdocument/tests/keduvocdocumentvalidatortest.cpp +++ b/keduvocdocument/tests/keduvocdocumentvalidatortest.cpp @@ -1,5 +1,5 @@ /* - Copyright 2007 Frederik Gladhorn + Copyright 2007-2008 Frederik Gladhorn This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,12 +17,14 @@ USA */ -#include "../keduvocdocument.h" -#include "../keduvoclesson.h" -#include "../keduvocexpression.h" -#include "../keduvoctranslation.h" -#include "../keduvocconjugation.h" -#include "../keduvocdeclination.h" +#include "keduvocdocument.h" +#include "keduvoclesson.h" +#include "keduvocexpression.h" +#include "keduvoctranslation.h" +#include "keduvocconjugation.h" +#include "keduvocdeclination.h" +#include "keduvocwordtype.h" + #include @@ -39,6 +41,7 @@ class KEduVocDocumentValidatorTest private slots: void testDocumentAboutInfo(); void testLessons(); + void testWordTypes(); }; void KEduVocDocumentValidatorTest::testDocumentAboutInfo() @@ -112,6 +115,56 @@ void KEduVocDocumentValidatorTest::testLessons() // QCOMPARE(doc.lesson(2), lesson2); } + +void KEduVocDocumentValidatorTest::testWordTypes() +{ + KEduVocDocument doc; + // create doc - has no word types yet + QCOMPARE(doc.wordTypeContainer()->childContainerCount(), 0); + + KEduVocWordType *noun; + KEduVocWordType *nounMale; + KEduVocWordType *nounFemale; + KEduVocWordType *verb; + + noun = new KEduVocWordType("Noun", doc.wordTypeContainer()); + doc.wordTypeContainer()->appendChildContainer(noun); + QCOMPARE(doc.wordTypeContainer()->childContainerCount(), 1); + nounMale = new KEduVocWordType("Male", noun); + noun->appendChildContainer(nounMale); + nounFemale = new KEduVocWordType("Female", noun); + noun->appendChildContainer(nounFemale); + verb = new KEduVocWordType("Verb", doc.wordTypeContainer()); + doc.wordTypeContainer()->appendChildContainer(verb); + QCOMPARE(doc.wordTypeContainer()->childContainerCount(), 2); + QCOMPARE(doc.wordTypeContainer()->childContainer(0)->childContainerCount(), 2); + + // create some entries + for(int i = 0; i < 20; i++) { + KEduVocExpression *e = + new KEduVocExpression(QStringList() << QString("lang1 %1").arg(i) << QString("lang2 %1").arg(i)); + doc.lesson()->appendEntry(e); + e->translation(0)->setWordType(noun); + e->translation(1)->setWordType(noun); + } + QCOMPARE(doc.lesson()->entryCount(), 20); + QCOMPARE(noun->entryCount(), 20); + doc.lesson()->entry(0)->translation(0)->setWordType(verb); + // translation 1 is still noun, so it needs to be in both now + QCOMPARE(noun->entryCount(), 20); + QCOMPARE(verb->entryCount(), 1); + doc.lesson()->entry(0)->translation(1)->setWordType(verb); + QCOMPARE(noun->entryCount(), 19); + QCOMPARE(verb->entryCount(), 1); + + // delete word type + doc.wordTypeContainer()->deleteChildContainer(1); + // the word type is set to 0 when removed + QVERIFY(doc.lesson()->entry(0)->translation(0)->wordType() == 0); + QVERIFY(doc.lesson()->entry(0)->translation(1)->wordType() == 0); + QCOMPARE(doc.wordTypeContainer()->childContainerCount(), 1); +} + QTEST_KDEMAIN_CORE( KEduVocDocumentValidatorTest ) #include "keduvocdocumentvalidatortest.moc"