import unittest

import numpy as np

from transformers.testing_utils import require_torch, require_vision
from transformers.utils import is_torch_available, is_vision_available

from ...test_image_processing_common import ImageProcessingSavingTestMixin, prepare_image_inputs


if is_torch_available():
     import torch

if is_vision_available():
     from PIL import Image

     from transformers import ConvNextImageProcessor







class 					UpperCAmelCase_				(							unittest.TestCase    ):




    def __init__(					self  :   str      ,      lowerCAmelCase  :   int      ,      lowerCAmelCase  :   Dict=7      ,      lowerCAmelCase  :   Dict=3      ,      lowerCAmelCase  :   int=18      ,      lowerCAmelCase  :   Any=30      ,      lowerCAmelCase  :   str=400      ,      lowerCAmelCase  :   Tuple=True      ,      lowerCAmelCase  :   List[Any]=None      ,      lowerCAmelCase  :   Optional[Any]=0.875      ,      lowerCAmelCase  :   Tuple=True      ,      lowerCAmelCase  :   Tuple=[0.5, 0.5, 0.5]      ,      lowerCAmelCase  :   List[Any]=[0.5, 0.5, 0.5]      ,      )	-> List[str]:
      a__     		=     size if size is not None else {'''shortest_edge''': 20}
      a__     		=     parent
      a__     		=     batch_size
      a__     		=     num_channels
      a__     		=     image_size
      a__     		=     min_resolution
      a__     		=     max_resolution
      a__     		=     do_resize
      a__     		=     size
      a__     		=     crop_pct
      a__     		=     do_normalize
      a__     		=     image_mean
      a__     		=     image_std




    def 						__lowerCamelCase (					self  :   List[Any]   )	-> str:
      return {
          "image_mean": self.image_mean,
          "image_std": self.image_std,
          "do_normalize": self.do_normalize,
          "do_resize": self.do_resize,
          "size": self.size,
          "crop_pct": self.crop_pct,
      }







@require_torch
@require_vision
class 					UpperCAmelCase_				(							__UpperCAmelCase     ,     unittest.TestCase    ):
    UpperCAmelCase_			:       Tuple						 =							ConvNextImageProcessor if is_vision_available() else None




    def 						__lowerCamelCase (					self  :   Any   )	-> Dict:
      a__     		=     ConvNextImageProcessingTester(self   )




    @property
    def 						__lowerCamelCase (					self  :   int   )	-> Dict:
      return self.image_processor_tester.prepare_image_processor_dict()




    def 						__lowerCamelCase (					self  :   List[Any]   )	-> str:
      a__     		=     self.image_processing_class(**self.image_processor_dict   )
      self.assertTrue(hasattr(lowercase_      ,      "do_resize"   )   )
      self.assertTrue(hasattr(lowercase_      ,      "size"   )   )
      self.assertTrue(hasattr(lowercase_      ,      "crop_pct"   )   )
      self.assertTrue(hasattr(lowercase_      ,      "do_normalize"   )   )
      self.assertTrue(hasattr(lowercase_      ,      "image_mean"   )   )
      self.assertTrue(hasattr(lowercase_      ,      "image_std"   )   )




    def 						__lowerCamelCase (					self  :   Optional[Any]   )	-> List[Any]:
      a__     		=     self.image_processing_class.from_dict(self.image_processor_dict   )
      self.assertEqual(image_processor.size      ,      {"shortest_edge": 20}   )

      a__     		=     self.image_processing_class.from_dict(self.image_processor_dict      ,      size=42   )
      self.assertEqual(image_processor.size      ,      {"shortest_edge": 42}   )




    def 						__lowerCamelCase (					self  :   str   )	-> List[Any]:
      pass




    def 						__lowerCamelCase (					self  :   str   )	-> int:
      a__     		=     self.image_processing_class(**self.image_processor_dict   )
      # create random PIL images
      a__     		=     prepare_image_inputs(self.image_processor_tester      ,      equal_resolution=lowercase_   )
      for image in image_inputs:
        self.assertIsInstance(lowercase_      ,      Image.Image   )

      # Test not batched input
      a__     		=     image_processing(image_inputs[0]      ,      return_tensors="pt"   ).pixel_values
      self.assertEqual(
          encoded_images.shape      ,      (
              1,
              self.image_processor_tester.num_channels,
              self.image_processor_tester.size["shortest_edge"],
              self.image_processor_tester.size["shortest_edge"],
          )      ,      )

      # Test batched
      a__     		=     image_processing(lowercase_      ,      return_tensors="pt"   ).pixel_values
      self.assertEqual(
          encoded_images.shape      ,      (
              self.image_processor_tester.batch_size,
              self.image_processor_tester.num_channels,
              self.image_processor_tester.size["shortest_edge"],
              self.image_processor_tester.size["shortest_edge"],
          )      ,      )




    def 						__lowerCamelCase (					self  :   List[str]   )	-> Dict:
      a__     		=     self.image_processing_class(**self.image_processor_dict   )
      # create random numpy tensors
      a__     		=     prepare_image_inputs(self.image_processor_tester      ,      equal_resolution=lowercase_      ,      numpify=lowercase_   )
      for image in image_inputs:
        self.assertIsInstance(lowercase_      ,      np.ndarray   )

      # Test not batched input
      a__     		=     image_processing(image_inputs[0]      ,      return_tensors="pt"   ).pixel_values
      self.assertEqual(
          encoded_images.shape      ,      (
              1,
              self.image_processor_tester.num_channels,
              self.image_processor_tester.size["shortest_edge"],
              self.image_processor_tester.size["shortest_edge"],
          )      ,      )

      # Test batched
      a__     		=     image_processing(lowercase_      ,      return_tensors="pt"   ).pixel_values
      self.assertEqual(
          encoded_images.shape      ,      (
              self.image_processor_tester.batch_size,
              self.image_processor_tester.num_channels,
              self.image_processor_tester.size["shortest_edge"],
              self.image_processor_tester.size["shortest_edge"],
          )      ,      )




    def 						__lowerCamelCase (					self  :   Dict   )	-> Union[str, Any]:
      a__     		=     self.image_processing_class(**self.image_processor_dict   )
      # create random PyTorch tensors
      a__     		=     prepare_image_inputs(self.image_processor_tester      ,      equal_resolution=lowercase_      ,      torchify=lowercase_   )
      for image in image_inputs:
        self.assertIsInstance(lowercase_      ,      torch.Tensor   )

      # Test not batched input
      a__     		=     image_processing(image_inputs[0]      ,      return_tensors="pt"   ).pixel_values
      self.assertEqual(
          encoded_images.shape      ,      (
              1,
              self.image_processor_tester.num_channels,
              self.image_processor_tester.size["shortest_edge"],
              self.image_processor_tester.size["shortest_edge"],
          )      ,      )

      # Test batched
      a__     		=     image_processing(lowercase_      ,      return_tensors="pt"   ).pixel_values
      self.assertEqual(
          encoded_images.shape      ,      (
              self.image_processor_tester.batch_size,
              self.image_processor_tester.num_channels,
              self.image_processor_tester.size["shortest_edge"],
              self.image_processor_tester.size["shortest_edge"],
          )      ,      )



_SCREAMING_SNAKE_CASE   						=    [0.485, 0.456, 0.406]
_SCREAMING_SNAKE_CASE   						=    [0.229, 0.224, 0.225]
_SCREAMING_SNAKE_CASE   						=    [0.5, 0.5, 0.5]
_SCREAMING_SNAKE_CASE   						=    [0.5, 0.5, 0.5]
_SCREAMING_SNAKE_CASE   						=    [0.48145466, 0.4578275, 0.40821073]
_SCREAMING_SNAKE_CASE   						=    [0.26862954, 0.26130258, 0.27577711]

