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