code: def test_properties(image_files: Path):
      file: PluginV3
  
      # test a flat image (RGB PNG)
      with iio.imopen(
          image_files / "chelsea.png", "r", plugin="pillow"
      ) as file:
          properties = file.properties()
  
      assert properties.shape == (300, 451, 3)
      assert properties.dtype == np.uint8
      assert properties.n_images is None
  
      # test a ndimage (GIF)
      properties = iio.improps(
          image_files / "newtonscradle.gif", plugin="pillow"
      )
      assert properties.shape == (36, 150, 200, 3)
      assert properties.dtype == np.uint8
      assert properties.n_images == 36
      assert properties.is_batch is True
  
      # test a flat gray image
      properties = iio.improps(
          image_files / "text.png", plugin="pillow", index=0
      )
  
      assert properties.shape == (172, 448)
      assert properties.dtype == np.uint8
      assert properties.n_images is None
  
      # test an image format that doesn't have n_frames
      properties = iio.improps(
          image_files / "rommel.jpg", plugin="pillow"
      )
      assert properties.n_images is None
  
      properties = iio.improps(
          image_files / "rommel.jpg", plugin="pillow", index=...
      )
      assert properties.n_images == 1
  
imports: import io
  import os
  from pathlib import Path
  import imageio.v3
  import numpy
  import pytest
  from imageio.core.request import InitializationError, Request
  from imageio.core.v3_plugin_api import PluginV3
  from imageio.plugins.pillow import PillowPlugin
  from PIL import Image, ImageSequence, ImageOps, __version__
label_desc: Use image node_id 33 for calling a global function with example usage: test_properties(image_files) without return types