# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: address@hidden # am8uxrdxyhtg27wy # target_branch: bzr://bzr.sv.gnu.org/pdf/libgnupdf/trunk/ # testament_sha1: a32c1a3bd0c3e1c33a00513d355c27f3a2eb1ed3 # timestamp: 2011-08-03 12:03:10 +0200 # base_revision_id: address@hidden # # Begin patch === 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-03 10:02:47 +0000 @@ -0,0 +1,236 @@ +/* -*- 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" + }, + { 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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 SX/i7kinChIKHVAsAA==