1/*
2** Copyright 2003, Oliver Tappe, zooey@hirschkaefer.de. All rights reserved.
3** Distributed under the terms of the MIT License.
4*/
5
6#include <assert.h>
7#include <stdio.h>
8#include <stdlib.h>
9#include <unistd.h>
10
11#include <Application.h>
12#include <Catalog.h>
13#include <DefaultCatalog.h>
14#include <Entry.h>
15#include <Locale.h>
16#include <Path.h>
17#include <Roster.h>
18
19class CatalogTest {
20	public:
21		void Run();
22		void Check();
23};
24
25#define B_TRANSLATION_CONTEXT "CatalogTest"
26
27
28#define catSig "x-vnd.Be.locale.catalogTest"
29#define catName catSig".catalog"
30
31void
32CatalogTest::Run()
33{
34	printf("app...");
35	status_t res;
36	BString s;
37	s << "string" << "\x01" << B_TRANSLATION_CONTEXT << "\x01";
38	size_t hashVal = CatKey::HashFun(s.String());
39	assert(be_locale != NULL);
40	system("mkdir -p ./locale/catalogs/"catSig);
41
42	// create an empty catalog of default type...
43	BPrivate::EditableCatalog cata("Default", catSig, "German");
44	assert(cata.InitCheck() == B_OK);
45
46	// ...and populate the catalog with some data:
47	res = cata.SetString("string", "Schnur", B_TRANSLATION_CONTEXT);
48	assert(res == B_OK);
49	res = cata.SetString(hashVal, "Schnur_id");
50		// add a second entry for the same hash-value, but with different
51		// translation
52	assert(res == B_OK);
53	res = cata.SetString("string", "String", "programming");
54	assert(res == B_OK);
55	res = cata.SetString("string", "Textpuffer", "programming",
56		"Deutsches Fachbuch");
57	assert(res == B_OK);
58	res = cata.SetString("string", "Leine", B_TRANSLATION_CONTEXT,
59		"Deutsches Fachbuch");
60	assert(res == B_OK);
61	res = cata.WriteToFile("./locale/catalogs/"catSig"/german.catalog");
62	assert(res == B_OK);
63
64	// check if we are getting back the correct strings:
65	s = cata.GetString(("string"), B_TRANSLATION_CONTEXT);
66	assert(s == "Schnur");
67	s = cata.GetString(hashVal);
68	assert(s == "Schnur_id");
69	s = cata.GetString("string", "programming");
70	assert(s == "String");
71	s = cata.GetString("string", "programming", "Deutsches Fachbuch");
72	assert(s == "Textpuffer");
73	s = cata.GetString("string", B_TRANSLATION_CONTEXT, "Deutsches Fachbuch");
74	assert(s == "Leine");
75
76	// now we create a new (base) catalog and embed this one into the app-file:
77	BPrivate::EditableCatalog catb("Default", catSig, "English");
78	assert(catb.InitCheck() == B_OK);
79	// the following string is unique to the embedded catalog:
80	res = catb.SetString("string", "string", "base");
81	assert(res == B_OK);
82	// the following id is unique to the embedded catalog:
83	res = catb.SetString(32, "hashed string");
84	assert(res == B_OK);
85	// the following string will be hidden by the definition inside the
86	// german catalog:
87	res = catb.SetString("string", "hidden", B_TRANSLATION_CONTEXT);
88	assert(res == B_OK);
89	app_info appInfo;
90	res = be_app->GetAppInfo(&appInfo);
91	assert(res == B_OK);
92	// embed created catalog into application file (catalogTest):
93	res = catb.WriteToResource(&appInfo.ref);
94	assert(res == B_OK);
95
96	printf("ok.\n");
97	Check();
98}
99
100
101void
102CatalogTest::Check()
103{
104	status_t res;
105	printf("app-check...");
106	BString s;
107	s << "string" << "\x01" << B_TRANSLATION_CONTEXT << "\x01";
108	size_t hashVal = CatKey::HashFun(s.String());
109	// ok, we now try to re-load the catalog that has just been written:
110	//
111	// actually, the following code can be seen as an example of what an
112	// app needs in order to translate strings:
113	BCatalog cat;
114	res = be_locale->GetAppCatalog(&cat);
115	assert(res == B_OK);
116	// fetch basic data:
117	uint32 fingerprint = 0;
118	res = cat.GetFingerprint(&fingerprint);
119	assert(res == B_OK);
120	BString lang;
121	res = cat.GetLanguage(&lang);
122	assert(res == B_OK);
123	BString sig;
124	res = cat.GetSignature(&sig);
125	assert(res == B_OK);
126
127	// now check strings:
128	s = B_TRANSLATE_ID(hashVal);
129	assert(s == "Schnur_id");
130	s = B_TRANSLATE_ALL("string", "programming", "");
131	assert(s == "String");
132	s = B_TRANSLATE_ALL("string", "programming", "Deutsches Fachbuch");
133	assert(s == "Textpuffer");
134	s = B_TRANSLATE_COMMENT("string", "Deutsches Fachbuch");
135	assert(s == "Leine");
136	// the following string should be found in the embedded catalog only:
137	s = B_TRANSLATE_ALL("string", "base", NULL);
138	assert(s == "string");
139	// the following id should be found in the embedded catalog only:
140	s = B_TRANSLATE_ID(32);
141	assert(s == "hashed string");
142	// the following id doesn't exist anywhere (hopefully):
143	s = B_TRANSLATE_ID(-1);
144	assert(s == "");
145	// the following string exists twice, in the embedded as well as in the
146	// external catalog. So we should get the external translation (as it should
147	// override the embedded one):
148	s = B_TRANSLATE("string");
149	assert(s == "Schnur");
150
151	// now check if trying to access same catalog by specifying its data works:
152	BCatalog cat2(sig.String(), lang.String(), fingerprint);
153	assert(cat2.InitCheck() == B_OK);
154	// now check if trying to access same catalog with wrong fingerprint fails:
155	BCatalog cat3(sig.String(), lang.String(), fingerprint*-1);
156	assert(cat3.InitCheck() == B_NO_INIT);
157	// translating through an invalid catalog should yield the native string:
158	s = cat3.GetString("string");
159	assert(s == "string");
160
161	printf("ok.\n");
162}
163
164
165int
166main(int argc, char **argv)
167{
168	BApplication* testApp
169		= new BApplication("application/"catSig);
170
171	// change to app-folder:
172	app_info appInfo;
173	be_app->GetAppInfo(&appInfo);
174	BEntry appEntry(&appInfo.ref);
175	BEntry appFolder;
176	appEntry.GetParent( &appFolder);
177	BPath appPath;
178	appFolder.GetPath( &appPath);
179	chdir( appPath.Path());
180
181	CatalogTest catTest;
182	catTest.Run();
183
184	char cwd[B_FILE_NAME_LENGTH];
185	getcwd(cwd, B_FILE_NAME_LENGTH);
186	BString addonName(cwd);
187	addonName << "/" "catalogTestAddOn";
188	image_id image = load_add_on(addonName.String());
189	assert(image >= B_OK);
190	void (*runAddonFunc)() = 0;
191	get_image_symbol(image, "run_test_add_on",
192		B_SYMBOL_TYPE_TEXT, (void **)&runAddonFunc);
193	assert(runAddonFunc);
194	runAddonFunc();
195
196	catTest.Check();
197
198	delete testApp;
199}
200