diff options
Diffstat (limited to 'kword/tests')
-rw-r--r-- | kword/tests/FrameTester.cpp | 152 | ||||
-rw-r--r-- | kword/tests/FrameTester.h | 59 | ||||
-rw-r--r-- | kword/tests/FrameViewTester.cpp | 295 | ||||
-rw-r--r-- | kword/tests/FrameViewTester.h | 27 | ||||
-rw-r--r-- | kword/tests/KWPageManagerTester.cpp | 320 | ||||
-rw-r--r-- | kword/tests/KWPageManagerTester.h | 30 | ||||
-rw-r--r-- | kword/tests/Makefile.am | 25 | ||||
-rw-r--r-- | kword/tests/README | 26 | ||||
-rwxr-xr-x | kword/tests/checkFilter.pl | 52 | ||||
-rw-r--r-- | kword/tests/oasis-kword.sh | 108 |
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\")'" |