searchengine/cpix/tsrc/cpixunittest/src/en_stemtests.cpp
changeset 0 671dee74050a
child 3 ae3f1779f6da
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/searchengine/cpix/tsrc/cpixunittest/src/en_stemtests.cpp	Mon Apr 19 14:40:16 2010 +0300
@@ -0,0 +1,379 @@
+/*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+#include <wchar.h>
+#include <stddef.h>
+
+#include <iostream>
+
+#include "cpixfstools.h"
+
+#include "itk.h"
+
+#include "cpixidxdb.h"
+
+#include "config.h"
+#include "testutils.h"
+
+#include "testcorpus.h"
+#include "setupsentry.h"
+
+class StemContext : public Itk::ITestContext, public Cpt::IFileVisitor
+{
+
+
+protected:
+    FileIdxUtil      * util_;
+    cpix_Analyzer    * analyzer_;
+    cpix_Query       * query_;
+
+    cpix_QueryParser * queryParser_;
+
+    Itk::TestMgr     * testMgr_;
+
+    virtual cpix_LangCode langCode() const = 0;
+    virtual wchar_t * queryTerm() const = 0;
+
+public:
+
+
+    //
+    // From ITestContext
+    //
+    virtual void setup() throw (Itk::PanicExc)
+    {
+        SetupSentry
+            ss(*this);
+
+        cpix_Result
+            result;
+
+        cpix_IdxDb_dbgScrapAll(&result);
+
+        using namespace std;
+
+        util_ = new FileIdxUtil;
+        util_->init();
+        
+        analyzer_ = cpix_CreateSnowballAnalyzer(&result,
+                                                langCode());
+        if (analyzer_ == NULL)
+            {
+                ITK_PANIC("Could not create analyzer");
+            }
+
+        queryParser_ = cpix_QueryParser_create(&result,
+                                              CONTENTS_FIELD,
+                                              analyzer_);
+        if (queryParser_ == NULL)
+            {
+                ITK_PANIC("Could not create query parser");
+            }
+
+        query_ = cpix_QueryParser_parse(queryParser_,
+                                        queryTerm());
+        if (cpix_Failed(queryParser_)
+            || query_ == NULL)
+            {
+                ITK_PANIC("Could not parse query string");
+            }
+
+        ss.setupComplete();
+    }
+
+
+
+    virtual void tearDown() throw ()
+    {
+        cleanup();
+    }
+
+
+    StemContext()
+        : util_(NULL),
+          analyzer_(NULL),
+          query_(NULL),
+          queryParser_(NULL),
+          testMgr_(NULL)
+    {
+        ;
+    }
+
+
+    virtual ~StemContext()
+    {
+        cleanup();
+    }
+
+
+    
+    //
+    // from Cpt::IFileVisitor
+    //
+    virtual bool visitFile(const char * path)
+    {
+        bool
+            goOn = true;
+
+        util_->indexFile(path,
+                         analyzer_,
+                         testMgr_);
+
+        return goOn;
+    }
+    
+    
+    virtual DirVisitResult visitDirPre(const char * /*path*/)
+    {
+        return IFV_CONTINUE;
+    }
+
+
+    virtual bool visitDirPost(const char * /*path*/)
+    {
+        return true;
+    }
+
+
+
+    //
+    // public operations
+    //
+    void deleteFiles(Itk::TestMgr * testMgr,
+                     const char  ** docUids,
+                     size_t         count,
+                     size_t         expectedDelCount)
+    {
+        using namespace Itk;
+
+        static const int FIELD_SIZE = 128;
+
+        wchar_t
+            ** fieldValues = new wchar_t* [count];
+        
+        for (size_t i = 0; i < count; ++i)
+            {
+                fieldValues[i] = NULL;
+            }
+        
+        for (size_t i = 0; i < count; ++i)
+            {
+                fieldValues[i] = new wchar_t[FIELD_SIZE];
+                mbstowcs(fieldValues[i],
+                         docUids[i],
+                         FIELD_SIZE-1);
+                fieldValues[i][FIELD_SIZE-1] = wchar_t(0);
+            }
+        
+        int32_t
+            result = 0;
+
+        for (size_t i = 0; i < count; ++i)
+            {
+                result += cpix_IdxDb_deleteDocuments(util_->idxDb(),
+                                                     fieldValues[i]);
+                if (cpix_Failed(util_->idxDb()))
+                    {
+                        printf("Failed to delete\n");
+                        cpix_ClearError(util_->idxDb());
+                        break;
+                    }
+                else
+                    {
+                        std::string
+                            docUid(docUids[i]);
+                        docUid[0] = '!';
+                        ITK_MSG(testMgr,
+                                "Deleted document %s",
+                                docUid.c_str());
+                    }
+            }
+        
+        ITK_EXPECT(testMgr,
+                   result == expectedDelCount,
+                   "Only %d docs instead of %d have been deleted",
+                   result,
+                   expectedDelCount);
+
+        for (size_t i = 0; i < count; ++i)
+            {
+                delete[] fieldValues[i];
+            }
+        
+        delete[] fieldValues;
+    }
+
+
+private:
+    //
+    // private methods
+    //
+
+    void cleanup()
+    {
+        delete util_;
+        util_ = NULL;
+
+        cpix_Analyzer_destroy(analyzer_);
+        analyzer_ = NULL;
+
+        cpix_Query_destroy(query_);
+        query_ = NULL;
+
+        cpix_QueryParser_destroy(queryParser_);
+        queryParser_ = NULL;
+    }
+
+
+};
+
+
+const char * EnglishDocsToDelete[2] = {
+    FILE_TEST_CORPUS_PATH "\\en\\1.txt",
+    FILE_TEST_CORPUS_PATH "\\en\\4.txt",
+};
+
+
+class EnglishStemContext : public StemContext
+{
+protected:
+    virtual cpix_LangCode langCode() const
+    {
+        return cpix_LANG_EN;
+    }
+
+
+    virtual wchar_t * queryTerm() const
+    {
+        return L"happy";
+    }
+
+
+public:
+    //
+    // public operations
+    //
+
+    void testAddFiles(Itk::TestMgr * testMgr)
+    {
+        testMgr_ = testMgr;
+        Cpt::traverse(FILE_TEST_CORPUS_PATH "\\en",
+                      this);
+        util_->flush();
+    }
+
+
+    
+    void testSearchFiles(Itk::TestMgr * testMgr)
+    {
+        using namespace Itk;
+
+        cpix_Hits
+            * hits = cpix_IdxDb_search(util_->idxDb(),
+                                       query_);
+        
+        if (cpix_Failed(util_->idxDb()))
+            {
+                ITK_EXPECT(testMgr,
+                           false,
+                           "Failed to search index");
+                cpix_ClearError(util_->idxDb());
+            }
+        else
+            {
+                util_->printHits(hits,
+                                 testMgr);
+
+                cpix_Hits_destroy(hits);
+            }
+
+    }
+
+
+    void testDeleteFiles(Itk::TestMgr * testMgr)
+    {
+        deleteFiles(testMgr,
+                    EnglishDocsToDelete,
+                    sizeof(EnglishDocsToDelete)/sizeof(wchar_t*),
+                    2);
+        util_->flush();
+    }
+
+
+};
+
+
+Itk::TesterBase * CreateEnglishStemTests()
+{
+    using namespace Itk;
+
+    EnglishStemContext
+        * context = new EnglishStemContext;
+
+    ContextTester
+        * contextTester = new ContextTester("en",
+                                            context);
+
+
+#define TEST "adding"
+    contextTester->add(TEST,
+                       context,
+                       &EnglishStemContext::testAddFiles,
+                       TEST);
+#undef TEST
+
+#define TEST "searching"
+    contextTester->add(TEST,
+                       context,
+                       &EnglishStemContext::testSearchFiles,
+                       TEST);
+#undef TEST
+
+
+#define TEST "deleting"
+    contextTester->add(TEST,
+                       context,
+                       &EnglishStemContext::testDeleteFiles,
+                       TEST);
+#undef TEST
+
+#define TEST "searching2"
+    contextTester->add(TEST,
+                       context,
+                       &EnglishStemContext::testSearchFiles,
+                       TEST);
+#undef TEST
+
+
+    return contextTester;
+}
+
+
+Itk::TesterBase * CreateStemTests()
+{
+    using namespace Itk;
+
+    SuiteTester
+        * stemTests = new SuiteTester("stem");
+
+    stemTests->add(CreateEnglishStemTests());
+
+    // TODO add more tests to suite
+
+    return stemTests;
+}
+