Skip to content
Snippets Groups Projects
PyZyTest.cc 56.3 KiB
Newer Older
/* vim:set et ts=4 sts=4:
 *
 * ibus-pinyin - The Chinese PinYin engine for IBus
 *
 * Copyright (c) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
 *
 * 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
 * the Free Software Foundation; either version 2, or (at your option)
 * any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
#include <gtest/gtest.h>
#include <glib/gstdio.h>

#include <iostream>
#include <algorithm>

#include "PyZyConfig.h"
#include "PyZyDoublePinyinContext.h"
#include "PyZyFullPinyinContext.h"
#include "PyZyBopomofoContext.h"
#include "PyZyPhoneticContext.h"

#include "PyZyPinyinArray.h"
#include "PyZyDatabase.h"

using namespace std;
using namespace PyZy;


int main(int argc, char **argv) {
    testing::InitGoogleTest (&argc, argv);
    return RUN_ALL_TESTS ();
}

class PyZyTest : public testing::Test {
protected:
    virtual void SetUp () {
        PhoneticContext::init ("libpyzy-test");
        PinyinConfig::init ();
        BopomofoConfig::init ();
    }

    virtual void TearDown () {
        PyZy::Database::finalize ();

        std::string db_file = g_get_user_cache_dir();
        db_file += G_DIR_SEPARATOR_S;
        db_file += "libpyzy-test";
        db_file += G_DIR_SEPARATOR_S;
        db_file += "user-1.3.db";
        g_unlink (db_file.c_str ());
    }
};

class CounterObserver : public PyZy::PhoneticContext::Observer {
public:
    void commitText (const std::string &commit_text) {
        m_commited_text = commit_text;
        ++m_commit_text;
    }
    void preeditTextChanged ()     { ++m_preedit_text; }
    void auxiliaryTextChanged ()   { ++m_auxiliary_text; }
    void lookupTableChanged ()     { ++m_lookup_table; }

    string commitedText ()         { return m_commited_text; }
    guint commitTextCount ()       { return m_commit_text; }
    guint preeditTextCount ()      { return m_preedit_text; }
    guint auxiliaryTextCount ()    { return m_auxiliary_text; }
    guint lookupTableCount ()      { return m_lookup_table; }

    void clear () {
        m_commited_text.clear ();
        m_commit_text = 0;
        m_preedit_text = 0;
        m_auxiliary_text = 0;
        m_lookup_table = 0;
    }
private:
    string    m_commited_text;
    guint     m_commit_text;
    guint     m_preedit_text;
    guint     m_auxiliary_text;
    guint     m_lookup_table;
};

void insertKeys (PhoneticContext &context, const string &keys) {
    for (guint i = 0; i < keys.size (); ++i) {
        context.processKeyEvent (keys[i]);
    }
}

TEST_F (PyZyTest, FullPinyinBasicTest) {
    CounterObserver observer;
    FullPinyinContext context(PinyinConfig::instance (), &observer);

    {  // Reset
        context.reset ();

        observer.clear ();
        insertKeys (context, "nihao");
        EXPECT_EQ (5, context.cursor ());
        EXPECT_EQ ("nihao", context.inputText ());
        EXPECT_EQ ("", context.selectedText ());
        EXPECT_EQ ("你好", context.conversionText ());
        EXPECT_EQ ("", context.restText ());
        EXPECT_EQ ("ni hao|", context.auxiliaryText ());
        EXPECT_LT (0, context.candidates ().size ());
        EXPECT_EQ ("", observer.commitedText ());
        EXPECT_EQ (5, observer.preeditTextCount ());
        EXPECT_EQ (5, observer.lookupTableCount ());
        EXPECT_EQ (0, observer.commitTextCount ());

        observer.clear ();
        context.processKeyEvent (VKEY_RESET);
        EXPECT_EQ (0, context.cursor ());
        EXPECT_EQ ("", context.inputText ());
        EXPECT_EQ ("", context.selectedText ());
        EXPECT_EQ ("", context.conversionText ());
        EXPECT_EQ ("", context.restText ());
        EXPECT_EQ ("", context.auxiliaryText ());
        EXPECT_EQ (0, context.candidates ().size ());
        EXPECT_EQ ("", observer.commitedText ());
        EXPECT_EQ (1, observer.preeditTextCount ());
        EXPECT_EQ (1, observer.lookupTableCount ());
        EXPECT_EQ (0, observer.commitTextCount ());
    }

    {  // Commit directly
        context.reset ();

        observer.clear ();
        insertKeys (context, "nihao");
        EXPECT_EQ (5, context.cursor ());
        EXPECT_EQ ("nihao", context.inputText ());
        EXPECT_EQ ("", context.selectedText ());
        EXPECT_EQ ("你好", context.conversionText ());
        EXPECT_EQ ("", context.restText ());
        EXPECT_EQ ("ni hao|", context.auxiliaryText ());
        EXPECT_LT (0, context.candidates ().size ());
        EXPECT_EQ ("", observer.commitedText ());
        EXPECT_EQ (5, observer.preeditTextCount ());
        EXPECT_EQ (5, observer.lookupTableCount ());
        EXPECT_EQ (0, observer.commitTextCount ());

        observer.clear ();
        context.processKeyEvent (VKEY_COMMIT);
        EXPECT_EQ (0, context.cursor ());
        EXPECT_EQ ("", context.inputText ());
        EXPECT_EQ ("", context.selectedText ());
        EXPECT_EQ ("", context.conversionText ());
        EXPECT_EQ ("", context.restText ());
        EXPECT_EQ ("", context.auxiliaryText ());
        EXPECT_EQ (0, context.candidates ().size ());
        EXPECT_EQ ("nihao", observer.commitedText ());
        EXPECT_EQ (1, observer.preeditTextCount ());
        EXPECT_EQ (1, observer.lookupTableCount ());
        EXPECT_EQ (1, observer.commitTextCount ());
    }

    {  // Select candidate
        context.reset ();

        observer.clear ();
        insertKeys (context, "nihao");
        EXPECT_EQ (5, context.cursor ());
        EXPECT_EQ ("nihao", context.inputText ());
        EXPECT_EQ ("", context.selectedText ());
        EXPECT_EQ ("你好", context.conversionText ());
        EXPECT_EQ ("", context.restText ());
        EXPECT_EQ ("ni hao|", context.auxiliaryText ());
        EXPECT_LT (0, context.candidates ().size ());
        EXPECT_EQ ("", observer.commitedText ());
        EXPECT_EQ (5, observer.preeditTextCount ());
        EXPECT_EQ (5, observer.lookupTableCount ());
        EXPECT_EQ (0, observer.commitTextCount ());

        observer.clear ();
        context.processKeyEvent (VKEY_CANDIDATE_SELECT | '1');
        EXPECT_EQ (0, context.cursor ());
        EXPECT_EQ ("", context.inputText ());
        EXPECT_EQ ("", context.selectedText ());
        EXPECT_EQ ("", context.conversionText ());
        EXPECT_EQ ("", context.restText ());
        EXPECT_EQ ("", context.auxiliaryText ());
        EXPECT_EQ (0, context.candidates ().size ());
        EXPECT_EQ ("你好", observer.commitedText ());
        EXPECT_EQ (1, observer.preeditTextCount ());
        EXPECT_EQ (1, observer.lookupTableCount ());
        EXPECT_EQ (1, observer.commitTextCount ());
    }
Loading full blame...