Tizen 2.1 base
[external/enchant.git] / unittests / enchant_providers / main.cpp
1 /* Copyright (c) 2008 Eric Scott Albright\r
2  * \r
3  * Permission is hereby granted, free of charge, to any person obtaining a copy\r
4  * of this software and associated documentation files (the "Software"), to deal\r
5  * in the Software without restriction, including without limitation the rights\r
6  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
7  * copies of the Software, and to permit persons to whom the Software is\r
8  * furnished to do so, subject to the following conditions:\r
9  * \r
10  * The above copyright notice and this permission notice shall be included in\r
11  * all copies or substantial portions of the Software.\r
12  * \r
13  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
14  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
15  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
16  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
17  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
18  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
19  * THE SOFTWARE.\r
20  */\r
21 \r
22 #include <UnitTest++.h>\r
23 #include <enchant.h>\r
24 #include <enchant-provider.h>\r
25 #include <glib.h>\r
26 #include <gmodule.h>\r
27 #include <assert.h>\r
28 #include "unittest_enchant_providers.h"\r
29 \r
30 int Test(char* path);\r
31 int TestProvider(char* filename);\r
32 int TestProvidersInDirectory(char * dir_name);\r
33 \r
34 typedef EnchantProvider *(*EnchantProviderInitFunc) (void);\r
35 typedef void             (*EnchantPreConfigureFunc) (EnchantProvider * provider, const char * module_dir);\r
36 \r
37 // from enchant.c we need this so that providers can set errors.\r
38 struct str_enchant_broker\r
39 {\r
40         GSList *provider_list;  /* list of all of the spelling backend providers */\r
41         GHashTable *dict_map;           /* map of language tag -> dictionary */\r
42         GHashTable *provider_ordering; /* map of language tag -> provider order */\r
43 \r
44         gchar * error;\r
45 };\r
46 \r
47 // comes with a list of directories or providers\r
48 int main(int argc, char* argv[])\r
49 {\r
50     int result = 0;\r
51     for(int i=1; i < argc; ++i)\r
52     {\r
53         int resultT = Test(argv[i]);\r
54         if(resultT != 0)\r
55         {\r
56             result = resultT;\r
57         }\r
58     }\r
59 \r
60     if(argc == 1)\r
61     {\r
62         char* current_dir = g_get_current_dir();\r
63         TestProvidersInDirectory(current_dir);\r
64         g_free(current_dir);\r
65     }\r
66 \r
67     return result;\r
68 }\r
69 \r
70 EnchantProvider* g_provider;\r
71 EnchantProvider* GetProviderForTests()\r
72 {\r
73     return g_provider;\r
74 }\r
75 \r
76 char* GetErrorMessage(EnchantProvider* provider)\r
77 {\r
78     return provider->owner->error;\r
79 }\r
80 \r
81 //path is provider filename or directory containing providers\r
82 int Test(char* path)\r
83 {\r
84     assert(path);\r
85     if (g_file_test (path, (GFileTest)(G_FILE_TEST_IS_DIR))) \r
86         {\r
87         return TestProvidersInDirectory(path);\r
88     }\r
89     else\r
90     {\r
91         return TestProvider(path);\r
92     }\r
93 }\r
94 \r
95 int TestProvidersInDirectory(char * dir_name)\r
96 {\r
97     GDir *dir;\r
98         G_CONST_RETURN char *dir_entry;\r
99         size_t entry_len, g_module_suffix_len;\r
100         \r
101         char * filename;\r
102     int result = 0;\r
103         \r
104         dir = g_dir_open (dir_name, 0, NULL);\r
105         if (!dir) \r
106                 return 0;\r
107         \r
108         g_module_suffix_len = strlen (G_MODULE_SUFFIX);\r
109 \r
110         while ((dir_entry = g_dir_read_name (dir)) != NULL)\r
111                 {\r
112                         entry_len = strlen (dir_entry);\r
113                         if ((entry_len > g_module_suffix_len) && \r
114                                 !strcmp(dir_entry+(entry_len-g_module_suffix_len), G_MODULE_SUFFIX))\r
115                                 {\r
116                                         filename = g_build_filename (dir_name, dir_entry, NULL);\r
117                     int resultT = Test(filename);\r
118                     if(resultT != 0)\r
119                     {\r
120                         result = resultT;\r
121                     }\r
122                         g_free (filename);\r
123                                 }\r
124                 }\r
125         \r
126         g_dir_close (dir);\r
127     return result;\r
128 }\r
129 \r
130 int TestProvider(char* filename)\r
131 {\r
132     assert(g_provider == NULL);\r
133     int result = 0;\r
134 \r
135         EnchantProviderInitFunc init_func;\r
136         EnchantPreConfigureFunc conf_func;\r
137 \r
138     GModule* module = g_module_open (filename, (GModuleFlags) 0);\r
139         if (module) \r
140                 {\r
141                         if (g_module_symbol(module, "init_enchant_provider", (gpointer *) (&init_func))\r
142                                 && init_func)\r
143                                 {\r
144                                         g_provider = init_func ();\r
145                                 }\r
146 \r
147                         /* optional entry point to allow modules to look for associated files\r
148                          */\r
149                         if (g_provider && \r
150                 g_module_symbol(module, "configure_enchant_provider", (gpointer *) (&conf_func))\r
151                                 && conf_func)\r
152                                 {\r
153                     char* dir_name = g_path_get_dirname(filename);\r
154                                         conf_func (g_provider, dir_name);\r
155                     g_free(dir_name);\r
156                                 }\r
157                 } \r
158         else \r
159                 {\r
160                         g_warning ("Could not load provider: %s\n", g_module_error());\r
161                 }\r
162 \r
163         if (g_provider)\r
164         {\r
165         EnchantBroker broker; // just so we have someplace to put errors\r
166         broker.error=NULL;\r
167 \r
168         g_provider->enchant_private_data = (void *) module;\r
169                 g_provider->owner = &broker;\r
170         printf("\nRunning tests on %s\n", filename);\r
171         result = UnitTest::RunAllTests();\r
172                 if(g_provider->dispose)\r
173                         g_provider->dispose(g_provider);\r
174 \r
175         g_provider = NULL;\r
176         }\r
177 \r
178     if(module){\r
179         g_module_close(module);\r
180     }\r
181     return result;\r
182 }\r
183 \r