]> Git trees. - libqmvoc.git/commitdiff
Cleanup issues with word types - deletion was buggy.
authorFrederik Gladhorn <gladhorn@kde.org>
Sun, 27 Jan 2008 22:37:58 +0000 (22:37 +0000)
committerFrederik Gladhorn <gladhorn@kde.org>
Sun, 27 Jan 2008 22:37:58 +0000 (22:37 +0000)
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

keduvocdocument/keduvoccontainer.cpp
keduvocdocument/keduvoccontainer.h
keduvocdocument/keduvoctranslation.cpp
keduvocdocument/keduvocwordtype.cpp
keduvocdocument/keduvocwordtype.h
keduvocdocument/tests/keduvocdocumentvalidatortest.cpp

index 577019f19863b392a9ea165888d0b1e6d98020a1..ffc1151d862f2c52948946541ad87cf1be14caef 100644 (file)
@@ -33,10 +33,12 @@ public:
 
     // other lessons in the tree
     KEduVocContainer *m_parentContainer;
-    QList<KEduVocContainer*> 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());
+    }
+}
 
index 64fa110aed17ec8d6fe6c02b241ebd037c653827..4259aecc391b208f1489e1fc1f1f4c02f375c4d7 100644 (file)
@@ -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;
index 7c93bd253164df7fc3a3e19ceb1d5dd6846fc86f..c387acdcd78cf89b28c5aca72f1e48d131bae7a3 100644 (file)
@@ -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()
index de15b69c04d65e4229079896ee325458e9890349..8d87e84011450ab4ce5a2ba8fd84ceeb6df216ea 100644 (file)
@@ -18,6 +18,8 @@
 
 #include "keduvocexpression.h"
 
+#include <KDebug>
+
 #include <QtCore/QList>
 #include <QtCore/QSet>
 
@@ -29,25 +31,26 @@ public:
     QList<KEduVocTranslation*> 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<KEduVocExpression*> 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;
 }
+
index 6e8288399cceb944ca04ac69aa30996b245840b3..8ebb7dc9c91df76d057f2d5253ab7733382abc4c 100644 (file)
@@ -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();
index 9494bec5b6e72d7218bb6d6449fee016137fac78..6ac854ce335c53085c7c28e095475815d62c066e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- Copyright 2007 Frederik Gladhorn <frederik.gladhorn@kdemail.net>
+ Copyright 2007-2008 Frederik Gladhorn <frederik.gladhorn@kdemail.net>
 
  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
  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 <KTemporaryFile>
 
@@ -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"