test_ewk2_text_checker.cpp [plain text]
#include "config.h"
#include "UnitTestUtils/EWK2UnitTestBase.h"
#include <wtf/text/CString.h>
#include <wtf/text/StringBuilder.h>
using namespace EWK2UnitTest;
extern EWK2UnitTestEnvironment* environment;
static const uint64_t defaultDocumentTag = 123;
static const char expectedMisspelledWord[] = "aa";
static const Evas_Object* defaultView = 0;
static bool isSettingEnabled = false;
static Ecore_Timer* timeoutTimer = 0;
static double defaultTimeoutInSeconds = 0.5;
static bool wasContextMenuShown = false;
static const char noGuessesString[] = "No Guesses Found";
static const char ignoreSpellingString[] = "Ignore Spelling";
static const char learnSpellingString[] = "Learn Spelling";
static struct {
bool spellDocumentTag : 1;
bool spellDocumentTagClose : 1;
bool spellingCheck : 1;
bool wordGuesses : 1;
bool wordLearn : 1;
bool wordIgnore : 1;
} callbacksExecutionStats;
static void resetCallbacksExecutionStats()
{
callbacksExecutionStats.spellDocumentTag = false;
callbacksExecutionStats.spellDocumentTagClose = false;
callbacksExecutionStats.spellingCheck = false;
callbacksExecutionStats.wordGuesses = false;
callbacksExecutionStats.wordLearn = false;
callbacksExecutionStats.wordIgnore = false;
}
static Eina_Bool onTimeout(void*)
{
ecore_main_loop_quit();
return ECORE_CALLBACK_CANCEL;
}
static void onSettingChange(Eina_Bool flag)
{
EXPECT_EQ(isSettingEnabled, flag);
ecore_timer_del(timeoutTimer);
timeoutTimer = 0;
ecore_main_loop_quit();
}
static uint64_t onSpellDocumentTag(const Evas_Object* ewkView)
{
EXPECT_EQ(defaultView, ewkView);
callbacksExecutionStats.spellDocumentTag = true;
return defaultDocumentTag;
}
static void onSpellDocumentTagClose(uint64_t tag)
{
ASSERT_EQ(defaultDocumentTag, tag);
callbacksExecutionStats.spellDocumentTagClose = true;
}
static void onSpellingCheck(uint64_t tag, const char* text, int32_t* misspellingLocation, int32_t* misspellingLength)
{
ASSERT_EQ(defaultDocumentTag, tag);
ASSERT_STREQ(expectedMisspelledWord, text);
ASSERT_TRUE(misspellingLocation);
ASSERT_TRUE(misspellingLength);
*misspellingLocation = 0;
*misspellingLength = strlen(expectedMisspelledWord);
callbacksExecutionStats.spellingCheck = true;
}
static Eina_List* onWordGuesses(uint64_t tag, const char* word)
{
EXPECT_EQ(defaultDocumentTag, tag);
EXPECT_STREQ(expectedMisspelledWord, word);
Eina_List* suggestionsForWord = 0;
callbacksExecutionStats.wordGuesses = true;
return suggestionsForWord;
}
static void onWordLearn(uint64_t tag, const char* word)
{
ASSERT_EQ(defaultDocumentTag, tag);
ASSERT_STREQ(expectedMisspelledWord, word);
callbacksExecutionStats.wordLearn = true;
}
static void onWordIgnore(uint64_t tag, const char* word)
{
ASSERT_EQ(defaultDocumentTag, tag);
ASSERT_STREQ(expectedMisspelledWord, word);
callbacksExecutionStats.wordIgnore = true;
}
static Eina_Bool onContextMenuShow(Ewk_View_Smart_Data*, Evas_Coord, Evas_Coord, Ewk_Context_Menu* contextMenu)
{
const Eina_List* contextMenuItems = ewk_context_menu_items_get(contextMenu);
bool noGuessesAvailable = false;
bool isIgnoreSpellingAvailable = false;
bool isLearnSpellingAvailable = false;
const Eina_List* listIterator;
void* itemData;
EINA_LIST_FOREACH(contextMenuItems, listIterator, itemData) {
Ewk_Context_Menu_Item* item = static_cast<Ewk_Context_Menu_Item*>(itemData);
if (!strcmp(ewk_context_menu_item_title_get(item), noGuessesString))
noGuessesAvailable = true;
else if (!strcmp(ewk_context_menu_item_title_get(item), ignoreSpellingString))
isIgnoreSpellingAvailable = true;
else if (!strcmp(ewk_context_menu_item_title_get(item), learnSpellingString))
isLearnSpellingAvailable = true;
}
EXPECT_FALSE(noGuessesAvailable);
EXPECT_TRUE(isIgnoreSpellingAvailable);
EXPECT_TRUE(isLearnSpellingAvailable);
wasContextMenuShown = true;
return true;
}
TEST_F(EWK2UnitTestBase, ewk_text_checker_spell_checking_languages_get)
{
ewk_text_checker_continuous_spell_checking_enabled_set(false);
timeoutTimer = ecore_timer_add(defaultTimeoutInSeconds, onTimeout, 0);
ecore_main_loop_begin();
Eina_List* loadedLanguages = ewk_text_checker_spell_checking_languages_get();
if (!loadedLanguages)
return;
EXPECT_EQ(1, eina_list_count(loadedLanguages));
void* data;
EINA_LIST_FREE(loadedLanguages, data)
eina_stringshare_del(static_cast<Eina_Stringshare*>(data));
ewk_text_checker_continuous_spell_checking_enabled_set(true);
timeoutTimer = ecore_timer_add(defaultTimeoutInSeconds, onTimeout, 0);
ecore_main_loop_begin();
loadedLanguages = ewk_text_checker_spell_checking_languages_get();
if (!loadedLanguages)
return;
EXPECT_EQ(1, eina_list_count(loadedLanguages));
EINA_LIST_FREE(loadedLanguages, data)
eina_stringshare_del(static_cast<Eina_Stringshare*>(data));
}
TEST_F(EWK2UnitTestBase, context_menu_spelling_items_availability)
{
ewk_text_checker_continuous_spell_checking_enabled_set(false);
ewkViewClass()->context_menu_show = onContextMenuShow;
ASSERT_TRUE(loadUrlSync(environment->urlForResource("spelling_test.html").data()));
mouseClick(10, 20, 3 );
while (!wasContextMenuShown)
ecore_main_loop_iterate();
}
TEST_F(EWK2UnitTestBase, ewk_text_checker_continuous_spell_checking_enabled)
{
ewk_text_checker_continuous_spell_checking_enabled_set(true);
#if ENABLE(SPELLCHECK)
EXPECT_TRUE(ewk_text_checker_continuous_spell_checking_enabled_get());
#else
EXPECT_FALSE(ewk_text_checker_continuous_spell_checking_enabled_get());
#endif
ewk_text_checker_continuous_spell_checking_enabled_set(false);
EXPECT_FALSE(ewk_text_checker_continuous_spell_checking_enabled_get());
}
TEST_F(EWK2UnitTestBase, ewk_text_checker_continuous_spell_checking_change_cb_set)
{
ewk_text_checker_continuous_spell_checking_change_cb_set(onSettingChange);
isSettingEnabled = ewk_text_checker_continuous_spell_checking_enabled_get();
isSettingEnabled = !isSettingEnabled;
ewk_text_checker_continuous_spell_checking_enabled_set(isSettingEnabled);
timeoutTimer = ecore_timer_add(defaultTimeoutInSeconds, onTimeout, 0);
ecore_main_loop_begin();
EXPECT_TRUE(timeoutTimer);
}
TEST_F(EWK2UnitTestBase, ewk_text_checker_spell_checking_available_languages_get)
{
Eina_List* availableLanguages = ewk_text_checker_spell_checking_available_languages_get();
if (!availableLanguages)
return;
void* actual = 0;
WTF::StringBuilder languages;
Eina_List* listIterator = 0;
unsigned lastIndex = eina_list_count(availableLanguages) - 1;
unsigned i = 0;
EINA_LIST_FOREACH(availableLanguages, listIterator, actual) {
languages.append(static_cast<const char*>(actual));
if (i++ != lastIndex)
languages.append(',');
}
ewk_text_checker_spell_checking_languages_set(languages.toString().utf8().data());
timeoutTimer = ecore_timer_add(defaultTimeoutInSeconds, onTimeout, 0);
ecore_main_loop_begin();
Eina_List* loadedLanguages = ewk_text_checker_spell_checking_languages_get();
ASSERT_EQ(eina_list_count(loadedLanguages), eina_list_count(availableLanguages));
i = 0;
void* expected = 0;
EINA_LIST_FOREACH(loadedLanguages, listIterator, actual) {
expected = eina_list_nth(availableLanguages, i++);
EXPECT_STREQ(static_cast<const char*>(expected), static_cast<const char*>(actual));
}
EINA_LIST_FREE(availableLanguages, actual)
eina_stringshare_del(static_cast<const char*>(actual));
EINA_LIST_FREE(loadedLanguages, actual)
eina_stringshare_del(static_cast<const char*>(actual));
}
TEST_F(EWK2UnitTestBase, ewk_text_checker_spell_checking_languages)
{
ewk_text_checker_spell_checking_languages_set(0);
timeoutTimer = ecore_timer_add(defaultTimeoutInSeconds, onTimeout, 0);
ecore_main_loop_begin();
Eina_List* loadedLanguages = ewk_text_checker_spell_checking_languages_get();
if (!loadedLanguages)
return;
ASSERT_EQ(1, eina_list_count(loadedLanguages));
void* actual = 0;
EINA_LIST_FREE(loadedLanguages, actual)
eina_stringshare_del(static_cast<const char*>(actual));
Eina_List* availableLanguages = ewk_text_checker_spell_checking_available_languages_get();
unsigned numberOfAvailableLanguages = eina_list_count(availableLanguages);
if (numberOfAvailableLanguages < 2)
return;
const char* firstExpected = static_cast<const char*>(eina_list_nth(availableLanguages, 0));
const char* lastExpected = static_cast<const char*>(eina_list_data_get(eina_list_last(availableLanguages)));
WTF::StringBuilder languages;
languages.append(String(firstExpected).upper());
languages.append(',');
languages.append(String(lastExpected).lower());
ewk_text_checker_spell_checking_languages_set(languages.toString().utf8().data());
timeoutTimer = ecore_timer_add(defaultTimeoutInSeconds, onTimeout, 0);
ecore_main_loop_begin();
loadedLanguages = ewk_text_checker_spell_checking_languages_get();
ASSERT_EQ(2, eina_list_count(loadedLanguages));
EXPECT_STREQ(firstExpected, static_cast<const char*>(eina_list_nth(loadedLanguages, 0)));
EXPECT_STREQ(lastExpected, static_cast<const char*>(eina_list_nth(loadedLanguages, 1)));
EINA_LIST_FREE(availableLanguages, actual)
eina_stringshare_del(static_cast<const char*>(actual));
EINA_LIST_FREE(loadedLanguages, actual)
eina_stringshare_del(static_cast<const char*>(actual));
}
TEST_F(EWK2UnitTestBase, ewk_text_checker)
{
resetCallbacksExecutionStats();
ewk_text_checker_continuous_spell_checking_enabled_set(true);
ASSERT_TRUE(loadUrlSync(environment->urlForResource("spelling_test.html").data()));
ASSERT_FALSE(callbacksExecutionStats.spellDocumentTag);
ASSERT_FALSE(callbacksExecutionStats.spellDocumentTagClose);
ASSERT_FALSE(callbacksExecutionStats.spellingCheck);
}
TEST_F(EWK2UnitTestBase, ewk_text_checker_unique_spell_document_tag)
{
resetCallbacksExecutionStats();
defaultView = webView();
ewk_text_checker_continuous_spell_checking_enabled_set(true);
ewk_text_checker_unique_spell_document_tag_get_cb_set(onSpellDocumentTag);
ewk_text_checker_unique_spell_document_tag_close_cb_set(onSpellDocumentTagClose);
ASSERT_TRUE(loadUrlSync(environment->urlForResource("spelling_test.html").data()));
ASSERT_TRUE(callbacksExecutionStats.spellDocumentTag);
}
TEST_F(EWK2UnitTestBase, ewk_text_checker_string_spelling_check_cb_set)
{
resetCallbacksExecutionStats();
defaultView = webView();
ewk_text_checker_continuous_spell_checking_enabled_set(true);
ewk_text_checker_string_spelling_check_cb_set(onSpellingCheck);
ASSERT_TRUE(loadUrlSync(environment->urlForResource("spelling_test.html").data()));
ASSERT_TRUE(callbacksExecutionStats.spellingCheck);
}
TEST_F(EWK2UnitTestBase, ewk_text_checker_word_guesses_get_cb_set)
{
resetCallbacksExecutionStats();
defaultView = webView();
ewk_text_checker_continuous_spell_checking_enabled_set(true);
ewk_text_checker_word_guesses_get_cb_set(onWordGuesses);
ASSERT_TRUE(loadUrlSync(environment->urlForResource("spelling_test.html").data()));
}
TEST_F(EWK2UnitTestBase, ewk_text_checker_word_learn_cb_set)
{
resetCallbacksExecutionStats();
defaultView = webView();
ewk_text_checker_continuous_spell_checking_enabled_set(true);
ewk_text_checker_word_learn_cb_set(onWordLearn);
ASSERT_TRUE(loadUrlSync(environment->urlForResource("spelling_test.html").data()));
}
TEST_F(EWK2UnitTestBase, ewk_text_checker_word_ignore_cb_set)
{
resetCallbacksExecutionStats();
defaultView = webView();
ewk_text_checker_continuous_spell_checking_enabled_set(true);
ewk_text_checker_word_ignore_cb_set(onWordIgnore);
ASSERT_TRUE(loadUrlSync(environment->urlForResource("spelling_test.html").data()));
}