From fa13386899173709cbca7acd0dd57cd82c99e689 Mon Sep 17 00:00:00 2001 From: Lu Wang Date: Fri, 1 May 2015 13:45:30 +0800 Subject: [PATCH] fix #501 --- src/pdf2htmlEX.cc | 4 +-- test/test.py | 7 ++--- test/test_output.py | 59 +++++++++++++++++++++----------------- test/test_output/issue501 | Bin 0 -> 13114 bytes 4 files changed, 36 insertions(+), 34 deletions(-) create mode 100644 test/test_output/issue501 diff --git a/src/pdf2htmlEX.cc b/src/pdf2htmlEX.cc index 8f7edb4..10d9925 100644 --- a/src/pdf2htmlEX.cc +++ b/src/pdf2htmlEX.cc @@ -255,7 +255,6 @@ void check_param() if(get_suffix(param.input_filename) == ".pdf") { param.output_filename = s.substr(0, s.size() - 4) + ".html"; - } else { @@ -298,8 +297,7 @@ void check_param() } else { - if(!param.split_pages) - param.css_filename = s + ".css"; + param.css_filename = s + ".css"; } } if(param.outline_filename.empty()) diff --git a/test/test.py b/test/test.py index 253abaa..3d4ee8c 100755 --- a/test/test.py +++ b/test/test.py @@ -100,14 +100,13 @@ if __name__ == '__main__': test_names = [] for name in sys.argv[1:]: - if name.find('.') != -1: - test_names.append(name) - else: + test_names.append(name) + if name.find('.') == -1: for m in all_classes: test_names.append(m + '.' + name) for module in all_modules: - if len(test_names) > 0: + if len(test_names) > 0 and module.__name__ not in test_names: for n in test_names: try: suites.append(loader.loadTestsFromName(n, module)) diff --git a/test/test_output.py b/test/test_output.py index e7e30a3..2610268 100644 --- a/test/test_output.py +++ b/test/test_output.py @@ -1,6 +1,7 @@ #!/usr/bin/env python -# Test output files +# Check pdf2htmlEX does not crash, and produces correct files. +# Do not check the content of the files import unittest import os @@ -9,78 +10,82 @@ from test import Common @unittest.skipIf(Common.GENERATING_MODE, 'Skipping test_output in generating mode') class test_output(Common, unittest.TestCase): - def run_test_case(self, input_file, expected_output_files, args=[]): + def run_test_case(self, input_file, args=[], expected_output_files=None): args = list(args) args.insert(0, os.path.join(self.TEST_DIR, 'test_output', input_file)) - self.assertItemsEqual(self.run_pdf2htmlEX(args)['output_files'], expected_output_files) + result = self.run_pdf2htmlEX(args) + print result + if expected_output_files: + self.assertItemsEqual(result['output_files'], expected_output_files) def test_generate_single_html_default_name_single_page_pdf(self): - self.run_test_case('1-page.pdf', ['1-page.html']) + self.run_test_case('1-page.pdf', expected_output_files = ['1-page.html']) def test_generate_single_html_default_name_multiple_page_pdf(self): - self.run_test_case('2-pages.pdf', ['2-pages.html']) + self.run_test_case('2-pages.pdf', expected_output_files = ['2-pages.html']) def test_generate_single_html_specify_name_single_page_pdf(self): - self.run_test_case('1-page.pdf', ['foo.html'], ['foo.html']) + self.run_test_case('1-page.pdf', ['foo.html'], expected_output_files = ['foo.html']) def test_generate_single_html_specify_name_multiple_page_pdf(self): - self.run_test_case('2-pages.pdf', ['foo.html'], ['foo.html']) + self.run_test_case('2-pages.pdf', ['foo.html'], expected_output_files = ['foo.html']) def test_generate_split_pages_default_name_single_page(self): - self.run_test_case('1-page.pdf', ['1-page.html', '1-page1.page'], ['--split-pages', 1]) + self.run_test_case('1-page.pdf', ['--split-pages', 1], expected_output_files = ['1-page.html', '1-page1.page']) def test_generate_split_pages_default_name_multiple_pages(self): - self.run_test_case('3-pages.pdf', ['3-pages.html', '3-pages1.page', '3-pages2.page', '3-pages3.page'], ['--split-pages', 1]) + self.run_test_case('3-pages.pdf', ['--split-pages', 1], expected_output_files = ['3-pages.html', '3-pages1.page', '3-pages2.page', '3-pages3.page']) def test_generate_split_pages_specify_name_single_page(self): - self.run_test_case('1-page.pdf', ['1-page.html', 'foo1.xyz'], ['--split-pages', 1, '--page-filename', 'foo.xyz']) + self.run_test_case('1-page.pdf', ['--split-pages', 1, '--page-filename', 'foo.xyz'], expected_output_files = ['1-page.html', 'foo1.xyz']) def test_generate_split_pages_specify_name_multiple_pages(self): - self.run_test_case('3-pages.pdf', ['3-pages.html', 'foo1.xyz', 'foo2.xyz', 'foo3.xyz'], ['--split-pages', 1, '--page-filename', 'foo.xyz']) + self.run_test_case('3-pages.pdf', ['--split-pages', 1, '--page-filename', 'foo.xyz'], expected_output_files = ['3-pages.html', 'foo1.xyz', 'foo2.xyz', 'foo3.xyz']) def test_generate_split_pages_specify_name_formatter_multiple_pages(self): - self.run_test_case('3-pages.pdf', ['3-pages.html', 'fo1o.xyz', 'fo2o.xyz', 'fo3o.xyz'], ['--split-pages', 1, '--page-filename', 'fo%do.xyz']) + self.run_test_case('3-pages.pdf', ['--split-pages', 1, '--page-filename', 'fo%do.xyz'], expected_output_files = ['3-pages.html', 'fo1o.xyz', 'fo2o.xyz', 'fo3o.xyz']) def test_generate_split_pages_specify_name_formatter_with_padded_zeros_multiple_pages(self): - self.run_test_case('3-pages.pdf', ['3-pages.html', 'fo001o.xyz', 'fo002o.xyz', 'fo003o.xyz'], ['--split-pages', 1, '--page-filename', 'fo%03do.xyz']) + self.run_test_case('3-pages.pdf', ['--split-pages', 1, '--page-filename', 'fo%03do.xyz'], expected_output_files = ['3-pages.html', 'fo001o.xyz', 'fo002o.xyz', 'fo003o.xyz']) def test_generate_split_pages_specify_name_only_first_formatter_gets_taken(self): - self.run_test_case('3-pages.pdf', ['3-pages.html', 'f1o%do.xyz', 'f2o%do.xyz', 'f3o%do.xyz'], ['--split-pages', 1, '--page-filename', 'f%do%do.xyz']) + self.run_test_case('3-pages.pdf', ['--split-pages', 1, '--page-filename', 'f%do%do.xyz'], expected_output_files = ['3-pages.html', 'f1o%do.xyz', 'f2o%do.xyz', 'f3o%do.xyz']) def test_generate_split_pages_specify_name_only_percent_d_is_used_percent_s(self): - self.run_test_case('3-pages.pdf', ['3-pages.html', 'f%soo1.xyz', 'f%soo2.xyz', 'f%soo3.xyz'], ['--split-pages', 1, '--page-filename', 'f%soo.xyz']) + self.run_test_case('3-pages.pdf', ['--split-pages', 1, '--page-filename', 'f%soo.xyz'], expected_output_files = ['3-pages.html', 'f%soo1.xyz', 'f%soo2.xyz', 'f%soo3.xyz']) def test_generate_split_pages_specify_name_only_percent_d_is_used_percent_p(self): - self.run_test_case('3-pages.pdf', ['3-pages.html', 'f%poo1.xyz', 'f%poo2.xyz', 'f%poo3.xyz'], ['--split-pages', 1, '--page-filename', 'f%poo.xyz']) - + self.run_test_case('3-pages.pdf', ['--split-pages', 1, '--page-filename', 'f%poo.xyz'], expected_output_files = ['3-pages.html', 'f%poo1.xyz', 'f%poo2.xyz', 'f%poo3.xyz']) def test_generate_split_pages_specify_name_only_percent_d_is_used_percent_n(self): - self.run_test_case('3-pages.pdf', ['3-pages.html', 'f%noo1.xyz', 'f%noo2.xyz', 'f%noo3.xyz'], ['--split-pages', 1, '--page-filename', 'f%noo.xyz']) + self.run_test_case('3-pages.pdf', ['--split-pages', 1, '--page-filename', 'f%noo.xyz'], expected_output_files = ['3-pages.html', 'f%noo1.xyz', 'f%noo2.xyz', 'f%noo3.xyz']) def test_generate_split_pages_specify_name_only_percent_d_is_used_percent_percent(self): - self.run_test_case('3-pages.pdf', ['3-pages.html', 'f%%oo1.xyz', 'f%%oo2.xyz', 'f%%oo3.xyz'], ['--split-pages', 1, '--page-filename', 'f%%oo.xyz']) + self.run_test_case('3-pages.pdf', ['--split-pages', 1, '--page-filename', 'f%%oo.xyz'], expected_output_files = ['3-pages.html', 'f%%oo1.xyz', 'f%%oo2.xyz', 'f%%oo3.xyz']) def test_generate_split_pages_specify_name_only_percent_d_is_used_percent_percent_with_actual_placeholder(self): - self.run_test_case('3-pages.pdf', ['3-pages.html', 'f%%o1o.xyz', 'f%%o2o.xyz', 'f%%o3o.xyz'], ['--split-pages', 1, '--page-filename', 'f%%o%do.xyz']) + self.run_test_case('3-pages.pdf', ['--split-pages', 1, '--page-filename', 'f%%o%do.xyz'], expected_output_files = ['3-pages.html', 'f%%o1o.xyz', 'f%%o2o.xyz', 'f%%o3o.xyz']) def test_generate_split_pages_specify_name_only_percent_d_is_used_percent_percent_with_actual_placeholder(self): - self.run_test_case('3-pages.pdf', ['3-pages.html', 'fo1o%%.xyz', 'fo2o%%.xyz', 'fo3o%%.xyz'], ['--split-pages', 1, '--page-filename', 'fo%do%%.xyz']) + self.run_test_case('3-pages.pdf', ['--split-pages', 1, '--page-filename', 'fo%do%%.xyz'], expected_output_files = ['3-pages.html', 'fo1o%%.xyz', 'fo2o%%.xyz', 'fo3o%%.xyz']) def test_generate_split_pages_specify_name_only_formatter_starts_part_way_through_invalid_formatter(self): - self.run_test_case('3-pages.pdf', ['3-pages.html', 'f%021oo.xyz', 'f%022oo.xyz', 'f%023oo.xyz'], ['--split-pages', 1, '--page-filename', 'f%02%doo.xyz']) + self.run_test_case('3-pages.pdf', ['--split-pages', 1, '--page-filename', 'f%02%doo.xyz'], expected_output_files = ['3-pages.html', 'f%021oo.xyz', 'f%022oo.xyz', 'f%023oo.xyz']) def test_generate_split_pages_specify_output_filename_no_formatter_no_extension(self): - self.run_test_case('1-page.pdf', ['1-page.html', 'foo1'], ['--split-pages', 1, '--page-filename', 'foo']) + self.run_test_case('1-page.pdf', ['--split-pages', 1, '--page-filename', 'foo'], expected_output_files = ['1-page.html', 'foo1']) def test_generate_single_html_name_specified_format_characters_percent_d(self): - self.run_test_case('2-pages.pdf', ['foo%d.html'], ['foo%d.html']) + self.run_test_case('2-pages.pdf', ['foo%d.html'], expected_output_files = ['foo%d.html']) def test_generate_single_html_name_specified_format_characters_percent_p(self): - self.run_test_case('2-pages.pdf', ['foo%p.html'], ['foo%p.html']) + self.run_test_case('2-pages.pdf', ['foo%p.html'], expected_output_files = ['foo%p.html']) def test_generate_single_html_name_specified_format_characters_percent_n(self): - self.run_test_case('2-pages.pdf', ['foo%n.html'], ['foo%n.html']) + self.run_test_case('2-pages.pdf', ['foo%n.html'], expected_output_files = ['foo%n.html']) def test_generate_single_html_name_specified_format_characters_percent_percent(self): - self.run_test_case('2-pages.pdf', ['foo%%.html'], ['foo%%.html']) + self.run_test_case('2-pages.pdf', ['foo%%.html'], expected_output_files = ['foo%%.html']) + def test_issue501(self): + self.run_test_case('issue501', ['--split-pages', 1, '--embed-css', 0]); diff --git a/test/test_output/issue501 b/test/test_output/issue501 new file mode 100644 index 0000000000000000000000000000000000000000..5971ccfd1499fa73a652e8ff66227fd221d54806 GIT binary patch literal 13114 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 AA^-pY literal 0 HcmV?d00001