Add intensive (optional) rotation test

This commit is contained in:
James R. Barlow
2018-08-03 00:42:59 -07:00
parent 4509ca6e75
commit 55eb481f30
2 changed files with 69 additions and 3 deletions

View File

@@ -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)

View File

@@ -16,12 +16,17 @@
# along with OCRmyPDF. If not, see <http://www.gnu.org/licenses/>.
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