code: def test_check_image_groups():
      workspace = make_workspace(numpy.zeros((100, 100)))
      image_set_list = workspace.image_set_list
      image_set = image_set_list.get_image_set(0)
      for i in range(1, 5):
          image_set.add(
              "my_image%s" % i,
              cellprofiler_core.image.Image(numpy.zeros((100, 100))),
          )
  
      q = workspace.module
      # Set my_image1 and my_image2 settings: Saturation only
      q.image_groups[0].image_names.value = "my_image1, my_image2"
      q.image_groups[0].include_image_scalings.value = False
      q.image_groups[0].check_blur.value = False
      q.image_groups[0].check_saturation.value = True
      q.image_groups[0].check_intensity.value = False
      q.image_groups[0].calculate_threshold.value = False
  
      # Set my_image3 and my_image4's settings: Blur only
      q.add_image_group()
      q.image_groups[1].image_names.value = "my_image3, my_image4"
      q.image_groups[1].include_image_scalings.value = False
      q.image_groups[1].check_blur.value = True
      q.image_groups[1].check_saturation.value = False
      q.image_groups[1].check_intensity.value = False
      q.image_groups[1].calculate_threshold.value = False
      q.run(workspace)
      m = workspace.measurements
  
      # Make sure each group of settings has (and *doesn't* have) the correct measures
      for i in [1, 2]:
          for feature_name in (
              ("ImageQuality_PercentMaximal_my_image%s" % i),
              ("ImageQuality_PercentMinimal_my_image%s" % i),
          ):
              assert m.has_current_measurements(
                  "Image", feature_name
              ), ("Missing feature %s" % feature_name)
  
          for feature_name in (
              ("ImageQuality_FocusScore_my_image%s" % i),
              ("ImageQuality_LocalFocusScore_my_image%s_20" % i),
              ("ImageQuality_PowerLogLogSlope_my_image%s" % i),
          ):
              assert not m.has_current_measurements(
                  "Image", feature_name
              ), ("Erroneously present feature %s" % feature_name)
      for i in [3, 4]:
          for feature_name in (
              ("ImageQuality_FocusScore_my_image%s" % i),
              ("ImageQuality_LocalFocusScore_my_image%s_20" % i),
              ("ImageQuality_PowerLogLogSlope_my_image%s" % i),
          ):
              assert m.has_current_measurements(
                  "Image", feature_name
              ), ("Missing feature %s" % feature_name)
          for feature_name in (
              ("ImageQuality_PercentMaximal_my_image%s" % i),
              ("ImageQuality_PercentMinimal_my_image%s" % i),
          ):
              assert not m.has_current_measurements(
                  "Image", feature_name
              ), ("Erroneously present feature %s" % feature_name)
  
imports: import io
  import centrosome.threshold
  import numpy
  import cellprofiler_core.image
  import cellprofiler_core.measurement
  from cellprofiler_core.constants.measurement import COLTYPE_FLOAT, EXPERIMENT
  from cellprofiler_core.constants.module._identify import O_FOREGROUND, O_THREE_CLASS, O_WEIGHTED_VARIANCE, O_TWO_CLASS, O_ENTROPY, O_BACKGROUND
  import cellprofiler.modules.measureimagequality
  import cellprofiler_core.modules.namesandtypes
  import cellprofiler.modules.smooth
  import cellprofiler_core.object
  import cellprofiler_core.pipeline
  import cellprofiler_core.workspace
  import tests.frontend.modules
label_desc: Use image node_id 21 for calling a global function with example usage: test_check_image_groups() without return types