From 6a6fc199589ab8ae6b32eff7f50a47e1cbde8cf8 Mon Sep 17 00:00:00 2001 From: Matthias Bisping Date: Mon, 4 Apr 2022 15:48:15 +0200 Subject: [PATCH] refactoring --- .../unit_tests/coordinate_transformer_test.py | 167 ++++++++++++------ 1 file changed, 110 insertions(+), 57 deletions(-) diff --git a/test/unit_tests/coordinate_transformer_test.py b/test/unit_tests/coordinate_transformer_test.py index 1d4cfd2..fc02890 100644 --- a/test/unit_tests/coordinate_transformer_test.py +++ b/test/unit_tests/coordinate_transformer_test.py @@ -1,7 +1,9 @@ +from operator import itemgetter, attrgetter + import numpy as np import pytest from fpdf import fpdf -from funcy import compose +from funcy import compose, omit from pdf2image import pdf2image from image_prediction.estimator.preprocessor.utils import image_to_normalized_tensor @@ -12,13 +14,9 @@ from image_prediction.transformer.transformers.coordinate.fpdf import FPDFCoordi from image_prediction.transformer.transformers.coordinate.pdfnet import PDFNetCoordinateTransformer from test.conftest import array_to_image, add_image -WIDTH = 200 -HEIGHT = 100 -PAGE_WIDTH = 300 -PAGE_HEIGHT = 300 - @pytest.mark.parametrize("coordinate_system", ["fpdf"]) +@pytest.mark.skip(reason="No content") def test_fpdf_coordinate_transformer(position_metadata_in_given_system, position_metadata_in_reference_system): """We use FPDF's coordinate system as the reference system (arbitrarily). Hence, FPDFCoordinateTransformer actually does not do anything. This test merely documents the fact, that FPDF is the reference system. @@ -27,6 +25,7 @@ def test_fpdf_coordinate_transformer(position_metadata_in_given_system, position @pytest.mark.parametrize("coordinate_system", ["fitz"]) +@pytest.mark.skip(reason="No content") def test_fitz_coordinate_transformer(position_metadata_in_given_system, position_metadata_in_reference_system): """How I inferred the transformation: @@ -38,6 +37,7 @@ def test_fitz_coordinate_transformer(position_metadata_in_given_system, position @pytest.mark.parametrize("coordinate_system", ["pdfnet"]) +@pytest.mark.skip(reason="No content") def test_pdfnet_coordinate_transformer(position_metadata_in_given_system, position_metadata_in_reference_system): """How I inferred the transformation: @@ -61,18 +61,6 @@ def test_coordinate_transformer_by_metadata( ) -@pytest.mark.parametrize("coordinate_system", ["fpdf"]) -def test_coordinate_transformer_by_image( - transformer, position_metadata_in_given_system, position_metadata_in_reference_system -): - metadata_transformed = transformer(position_metadata_in_given_system) - - target_image = metadata_to_test_image(position_metadata_in_reference_system) - test_image = metadata_to_test_image(metadata_transformed) - - assert np.allclose(target_image, test_image) - - @pytest.fixture def transformer(coordinate_system): if coordinate_system == "fpdf": @@ -104,26 +92,29 @@ def corner(request): @pytest.fixture -def corner2metadata_in_given_system(coordinate_system): +def corner2metadata_in_reference_system(get_fpdf_corner_metadat): + return get_fpdf_corner_metadat + + +@pytest.fixture +def corner2metadata_in_given_system( + coordinate_system, get_fpdf_corner_metadat, get_fitz_corner_metadat, get_pdfnet_corner_metadata +): if coordinate_system == "fpdf": - return get_fpdf_corner_metadat() + return get_fpdf_corner_metadat elif coordinate_system == "fitz": - return get_fitz_corner_metadat() + return get_fitz_corner_metadat elif coordinate_system == "pdfnet": - return get_pdfnet_corner_metadata() + return get_pdfnet_corner_metadata else: raise ValueError(f"Unknown coordinate system: {coordinate_system}") @pytest.fixture -def corner2metadata_in_reference_system(): - return get_fpdf_corner_metadat() - - -def get_fpdf_corner_metadat(): +def get_fpdf_corner_metadat(base_position_metadata, get_metadata_for_coords, get_image_and_page_edge_lengths): """Origin top left, y1 <= y2; all coords on page are positive (0,0)--+--(2,0)--+ |////| |////| @@ -133,19 +124,23 @@ def get_fpdf_corner_metadat(): |////| |////| +--(1,3) +--(3,3) """ + width, height, page_width, page_height = get_image_and_page_edge_lengths() + return { - "top_left": get_metadata_for_coords(0, 0, WIDTH, HEIGHT), - "bottom_left": get_metadata_for_coords(0, PAGE_HEIGHT - HEIGHT, WIDTH, PAGE_HEIGHT), - "bottom_right": get_metadata_for_coords(PAGE_WIDTH - WIDTH, PAGE_HEIGHT - HEIGHT, PAGE_WIDTH, PAGE_HEIGHT), - "top_right": get_metadata_for_coords(PAGE_WIDTH - WIDTH, 0, PAGE_WIDTH, HEIGHT) + "top_left": get_metadata_for_coords(0, 0, width, height), + "bottom_left": get_metadata_for_coords(0, page_height - height, width, page_height), + "bottom_right": get_metadata_for_coords(page_width - width, page_height - height, page_width, page_height), + "top_right": get_metadata_for_coords(page_width - width, 0, page_width, height) } -def get_fitz_corner_metadat(): - return get_fpdf_corner_metadat() +@pytest.fixture +def get_fitz_corner_metadat(get_fpdf_corner_metadat): + return get_fpdf_corner_metadat -def get_pdfnet_corner_metadata(): +@pytest.fixture +def get_pdfnet_corner_metadata(base_position_metadata, get_metadata_for_coords, get_image_and_page_edge_lengths): """Origin bottom left, y1 <= y2; all coords on page are positive +---(1,3) +--(3,3) |////| |////| @@ -155,48 +150,106 @@ def get_pdfnet_corner_metadata(): |////| |////| (0,0)--+ (2,0)--+ """ + width, height, page_width, page_height = get_image_and_page_edge_lengths() + return { - "top_left": get_metadata_for_coords(0, PAGE_HEIGHT - HEIGHT, WIDTH, PAGE_HEIGHT), - "bottom_left": get_metadata_for_coords(0, 0, WIDTH, HEIGHT), - "bottom_right": get_metadata_for_coords(PAGE_WIDTH - WIDTH, 0, PAGE_WIDTH, HEIGHT), - "top_right": get_metadata_for_coords(PAGE_WIDTH - WIDTH, PAGE_HEIGHT - HEIGHT, PAGE_WIDTH, PAGE_HEIGHT), + "top_left": get_metadata_for_coords(0, page_height - height, width, page_height), + "bottom_left": get_metadata_for_coords(0, 0, width, height), + "bottom_right": get_metadata_for_coords(page_width - width, 0, page_width, height), + "top_right": get_metadata_for_coords(page_width - width, page_height - height, page_width, page_height), } -def get_metadata_for_coords(x1, y1, x2, y2): - metadata = base_position_metadata() - metadata.update({Info.X1: x1, Info.Y1: y1, Info.X2: x2, Info.Y2: y2}) - return metadata +@pytest.fixture +def base_position_metadata(WIDTH, HEIGHT, PAGE_WIDTH, PAGE_HEIGHT): + return get_base_position_metadata(WIDTH, HEIGHT, PAGE_WIDTH, PAGE_HEIGHT) -def base_position_metadata(): +@pytest.fixture +def get_metadata_for_coords(base_position_metadata): + def __get_metadata_for_coords(*coords): + meta_data_coords = get_metadata_coords(*coords) + return {**meta_data_coords, **omit(base_position_metadata, meta_data_coords.keys())} + + return __get_metadata_for_coords + + +@pytest.fixture +def get_image_and_page_edge_lengths(base_position_metadata): + def __get_w_h_pw_ph(): + return itemgetter(*attrgetter("WIDTH", "HEIGHT", "PAGE_WIDTH", "PAGE_HEIGHT")(Info))(base_position_metadata) + + return __get_w_h_pw_ph + + +@pytest.fixture(params=[33, 100]) +def HEIGHT(request): + return request.param + + +@pytest.fixture(params=[10, 31]) +def WIDTH(request): + return request.param + + +@pytest.fixture(params=[220, 30]) +def PAGE_HEIGHT(request): + return request.param + + +@pytest.fixture(params=[100, 310]) +def PAGE_WIDTH(request): + return request.param + + +def get_base_position_metadata(width, height, page_width, page_height): return { - Info.X1: 0, - Info.Y1: 0, - Info.X2: WIDTH, - Info.Y2: HEIGHT, - Info.WIDTH: WIDTH, - Info.HEIGHT: HEIGHT, + Info.X1: None, + Info.Y1: None, + Info.X2: None, + Info.Y2: None, + Info.WIDTH: width, + Info.HEIGHT: height, Info.PAGE_IDX: 0, - Info.PAGE_WIDTH: PAGE_WIDTH, - Info.PAGE_HEIGHT: PAGE_HEIGHT, + Info.PAGE_WIDTH: page_width, + Info.PAGE_HEIGHT: page_height, } +def get_metadata_coords(x1, y1, x2, y2): + return {Info.X1: x1, Info.Y1: y1, Info.X2: x2, Info.Y2: y2} + + +@pytest.mark.parametrize("coordinate_system", ["pdfnet"]) +def test_coordinate_transformer_by_image( + transformer, position_metadata_in_given_system, position_metadata_in_reference_system +): + metadata_transformed = transformer(position_metadata_in_given_system) + + target_image = metadata_to_test_image(position_metadata_in_reference_system) + test_image = metadata_to_test_image(metadata_transformed) + + assert np.allclose(target_image, test_image) + + def metadata_to_test_image(metadata): - image = get_coordinate_test_image() - pdf = get_coordinate_test_fpdf() + image = get_coordinate_test_image( + *itemgetter(*attrgetter("WIDTH", "HEIGHT")(Info))(metadata) + ) + pdf = get_coordinate_test_fpdf( + *itemgetter(*attrgetter("PAGE_WIDTH", "PAGE_HEIGHT")(Info))(metadata) + ) add_image(pdf, ImageMetadataPair(image, metadata)) page_image = fpdf_to_page_tensor(pdf) return page_image -def get_coordinate_test_image(): - return array_to_image(np.zeros(shape=(WIDTH, HEIGHT, 3))) +def get_coordinate_test_image(width, height): + return array_to_image(np.zeros(shape=(width, height, 3))) -def get_coordinate_test_fpdf(): - pdf = fpdf.FPDF(unit="pt", format=(PAGE_WIDTH, PAGE_HEIGHT)) +def get_coordinate_test_fpdf(page_width, page_height): + pdf = fpdf.FPDF(unit="pt", format=(page_width, page_height)) return pdf