xref: /haiku/src/tests/add-ons/translators/tifftranslator/TIFFTranslatorTest.cpp (revision efafab643ce980e3f3c916795ed302599f6b4f66)
1 // TIFFTranslatorTest.cpp
2 #include "TIFFTranslatorTest.h"
3 #include <cppunit/Test.h>
4 #include <cppunit/TestCaller.h>
5 #include <cppunit/TestSuite.h>
6 #include <stdio.h>
7 #include <string.h>
8 #include <unistd.h>
9 #include <image.h>
10 #include <Translator.h>
11 #include <TranslatorFormats.h>
12 #include <TranslatorRoster.h>
13 #include <Message.h>
14 #include <View.h>
15 #include <Rect.h>
16 #include <File.h>
17 #include <DataIO.h>
18 #include <Errors.h>
19 #include <OS.h>
20 #include "TranslatorTestAddOn.h"
21 
22 // Suite
23 CppUnit::Test *
24 TIFFTranslatorTest::Suite()
25 {
26 	CppUnit::TestSuite *suite = new CppUnit::TestSuite();
27 	typedef CppUnit::TestCaller<TIFFTranslatorTest> TC;
28 
29 	suite->addTest(
30 		new TC("TIFFTranslator IdentifyTest",
31 			&TIFFTranslatorTest::IdentifyTest));
32 
33 	suite->addTest(
34 		new TC("TIFFTranslator TranslateTest",
35 			&TIFFTranslatorTest::TranslateTest));
36 
37 #if !TEST_R5
38 	suite->addTest(
39 		new TC("TIFFTranslator LoadAddOnTest",
40 			&TIFFTranslatorTest::LoadAddOnTest));
41 #endif
42 
43 	return suite;
44 }
45 
46 // setUp
47 void
48 TIFFTranslatorTest::setUp()
49 {
50 	BTestCase::setUp();
51 }
52 
53 // tearDown
54 void
55 TIFFTranslatorTest::tearDown()
56 {
57 	BTestCase::tearDown();
58 }
59 
60 void
61 CheckBits_Tiff(translator_info *pti)
62 {
63 	CheckTranslatorInfo(pti, B_TRANSLATOR_BITMAP, B_TRANSLATOR_BITMAP,
64 		0.7f, 0.6f, "Be Bitmap Format (TIFFTranslator)",
65 		"image/x-be-bitmap");
66 }
67 
68 void
69 CheckTiff(translator_info *pti, const char *imageType)
70 {
71 	CheckTranslatorInfo(pti, B_TIFF_FORMAT, B_TRANSLATOR_BITMAP,
72 		0.7f, 0.6f, imageType, "image/tiff");
73 }
74 
75 // coveniently group path of image with
76 // the expected Identify() string for that image
77 struct IdentifyInfo {
78 	const char *imagePath;
79 	const char *identifyString;
80 };
81 
82 void
83 IdentifyTests(TIFFTranslatorTest *ptest, BTranslatorRoster *proster,
84 	const IdentifyInfo *pinfo, int32 len, bool bbits)
85 {
86 	translator_info ti;
87 	printf(" [%d] ", (int) bbits);
88 
89 	for (int32 i = 0; i < len; i++) {
90 		ptest->NextSubTest();
91 		BFile file;
92 		printf(" [%s] ", pinfo[i].imagePath);
93 		CPPUNIT_ASSERT(file.SetTo(pinfo[i].imagePath, B_READ_ONLY) == B_OK);
94 
95 		// Identify (output: B_TRANSLATOR_ANY_TYPE)
96 		ptest->NextSubTest();
97 		memset(&ti, 0, sizeof(translator_info));
98 		CPPUNIT_ASSERT(proster->Identify(&file, NULL, &ti) == B_OK);
99 		if (bbits)
100 			CheckBits_Tiff(&ti);
101 		else
102 			CheckTiff(&ti, pinfo[i].identifyString);
103 
104 		// Identify (output: B_TRANSLATOR_BITMAP)
105 		ptest->NextSubTest();
106 		memset(&ti, 0, sizeof(translator_info));
107 		CPPUNIT_ASSERT(proster->Identify(&file, NULL, &ti, 0, NULL,
108 			B_TRANSLATOR_BITMAP) == B_OK);
109 		if (bbits)
110 			CheckBits_Tiff(&ti);
111 		else
112 			CheckTiff(&ti, pinfo[i].identifyString);
113 
114 		// Identify (output: B_TIFF_FORMAT)
115 		ptest->NextSubTest();
116 		memset(&ti, 0, sizeof(translator_info));
117 		CPPUNIT_ASSERT(proster->Identify(&file, NULL, &ti, 0, NULL,
118 			B_TIFF_FORMAT) == B_OK);
119 		if (bbits)
120 			CheckBits_Tiff(&ti);
121 		else
122 			CheckTiff(&ti, pinfo[i].identifyString);
123 	}
124 }
125 
126 void
127 TIFFTranslatorTest::IdentifyTest()
128 {
129 	// Init
130 	NextSubTest();
131 	status_t result = B_ERROR;
132 	BTranslatorRoster *proster = new BTranslatorRoster();
133 	CPPUNIT_ASSERT(proster);
134 	CPPUNIT_ASSERT(proster->AddTranslators(
135 		"/boot/home/config/add-ons/Translators/TIFFTranslator") == B_OK);
136 	BFile wronginput("../src/tests/kits/translation/data/images/image.jpg",
137 		B_READ_ONLY);
138 	CPPUNIT_ASSERT(wronginput.InitCheck() == B_OK);
139 
140 	// Identify (bad input, output types)
141 	NextSubTest();
142 	translator_info ti;
143 	memset(&ti, 0, sizeof(translator_info));
144 	result = proster->Identify(&wronginput, NULL, &ti, 0,
145 		NULL, B_TRANSLATOR_TEXT);
146 	CPPUNIT_ASSERT(result == B_NO_TRANSLATOR);
147 	CPPUNIT_ASSERT(ti.type == 0 && ti.translator == 0);
148 
149 	// Identify (wrong type of input data)
150 	NextSubTest();
151 	memset(&ti, 0, sizeof(translator_info));
152 	result = proster->Identify(&wronginput, NULL, &ti);
153 	CPPUNIT_ASSERT(result == B_NO_TRANSLATOR);
154 	CPPUNIT_ASSERT(ti.type == 0 && ti.translator == 0);
155 
156 	// Identify (successfully identify the following files)
157 	const IdentifyInfo aBitsPaths[] = {
158 		{ "/boot/home/resources/tiff/beer.bits", "" },
159 		{ "/boot/home/resources/tiff/blocks.bits", "" }
160 	};
161 	const IdentifyInfo aTiffPaths[] = {
162 		{ "/boot/home/resources/tiff/beer_rgb_nocomp.tif",
163 			"TIFF image (Little, RGB, None)" },
164 		{ "/boot/home/resources/tiff/beer_rgb_nocomp_big.tif",
165 			"TIFF image (Big, RGB, None)" },
166 		{ "/boot/home/resources/tiff/blocks_rgb_nocomp.tif",
167 			"TIFF image (Little, RGB, None)" },
168 		{ "/boot/home/resources/tiff/hills_bw_huffman.tif",
169 			"TIFF image (Little, Mono, Huffman)" },
170 		{ "/boot/home/resources/tiff/hills_cmyk_nocomp.tif",
171 			"TIFF image (Little, CMYK, None)" },
172 		{ "/boot/home/resources/tiff/hills_cmyk_nocomp_big.tif",
173 			"TIFF image (Big, CMYK, None)" },
174 		{ "/boot/home/resources/tiff/hills_rgb_nocomp.tif",
175 			"TIFF image (Little, RGB, None)" },
176 		{ "/boot/home/resources/tiff/hills_rgb_packbits.tif",
177 			"TIFF image (Little, RGB, PackBits)" },
178 		{ "/boot/home/resources/tiff/homes_bw_fax.tif",
179 			"TIFF image (Little, Mono, Group 3)" },
180 		{ "/boot/home/resources/tiff/homes_bw_huffman.tif",
181 			"TIFF image (Little, Mono, Huffman)" },
182 		{ "/boot/home/resources/tiff/homes_bw_nocomp.tif",
183 			"TIFF image (Little, Mono, None)" },
184 		{ "/boot/home/resources/tiff/homes_bw_nocomp_big.tif",
185 			"TIFF image (Big, Mono, None)" },
186 		{ "/boot/home/resources/tiff/homes_bw_packbits.tif",
187 			"TIFF image (Little, Mono, PackBits)" },
188 		{ "/boot/home/resources/tiff/homes_cmap4_nocomp.tif",
189 			"TIFF image (Little, Palette, None)" },
190 		{ "/boot/home/resources/tiff/homes_cmap4_nocomp_big.tif",
191 			"TIFF image (Big, Palette, None)" },
192 		{ "/boot/home/resources/tiff/homes_cmap4_packbits.tif",
193 			"TIFF image (Little, Palette, PackBits)" },
194 		{ "/boot/home/resources/tiff/homes_gray8_nocomp.tif",
195 			"TIFF image (Little, Gray, None)" },
196 		{ "/boot/home/resources/tiff/homes_gray8_nocomp_big.tif",
197 			"TIFF image (Big, Gray, None)" },
198 		{ "/boot/home/resources/tiff/homes_gray8_packbits.tif",
199 			"TIFF image (Little, Gray, PackBits)" },
200 		{ "/boot/home/resources/tiff/logo_cmap4_nocomp.tif",
201 			"TIFF image (Little, Palette, None)" },
202 		{ "/boot/home/resources/tiff/logo_cmap4_nocomp_big.tif",
203 			"TIFF image (Big, Palette, None)" },
204 		{ "/boot/home/resources/tiff/logo_cmap4_packbits.tif",
205 			"TIFF image (Little, Palette, PackBits)" },
206 		{ "/boot/home/resources/tiff/logo_cmap8_nocomp.tif",
207 			"TIFF image (Little, Palette, None)" },
208 		{ "/boot/home/resources/tiff/logo_cmap8_nocomp_big.tif",
209 			"TIFF image (Big, Palette, None)" },
210 		{ "/boot/home/resources/tiff/logo_cmap8_packbits.tif",
211 			"TIFF image (Little, Palette, PackBits)" },
212 		{ "/boot/home/resources/tiff/logo_cmyk_nocomp.tif",
213 			"TIFF image (Little, CMYK, None)" },
214 		{ "/boot/home/resources/tiff/vsmall_cmap4_nocomp.tif",
215 			"TIFF image (Little, Palette, None)" },
216 		{ "/boot/home/resources/tiff/vsmall_rgb_nocomp.tif",
217 			"TIFF image (Little, RGB, None)" },
218 		{ "/boot/home/resources/tiff/backup_help.tif",
219 			"TIFF image (Big, Mono, Group 3)" }
220 	};
221 
222 	IdentifyTests(this, proster, aTiffPaths,
223 		sizeof(aTiffPaths) / sizeof(IdentifyInfo), false);
224 	IdentifyTests(this, proster, aBitsPaths,
225 		sizeof(aBitsPaths) / sizeof(IdentifyInfo), true);
226 
227 	delete proster;
228 	proster = NULL;
229 }
230 
231 // coveniently group path of tiff image with
232 // path of bits image that it should translate to
233 struct TranslatePaths {
234 	const char *tiffPath;
235 	const char *bitsPath;
236 };
237 
238 void
239 TranslateTests(TIFFTranslatorTest *ptest, BTranslatorRoster *proster,
240 	const TranslatePaths *paths, int32 len)
241 {
242 	// Perform translations on every file in the array
243 	for (int32 i = 0; i < len; i++) {
244 		// Setup input files
245 		ptest->NextSubTest();
246 		BFile tiff_file, bits_file;
247 		CPPUNIT_ASSERT(tiff_file.SetTo(paths[i].tiffPath, B_READ_ONLY) == B_OK);
248 		CPPUNIT_ASSERT(bits_file.SetTo(paths[i].bitsPath, B_READ_ONLY) == B_OK);
249 		printf(" [%s] ", paths[i].tiffPath);
250 
251 		BMallocIO mallio, dmallio;
252 
253 		// Convert to B_TRANSLATOR_ANY_TYPE (should be B_TRANSLATOR_BITMAP)
254 		ptest->NextSubTest();
255 		CPPUNIT_ASSERT(mallio.Seek(0, SEEK_SET) == 0);
256 		CPPUNIT_ASSERT(mallio.SetSize(0) == B_OK);
257 		CPPUNIT_ASSERT(proster->Translate(&tiff_file, NULL, NULL, &mallio,
258 			B_TRANSLATOR_ANY_TYPE) == B_OK);
259 		CPPUNIT_ASSERT(CompareStreams(mallio, bits_file) == true);
260 
261 		// Convert to B_TRANSLATOR_BITMAP
262 		ptest->NextSubTest();
263 		CPPUNIT_ASSERT(mallio.Seek(0, SEEK_SET) == 0);
264 		CPPUNIT_ASSERT(mallio.SetSize(0) == B_OK);
265 		CPPUNIT_ASSERT(proster->Translate(&tiff_file, NULL, NULL, &mallio,
266 			B_TRANSLATOR_BITMAP) == B_OK);
267 		CPPUNIT_ASSERT(CompareStreams(mallio, bits_file) == true);
268 
269 		// Convert bits mallio to B_TRANSLATOR_BITMAP dmallio
270 		/* Not Supported Yet
271 		ptest->NextSubTest();
272 		CPPUNIT_ASSERT(dmallio.Seek(0, SEEK_SET) == 0);
273 		CPPUNIT_ASSERT(dmallio.SetSize(0) == B_OK);
274 		CPPUNIT_ASSERT(proster->Translate(&mallio, NULL, NULL, &dmallio,
275 			B_TRANSLATOR_BITMAP) == B_OK);
276 		CPPUNIT_ASSERT(CompareStreams(dmallio, bits_file) == true);
277 		*/
278 
279 		// Convert to B_TIFF_FORMAT
280 		/* Not Supported Yet
281 		ptest->NextSubTest();
282 		CPPUNIT_ASSERT(mallio.Seek(0, SEEK_SET) == 0);
283 		CPPUNIT_ASSERT(mallio.SetSize(0) == B_OK);
284 		CPPUNIT_ASSERT(proster->Translate(&tiff_file, NULL, NULL, &mallio,
285 			B_TIFF_FORMAT) == B_OK);
286 		CPPUNIT_ASSERT(CompareStreams(mallio, tiff_file) == true);
287 		*/
288 
289 		// Convert TIFF mallio to B_TRANSLATOR_BITMAP dmallio
290 		/* Not Ready Yet
291 		ptest->NextSubTest();
292 		CPPUNIT_ASSERT(dmallio.Seek(0, SEEK_SET) == 0);
293 		CPPUNIT_ASSERT(dmallio.SetSize(0) == B_OK);
294 		CPPUNIT_ASSERT(proster->Translate(&mallio, NULL, NULL, &dmallio,
295 			B_TRANSLATOR_BITMAP) == B_OK);
296 		CPPUNIT_ASSERT(CompareStreams(dmallio, bits_file) == true);
297 		*/
298 
299 		// Convert TIFF mallio to B_TIFF_FORMAT dmallio
300 		/* Not Ready Yet
301 		ptest->NextSubTest();
302 		CPPUNIT_ASSERT(dmallio.Seek(0, SEEK_SET) == 0);
303 		CPPUNIT_ASSERT(dmallio.SetSize(0) == B_OK);
304 		CPPUNIT_ASSERT(proster->Translate(&mallio, NULL, NULL, &dmallio,
305 			B_TIFF_FORMAT) == B_OK);
306 		CPPUNIT_ASSERT(CompareStreams(dmallio, tiff_file) == true);
307 		*/
308 	}
309 }
310 
311 void
312 TIFFTranslatorTest::TranslateTest()
313 {
314 	// Init
315 	NextSubTest();
316 	status_t result = B_ERROR;
317 	off_t filesize = -1;
318 	BTranslatorRoster *proster = new BTranslatorRoster();
319 	CPPUNIT_ASSERT(proster);
320 	CPPUNIT_ASSERT(proster->AddTranslators(
321 		"/boot/home/config/add-ons/Translators/TIFFTranslator") == B_OK);
322 	BFile wronginput("../src/tests/kits/translation/data/images/image.jpg",
323 		B_READ_ONLY);
324 	CPPUNIT_ASSERT(wronginput.InitCheck() == B_OK);
325 	BFile output("/tmp/tiff_test.out", B_WRITE_ONLY |
326 		B_CREATE_FILE | B_ERASE_FILE);
327 	CPPUNIT_ASSERT(output.InitCheck() == B_OK);
328 
329 	// Translate (bad input, output types)
330 	NextSubTest();
331 	result = proster->Translate(&wronginput, NULL, NULL, &output,
332 		B_TRANSLATOR_TEXT);
333 	CPPUNIT_ASSERT(result == B_NO_TRANSLATOR);
334 	CPPUNIT_ASSERT(output.GetSize(&filesize) == B_OK);
335 	CPPUNIT_ASSERT(filesize == 0);
336 
337 	// Translate (wrong type of input data)
338 	NextSubTest();
339 	result = proster->Translate(&wronginput, NULL, NULL, &output,
340 		B_TIFF_FORMAT);
341 	CPPUNIT_ASSERT(result == B_NO_TRANSLATOR);
342 	CPPUNIT_ASSERT(output.GetSize(&filesize) == B_OK);
343 	CPPUNIT_ASSERT(filesize == 0);
344 
345 	// Translate (wrong type of input, B_TRANSLATOR_ANY_TYPE output)
346 	NextSubTest();
347 	result = proster->Translate(&wronginput, NULL, NULL, &output,
348 		B_TRANSLATOR_ANY_TYPE);
349 	CPPUNIT_ASSERT(result == B_NO_TRANSLATOR);
350 	CPPUNIT_ASSERT(output.GetSize(&filesize) == B_OK);
351 	CPPUNIT_ASSERT(filesize == 0);
352 
353 	// Translate TIFF images to bits
354 	const TranslatePaths aPaths[] = {
355 		{ "/boot/home/resources/tiff/beer_rgb_nocomp.tif",
356 			"/boot/home/resources/tiff/beer.bits" },
357 		{ "/boot/home/resources/tiff/beer_rgb_nocomp_big.tif",
358 			"/boot/home/resources/tiff/beer.bits" },
359 		{ "/boot/home/resources/tiff/blocks_rgb_nocomp.tif",
360 			"/boot/home/resources/tiff/blocks.bits" },
361 		{ "/boot/home/resources/tiff/hills_bw_huffman.tif",
362 			"/boot/home/resources/tiff/hills_bw.bits" },
363 		{ "/boot/home/resources/tiff/hills_cmyk_nocomp.tif",
364 			"/boot/home/resources/tiff/hills_cmyk.bits" },
365 		{ "/boot/home/resources/tiff/hills_cmyk_nocomp_big.tif",
366 			"/boot/home/resources/tiff/hills_cmyk.bits" },
367 		{ "/boot/home/resources/tiff/hills_rgb_nocomp.tif",
368 			"/boot/home/resources/tiff/hills_rgb.bits" },
369 		{ "/boot/home/resources/tiff/hills_rgb_packbits.tif",
370 			"/boot/home/resources/tiff/hills_rgb.bits" },
371 		{ "/boot/home/resources/tiff/homes_bw_fax.tif",
372 			"/boot/home/resources/tiff/homes_bw.bits" },
373 		{ "/boot/home/resources/tiff/homes_bw_huffman.tif",
374 			"/boot/home/resources/tiff/homes_bw.bits" },
375 		{ "/boot/home/resources/tiff/homes_bw_nocomp.tif",
376 			"/boot/home/resources/tiff/homes_bw.bits" },
377 		{ "/boot/home/resources/tiff/homes_bw_nocomp_big.tif",
378 			"/boot/home/resources/tiff/homes_bw.bits" },
379 		{ "/boot/home/resources/tiff/homes_bw_packbits.tif",
380 			"/boot/home/resources/tiff/homes_bw.bits" },
381 		{ "/boot/home/resources/tiff/homes_cmap4_nocomp.tif",
382 			"/boot/home/resources/tiff/homes_cmap4.bits" },
383 		{ "/boot/home/resources/tiff/homes_cmap4_nocomp_big.tif",
384 			"/boot/home/resources/tiff/homes_cmap4.bits" },
385 		{ "/boot/home/resources/tiff/homes_cmap4_packbits.tif",
386 			"/boot/home/resources/tiff/homes_cmap4.bits" },
387 		{ "/boot/home/resources/tiff/homes_gray8_nocomp.tif",
388 			"/boot/home/resources/tiff/homes_gray8.bits" },
389 		{ "/boot/home/resources/tiff/homes_gray8_nocomp_big.tif",
390 			"/boot/home/resources/tiff/homes_gray8.bits" },
391 		{ "/boot/home/resources/tiff/homes_gray8_packbits.tif",
392 			"/boot/home/resources/tiff/homes_gray8.bits" },
393 		{ "/boot/home/resources/tiff/logo_cmap4_nocomp.tif",
394 			"/boot/home/resources/tiff/logo_cmap4.bits" },
395 		{ "/boot/home/resources/tiff/logo_cmap4_nocomp_big.tif",
396 			"/boot/home/resources/tiff/logo_cmap4.bits" },
397 		{ "/boot/home/resources/tiff/logo_cmap4_packbits.tif",
398 			"/boot/home/resources/tiff/logo_cmap4.bits" },
399 		{ "/boot/home/resources/tiff/logo_cmap8_nocomp.tif",
400 			"/boot/home/resources/tiff/logo_rgb.bits" },
401 		{ "/boot/home/resources/tiff/logo_cmap8_nocomp_big.tif",
402 			"/boot/home/resources/tiff/logo_rgb.bits" },
403 		{ "/boot/home/resources/tiff/logo_cmap8_packbits.tif",
404 			"/boot/home/resources/tiff/logo_rgb.bits" },
405 		{ "/boot/home/resources/tiff/logo_cmyk_nocomp.tif",
406 			"/boot/home/resources/tiff/logo_cmyk.bits" },
407 		{ "/boot/home/resources/tiff/vsmall_cmap4_nocomp.tif",
408 			"/boot/home/resources/tiff/vsmall.bits" },
409 		{ "/boot/home/resources/tiff/vsmall_rgb_nocomp.tif",
410 			"/boot/home/resources/tiff/vsmall.bits" },
411 		{ "/boot/home/resources/tiff/backup_help.tif",
412 			"/boot/home/resources/tiff/backup_help.bits" }
413 	};
414 
415 	TranslateTests(this, proster, aPaths,
416 		sizeof(aPaths) / sizeof(TranslatePaths));
417 
418 	delete proster;
419 	proster = NULL;
420 }
421 
422 #if !TEST_R5
423 
424 // The input formats that this translator is supposed to support
425 translation_format gTIFFInputFormats[] = {
426 	{
427 		B_TRANSLATOR_BITMAP,
428 		B_TRANSLATOR_BITMAP,
429 		0.7f, // quality
430 		0.6f, // capability
431 		"image/x-be-bitmap",
432 		"Be Bitmap Format (TIFFTranslator)"
433 	},
434 	{
435 		B_TIFF_FORMAT,
436 		B_TRANSLATOR_BITMAP,
437 		0.7f,
438 		0.6f,
439 		"image/tiff",
440 		"TIFF image"
441 	}
442 };
443 
444 // The output formats that this translator is supposed to support
445 translation_format gTIFFOutputFormats[] = {
446 	{
447 		B_TRANSLATOR_BITMAP,
448 		B_TRANSLATOR_BITMAP,
449 		0.7f, // quality
450 		0.6f, // capability
451 		"image/x-be-bitmap",
452 		"Be Bitmap Format (TIFFTranslator)"
453 	},
454 	{
455 		B_TIFF_FORMAT,
456 		B_TRANSLATOR_BITMAP,
457 		0.7f,
458 		0.6f,
459 		"image/tiff",
460 		"TIFF image"
461 	}
462 };
463 
464 void
465 TIFFTranslatorTest::LoadAddOnTest()
466 {
467 	TranslatorLoadAddOnTest("/boot/home/config/add-ons/Translators/TIFFTranslator",
468 		this,
469 		gTIFFInputFormats, sizeof(gTIFFInputFormats) / sizeof(translation_format),
470 		gTIFFOutputFormats, sizeof(gTIFFOutputFormats) / sizeof(translation_format),
471 		B_TRANSLATION_MAKE_VERSION(1,0,0));
472 }
473 
474 #endif // #if !TEST_R5
475