summaryrefslogtreecommitdiffstats
path: root/kword/tests
diff options
context:
space:
mode:
Diffstat (limited to 'kword/tests')
-rw-r--r--kword/tests/FrameTester.cpp152
-rw-r--r--kword/tests/FrameTester.h59
-rw-r--r--kword/tests/FrameViewTester.cpp295
-rw-r--r--kword/tests/FrameViewTester.h27
-rw-r--r--kword/tests/KWPageManagerTester.cpp320
-rw-r--r--kword/tests/KWPageManagerTester.h30
-rw-r--r--kword/tests/Makefile.am25
-rw-r--r--kword/tests/README26
-rwxr-xr-xkword/tests/checkFilter.pl52
-rw-r--r--kword/tests/oasis-kword.sh108
10 files changed, 1094 insertions, 0 deletions
diff --git a/kword/tests/FrameTester.cpp b/kword/tests/FrameTester.cpp
new file mode 100644
index 00000000..0a088674
--- /dev/null
+++ b/kword/tests/FrameTester.cpp
@@ -0,0 +1,152 @@
+/* This file is part of the KOffice project
+ * Copyright (C) 2005 Thomas Zander <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; version 2.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+#include "FrameTester.h"
+#include <KWFrame.h>
+#include <KWFrameList.h>
+#include <KWDocument.h>
+#include <kunittest/runner.h>
+#include <kunittest/module.h>
+#include <qapplication.h>
+
+using namespace KUnitTest;
+
+KUNITTEST_MODULE(kunittest_FrameTester, "Frame Tester");
+KUNITTEST_MODULE_REGISTER_TESTER(KWFrameTester);
+
+void KWFrameTester::allTests() {
+ int argc = 0;
+ char** argv = 0;
+ QApplication app( argc, argv ); // needed for KWDocument, due to KWCommandHistory -> KToolBarPopupAction -> QPopupMenu -> QWidget
+
+ testSimpleFrame();
+ testFrameList();
+ testDeleteAllCopies();
+ testNestedFrames();
+}
+
+void KWFrameTester::testSimpleFrame() {
+ KWFrameSet *fs = new TestFrameSet();
+ KWFrame *f = new KWFrame(fs, 0, 1, 10, 11);
+
+ KWFrame *f2 = f->getCopy();
+ CHECK(f2->x(), 0.0);
+ CHECK(f2->y(), 1.0);
+ CHECK(f2->width(), 10.0);
+ CHECK(f2->height(), 11.0);
+}
+
+void KWFrameTester::testFrameList()
+{
+ KWDocument* doc = new KWDocument();
+
+ KWFrameSet *fs = new TestFrameSet( doc );
+ // f2 is above f1, f3 doesn't intersect with either
+ KWFrame *f1 = new KWFrame(fs, 0, 1, 10, 11);
+ f1->setZOrder( 1 );
+ fs->addFrame( f1 );
+ KWFrame *f2 = new KWFrame(fs, 1, 5, 10, 12);
+ f2->setZOrder( 10 );
+ fs->addFrame( f2 );
+ KWFrame *f3 = new KWFrame(fs, 100, 101, 10, 12);
+ f3->setZOrder( 5 );
+ fs->addFrame( f3 );
+
+ CHECK( (int)fs->frameCount(), 3 );
+
+ doc->addFrameSet( fs ); // creates frame lists
+
+ KWFrameList* f1List = f1->frameStack();
+ CHECK( f1List != 0, true );
+ CHECK( f1List->framesBelow().isEmpty(), true );
+ CHECK( f1List->framesOnTop().count(), (size_t)1 );
+ CHECK( f1List->framesOnTop().first(), f2 );
+
+ KWFrameList* f2List = f2->frameStack();
+ CHECK( f2List->framesBelow().count(), (size_t)1 );
+ CHECK( f2List->framesBelow().first(), f1 );
+ CHECK( f2List->framesOnTop().isEmpty(), true );
+
+ KWFrameList* f3List = f3->frameStack();
+ CHECK( f3List->framesBelow().isEmpty(), true );
+ CHECK( f3List->framesOnTop().isEmpty(), true );
+
+ delete doc;
+}
+
+void KWFrameTester::testDeleteAllCopies() {
+ KWFrameSet *fs = new TestFrameSet();
+ KWFrame *f = new KWFrame(fs, 0, 1, 10, 11);
+ fs->addFrame(f);
+
+ fs->deleteAllCopies();
+ CHECK(fs->frameCount(), (unsigned int) 1);
+ CHECK(fs->frame(0), f);
+
+ KWFrame *f2 = f->getCopy();
+ f2->setCopy(true);
+ fs->addFrame(f2);
+
+ CHECK(fs->frameCount(), (unsigned int) 2);
+ CHECK(fs->frame(0), f);
+ CHECK(fs->frame(1), f2);
+
+ fs->deleteAllCopies();
+ f2=0;
+ CHECK(fs->frameCount(), (unsigned int) 1);
+ CHECK(fs->frame(0), f);
+}
+
+void KWFrameTester::testNestedFrames() {
+ KWDocument *doc = new KWDocument();
+ CHECK(doc->pageManager() != 0, true);
+
+ KWTextFrameSet *base = new TestTextFrameSet(doc, "base");
+ base->setPageManager(doc->pageManager());
+ KWFrame *f1 = new KWFrame(base, 0, 1, 10, 11);
+ base->addFrame(f1);
+ KWTextFrameSet *nested = new TestTextFrameSet(doc, "nested");
+ nested->setPageManager(doc->pageManager());
+ KWFrame *f2 = new KWFrame(nested, 0, 1, 10, 11);
+ nested->addFrame(f2);
+
+ nested->setAnchorFrameset(base);
+
+ KWFrameSet *deepNested = new TestTextFrameSet(doc, "deepNested");
+ deepNested->setPageManager(doc->pageManager());
+ KWFrame *f3 = new KWFrame(deepNested, 0, 1, 10, 11);
+ deepNested->addFrame(f3);
+
+ deepNested->setAnchorFrameset(nested);
+
+ doc->addFrameSet(base, false);
+ doc->addFrameSet(nested, false);
+ doc->addFrameSet(deepNested, false);
+
+ CHECK(f1->frameStack() != 0, true);
+ CHECK(f2->frameStack() != 0, true);
+ CHECK(f3->frameStack() != 0, true);
+
+ // since nested and deepNested are inline they are 'inside' the base frame and thuse
+ // all above and below lists should be empty.
+ CHECK(f1->frameStack()->framesBelow().isEmpty(), true);
+ CHECK(f2->frameStack()->framesBelow().isEmpty(), true);
+ CHECK(f3->frameStack()->framesBelow().isEmpty(), true);
+ CHECK(f1->frameStack()->framesOnTop().isEmpty(), true);
+ CHECK(f2->frameStack()->framesOnTop().isEmpty(), true);
+ CHECK(f3->frameStack()->framesOnTop().isEmpty(), true);
+}
diff --git a/kword/tests/FrameTester.h b/kword/tests/FrameTester.h
new file mode 100644
index 00000000..9c255829
--- /dev/null
+++ b/kword/tests/FrameTester.h
@@ -0,0 +1,59 @@
+/* This file is part of the KOffice project
+ * Copyright (C) 2005 Thomas Zander <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; version 2.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+#include <kunittest/tester.h>
+
+#include <KWFrameSet.h>
+#include <KWTextFrameSet.h>
+
+class KWDocument;
+class KoXmlWriter;
+
+class KWFrameTester : public KUnitTest::Tester {
+ public:
+ void allTests();
+ private:
+ void testSimpleFrame();
+ void testFrameList();
+ void testDeleteAllCopies();
+ void testNestedFrames();
+};
+
+class TestFrameSet : public KWFrameSet {
+public:
+ TestFrameSet( KWDocument* doc = 0 ) : KWFrameSet(doc) {
+ }
+ QDomElement save(QDomElement&, bool) { return QDomElement(); }
+ void saveOasis( KoXmlWriter&, KoSavingContext&, bool) const { };
+ void setProtectContent(bool) { }
+ bool protectContent() const { return true; }
+};
+
+class TestTextFrameSet : public KWTextFrameSet {
+public:
+ TestTextFrameSet(KWDocument *doc, const QString name) : KWTextFrameSet(name) {
+ m_doc = doc;
+ }
+ QDomElement save(QDomElement&, bool) { return QDomElement(); }
+ void saveOasis( KoXmlWriter&, KoSavingContext&, bool) const { };
+ void setProtectContent(bool) { }
+ bool protectContent() const { return true; }
+ void updateFrames( int flags = 0xff ) {
+ flags = UpdateFramesInPage;
+ KWFrameSet::updateFrames(flags);
+ }
+};
diff --git a/kword/tests/FrameViewTester.cpp b/kword/tests/FrameViewTester.cpp
new file mode 100644
index 00000000..652bc50e
--- /dev/null
+++ b/kword/tests/FrameViewTester.cpp
@@ -0,0 +1,295 @@
+/* This file is part of the KOffice project
+ * Copyright (C) 2005 Thomas Zander <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; version 2.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+#include <kunittest/runner.h>
+#include <kunittest/module.h>
+#include <kdebug.h>
+
+#include "FrameViewTester.h"
+#include "FrameTester.h"
+
+#include <KWFrame.h>
+#include <KWFrameSet.h>
+#include <KWFrameViewManager.h>
+#include <KWFrameView.h>
+#include <defs.h> // for mousemeaning
+
+using namespace KUnitTest;
+
+KUNITTEST_MODULE(kunittest_FrameViewTester, "FrameView Tester");
+KUNITTEST_MODULE_REGISTER_TESTER(KWFrameViewTester);
+
+void KWFrameViewTester::allTests() {
+ testListeners();
+ testGetView();
+ testMouseMeaning();
+}
+
+class MockListener : public KWFramesListener {
+public:
+ int fsa, fsr, fa,fr;
+ KWFrameSet *lastFs;
+ KWFrame *lastF;
+ MockListener() {
+ fsa=0;
+ fsr=0;
+ fa=0;
+ fr=0;
+ lastFs=0;
+ lastF=0;
+ }
+ void frameSetAdded(KWFrameSet *fs) {
+ fsa++;
+ lastFs=fs;
+ }
+ void frameSetRemoved(KWFrameSet *fs) {
+ fsr++;
+ lastFs=fs;
+ }
+ void frameAdded(KWFrame *f) {
+ fa++;
+ lastF=f;
+ }
+ void frameRemoved(KWFrame *f) {
+ fr++;
+ lastF=f;
+ }
+ void frameMoved(KWFrame *f) {
+ lastF=f;
+ }
+ void frameResized(KWFrame *f) {
+ lastF=f;
+ }
+};
+
+class TestFrameViewManager : public KWFrameViewManager {
+public:
+ TestFrameViewManager() {
+ m_fireEventsRequested = false;
+ }
+ bool m_fireEventsRequested;
+
+ void doFireEvents() { fireEvents(); }
+protected:
+ void requestFireEvents() {
+ m_fireEventsRequested = true;
+ }
+};
+
+void KWFrameViewTester::testListeners() {
+ KWFrameSet *fs = new TestFrameSet();
+ KWFrame *f = new KWFrame(fs, 0, 1, 10, 11);
+
+ TestFrameViewManager *viewManager = new TestFrameViewManager();
+ MockListener *listener = new MockListener();
+ viewManager->addKWFramesListener(listener);
+ CHECK(listener->fsa, 0);
+ // frameSetAdded
+ viewManager->slotFrameSetAdded(fs);
+ CHECK(listener->fsa, 0);
+ CHECK(viewManager->m_fireEventsRequested, true);
+ viewManager->doFireEvents();
+ CHECK(listener->fsa, 1);
+ CHECK(listener->fsr, 0);
+ CHECK(listener->fa, 0);
+ CHECK(listener->fr, 0);
+ CHECK(listener->lastFs, fs);
+
+ // reset
+ listener->fsa = 0;
+ viewManager->m_fireEventsRequested = false;
+ // frameSetRemoved
+ viewManager->slotFrameSetRemoved(fs);
+ CHECK(viewManager->m_fireEventsRequested, true);
+ viewManager->doFireEvents();
+ CHECK(listener->fsa, 0);
+ CHECK(listener->fsr, 1);
+ CHECK(listener->fa, 0);
+ CHECK(listener->fr, 0);
+ CHECK(listener->lastFs, fs);
+
+ // reset
+ listener->fsr = 0;
+ viewManager->m_fireEventsRequested = false;
+ // frameSetRemoved
+ viewManager->slotFrameAdded(f);
+ CHECK(viewManager->m_fireEventsRequested, true);
+ viewManager->doFireEvents();
+ CHECK(listener->fsr, 0);
+ CHECK(listener->fsa, 0);
+ CHECK(listener->fa, 1);
+ CHECK(listener->fr, 0);
+ CHECK(listener->lastF, f);
+
+ // reset
+ listener->fa = 0;
+ viewManager->m_fireEventsRequested = false;
+ // frameSetRemoved
+ viewManager->slotFrameRemoved(f);
+ CHECK(viewManager->m_fireEventsRequested, true);
+ viewManager->doFireEvents();
+ CHECK(listener->fsr, 0);
+ CHECK(listener->fsa, 0);
+ CHECK(listener->fa, 0);
+ CHECK(listener->fr, 1);
+ CHECK(listener->lastF, f);
+
+ // reset
+ listener->fr = 0;
+ viewManager->m_fireEventsRequested = false;
+ // multiple
+ KWFrame *f2 = new KWFrame(fs, 0, 1, 2, 3);
+ viewManager->slotFrameRemoved(f);
+ viewManager->slotFrameSetAdded(fs);
+ viewManager->slotFrameAdded(f);
+ viewManager->slotFrameAdded(f);
+ viewManager->slotFrameAdded(f2);
+ viewManager->doFireEvents();
+ CHECK(listener->fsr, 0);
+ CHECK(listener->fsa, 1);
+ CHECK(listener->fa, 3);
+ CHECK(listener->fr, 1);
+ CHECK(listener->lastF, f2);
+
+ viewManager->slotFrameSetAdded(fs);
+ viewManager->removeKWFramesListener(listener);
+ viewManager->doFireEvents();
+ CHECK(listener->fsr, 0);
+
+ // frame moved
+ // frame resized
+}
+
+void KWFrameViewTester::testGetView() {
+ TestFrameViewManager fvm;
+ KWFrameSet *fs = new TestFrameSet();
+ KWFrame *frame = new KWFrame(fs, 0, 0, 100, 100);
+ fs->addFrame(frame);
+
+ fvm.slotFrameAdded(frame);
+ KWFrameView *fv = fvm.view(frame);
+ CHECK(fv != 0, true);
+ if(!fv) return;
+ CHECK(fv->frame(), frame);
+
+ fv = fvm.view( KoPoint(0,0), KWFrameViewManager::frameOnTop);
+ CHECK(fv != 0, true); // should exist
+ if(!fv) return;
+ CHECK(fv->frame(), frame);
+
+ fv = fvm.view( KoPoint(1,1), KWFrameViewManager::frameOnTop);
+ CHECK(fv != 0, true);
+ if(!fv) return;
+ CHECK(fv->frame(), frame);
+
+ fv = fvm.view( KoPoint(110,110), KWFrameViewManager::frameOnTop);
+ CHECK(fv == 0, true);
+
+ fv = fvm.view( KoPoint(100,100), KWFrameViewManager::frameOnTop); // note that 100,100 _is_ inside 0,0 100x100
+ CHECK(fv != 0, true);
+ if(!fv) return;
+ CHECK(fv->frame(), frame);
+
+ fv->setSelected(true);
+ fv = fvm.view( KoPoint(1,1), KWFrameViewManager::unselected);
+ CHECK(fv == 0, true);
+
+ frame->setZOrder(4);
+ KWFrame *frame2 = new KWFrame(fs, 80, 50, 60, 60);
+ frame2->setZOrder(2);
+ fvm.slotFrameAdded(frame2);
+ KWFrame *frame3 = new KWFrame(fs, 30, 60, 60, 60);
+ frame3->setZOrder(5);
+ fvm.slotFrameAdded(frame3);
+ KWFrame *frame4 = new KWFrame(fs, 200, 0, 100, 100);
+ fvm.slotFrameAdded(frame4);
+ frame4->setZOrder(1);
+
+kdDebug() << "frame:" << frame << ", frame2:" << frame2<< ", frame2:" << frame3<< ", frame2:" << frame4 << endl;
+ fv = fvm.view( KoPoint(90,60), KWFrameViewManager::frameOnTop);
+ CHECK(fv != 0, true);
+ if(!fv) return;
+ CHECK(fv->frame(), frame3);
+ fv = fvm.view( KoPoint(90,60), KWFrameViewManager::frameOnTop); // second time should give the same results
+ CHECK(fv != 0, true);
+ if(!fv) return;
+ CHECK(fv->frame(), frame3);
+ fv = fvm.view( KoPoint(90,60), KWFrameViewManager::selected);
+ CHECK(fv != 0, true);
+ if(!fv) return;
+ CHECK(fv->frame(), frame);
+ fv = fvm.view( KoPoint(90,60), KWFrameViewManager::selected); // second time should give the same results
+ CHECK(fv != 0, true);
+ if(!fv) return;
+ CHECK(fv->frame(), frame);
+
+ fv = fvm.view( KoPoint(90,60), KWFrameViewManager::nextUnselected);
+ CHECK(fv != 0, true);
+ if(!fv) return;
+ CHECK(fv->frame(), frame2); // the one directly below the selected frame
+}
+
+void KWFrameViewTester::testMouseMeaning() {
+ TestFrameViewManager fvm;
+ KWFrameSet *fs = new TestFrameSet();
+ KWFrame *frame = new KWFrame(fs, 50, 50, 50, 50);
+
+ fvm.slotFrameAdded(frame);
+ KWFrameView *fv = fvm.view(frame);
+ if(fv == 0) return; // means previous test already failed a lot.
+
+ MouseMeaning answers[9 * 3] = { MEANING_TOPLEFT, MEANING_LEFT, MEANING_BOTTOMLEFT,
+ MEANING_TOPLEFT, MEANING_LEFT, MEANING_BOTTOMLEFT,
+ MEANING_TOPLEFT, MEANING_LEFT, MEANING_BOTTOMLEFT,
+ MEANING_TOP, MEANING_MOUSE_INSIDE_TEXT, MEANING_BOTTOM,
+ MEANING_TOP, MEANING_MOUSE_INSIDE_TEXT, MEANING_BOTTOM,
+ MEANING_TOP, MEANING_MOUSE_INSIDE_TEXT, MEANING_BOTTOM,
+ MEANING_TOPRIGHT, MEANING_RIGHT, MEANING_BOTTOMRIGHT,
+ MEANING_TOPRIGHT, MEANING_RIGHT, MEANING_BOTTOMRIGHT,
+ MEANING_TOPRIGHT, MEANING_RIGHT, MEANING_BOTTOMRIGHT };
+ int count=0;
+
+ KoPoint point(10, 10);
+ CHECK(fv->mouseMeaning(point, 0), MEANING_NONE);
+ for(int x = 50; x <= 100; x += 25) {
+ for(int offset=-6; offset <= 6; offset+=6) {
+ point.setX(x + offset);
+ for(int y = 50; y <= 100; y += 25) {
+ for(int offset2=-6; offset2 <= 6; offset2+=6) {
+ point.setY(y + offset2);
+ CHECK(fv->contains(point, true), true);
+ if(x < 50 || x > 100 || y < 50 || y > 100)
+ CHECK(fv->contains(point), false);
+ else
+ CHECK(fv->contains(point), true);
+ if(x > 60 && x < 90 && y > 60 && y < 90)
+ CHECK(fv->isBorderHit(point), false);
+ else
+ CHECK(fv->isBorderHit(point), true);
+ CHECK(fv->mouseMeaning(point, 0), answers[count]);
+ }
+ count++;
+ }
+ }
+ }
+
+ point.setX(50);
+ point.setY(120);
+ CHECK(fv->mouseMeaning(point, 0), MEANING_NONE);
+
+}
+// QCursor mouseCursor( const KoPoint &point, int keyState ) const;
diff --git a/kword/tests/FrameViewTester.h b/kword/tests/FrameViewTester.h
new file mode 100644
index 00000000..dceb3835
--- /dev/null
+++ b/kword/tests/FrameViewTester.h
@@ -0,0 +1,27 @@
+/* This file is part of the KOffice project
+ * Copyright (C) 2005 Thomas Zander <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; version 2.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+#include <kunittest/tester.h>
+
+class KWFrameViewTester : public KUnitTest::Tester {
+ public:
+ void allTests();
+ private:
+ void testListeners();
+ void testGetView();
+ void testMouseMeaning();
+};
diff --git a/kword/tests/KWPageManagerTester.cpp b/kword/tests/KWPageManagerTester.cpp
new file mode 100644
index 00000000..9b261d90
--- /dev/null
+++ b/kword/tests/KWPageManagerTester.cpp
@@ -0,0 +1,320 @@
+/* This file is part of the KOffice project
+ * Copyright (C) 2005 Thomas Zander <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; version 2.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+#include <kunittest/runner.h>
+#include <kunittest/module.h>
+#include <kdebug.h>
+
+#include "KWPageManagerTester.h"
+
+#include <KWPageManager.h>
+#include <KWPage.h>
+
+using namespace KUnitTest;
+
+KUNITTEST_MODULE(kunittest_KWPageManagerTester, "PageManager Tester");
+KUNITTEST_MODULE_REGISTER_TESTER(KWPageManagerTester);
+
+void KWPageManagerTester::allTests() {
+ getAddPages();
+ getAddPages2();
+ createInsertPages();
+ removePages();
+ pageInfo();
+ testClipToDocument();
+}
+
+void KWPageManagerTester::getAddPages() {
+ KWPageManager *pageManager = new KWPageManager();
+ pageManager->setStartPage(1);
+ pageManager->appendPage();
+ KWPage *page = pageManager->page(0);
+ CHECK(page == 0, true);
+ page = pageManager->page(2);
+ CHECK(page == 0, true);
+
+ page = pageManager->page(1);
+ CHECK(page == 0, false);
+ CHECK(page->pageNumber(), 1);
+ CHECK(page->pageSide(), KWPage::Right);
+
+ page->setWidth(134.2);
+ page->setHeight(521.4);
+ CHECK(page->width(), 134.2);
+ CHECK(page->height(), 521.4);
+
+ // test setStartPage
+ pageManager->setStartPage(4);
+ page = pageManager->page(0);
+ CHECK(page == 0, true);
+ page = pageManager->page(3);
+ CHECK(page == 0, true);
+ page = pageManager->page(5);
+ CHECK(page == 0, true);
+ page = pageManager->page(4);
+ CHECK(page == 0, false);
+ CHECK(page->pageNumber(), 4);
+ CHECK(page->pageSide(), KWPage::Left);
+
+ pageManager->setStartPage(1);
+ page = pageManager->page(0);
+ CHECK(page == 0, true);
+ page = pageManager->page(3);
+ CHECK(page == 0, true);
+ page = pageManager->page(2);
+ CHECK(page == 0, true);
+ page = pageManager->page(1);
+ CHECK(page == 0, false);
+ CHECK(page->pageNumber(), 1);
+ CHECK(page->pageSide(), KWPage::Right);
+
+ // adding pages
+ CHECK(pageManager->pageCount(), 1);
+ CHECK(pageManager->lastPageNumber(), 1);
+ pageManager->setStartPage(40);
+ CHECK(pageManager->pageCount(), 1);
+ CHECK(pageManager->lastPageNumber(), 40);
+ page = pageManager->appendPage();
+ CHECK(pageManager->pageCount(), 2);
+ CHECK(pageManager->lastPageNumber(), 41);
+
+ CHECK(page == 0, false);
+ CHECK(page->pageNumber(), 41);
+ CHECK(page->pageSide(), KWPage::Right);
+}
+
+void KWPageManagerTester::getAddPages2() {
+ KWPageManager *pageManager = new KWPageManager();
+ pageManager->setStartPage(1);
+ KWPage *page = pageManager->appendPage();
+ page->setWidth(200);
+ page->setHeight(200);
+
+ CHECK(pageManager->pageNumber(KoRect(0,0,2,2)), 1);
+ CHECK(pageManager->pageNumber(KoRect(90,90,2,2)), 1);
+ CHECK(pageManager->pageNumber(KoRect(190,190,9,9)), 1);
+
+ page = pageManager->appendPage();
+ page->setWidth(600);
+ page->setHeight(600);
+ CHECK(pageManager->pageNumber(KoRect(0,0,2,2)), 1);
+ CHECK(pageManager->pageNumber(KoRect(90,90,2,2)), 1);
+ CHECK(pageManager->pageNumber(KoRect(190,190,9,9)), 1);
+
+ CHECK(pageManager->pageNumber(KoRect(201,201,2,2)), 2);
+#ifdef STRICT_PAGECHECKS // was true before KWPageManager.cpp -r511705:511706
+ CHECK(pageManager->pageNumber(KoRect(300,3,2,2)), -1); // right of page 1
+#else
+ CHECK(pageManager->pageNumber(KoRect(300,3,2,2)), 1); // right of page 1
+#endif
+ CHECK(pageManager->pageNumber(KoRect(2, 690,9,9)), 2);
+ CHECK(pageManager->pageNumber(KoRect(300,300,10,10)), 2);
+#ifdef STRICT_PAGECHECKS // was true before KWPageManager.cpp -r511705:511706
+ CHECK(pageManager->pageNumber(KoRect(600,700,10,10)), -1); // right of page 2
+#else
+ CHECK(pageManager->pageNumber(KoRect(600,700,10,10)), 2); // right of page 2
+#endif
+
+ // KoPoint based
+ CHECK(pageManager->pageNumber(KoPoint(201,201)), 2);
+ // Y based
+ CHECK(pageManager->pageNumber(201.0), 2);
+#ifdef STRICT_PAGECHECKS // was true before KWPageManager.cpp -r511705:511706
+ CHECK(pageManager->pageNumber(900.0), -1);
+#else
+ CHECK(pageManager->pageNumber(900.0), 2);
+#endif
+}
+
+void KWPageManagerTester::createInsertPages() {
+ KWPageManager *pageManager = new KWPageManager();
+ pageManager->setStartPage(1);
+ CHECK(pageManager->pageCount(), 0);
+ KWPage *page1 = pageManager->appendPage();
+ CHECK(pageManager->pageCount(), 1);
+ KWPage *page3 = pageManager->appendPage();
+ CHECK(pageManager->pageCount(), 2);
+ CHECK(page3->pageNumber(), 2);
+
+ KWPage *page2 = pageManager->insertPage(2);
+ CHECK(pageManager->pageCount(), 3);
+ CHECK(page1->pageNumber(), 1);
+ CHECK(page2->pageNumber(), 2);
+ CHECK(page3->pageNumber(), 3);
+
+ KWPage *page4 = pageManager->insertPage(100);
+ CHECK(pageManager->pageCount(), 4);
+ CHECK(page1->pageNumber(), 1);
+ CHECK(page2->pageNumber(), 2);
+ CHECK(page3->pageNumber(), 3);
+ CHECK(page4->pageNumber(), 4);
+
+ KWPage *page = pageManager->insertPage(0);
+ CHECK(pageManager->pageCount(), 5);
+ CHECK(page->pageNumber(), 1);
+ CHECK(page1->pageNumber(), 2);
+ CHECK(page2->pageNumber(), 3);
+ CHECK(page3->pageNumber(), 4);
+ CHECK(page4->pageNumber(), 5);
+
+ pageManager->setOnlyAllowAppend(true);
+ KWPage *page6 = pageManager->insertPage(0);
+ CHECK(pageManager->pageCount(), 6);
+ CHECK(page1->pageNumber(), 2);
+ CHECK(page6->pageNumber(), 6);
+}
+
+void KWPageManagerTester::removePages() {
+ KWPageManager *pageManager = new KWPageManager();
+ pageManager->setStartPage(1);
+ KWPage *page1 = pageManager->appendPage();
+ pageManager->appendPage();
+ KWPage *page2 = pageManager->appendPage();
+ /*KWPage *page3 =*/ pageManager->appendPage();
+ KWPage *page4 = pageManager->appendPage();
+
+ pageManager->removePage(2);
+ CHECK(page1->pageNumber(), 1);
+ CHECK(page2->pageNumber(), 2);
+ CHECK(page4->pageNumber(), 4);
+ pageManager->removePage(page2);
+ CHECK(page1->pageNumber(), 1);
+ CHECK(page4->pageNumber(), 3);
+
+ /* todo: bool tryRemovingPages(); */
+}
+
+void KWPageManagerTester::pageInfo() {
+ KWPageManager *pageManager = new KWPageManager();
+ KoPageLayout layout;
+ layout.ptWidth = 300;
+ layout.ptHeight = 600;
+ layout.format = PG_DIN_A4;
+ pageManager->setDefaultPage(layout);
+ pageManager->setStartPage(1);
+ KWPage *page1 = pageManager->appendPage();
+ page1->setWidth(100);
+ page1->setHeight(200);
+ KWPage *page2 = pageManager->appendPage();
+ page2->setWidth(50);
+ page2->setHeight(100);
+ KWPage *page3 = pageManager->appendPage();
+
+ CHECK(pageManager->topOfPage(3), 300.0);
+ CHECK(pageManager->bottomOfPage(3), 900.0);
+ layout.ptHeight = 500;
+ pageManager->setDefaultPage(layout);
+ CHECK(pageManager->bottomOfPage(3), 800.0);
+ page2->setHeight(-1);
+ CHECK(pageManager->bottomOfPage(3), 1200.0);
+
+ layout.ptTop = 5;
+ layout.ptLeft = 6;
+ layout.ptBottom = 7;
+ layout.ptRight = 8;
+ layout.ptBindingSide = -1;
+ layout.ptPageEdge = -1;
+ pageManager->setDefaultPage(layout);
+ page2->setTopMargin(9);
+ page2->setLeftMargin(10);
+ page2->setBottomMargin(11);
+ page2->setRightMargin(12);
+
+ KoPageLayout lay = pageManager->pageLayout(2);
+ CHECK(lay.ptHeight, 500.0);
+ CHECK(lay.ptWidth, 50.0);
+ CHECK(lay.ptTop, 9.0);
+ CHECK(lay.ptLeft, 10.0);
+ CHECK(lay.ptBottom, 11.0);
+ CHECK(lay.ptRight, 12.0);
+
+ lay = pageManager->pageLayout(3);
+ CHECK(lay.ptHeight, 500.0);
+ CHECK(lay.ptWidth, 300.0);
+ CHECK(lay.ptTop, 5.0);
+ CHECK(lay.ptLeft, 6.0);
+ CHECK(lay.ptBottom, 7.0);
+ CHECK(lay.ptRight, 8.0);
+
+ lay.ptRight = 90; // should have no effect, since its a copy
+ CHECK(page3->rightMargin(), 8.0);
+
+
+ // Page Edge / Page Margin
+ page1->setPageEdgeMargin(14.0);
+ CHECK(page1->pageSide(), KWPage::Right);
+ CHECK(page1->rightMargin(), 14.0);
+ page1->setMarginClosestBinding(15.0);
+ CHECK(page1->rightMargin(), 14.0);
+ CHECK(page1->leftMargin(), 15.0);
+
+ CHECK(page2->rightMargin(), 12.0); // unchanged due to changes in page1
+ CHECK(page2->leftMargin(), 10.0);
+ page2->setPageEdgeMargin(16.0);
+ CHECK(page2->pageSide(), KWPage::Left);
+ CHECK(page2->leftMargin(), 16.0);
+ page2->setMarginClosestBinding(17.0);
+ CHECK(page2->leftMargin(), 16.0);
+ CHECK(page2->rightMargin(), 17.0);
+
+ page2->setLeftMargin(18);
+ CHECK(page2->leftMargin(), 18.0);
+ page2->setRightMargin(19);
+ CHECK(page2->rightMargin(), 19.0);
+ CHECK(page2->leftMargin(), 18.0);
+}
+
+void KWPageManagerTester::testClipToDocument() {
+ KWPageManager *pageManager = new KWPageManager();
+ KoPageLayout lay;
+ lay.ptWidth = 300;
+ lay.ptHeight = 600;
+ lay.format = PG_DIN_A4;
+ pageManager->setDefaultPage(lay);
+ KWPage *page1 = pageManager->appendPage();
+ page1->setWidth(100);
+ page1->setHeight(200);
+ KWPage *page2 = pageManager->appendPage();
+ page2->setWidth(50);
+ page2->setHeight(100);
+ /*KWPage *page3 =*/ pageManager->appendPage();
+
+ KoPoint p(10,10);
+
+ KoPoint result = pageManager->clipToDocument(p);
+ CHECK(p == result, true);
+
+ p.setX(110);
+ result = pageManager->clipToDocument(p);
+ CHECK(p.y(), result.y());
+ CHECK(result.x(), 100.0);
+
+ p.setY(210);
+ result = pageManager->clipToDocument(p);
+ CHECK(p.y(), result.y());
+ CHECK(result.x(), 50.0);
+
+ p.setY(330);
+ result = pageManager->clipToDocument(p);
+ CHECK(p == result, true);
+
+ p.setY(910);
+ p.setX(310);
+ result = pageManager->clipToDocument(p);
+ CHECK(result.y(), 900.0);
+ CHECK(result.x(), 300.0);
+}
diff --git a/kword/tests/KWPageManagerTester.h b/kword/tests/KWPageManagerTester.h
new file mode 100644
index 00000000..2136bdc4
--- /dev/null
+++ b/kword/tests/KWPageManagerTester.h
@@ -0,0 +1,30 @@
+/* This file is part of the KOffice project
+ * Copyright (C) 2005 Thomas Zander <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; version 2.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+#include <kunittest/tester.h>
+
+class KWPageManagerTester : public KUnitTest::Tester {
+ public:
+ void allTests();
+ private:
+ void getAddPages();
+ void getAddPages2();
+ void createInsertPages();
+ void removePages();
+ void pageInfo();
+ void testClipToDocument();
+};
diff --git a/kword/tests/Makefile.am b/kword/tests/Makefile.am
new file mode 100644
index 00000000..5b316ce7
--- /dev/null
+++ b/kword/tests/Makefile.am
@@ -0,0 +1,25 @@
+AM_CPPFLAGS = -I$(srcdir)/../ $(KOFFICE_INCLUDES) $(KOPAINTER_INCLUDES) $(all_includes)
+
+INCLUDES = $(KOFFICE_INCLUDES) $(KOTEXT_INCLUDES) $(all_includes)
+
+# The check_ target makes sure we don't install the modules,
+# $(KDE_CHECK_PLUGIN) assures a shared library is created.
+check_LTLIBRARIES = kunittest_KWPageManagerTester.la \
+ kunittest_FrameTester.la \
+ kunittest_FrameViewTester.la
+
+kunittest_KWPageManagerTester_la_SOURCES = KWPageManagerTester.cpp
+kunittest_KWPageManagerTester_la_LIBADD = -lkunittest ../libkwordprivate.la
+kunittest_KWPageManagerTester_la_LDFLAGS = -module $(KDE_CHECK_PLUGIN) $(all_libraries)
+
+kunittest_FrameTester_la_SOURCES = FrameTester.cpp
+kunittest_FrameTester_la_LIBADD = -lkunittest ../libkwordprivate.la
+kunittest_FrameTester_la_LDFLAGS = -module $(KDE_CHECK_PLUGIN) $(all_libraries)
+
+kunittest_FrameViewTester_la_SOURCES = FrameViewTester.cpp
+kunittest_FrameViewTester_la_LIBADD = -lkunittest ../libkwordprivate.la
+kunittest_FrameViewTester_la_LDFLAGS = -module $(KDE_CHECK_PLUGIN) $(all_libraries)
+
+check-local: kunittest_KWPageManagerTester.la kunittest_FrameTester.la kunittest_FrameViewTester.la
+ kunittestmodrunner 2>&1 | perl $(srcdir)/checkFilter.pl
+
diff --git a/kword/tests/README b/kword/tests/README
new file mode 100644
index 00000000..2d9ee0eb
--- /dev/null
+++ b/kword/tests/README
@@ -0,0 +1,26 @@
+When running oasis-kword.sh you can expect the following differences in the diff,
+they are not bugs:
+
+* Background color (bkRed/bkBlue/bkGreen) isn't saved anymore for transparent frames (bkStyle=0)
+ (which makes sense since it doesn't appear)
+
+* Font weight is rounded to a multiple of 10 (if not 75)
+ - <WEIGHT value="48" />
+ + <WEIGHT value="40" />
+No idea how I ended up with a value of 48 in the old .kwd file, Qt mostly knows 50 and 75.
+
+* Picture collection: the keys and filenames are re-generated.
+
+* The direction of a paragraph and its text color are now explicit instead of implicit:
+ <LAYOUT>
+ <NAME value="Standard" />
+- <FLOW align="left" />
++ <FLOW dir="L" align="left" />
+ <FORMAT id="1" pos="0" len="26" >
+ <WEIGHT value="50" />
++ <COLOR blue="0" red="0" green="0" />
+ <FONT name="Bitstream Vera Sans" />
+ <SIZE value="9" />
+ <ITALIC value="0" />
+ This is hidden by oasis-kword.sh though.
+
diff --git a/kword/tests/checkFilter.pl b/kword/tests/checkFilter.pl
new file mode 100755
index 00000000..c3a8cb53
--- /dev/null
+++ b/kword/tests/checkFilter.pl
@@ -0,0 +1,52 @@
+#!/usr/bin/perl
+
+foreach $in (<STDIN>) {
+ if($in=~/^# Running normal tests... #$/) { $testsStarted=1; }
+ elsif($testsStarted != 1 || $in=~/^$/) { print "$in"; }
+ elsif($in=~/^check: (.*?)\[(\d+)\](| failed)$/) {
+#print "++ $_ a: '$1', b: '$2'\n";
+ $file = $1;
+ $line = $2;
+ $failed = $3;
+ if($file ne $currentFile) {
+ print "$file: ";
+ $currentFile = $file;
+ }
+ if($lines ne "") {
+ if($lines=~/\n$/) {
+ $lines = "$lines...";
+ } else {
+ $lines = "$lines, ";
+ }
+ }
+ if($failed ne "") { # it failed!
+ $lines = "$lines\[F:$line\]";
+ } else {
+ $lines = "$lines$line";
+ }
+ }
+ elsif($in=~/ ((\d+) test(|s) passed, (\d+) test(|s) failed)/) {
+#print "passed: '$2' failed: '$4'\n";
+ if($4 ne "0") {
+ print "$lines\n";
+ }
+ print "$1\n";
+ $lines = "";
+ $currentFile = "";
+ }
+ elsif($currentFile eq "") {
+ print $in;
+ } else {
+ # debug output in between lines..
+ if(!($lines eq "" || $lines=~/\n$/)) {
+ $lines = "$lines\n";
+ }
+ $lines = "$lines$in";
+ }
+}
+
+if($lines ne "") {
+ print "$lines\n";
+ print $in;
+ print "WARN: unexpected end of stream, check test $file after line $line\n";
+}
diff --git a/kword/tests/oasis-kword.sh b/kword/tests/oasis-kword.sh
new file mode 100644
index 00000000..d68de47c
--- /dev/null
+++ b/kword/tests/oasis-kword.sh
@@ -0,0 +1,108 @@
+#!/bin/bash
+
+# This script helps finding out problems in the OASIS loading/saving code,
+# by converting .kwd -> .odt -> .kwd and comparing the initial and final .kwd files.
+# We use the kwd format as a "dump" of the KWord data, to check if everything is correct
+# in memory, but the point is of course to ensure that the .odt has all the information.
+
+# To use this script, you need to pass the path to an existing kwd file as argument.
+input="$1"
+
+# Set this to 1 in order to validate the saved oasis document using oasislint
+checkoasis="1"
+
+appname=kword
+oldextension=kwd
+oasisextension=odt
+oasismimetype=application/vnd.oasis.opendocument.text
+
+# dcopstart won't handle a relative path (kdeinit has a different cwd)
+# so make it absolute
+if echo "$input" | grep -v '^/' >/dev/null 2>&1; then
+ input="$PWD/$input"
+fi
+
+test -f "$input" || { echo "No such file $input"; exit 1; }
+
+# Load old native file
+appid=`dcopstart $appname $input`
+test -n "$appid" || { echo "Error starting $appname!"; exit 1; }
+while test "`dcop $appid Document-0 isLoading`" != "false"; do
+ sleep 1;
+done
+
+# Save again (in case of changes in syntax etc.)
+origfile=$PWD/oasisregtest-initial.$oldextension
+dcop $appid Document-0 saveAs $origfile || exit 1
+test -f $origfile || exit 1
+
+# Save to OASIS
+tmpoasisfile=$PWD/oasisregtest.$oasisextension
+dcop $appid Document-0 setOutputMimeType $oasismimetype || exit 1
+dcop $appid Document-0 saveAs $tmpoasisfile || exit 1
+test -f $tmpoasisfile || exit 1
+
+dcopquit $appid
+
+rm -rf oasisregtest-oasis
+mkdir oasisregtest-oasis
+cd oasisregtest-oasis || exit 1
+unzip $tmpoasisfile || exit 1
+cd ..
+
+# Load resulting OASIS file, convert to old native format
+tmpnativefile=$PWD/oasisregtest-final.$oldextension
+appid=`dcopstart $appname $tmpoasisfile`
+while `dcop $appid Document-0 isLoading` == "true"; do
+ sleep 1;
+done
+dcop $appid Document-0 setOutputMimeType "application/x-$appname" || exit 1
+dcop $appid Document-0 saveAs $tmpnativefile || exit 1
+test -f $tmpnativefile || exit 1
+
+# Unpack everything
+rm -rf oasisregtest-orig
+mkdir oasisregtest-orig
+rm -rf oasisregtest-final
+mkdir oasisregtest-final
+cd oasisregtest-orig || exit 1
+unzip $origfile || exit 1
+cd ..
+cd oasisregtest-final || exit 1
+unzip $tmpnativefile || exit 1
+cd ..
+# Validate OASIS format
+cd oasisregtest-oasis || exit 1
+if test "$checkoasis" = "1"; then
+ if type -p oasislint >/dev/null 2>&1; then
+ for f in content.xml styles.xml meta.xml settings.xml; do
+ echo "Checking $f..." ; oasislint $f
+ done
+ fi
+ # Hide warning about non-standard oasis attribute being used for a kword-specific feature
+ perl -pi -e 's/style:frame-behavior-on-new-page="[^\"]*"//' content.xml
+ if type -p oasislint-strict >/dev/null 2>&1; then
+ for f in content.xml styles.xml meta.xml settings.xml; do
+ echo "Checking $f strict..." && oasislint-strict $f
+ done
+ fi
+fi
+cd ..
+
+# Some fixups - kword specific
+# 1) the name of the main text frameset changes, no big deal, so adjust in orig
+# 2) modification time obviously changed, remove it
+# 3) paragraph direction, text color and relativetextsize are now explicitly saved, hide them from the diff
+perl -pi -e 's/\"Text Frameset 1\"/\"Main Text Frameset\"/;s,<WEIGHT value="48" />,<WEIGHT value="40" />,' oasisregtest-orig/maindoc.xml
+perl -pi -e 's/<FLOW dir="L"/<FLOW/ ; s/relativetextsize="0.58" //' oasisregtest-final/maindoc.xml
+perl -pi -e 's/modificationDate=\"[0-9-T:]*\"//; $_="" if (/<COLOR blue=\"0\" red=\"0\" green=\"0\" \/>/);' oasisregtest-final/maindoc.xml oasisregtest-orig/maindoc.xml
+
+# Some generic fixups: documentinfo was updated by the automated 'editing'
+perl -pi -e '$_ = "" if (/<editing-cycles>/ || /<date>/ || /<full-name>/ || /<company>/ || /<email>/ )' oasisregtest-final/documentinfo.xml oasisregtest-orig/documentinfo.xml
+
+# Compare initial and final "native format" files
+diff -urp oasisregtest-orig oasisregtest-final 2>&1 | tee oasisdiff | less
+
+echo "See oasisregtest-oasis for the OASIS xml files."
+echo "For a better diffing mechanism, launch xemacs and paste into a terminal:"
+echo "gnudoit '(ediff-files \"$PWD/oasisregtest-orig/maindoc.xml\" \"$PWD/oasisregtest-final/maindoc.xml\")'"