From 487edd3da2ad770efbb21598e6085dc912a44764 Mon Sep 17 00:00:00 2001 From: Elwin Date: Tue, 22 Apr 2025 16:49:41 +0800 Subject: [PATCH] test: add a test case for `image/webp` file Signed-off-by: Elwin --- tests/data/webp/20250422-155738.webp | Bin 0 -> 35644 bytes tests/test_backend_webp.py | 60 +++++++++++++++++++++++++++ tests/verify_utils.py | 2 +- 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 tests/data/webp/20250422-155738.webp create mode 100644 tests/test_backend_webp.py diff --git a/tests/data/webp/20250422-155738.webp b/tests/data/webp/20250422-155738.webp new file mode 100644 index 0000000000000000000000000000000000000000..29cded51b338a32e917018e25b60df588ca3f4f6 GIT binary patch literal 35644 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 QGJpU801?0d000000C#+O(EtDd literal 0 HcmV?d00001 diff --git a/tests/test_backend_webp.py b/tests/test_backend_webp.py new file mode 100644 index 00000000..34b04f4f --- /dev/null +++ b/tests/test_backend_webp.py @@ -0,0 +1,60 @@ +from pathlib import Path + +from docling.datamodel.base_models import InputFormat +from docling.datamodel.document import ConversionResult, DoclingDocument +from docling.datamodel.pipeline_options import RapidOcrOptions +from docling.document_converter import DocumentConverter, ImageFormatOption +from .test_data_gen_flag import GEN_TEST_DATA +from .verify_utils import verify_document, verify_export + +GENERATE = GEN_TEST_DATA + + +def get_webp_paths(): + # Define the directory you want to search + directory = Path("./tests/data/webp/") + + # List all WEBP files in the directory and its subdirectories + webp_files = sorted(directory.rglob("*.webp")) + return webp_files + + +def get_converter(): + image_format_option = ImageFormatOption() + image_format_option.pipeline_options.ocr_options = RapidOcrOptions() + converter = DocumentConverter( + format_options={InputFormat.IMAGE: image_format_option}, + allowed_formats=[InputFormat.IMAGE] + ) + + return converter + + +def test_e2e_webp_conversions(): + webp_paths = get_webp_paths() + converter = get_converter() + + for webp_path in webp_paths: + print(f"converting {webp_path}") + + gt_path = ( + webp_path.parent.parent / "groundtruth" / "docling_v2" / webp_path.name + ) + + conv_result: ConversionResult = converter.convert(webp_path) + + doc: DoclingDocument = conv_result.document + + pred_md: str = doc.export_to_markdown() + assert verify_export(pred_md, str(gt_path) + ".md"), "export to md" + + pred_itxt: str = doc._export_to_indented_text( + max_text_len=70, explicit_tables=False + ) + assert verify_export(pred_itxt, str(gt_path) + ".itxt"), ( + "export to indented-text" + ) + + assert verify_document(doc, str(gt_path) + ".json", GENERATE), ( + "document document" + ) diff --git a/tests/verify_utils.py b/tests/verify_utils.py index 1a913c2c..ca26b9b9 100644 --- a/tests/verify_utils.py +++ b/tests/verify_utils.py @@ -456,7 +456,7 @@ def verify_conversion_result_v2( def verify_document(pred_doc: DoclingDocument, gtfile: str, generate: bool = False): if not os.path.exists(gtfile) or generate: with open(gtfile, "w") as fw: - json.dump(pred_doc.export_to_dict(), fw, indent=2) + json.dump(pred_doc.export_to_dict(), fw, ensure_ascii=False, indent=2) return True else: