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
10#include <CatalogInAddOn.h>
11#include <DefaultCatalog.h>
12
13class CatalogTestAddOn {
14	public:
15		void Run();
16		void Check();
17};
18
19#define B_TRANSLATION_CONTEXT "CatalogTestAddOn"
20
21#define catSig "add-ons/catalogTest/catalogTestAddOn"
22#define catName catSig".catalog"
23
24
25void
26CatalogTestAddOn::Run() {
27	printf("addon...");
28	status_t res;
29	BString s;
30	s << "string" << "\x01" << B_TRANSLATION_CONTEXT << "\x01";
31	size_t hashVal = CatKey::HashFun(s.String());
32	assert(be_locale != NULL);
33	system("mkdir -p ./locale/catalogs/"catSig);
34
35	// create an empty catalog of default type...
36	BPrivate::EditableCatalog cat1("Default", catSig, "German");
37	assert(cat1.InitCheck() == B_OK);
38
39	// ...and populate the catalog with some data:
40	res = cat1.SetString("string", "Schnur_A", B_TRANSLATION_CONTEXT);
41	assert(res == B_OK);
42	res = cat1.SetString(hashVal, "Schnur_id_A");
43		// add a second entry for the same hash-value, but with different
44		// translation
45	assert(res == B_OK);
46	res = cat1.SetString("string", "String_A", "programming");
47	assert(res == B_OK);
48	res = cat1.SetString("string", "Textpuffer_A", "programming",
49		"Deutsches Fachbuch");
50	assert(res == B_OK);
51	res = cat1.SetString("string", "Leine_A", B_TRANSLATION_CONTEXT,
52		"Deutsches Fachbuch");
53	assert(res == B_OK);
54	res = cat1.WriteToFile("./locale/catalogs/"catSig"/german.catalog");
55	assert(res == B_OK);
56
57	// check if we are getting back the correct strings:
58	s = cat1.GetString("string", B_TRANSLATION_CONTEXT);
59	assert(s == "Schnur_A");
60	s = cat1.GetString(hashVal);
61	assert(s == "Schnur_id_A");
62	s = cat1.GetString("string", "programming");
63	assert(s == "String_A");
64	s = cat1.GetString("string", "programming", "Deutsches Fachbuch");
65	assert(s == "Textpuffer_A");
66	s = cat1.GetString("string", B_TRANSLATION_CONTEXT, "Deutsches Fachbuch");
67	assert(s == "Leine_A");
68
69	// now we create a new (base) catalog and embed this one into the
70	// add-on-file:
71	BPrivate::EditableCatalog cat2("Default", catSig, "English");
72	assert(cat2.InitCheck() == B_OK);
73	// the following string is unique to the embedded catalog:
74	res = cat2.SetString("string", "string_A", "base");
75	assert(res == B_OK);
76	// the following id is unique to the embedded catalog:
77	res = cat2.SetString(32, "hashed string_A");
78	assert(res == B_OK);
79	// the following string will be hidden by the definition inside the german
80	// catalog:
81	res = cat2.SetString("string", "hidden_A", B_TRANSLATION_CONTEXT);
82	assert(res == B_OK);
83	entry_ref addOnRef;
84	res = get_add_on_ref(&addOnRef);
85	assert(res == B_OK);
86	res = cat2.WriteToResource(&addOnRef);
87	assert(res == B_OK);
88
89	printf("ok.\n");
90	Check();
91}
92
93
94void
95CatalogTestAddOn::Check() {
96	status_t res;
97	printf("addon-check...");
98	BString s;
99	s << "string" << "\x01" << B_TRANSLATION_CONTEXT << "\x01";
100	size_t hashVal = CatKey::HashFun(s.String());
101	// ok, we now try to re-load the catalog that has just been written:
102	//
103	// actually, the following code can be seen as an example of what an
104	// add_on needs in order to translate strings:
105	BCatalog cat;
106	res = get_add_on_catalog(&cat, catSig);
107	assert(res == B_OK);
108	// fetch basic data:
109	uint32 fingerprint;
110	res = cat.GetFingerprint(&fingerprint);
111	assert(res == B_OK);
112	BString lang;
113	res = cat.GetLanguage(&lang);
114	assert(res == B_OK);
115	assert(lang == "german");
116	BString sig;
117	res = cat.GetSignature(&sig);
118	assert(res == B_OK);
119	assert(sig == catSig);
120
121	// now check strings:
122	s = B_TRANSLATE_ID(hashVal);
123	assert(s == "Schnur_id_A");
124	s = B_TRANSLATE_ALL("string", "programming", "");
125	assert(s == "String_A");
126	s = B_TRANSLATE_ALL("string", "programming", "Deutsches Fachbuch");
127	assert(s == "Textpuffer_A");
128	s = B_TRANSLATE_COMMENT("string", "Deutsches Fachbuch");
129	assert(s == "Leine_A");
130	// the following string should be found in the embedded catalog only:
131	s = B_TRANSLATE_ALL("string", "base", "");
132	assert(s == "string_A");
133	// the following id should be found in the embedded catalog only:
134	s = B_TRANSLATE_ID(32);
135	assert(s == "hashed string_A");
136	// the following id doesn't exist anywhere (hopefully):
137	s = B_TRANSLATE_ID(-1);
138	assert(s == "");
139	// the following string exists twice, in the embedded as well as in the
140	// external catalog. So we should get the external translation (as it should
141	// override the embedded one):
142	s = B_TRANSLATE("string");
143	assert(s == "Schnur_A");
144
145	// check access to app-catalog from inside add-on:
146	BCatalog appCat;
147	res = be_locale->GetAppCatalog(&appCat);
148	assert(res == B_OK);
149	s = be_app_catalog->GetString("string", "CatalogTest");
150	assert(s == "Schnur");
151	s = be_app_catalog->GetString("string", "CatalogTest",
152		"Deutsches Fachbuch");
153	assert(s == "Leine");
154	s = be_app_catalog->GetString("string", "programming",
155		"Deutsches Fachbuch");
156	assert(s == "Textpuffer");
157
158	printf("ok.\n");
159}
160
161
162extern "C" _EXPORT void run_test_add_on()
163{
164	CatalogTestAddOn catTest;
165	catTest.Run();
166}
167