1 /* Copyright (c) 2007 Eric Scott Albright
2 *
3 * Permission is hereby granted, free of charge, to any person obtaining a copy
4 * of this software and associated documentation files (the "Software"), to deal
5 * in the Software without restriction, including without limitation the rights
6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 * copies of the Software, and to permit persons to whom the Software is
8 * furnished to do so, subject to the following conditions:
9 *
10 * The above copyright notice and this permission notice shall be included in
11 * all copies or substantial portions of the Software.
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 * THE SOFTWARE.
20 */
21
22 #include <UnitTest++/UnitTest++.h>
23 #include <enchant.h>
24 #include "EnchantBrokerTestFixture.h"
25 #include <vector>
26
27
EnchantDictionaryDescribeCallback(const char * const lang_tag,const char * const provider_name,const char * const provider_desc,const char * const provider_file,void * user_data)28 void EnchantDictionaryDescribeCallback (const char * const lang_tag,
29 const char * const provider_name,
30 const char * const provider_desc,
31 const char * const provider_file,
32 void * user_data)
33 {
34 std::vector<DictionaryDescription>* dictionaryList = reinterpret_cast<std::vector<DictionaryDescription>*>(user_data);
35 dictionaryList->push_back(DictionaryDescription(lang_tag, provider_name, provider_desc, provider_file));
36 }
37
38 static void * global_user_data;
EnchantDictionaryDescribeAssignUserDataToStaticCallback(const char * const,const char * const,const char * const,const char * const,void * user_data)39 void EnchantDictionaryDescribeAssignUserDataToStaticCallback (const char * const,
40 const char * const,
41 const char * const,
42 const char * const,
43 void * user_data)
44 {
45 global_user_data = user_data;
46 }
47
48 static bool listDictionariesCalled;
ListDictionaries(EnchantProvider * me,size_t * out_n_dicts)49 static char** ListDictionaries (EnchantProvider * me, size_t * out_n_dicts)
50 {
51 listDictionariesCalled = true;
52
53 return MockEnGbProviderListDictionaries(me, out_n_dicts);
54 }
55
56 struct EnchantBrokerListDictionaries_TestFixtureBase : EnchantBrokerTestFixture
57 {
58 //Setup
EnchantBrokerListDictionaries_TestFixtureBaseEnchantBrokerListDictionaries_TestFixtureBase59 EnchantBrokerListDictionaries_TestFixtureBase(ConfigureHook userConfiguration):
60 EnchantBrokerTestFixture(userConfiguration)
61 {
62 listDictionariesCalled=false;
63 global_user_data = NULL;
64 }
65 std::vector<DictionaryDescription> _dictionaryList;
66 };
67
List_Dictionaries_ProviderConfiguration(EnchantProvider * me,const char *)68 static void List_Dictionaries_ProviderConfiguration (EnchantProvider * me, const char *)
69 {
70 me->list_dicts=ListDictionaries;
71 }
72
73
74 struct EnchantBrokerListDictionaries_TestFixture : EnchantBrokerListDictionaries_TestFixtureBase
75 {
76 //Setup
EnchantBrokerListDictionaries_TestFixtureEnchantBrokerListDictionaries_TestFixture77 EnchantBrokerListDictionaries_TestFixture():
78 EnchantBrokerListDictionaries_TestFixtureBase(List_Dictionaries_ProviderConfiguration)
79 { }
80 };
81
82 static char **
InvalidTagEnGbListDictionaries(EnchantProvider *,size_t * out_n_dicts)83 InvalidTagEnGbListDictionaries (EnchantProvider *,
84 size_t * out_n_dicts)
85 {
86 *out_n_dicts = 2;
87 char** out_list = g_new0 (char *, *out_n_dicts + 1);
88 out_list[0] = g_strdup ("en_GB");
89 out_list[1] = g_strdup ("en-GB");
90
91 return out_list;
92 }
93
List_Dictionaries_InvalidTag_ProviderConfiguration(EnchantProvider * me,const char *)94 static void List_Dictionaries_InvalidTag_ProviderConfiguration (EnchantProvider * me, const char *)
95 {
96 me->list_dicts=InvalidTagEnGbListDictionaries;
97 }
98
99 struct EnchantBrokerListDictionaries_ProviderReturnsInvalidTag_TestFixture : EnchantBrokerListDictionaries_TestFixtureBase
100 {
101 //Setup
EnchantBrokerListDictionaries_ProviderReturnsInvalidTag_TestFixtureEnchantBrokerListDictionaries_ProviderReturnsInvalidTag_TestFixture102 EnchantBrokerListDictionaries_ProviderReturnsInvalidTag_TestFixture():
103 EnchantBrokerListDictionaries_TestFixtureBase(List_Dictionaries_InvalidTag_ProviderConfiguration)
104 { }
105 };
106
107
108 static char **
DuplicateEnGbListDictionaries(EnchantProvider *,size_t * out_n_dicts)109 DuplicateEnGbListDictionaries (EnchantProvider *,
110 size_t * out_n_dicts)
111 {
112 *out_n_dicts = 2;
113 char** out_list = g_new0 (char *, *out_n_dicts + 1);
114 out_list[0] = g_strdup ("en_GB");
115 out_list[1] = g_strdup ("en_GB");
116
117 return out_list;
118 }
119
List_Dictionaries_ProviderConfigurationDuplicateTags(EnchantProvider * me,const char *)120 static void List_Dictionaries_ProviderConfigurationDuplicateTags (EnchantProvider * me, const char *)
121 {
122 me->list_dicts=DuplicateEnGbListDictionaries;
123 }
124
125 struct EnchantBrokerListDictionaries_ProviderDuplicateTags_TestFixture : EnchantBrokerListDictionaries_TestFixtureBase
126 {
127 //Setup
EnchantBrokerListDictionaries_ProviderDuplicateTags_TestFixtureEnchantBrokerListDictionaries_ProviderDuplicateTags_TestFixture128 EnchantBrokerListDictionaries_ProviderDuplicateTags_TestFixture():
129 EnchantBrokerListDictionaries_TestFixtureBase(List_Dictionaries_ProviderConfigurationDuplicateTags)
130 { }
131 };
132
133 /**
134 * enchant_broker_list_dicts
135 * @broker: A non-null #EnchantBroker
136 * @fn: A non-null #EnchantDictDescribeFn
137 * @user_data: Optional user-data
138 *
139 * Enumerates the dictionaries available from
140 * all Enchant providers.
141 */
142
143 /////////////////////////////////////////////////////////////////////////////
144 // Test Normal Operation
145
TEST_FIXTURE(EnchantBrokerListDictionaries_TestFixture,EnchantBrokerListDictionaries_UserDataNotNull_PassedThrough)146 TEST_FIXTURE(EnchantBrokerListDictionaries_TestFixture,
147 EnchantBrokerListDictionaries_UserDataNotNull_PassedThrough)
148 {
149 char* userData = const_cast<char*>("some user data");
150 enchant_broker_list_dicts(_broker, EnchantDictionaryDescribeAssignUserDataToStaticCallback, userData);
151 CHECK_EQUAL(userData, global_user_data);
152 }
153
TEST_FIXTURE(EnchantBrokerListDictionaries_TestFixture,EnchantBrokerListDictionaries_UserDataNull_PassedThrough)154 TEST_FIXTURE(EnchantBrokerListDictionaries_TestFixture,
155 EnchantBrokerListDictionaries_UserDataNull_PassedThrough)
156 {
157 enchant_broker_list_dicts(_broker, EnchantDictionaryDescribeAssignUserDataToStaticCallback, NULL);
158 CHECK_EQUAL((void*)NULL, global_user_data);
159 }
160
TEST_FIXTURE(EnchantBrokerListDictionaries_TestFixture,EnchantBrokerListDictionaries_listDictionariesCalledOnProvider)161 TEST_FIXTURE(EnchantBrokerListDictionaries_TestFixture,
162 EnchantBrokerListDictionaries_listDictionariesCalledOnProvider)
163 {
164 enchant_broker_list_dicts(_broker, EnchantDictionaryDescribeCallback, &_dictionaryList);
165 CHECK(listDictionariesCalled);
166 }
167
TEST_FIXTURE(EnchantBrokerListDictionaries_TestFixture,EnchantBrokerListDictionaries_dictionaryListHasDictionariesFromProvider)168 TEST_FIXTURE(EnchantBrokerListDictionaries_TestFixture,
169 EnchantBrokerListDictionaries_dictionaryListHasDictionariesFromProvider)
170 {
171 enchant_broker_list_dicts(_broker, EnchantDictionaryDescribeCallback, &_dictionaryList);
172 CHECK_EQUAL((unsigned int)1, _dictionaryList.size());
173 if(_dictionaryList.size()>0){
174 CHECK(_dictionaryList[0].DataIsComplete());
175 CHECK_EQUAL(std::string("en_GB"), _dictionaryList[0].LanguageTag);
176 CHECK_EQUAL(std::string("mock"), _dictionaryList[0].Name);
177 CHECK_EQUAL(std::string("Mock Provider"), _dictionaryList[0].Description);
178 }
179 }
180
TEST_FIXTURE(EnchantBrokerListDictionaries_TestFixture,EnchantBrokerListDictionaries_HasPreviousError_ErrorCleared)181 TEST_FIXTURE(EnchantBrokerListDictionaries_TestFixture,
182 EnchantBrokerListDictionaries_HasPreviousError_ErrorCleared)
183 {
184 SetErrorOnMockProvider("something bad happened");
185
186 enchant_broker_list_dicts(_broker, EnchantDictionaryDescribeCallback, &_dictionaryList);
187
188 CHECK_EQUAL((void*)NULL, (void*)enchant_broker_get_error(_broker));
189 }
190
191 /////////////////////////////////////////////////////////////////////////////
192 // Test Error Conditions
TEST_FIXTURE(EnchantBrokerListDictionaries_TestFixture,EnchantBrokerListDictionaries_NullBroker_DoNotCallDescribeFunction)193 TEST_FIXTURE(EnchantBrokerListDictionaries_TestFixture,
194 EnchantBrokerListDictionaries_NullBroker_DoNotCallDescribeFunction)
195 {
196 enchant_broker_list_dicts(NULL, EnchantDictionaryDescribeAssignUserDataToStaticCallback, NULL);
197 CHECK(!listDictionariesCalled);
198 }
199
TEST_FIXTURE(EnchantBrokerListDictionaries_TestFixture,EnchantBrokerListDictionaries_NullCallback_DoNotCallDescribeFunction)200 TEST_FIXTURE(EnchantBrokerListDictionaries_TestFixture,
201 EnchantBrokerListDictionaries_NullCallback_DoNotCallDescribeFunction)
202 {
203 enchant_broker_list_dicts(_broker, NULL, NULL);
204 CHECK(!listDictionariesCalled);
205 }
206
TEST_FIXTURE(EnchantBrokerTestFixture,EnchantBrokerListDictionaries_ProviderLacksListDictionaries_CallbackNeverCalled)207 TEST_FIXTURE(EnchantBrokerTestFixture,
208 EnchantBrokerListDictionaries_ProviderLacksListDictionaries_CallbackNeverCalled)
209 {
210 void* userData = const_cast<char*>("some user data");
211 enchant_broker_list_dicts(_broker, EnchantDictionaryDescribeAssignUserDataToStaticCallback, userData);
212 CHECK_EQUAL((void*)NULL, global_user_data);
213 }
214
TEST_FIXTURE(EnchantBrokerListDictionaries_ProviderDuplicateTags_TestFixture,EnchantBrokerListDictionaries_ProviderDuplicateTags_CallbackCalledOnlyOncePerUniqueTag)215 TEST_FIXTURE(EnchantBrokerListDictionaries_ProviderDuplicateTags_TestFixture,
216 EnchantBrokerListDictionaries_ProviderDuplicateTags_CallbackCalledOnlyOncePerUniqueTag)
217 {
218 enchant_broker_list_dicts(_broker, EnchantDictionaryDescribeCallback, &_dictionaryList);
219 CHECK_EQUAL((unsigned int)1, _dictionaryList.size());
220 }
221
TEST_FIXTURE(EnchantBrokerListDictionaries_ProviderReturnsInvalidTag_TestFixture,EnchantBrokerListDictionaries_ProviderReturnsInvalidTag)222 TEST_FIXTURE(EnchantBrokerListDictionaries_ProviderReturnsInvalidTag_TestFixture,
223 EnchantBrokerListDictionaries_ProviderReturnsInvalidTag)
224 {
225 enchant_broker_list_dicts(_broker, EnchantDictionaryDescribeCallback, &_dictionaryList);
226 CHECK_EQUAL((unsigned int)1, _dictionaryList.size());
227 }
228