docstr: Warn user re: Test mode 
docstr_tok: ["Warn","user","re",":","Test","mode"]
code: def validate_module_warnings(self, pipeline):
      """Warn user re: Test mode"""
      if pipeline.test_mode:
          raise ValidationError(
              "ExportToSpreadsheet will not produce output in Test Mode",
              self.directory,
          )
  
      """Warn user that changing the extension may cause Excel to stuff everything into one column"""
      if not self.wants_everything.value:
          all_extensions = [
              os.path.splitext(group.file_name.value)[1]
              for group in self.object_groups
          ]
          is_valid_extension = [
              not group.wants_automatic_file_name.value
              and (
                  (
                      extension == ".csv"
                      and self.delimiter == DELIMITER_COMMA
                  )
                  or (
                      extension == ".txt"
                      and self.delimiter == DELIMITER_TAB
                  )
              )
              for (extension, group) in zip(
                  all_extensions, self.object_groups
              )
          ]
          if not all(is_valid_extension):
              raise ValidationError(
                  "To avoid formatting problems in Excel, use the extension .csv for "
                  "comma-delimited files and .txt for tab-delimited..",
                  self.object_groups[
                      is_valid_extension.index(False)
                  ].file_name,
              )
  
imports: import base64
  import csv
  import logging
  import os
  import numpy
  from cellprofiler_core.constants.image import C_MD5_DIGEST, C_SCALING, C_HEIGHT, C_WIDTH
  from cellprofiler_core.constants.measurement import EXPERIMENT, IMAGE, AGG_MEAN, AGG_MEDIAN, AGG_STD_DEV, C_URL, C_PATH_NAME, C_FILE_NAME, NEIGHBORS, R_FIRST_IMAGE_NUMBER, R_SECOND_IMAGE_NUMBER, R_FIRST_OBJECT_NUMBER, R_SECOND_OBJECT_NUMBER
  from cellprofiler_core.constants.module import IO_FOLDER_CHOICE_HELP_TEXT, IO_WITH_METADATA_HELP_TEXT, USING_METADATA_HELP_REF, USING_METADATA_TAGS_REF
  from cellprofiler_core.constants.pipeline import EXIT_STATUS
  from cellprofiler_core.measurement import Measurements
  from cellprofiler_core.module import Module
  from cellprofiler_core.preferences import ABSOLUTE_FOLDER_NAME
  from cellprofiler_core.preferences import DEFAULT_INPUT_FOLDER_NAME
  from cellprofiler_core.preferences import DEFAULT_INPUT_SUBFOLDER_NAME
  from cellprofiler_core.preferences import DEFAULT_OUTPUT_FOLDER_NAME
  from cellprofiler_core.preferences import DEFAULT_OUTPUT_SUBFOLDER_NAME
  from cellprofiler_core.preferences import get_headless
  from cellprofiler_core.setting import Binary
  from cellprofiler_core.setting import Divider
  from cellprofiler_core.setting import Measurement
  from cellprofiler_core.setting import SettingsGroup
  from cellprofiler_core.setting import ValidationError
  from cellprofiler_core.setting.choice import CustomChoice, Choice
  from cellprofiler_core.setting.do_something import DoSomething, RemoveSettingButton
  from cellprofiler_core.setting.multichoice import MeasurementMultiChoice
  from cellprofiler_core.setting.subscriber import ImageSubscriber, LabelSubscriber
  from cellprofiler_core.setting.text import Directory, Text
  from cellprofiler_core.utilities.core.modules.load_data import is_file_name_feature, is_path_name_feature
  from cellprofiler_core.utilities.measurement import find_metadata_tokens, get_agg_measurement_name
  from cellprofiler.gui.help.content import MEASUREMENT_NAMING_HELP
label_desc: Use image node_id 7 for calling the ExportToSpreadsheet obj's underlying member method code with example usage: obj.validate_module_warnings(pipeline) without return types