






import unittest

from transformers import MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING, AutoTokenizer, is_vision_available
from transformers.pipelines import pipeline
from transformers.pipelines.document_question_answering import apply_tesseract
from transformers.testing_utils import (
    is_pipeline_test,
    nested_simplify,
    require_detectrona,
    require_pytesseract,
    require_tf,
    require_torch,
    require_vision,
    slow,
)

from .test_pipelines_common import ANY


if is_vision_available():
   from PIL import Image

   from transformers.image_utils import load_image
else:




   class     _lowerCAmelCase:





          """simple docstring"""







          @staticmethod
          def       _a   ( *_lowerCamelCase  ,      **_lowerCamelCase							):
            pass







   def   snake_case (UpperCAmelCase__  )	->    List[Any]:
     return None


# This is a pinned image from a specific revision of a document question answering space, hosted by HuggingFace,
# so we can expect it to be available.
A_		:		Any		     =			(
    'https://huggingface.co/spaces/impira/docquery/resolve/2f6c96314dc84dfda62d40de9da55f2f5165d403/invoice.png'
)




@is_pipeline_test
@require_torch
@require_vision
class     _lowerCAmelCase(	unittest.TestCase ):





       """simple docstring"""







       a    :		Union[str, Any]									=MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING





       @require_pytesseract
       @require_vision
       def       _a   ( self  ,      _lowerCamelCase  ,      _lowerCamelCase  ,      _lowerCamelCase							):
         UpperCamelCase_: List[Any]   				=    pipeline(
             'document-question-answering'  ,      model=_lowerCamelCase  ,      tokenizer=_lowerCamelCase  ,      image_processor=_lowerCamelCase							)

         UpperCamelCase_: List[Any]   				=    INVOICE_URL
         UpperCamelCase_: Tuple   				=    list(zip(*apply_tesseract(load_image(_lowerCamelCase							)  ,      _lowerCamelCase  ,      ''							)							)							)
         UpperCamelCase_: int   				=    'What is the placebo?'
         UpperCamelCase_: List[Any]   				=    [
             {
                 'image': load_image(_lowerCamelCase							),
                 'question': question,
             },
             {
                 'image': image,
                 'question': question,
             },
             {
                 'image': image,
                 'question': question,
                 'word_boxes': word_boxes,
             },
         ]
         return dqa_pipeline, examples





       def       _a   ( self  ,      _lowerCamelCase  ,      _lowerCamelCase							):
         UpperCamelCase_: Optional[Any]   				=    dqa_pipeline(_lowerCamelCase  ,      top_k=2							)
         self.assertEqual(
             _lowerCamelCase  ,      [
                 [
                     {'score': ANY(_lowerCamelCase							), 'answer': ANY(_lowerCamelCase							), 'start': ANY(_lowerCamelCase							), 'end': ANY(_lowerCamelCase							)},
                     {'score': ANY(_lowerCamelCase							), 'answer': ANY(_lowerCamelCase							), 'start': ANY(_lowerCamelCase							), 'end': ANY(_lowerCamelCase							)},
                 ]
             ]
             * 3  ,      )





       @require_torch
       @require_detectrona
       @require_pytesseract
       def       _a   ( self							):
         UpperCamelCase_: Optional[Any]   				=    pipeline('document-question-answering'  ,      model='hf-internal-testing/tiny-random-layoutlmv2'							)
         UpperCamelCase_: Tuple   				=    INVOICE_URL
         UpperCamelCase_: Optional[Any]   				=    'How many cats are there?'

         UpperCamelCase_: str   				=    [
             {'score': 0.0_0_0_1, 'answer': 'oy 2312/2019', 'start': 3_8, 'end': 3_9},
             {'score': 0.0_0_0_1, 'answer': 'oy 2312/2019 DUE', 'start': 3_8, 'end': 4_0},
         ]
         UpperCamelCase_: Dict   				=    dqa_pipeline(image=_lowerCamelCase  ,      question=_lowerCamelCase  ,      top_k=2							)
         self.assertEqual(nested_simplify(_lowerCamelCase  ,      decimals=4							)  ,      _lowerCamelCase							)

         UpperCamelCase_: List[Any]   				=    dqa_pipeline({'image': image, 'question': question}  ,      top_k=2							)
         self.assertEqual(nested_simplify(_lowerCamelCase  ,      decimals=4							)  ,      _lowerCamelCase							)

         # This image does not detect ANY text in it, meaning layoutlmv2 should fail.
         # Empty answer probably
         UpperCamelCase_: List[Any]   				=    './tests/fixtures/tests_samples/COCO/000000039769.png'
         UpperCamelCase_: int   				=    dqa_pipeline(image=_lowerCamelCase  ,      question=_lowerCamelCase  ,      top_k=2							)
         self.assertEqual(_lowerCamelCase  ,      []							)

         # We can optionnally pass directly the words and bounding boxes
         UpperCamelCase_: Optional[int]   				=    './tests/fixtures/tests_samples/COCO/000000039769.png'
         UpperCamelCase_: Any   				=    []
         UpperCamelCase_: Union[str, Any]   				=    []
         UpperCamelCase_: str   				=    dqa_pipeline(image=_lowerCamelCase  ,      question=_lowerCamelCase  ,      words=_lowerCamelCase  ,      boxes=_lowerCamelCase  ,      top_k=2							)
         self.assertEqual(_lowerCamelCase  ,      []							)





       @slow
       @require_torch
       @require_detectrona
       @require_pytesseract
       def       _a   ( self							):
         UpperCamelCase_: Any   				=    pipeline(
             'document-question-answering'  ,      model='tiennvcs/layoutlmv2-base-uncased-finetuned-docvqa'  ,      revision='9977165'  ,      )
         UpperCamelCase_: List[str]   				=    INVOICE_URL
         UpperCamelCase_: Union[str, Any]   				=    'What is the invoice number?'

         UpperCamelCase_: Optional[int]   				=    dqa_pipeline(image=_lowerCamelCase  ,      question=_lowerCamelCase  ,      top_k=2							)
         self.assertEqual(
             nested_simplify(_lowerCamelCase  ,      decimals=4							)  ,      [
                 {'score': 0.9_9_4_4, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
                 {'score': 0.0_0_0_9, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
             ]  ,      )

         UpperCamelCase_: str   				=    dqa_pipeline({'image': image, 'question': question}  ,      top_k=2							)
         self.assertEqual(
             nested_simplify(_lowerCamelCase  ,      decimals=4							)  ,      [
                 {'score': 0.9_9_4_4, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
                 {'score': 0.0_0_0_9, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
             ]  ,      )

         UpperCamelCase_: Any   				=    dqa_pipeline(
             [{'image': image, 'question': question}, {'image': image, 'question': question}]  ,      top_k=2							)
         self.assertEqual(
             nested_simplify(_lowerCamelCase  ,      decimals=4							)  ,      [
                 [
                     {'score': 0.9_9_4_4, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
                     {'score': 0.0_0_0_9, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
                 ],
             ]
             * 2  ,      )





       @slow
       @require_torch
       @require_detectrona
       @require_pytesseract
       def       _a   ( self							):
         UpperCamelCase_: Optional[int]   				=    pipeline(
             'document-question-answering'  ,      model='tiennvcs/layoutlmv2-base-uncased-finetuned-docvqa'  ,      revision='9977165'  ,      max_seq_len=5_0  ,      )
         UpperCamelCase_: Union[str, Any]   				=    INVOICE_URL
         UpperCamelCase_: List[str]   				=    'What is the invoice number?'

         UpperCamelCase_: List[Any]   				=    dqa_pipeline(image=_lowerCamelCase  ,      question=_lowerCamelCase  ,      top_k=2							)
         self.assertEqual(
             nested_simplify(_lowerCamelCase  ,      decimals=4							)  ,      [
                 {'score': 0.9_9_7_4, 'answer': '1110212019', 'start': 2_3, 'end': 2_3},
                 {'score': 0.9_9_4_8, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
             ]  ,      )

         UpperCamelCase_: Optional[int]   				=    dqa_pipeline({'image': image, 'question': question}  ,      top_k=2							)
         self.assertEqual(
             nested_simplify(_lowerCamelCase  ,      decimals=4							)  ,      [
                 {'score': 0.9_9_7_4, 'answer': '1110212019', 'start': 2_3, 'end': 2_3},
                 {'score': 0.9_9_4_8, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
             ]  ,      )

         UpperCamelCase_: List[str]   				=    dqa_pipeline(
             [{'image': image, 'question': question}, {'image': image, 'question': question}]  ,      top_k=2							)
         self.assertEqual(
             nested_simplify(_lowerCamelCase  ,      decimals=4							)  ,      [
                 [
                     {'score': 0.9_9_7_4, 'answer': '1110212019', 'start': 2_3, 'end': 2_3},
                     {'score': 0.9_9_4_8, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
                 ]
             ]
             * 2  ,      )





       @slow
       @require_torch
       @require_pytesseract
       @require_vision
       def       _a   ( self							):
         UpperCamelCase_: List[Any]   				=    AutoTokenizer.from_pretrained(
             'impira/layoutlm-document-qa'  ,      revision='3dc6de3'  ,      add_prefix_space=_lowerCamelCase							)
         UpperCamelCase_: Optional[int]   				=    pipeline(
             'document-question-answering'  ,      model='impira/layoutlm-document-qa'  ,      tokenizer=_lowerCamelCase  ,      revision='3dc6de3'  ,      )
         UpperCamelCase_: Optional[Any]   				=    INVOICE_URL
         UpperCamelCase_: Tuple   				=    'What is the invoice number?'

         UpperCamelCase_: Dict   				=    dqa_pipeline(image=_lowerCamelCase  ,      question=_lowerCamelCase  ,      top_k=2							)
         self.assertEqual(
             nested_simplify(_lowerCamelCase  ,      decimals=4							)  ,      [
                 {'score': 0.4_2_5_1, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
                 {'score': 0.0_8_1_9, 'answer': '1110212019', 'start': 2_3, 'end': 2_3},
             ]  ,      )

         UpperCamelCase_: Tuple   				=    dqa_pipeline({'image': image, 'question': question}  ,      top_k=2							)
         self.assertEqual(
             nested_simplify(_lowerCamelCase  ,      decimals=4							)  ,      [
                 {'score': 0.4_2_5_1, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
                 {'score': 0.0_8_1_9, 'answer': '1110212019', 'start': 2_3, 'end': 2_3},
             ]  ,      )

         UpperCamelCase_: Tuple   				=    dqa_pipeline(
             [{'image': image, 'question': question}, {'image': image, 'question': question}]  ,      top_k=2							)
         self.assertEqual(
             nested_simplify(_lowerCamelCase  ,      decimals=4							)  ,      [
                 [
                     {'score': 0.4_2_5_1, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
                     {'score': 0.0_8_1_9, 'answer': '1110212019', 'start': 2_3, 'end': 2_3},
                 ]
             ]
             * 2  ,      )

         UpperCamelCase_: str   				=    list(zip(*apply_tesseract(load_image(_lowerCamelCase							)  ,      _lowerCamelCase  ,      ''							)							)							)

         # This model should also work if `image` is set to None
         UpperCamelCase_: List[str]   				=    dqa_pipeline({'image': None, 'word_boxes': word_boxes, 'question': question}  ,      top_k=2							)
         self.assertEqual(
             nested_simplify(_lowerCamelCase  ,      decimals=4							)  ,      [
                 {'score': 0.4_2_5_1, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
                 {'score': 0.0_8_1_9, 'answer': '1110212019', 'start': 2_3, 'end': 2_3},
             ]  ,      )





       @slow
       @require_torch
       @require_pytesseract
       @require_vision
       def       _a   ( self							):
         UpperCamelCase_: int   				=    AutoTokenizer.from_pretrained(
             'impira/layoutlm-document-qa'  ,      revision='3dc6de3'  ,      add_prefix_space=_lowerCamelCase							)
         UpperCamelCase_: List[Any]   				=    pipeline(
             'document-question-answering'  ,      model='impira/layoutlm-document-qa'  ,      tokenizer=_lowerCamelCase  ,      revision='3dc6de3'  ,      max_seq_len=5_0  ,      )
         UpperCamelCase_: List[str]   				=    INVOICE_URL
         UpperCamelCase_: int   				=    'What is the invoice number?'

         UpperCamelCase_: List[Any]   				=    dqa_pipeline(image=_lowerCamelCase  ,      question=_lowerCamelCase  ,      top_k=2							)
         self.assertEqual(
             nested_simplify(_lowerCamelCase  ,      decimals=4							)  ,      [
                 {'score': 0.9_9_9_9, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
                 {'score': 0.9_9_9_8, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
             ]  ,      )

         UpperCamelCase_: str   				=    dqa_pipeline(
             [{'image': image, 'question': question}, {'image': image, 'question': question}]  ,      top_k=2							)
         self.assertEqual(
             nested_simplify(_lowerCamelCase  ,      decimals=4							)  ,      [
                 [
                     {'score': 0.9_9_9_9, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
                     {'score': 0.9_9_9_8, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
                 ]
             ]
             * 2  ,      )

         UpperCamelCase_: Tuple   				=    list(zip(*apply_tesseract(load_image(_lowerCamelCase							)  ,      _lowerCamelCase  ,      ''							)							)							)

         # This model should also work if `image` is set to None
         UpperCamelCase_: Any   				=    dqa_pipeline({'image': None, 'word_boxes': word_boxes, 'question': question}  ,      top_k=2							)
         self.assertEqual(
             nested_simplify(_lowerCamelCase  ,      decimals=4							)  ,      [
                 {'score': 0.9_9_9_9, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
                 {'score': 0.9_9_9_8, 'answer': 'us-001', 'start': 1_6, 'end': 1_6},
             ]  ,      )





       @slow
       @require_torch
       def       _a   ( self							):
         UpperCamelCase_: Tuple   				=    pipeline(
             'document-question-answering'  ,      model='naver-clova-ix/donut-base-finetuned-docvqa'  ,      tokenizer=AutoTokenizer.from_pretrained('naver-clova-ix/donut-base-finetuned-docvqa'							)  ,      feature_extractor='naver-clova-ix/donut-base-finetuned-docvqa'  ,      )

         UpperCamelCase_: Optional[int]   				=    INVOICE_URL
         UpperCamelCase_: List[Any]   				=    'What is the invoice number?'
         UpperCamelCase_: Tuple   				=    dqa_pipeline(image=_lowerCamelCase  ,      question=_lowerCamelCase  ,      top_k=2							)
         self.assertEqual(nested_simplify(_lowerCamelCase  ,      decimals=4							)  ,      [{'answer': 'us-001'}]							)





       @require_tf
       @unittest.skip('Document question answering not implemented in TF'							)
       def       _a   ( self							):
         pass







import unittest

from transformers import RoFormerTokenizer, RoFormerTokenizerFast
from transformers.testing_utils import require_rjieba, require_tokenizers

from ...test_tokenization_common import TokenizerTesterMixin




@require_rjieba
@require_tokenizers
class     _lowerCAmelCase(	UpperCAmelCase_							,     unittest.TestCase ):





       """simple docstring"""







       a    :		Optional[int]									=RoFormerTokenizer
       a    :		int									=RoFormerTokenizerFast
       a    :		int									=True
       a    :		Optional[int]									=True





       def       _a   ( self							):
         super().setUp()





       def       _a   ( self  ,      **_lowerCamelCase							):
         return self.tokenizer_class.from_pretrained('junnyu/roformer_chinese_base'  ,      **_lowerCamelCase							)





       def       _a   ( self  ,      **_lowerCamelCase							):
         return self.rust_tokenizer_class.from_pretrained('junnyu/roformer_chinese_base'  ,      **_lowerCamelCase							)





       def       _a   ( self							):
         UpperCamelCase_: Optional[int]   				=    '永和服装饰品有限公司,今天天气非常好'
         UpperCamelCase_: Any   				=    '永和 服装 饰品 有限公司 , 今 天 天 气 非常 好'
         return input_text, output_text





       def       _a   ( self							):
         UpperCamelCase_: int   				=    self.get_tokenizer()
         UpperCamelCase_				,UpperCamelCase_: int   				=    self.get_chinese_input_output_texts()
         UpperCamelCase_: Tuple   				=    tokenizer.tokenize(_lowerCamelCase							)

         self.assertListEqual(_lowerCamelCase  ,      output_text.split()							)

         UpperCamelCase_: Dict   				=    tokens + [tokenizer.unk_token]
         UpperCamelCase_: Dict   				=    [2_2_9_4_3, 2_1_3_3_2, 3_4_4_3_1, 4_5_9_0_4, 1_1_7, 3_0_6, 1_2_3_1, 1_2_3_1, 2_6_5_3, 3_3_9_9_4, 1_2_6_6, 1_0_0]
         self.assertListEqual(tokenizer.convert_tokens_to_ids(_lowerCamelCase							)  ,      _lowerCamelCase							)





       def       _a   ( self							):
         UpperCamelCase_: Optional[Any]   				=    self.get_rust_tokenizer()
         UpperCamelCase_				,UpperCamelCase_: Tuple   				=    self.get_chinese_input_output_texts()
         UpperCamelCase_: Optional[Any]   				=    tokenizer.tokenize(_lowerCamelCase							)
         self.assertListEqual(_lowerCamelCase  ,      output_text.split()							)
         UpperCamelCase_: str   				=    tokens + [tokenizer.unk_token]
         UpperCamelCase_: Optional[Any]   				=    [2_2_9_4_3, 2_1_3_3_2, 3_4_4_3_1, 4_5_9_0_4, 1_1_7, 3_0_6, 1_2_3_1, 1_2_3_1, 2_6_5_3, 3_3_9_9_4, 1_2_6_6, 1_0_0]
         self.assertListEqual(tokenizer.convert_tokens_to_ids(_lowerCamelCase							)  ,      _lowerCamelCase							)





       def       _a   ( self							):
         pass





       def       _a   ( self							):
         pass





       def       _a   ( self							):
         pass