From 55eb481f30bc9aa5993fbb40c317c461f5f7d4ae Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Fri, 3 Aug 2018 00:42:59 -0700 Subject: [PATCH] Add intensive (optional) rotation test --- tests/conftest.py | 21 +++++++++++++++-- tests/test_rotation.py | 51 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index b05fd2d9..17f20ba7 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -145,7 +145,8 @@ def check_ocrmypdf(input_file, output_file, *args, env=None): @pytest.helpers.register -def run_ocrmypdf(input_file, output_file, *args, env=None): +def run_ocrmypdf(input_file, output_file, *args, env=None, + universal_newlines=True): "Run ocrmypdf and let caller deal with results" if env is None: @@ -155,7 +156,7 @@ def run_ocrmypdf(input_file, output_file, *args, env=None): [str(input_file), str(output_file)] p = Popen( p_args, close_fds=True, stdout=PIPE, stderr=PIPE, - universal_newlines=True, env=env) + universal_newlines=universal_newlines, env=env) out, err = p.communicate() #print(err) @@ -168,3 +169,19 @@ def first_page_dimensions(pdf): info = pdfinfo.PdfInfo(pdf) page0 = info[0] return (page0.width_inches, page0.height_inches) + + +def pytest_addoption(parser): + parser.addoption( + "--runslow", action="store_true", default=False, help="run slow tests" + ) + + +def pytest_collection_modifyitems(config, items): + if config.getoption("--runslow"): + # --runslow given in cli: do not skip slow tests + return + skip_slow = pytest.mark.skip(reason="need --runslow option to run") + for item in items: + if "slow" in item.keywords: + item.add_marker(skip_slow) diff --git a/tests/test_rotation.py b/tests/test_rotation.py index e0095cc5..d35a487b 100644 --- a/tests/test_rotation.py +++ b/tests/test_rotation.py @@ -16,12 +16,17 @@ # along with OCRmyPDF. If not, see . import logging +from io import BytesIO +from PIL import Image import pytest +import img2pdf +import pikepdf from ocrmypdf import leptonica from ocrmypdf.pdfinfo import PdfInfo from ocrmypdf.exec import ghostscript +from ocrmypdf.helpers import fspath # pytest.helpers is dynamic @@ -51,7 +56,8 @@ def check_monochrome_correlation( return ghostscript.rasterize_pdf( pdf, png, xres=100, yres=100, - raster_device='pngmono', log=gslog, pageno=pageno) + raster_device='pngmono', log=gslog, pageno=pageno, + rotation=0) rasterize(reference_pdf, reference_pageno, reference_png) rasterize(test_pdf, test_pageno, test_png) @@ -171,3 +177,46 @@ def test_rotate_deskew_timeout(resources, outdir): # Confirm that the page still got deskewed assert correlation > 0.50 + + +@pytest.mark.slow +@pytest.mark.parametrize('page_angle', (0, 90, 180, 270)) +@pytest.mark.parametrize('image_angle', (0, 90, 180, 270)) +def test_rotate_page_level(image_angle, page_angle, resources, outdir): + + def make_rotate_test(prefix, image_angle, page_angle): + im = Image.open(fspath(resources / 'typewriter.png')) + if image_angle != 0: + ccw_angle = -image_angle % 360 + im = im.transpose(getattr(Image, 'ROTATE_{}'.format(ccw_angle))) + memimg = BytesIO() + im.save(memimg, format='PNG') + memimg.seek(0) + mempdf = BytesIO() + img2pdf.convert( + memimg.read(), + layout_fun=img2pdf.get_fixed_dpi_layout_fun((200, 200)), + outputstream=mempdf + ) + mempdf.seek(0) + pike = pikepdf.open(mempdf) + pike.pages[0].Rotate = page_angle + target = outdir / '{}_{}_{}.pdf'.format(prefix, image_angle, page_angle) + pike.save(target) + return target + + reference = make_rotate_test('ref', 0, 0) + test = make_rotate_test('test', image_angle, page_angle) + out = test.with_suffix('.out.pdf') + + p, _, err = run_ocrmypdf( + test, out, + '-O0', + '--rotate-pages', + '--rotate-pages-threshold', '0.001', + universal_newlines=False + ) + err = err.decode('utf-8', errors='replace') + assert p.returncode == 0, err + + assert check_monochrome_correlation(outdir, reference, 1, out, 1) > 0.2