# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: address@hidden # jl6mp5lelp22dkpf # target_branch: bzr://bzr.sv.gnu.org/pdf/libgnupdf/trunk/ # testament_sha1: c3027eb278b71bad634e77e616ee249b10455681 # timestamp: 2011-08-16 10:32:40 +0200 # base_revision_id: address@hidden # # Begin patch === modified file 'ChangeLog' --- ChangeLog 2011-08-04 13:49:13 +0000 +++ ChangeLog 2011-08-16 08:32:34 +0000 @@ -1,3 +1,8 @@ +2011-08-16 Georg Gottleuber + + torture,stm: Tests created for LZW filter + * torture/unit/base/stm/pdf-stm-rw-filter-lzw.c: New file with LZW tests + 2011-08-04 Georg Gottleuber base,stm: fix bug in lzw filter. === modified file 'torture/unit/Makefile.am' --- torture/unit/Makefile.am 2011-06-24 16:18:43 +0000 +++ torture/unit/Makefile.am 2011-08-03 10:02:47 +0000 @@ -76,7 +76,8 @@ base/stm/pdf-stm-rw-filter-a85.c \ base/stm/pdf-stm-rw-filter-flate.c \ base/stm/pdf-stm-rw-filter-v2.c \ - base/stm/pdf-stm-rw-filter-aesv2.c + base/stm/pdf-stm-rw-filter-aesv2.c \ + base/stm/pdf-stm-rw-filter-lzw.c TEST_SUITE_HASH = base/hash/pdf-hash-new.c \ base/hash/pdf-hash-add.c \ === added file 'torture/unit/base/stm/pdf-stm-rw-filter-lzw.c' --- torture/unit/base/stm/pdf-stm-rw-filter-lzw.c 1970-01-01 00:00:00 +0000 +++ torture/unit/base/stm/pdf-stm-rw-filter-lzw.c 2011-08-16 08:32:34 +0000 @@ -0,0 +1,242 @@ +/* -*- mode: C -*- + * + * File: pdf-stm-read-filter-lzw.c + * Date: Fr July 29 15:50:09 2011 + * + * GNU PDF Library - Unit tests for LZW filter. + * + */ + +/* Copyright (C) 2011 Free Software Foundation, Inc. */ + +/* This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#include +#include +#include +#include +#include "pdf-stm-test-common.h" + +struct test_strings_s { + /* LZW-Encoded string */ + pdf_size_t encoded_size; + const pdf_char_t *encoded; + /* Decoded string */ + pdf_size_t decoded_size; + const pdf_char_t *decoded; +}; + +static const struct test_strings_s test_strings[] = { + { + 240, + "\x80\x0c\x46\x43\x21\x9c\x14\x69\x07\x1a\x0d\x61\x50\xa1\xb4\x36" + "\x1c\x37\x88\x44\x46\xe3\x88\xa4\x56\x28\x39\x8c\x46\x63\x23\x08" + "\x14\x12\x0d\x08\x85\xc3\x21\xd0\xd8\x94\x46\x2d\x16\x8d\x4a\x63" + "\x90\x38\x28\xce\x11\x09\x90\xc8\xe4\x92\x58\x9c\x9e\x2f\x29\x8d" + "\xc7\x65\xb2\xf9\x08\xd6\x64\x36\x9a\x4d\x66\xd3\x89\xcc\xb2\x3f" + "\x07\x9e\xcf\xe8\x33\x69\xbd\x12\x57\x1e\x97\x48\x26\x33\x2a\x5d" + "\x32\x89\x18\xa7\xce\xea\x50\xba\x54\xd2\x98\x38\xab\x8e\x6b\x34" + "\x79\x85\x72\xa9\x5e\xab\x55\xec\x75\x1a\x45\x4e\x47\x55\xa1\xda" + "\xa7\x56\x4a\x4d\x9e\x4b\x5f\xb0\xda\xe7\x96\xe8\x7d\xa2\xe3\x4e" + "\xb9\xdb\x2c\xb2\x2b\x7d\xfa\x4f\x79\xc0\xde\xec\xd8\x5b\xbd\xa7" + "\x01\x46\xc1\x5d\x71\x91\x2b\xc5\xcb\x21\x8a\xc2\x5f\x71\xb7\xf9" + "\xc5\xea\xb7\x99\x99\xe6\xf0\xf9\x6a\x86\x62\x7d\x76\xca\x63\xb3" + "\xb8\x9c\xfe\x9f\x27\x26\xd5\x4a\xb5\x96\xdc\x5e\x6b\x53\x9c\xd9" + "\x65\xf5\xb5\xdd\x14\xa3\x49\x5a\xda\x68\x28\x18\x6d\xf6\x3f\x4b" + "\xbb\xd4\x6c\x37\x11\xac\xf7\x07\x5d\xb6\xe5\x68\xe9\xc0\x08\x08", + 1059, + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + "1223334444555556666667777777888888889999999990" + }, + { /* LZW encoding example from PDF ISO 32000-1 standard */ + 9, + "\x80\x0B\x60\x50\x22\x0C\x0C\x85\x01", + 10, + "\x2d\x2d\x2d\x2d\x2d\x41\x2d\x2d\x2d\x42" + }, + { 0, NULL, 0, NULL } +}; + + +static const struct test_params_s tests_params[] = { + /* No Test type Test operation Loop read size Cache size */ + { 1, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_ONE, 0 }, + { 2, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_TWO, 0 }, + { 3, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_HALF, 0 }, + { 4, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_EXACT, 0 }, + { 5, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_DOUBLE, 0 }, + + { 6, TEST_TYPE_ENCODER, TEST_OP_READ, LOOP_RW_SIZE_ONE, 0 }, + { 7, TEST_TYPE_ENCODER, TEST_OP_READ, LOOP_RW_SIZE_TWO, 0 }, + { 8, TEST_TYPE_ENCODER, TEST_OP_READ, LOOP_RW_SIZE_HALF, 0 }, + { 9, TEST_TYPE_ENCODER, TEST_OP_READ, LOOP_RW_SIZE_EXACT, 0 }, + { 10, TEST_TYPE_ENCODER, TEST_OP_READ, LOOP_RW_SIZE_DOUBLE, 0 }, + + { 11, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_ONE, 0 }, + { 12, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_TWO, 0 }, + { 13, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_HALF, 0 }, + { 14, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_EXACT, 0 }, + { 15, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_DOUBLE, 0 }, + + { 16, TEST_TYPE_ENCODER, TEST_OP_WRITE, LOOP_RW_SIZE_ONE, 0 }, + { 17, TEST_TYPE_ENCODER, TEST_OP_WRITE, LOOP_RW_SIZE_TWO, 0 }, + { 18, TEST_TYPE_ENCODER, TEST_OP_WRITE, LOOP_RW_SIZE_HALF, 0 }, + { 19, TEST_TYPE_ENCODER, TEST_OP_WRITE, LOOP_RW_SIZE_EXACT, 0 }, + { 20, TEST_TYPE_ENCODER, TEST_OP_WRITE, LOOP_RW_SIZE_DOUBLE, 0 }, +}; + +static void +common_test_lzw (const pdf_char_t *function_name, + int test_index) +{ + int i; + const struct test_params_s *params = &tests_params[test_index - 1]; + + /* Sanity check */ + fail_if (test_index != params->idx); + + for (i = 0; test_strings[i].encoded; i++) + { + pdf_stm_test_common (function_name, + params->type, + params->operation, + (params->type == TEST_TYPE_ENCODER ? + PDF_STM_FILTER_LZW_ENC : + PDF_STM_FILTER_LZW_DEC), + NULL, + params->stm_cache_size, + params->loop_size, + test_strings[i].decoded, + test_strings[i].decoded_size, + test_strings[i].encoded, + test_strings[i].encoded_size); + } +} + +/* + * Test: pdf_stm_read_filter_lzw_dec_001-005 + * Description: + * Test LZW decoder filter with different read loop sizes + * Success condition: + * The read data should be ok. + */ +START_TEST (pdf_stm_read_filter_lzw_dec_001) { common_test_lzw (__FUNCTION__, 1); } END_TEST +START_TEST (pdf_stm_read_filter_lzw_dec_002) { common_test_lzw (__FUNCTION__, 2); } END_TEST +START_TEST (pdf_stm_read_filter_lzw_dec_003) { common_test_lzw (__FUNCTION__, 3); } END_TEST +START_TEST (pdf_stm_read_filter_lzw_dec_004) { common_test_lzw (__FUNCTION__, 4); } END_TEST +START_TEST (pdf_stm_read_filter_lzw_dec_005) { common_test_lzw (__FUNCTION__, 5); } END_TEST + +/* + * Test: pdf_stm_read_filter_lzw_enc_001-005 + * Description: + * Test LZW encoder filter with different read loop sizes + * Success condition: + * The read data should be ok. + */ +START_TEST (pdf_stm_read_filter_lzw_enc_001) { common_test_lzw (__FUNCTION__, 6); } END_TEST +START_TEST (pdf_stm_read_filter_lzw_enc_002) { common_test_lzw (__FUNCTION__, 7); } END_TEST +START_TEST (pdf_stm_read_filter_lzw_enc_003) { common_test_lzw (__FUNCTION__, 8); } END_TEST +START_TEST (pdf_stm_read_filter_lzw_enc_004) { common_test_lzw (__FUNCTION__, 9); } END_TEST +START_TEST (pdf_stm_read_filter_lzw_enc_005) { common_test_lzw (__FUNCTION__, 10); } END_TEST + +/* + * Test: pdf_stm_write_filter_lzw_dec_001-005 + * Description: + * Test LZW decoder filter with different write loop sizes + * Success condition: + * The written data should be ok. + */ +START_TEST (pdf_stm_write_filter_lzw_dec_001) { common_test_lzw (__FUNCTION__, 11); } END_TEST +START_TEST (pdf_stm_write_filter_lzw_dec_002) { common_test_lzw (__FUNCTION__, 12); } END_TEST +START_TEST (pdf_stm_write_filter_lzw_dec_003) { common_test_lzw (__FUNCTION__, 13); } END_TEST +START_TEST (pdf_stm_write_filter_lzw_dec_004) { common_test_lzw (__FUNCTION__, 14); } END_TEST +START_TEST (pdf_stm_write_filter_lzw_dec_005) { common_test_lzw (__FUNCTION__, 15); } END_TEST + +/* + * Test: pdf_stm_write_filter_lzw_enc_001-005 + * Description: + * Test LZW encoder filter with different write loop sizes + * Success condition: + * The written data should be ok. + */ +START_TEST (pdf_stm_write_filter_lzw_enc_001) { common_test_lzw (__FUNCTION__, 16); } END_TEST +START_TEST (pdf_stm_write_filter_lzw_enc_002) { common_test_lzw (__FUNCTION__, 17); } END_TEST +START_TEST (pdf_stm_write_filter_lzw_enc_003) { common_test_lzw (__FUNCTION__, 18); } END_TEST +START_TEST (pdf_stm_write_filter_lzw_enc_004) { common_test_lzw (__FUNCTION__, 19); } END_TEST +START_TEST (pdf_stm_write_filter_lzw_enc_005) { common_test_lzw (__FUNCTION__, 20); } END_TEST + +/* + * Test case creation functions + */ + +TCase * +test_pdf_stm_rw_filter_lzw (void) +{ + TCase *tc = tcase_create ("pdf_stm_rw_filter_lzw"); + + tcase_add_test (tc, pdf_stm_read_filter_lzw_dec_001); + tcase_add_test (tc, pdf_stm_read_filter_lzw_dec_002); + tcase_add_test (tc, pdf_stm_read_filter_lzw_dec_003); + tcase_add_test (tc, pdf_stm_read_filter_lzw_dec_004); + tcase_add_test (tc, pdf_stm_read_filter_lzw_dec_005); + + tcase_add_test (tc, pdf_stm_read_filter_lzw_enc_001); + tcase_add_test (tc, pdf_stm_read_filter_lzw_enc_002); + tcase_add_test (tc, pdf_stm_read_filter_lzw_enc_003); + tcase_add_test (tc, pdf_stm_read_filter_lzw_enc_004); + tcase_add_test (tc, pdf_stm_read_filter_lzw_enc_005); + + tcase_add_test (tc, pdf_stm_write_filter_lzw_dec_001); + tcase_add_test (tc, pdf_stm_write_filter_lzw_dec_002); + tcase_add_test (tc, pdf_stm_write_filter_lzw_dec_003); + tcase_add_test (tc, pdf_stm_write_filter_lzw_dec_004); + tcase_add_test (tc, pdf_stm_write_filter_lzw_dec_005); + + tcase_add_test (tc, pdf_stm_write_filter_lzw_enc_001); + tcase_add_test (tc, pdf_stm_write_filter_lzw_enc_002); + tcase_add_test (tc, pdf_stm_write_filter_lzw_enc_003); + tcase_add_test (tc, pdf_stm_write_filter_lzw_enc_004); + tcase_add_test (tc, pdf_stm_write_filter_lzw_enc_005); + + tcase_add_checked_fixture (tc, + pdf_test_setup, + pdf_test_teardown); + return tc; +} + +/* End of pdf-stm-read-filter-lzw.c */ === modified file 'torture/unit/base/stm/tsuite-stm.c' --- torture/unit/base/stm/tsuite-stm.c 2011-05-17 22:17:31 +0000 +++ torture/unit/base/stm/tsuite-stm.c 2011-08-03 10:02:47 +0000 @@ -45,6 +45,7 @@ extern TCase *test_pdf_stm_rw_filter_flate (void); extern TCase *test_pdf_stm_rw_filter_v2 (void); extern TCase *test_pdf_stm_rw_filter_aesv2 (void); +extern TCase *test_pdf_stm_rw_filter_lzw (void); Suite * tsuite_stm () @@ -70,6 +71,7 @@ suite_add_tcase (s, test_pdf_stm_rw_filter_v2 ()); suite_add_tcase (s, test_pdf_stm_rw_filter_aesv2 ()); suite_add_tcase (s, test_pdf_stm_flush ()); + suite_add_tcase (s, test_pdf_stm_rw_filter_lzw ()); return s; } # Begin bundle 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