code: def test_show(self, func_names, valid):
      base_viz = CustomBaseVisualization()
  
      batch = {func_name: "test" for func_name in func_names}
  
      if not valid:
          with pytest.raises(
              ValueError, match="Invalid function names"
          ):
              base_viz.show(batch, RunningStage.TRAINING, func_names)
      else:
          base_viz.show(batch, RunningStage.TRAINING, func_names)
          for func_name in func_names:
              if hasattr(base_viz, f"show_{func_name}_called"):
                  assert getattr(base_viz, f"show_{func_name}_called")
  
imports: from pathlib import Path
  from typing import Any, List, Sequence, Tuple
  import numpy
  import pytest
  import torch
  from flash.core.data.base_viz import BaseVisualization
  from flash.core.data.io.input import DataKeys
  from flash.core.data.utils import _CALLBACK_FUNCS
  from flash.core.utilities.imports import _PIL_AVAILABLE, _TOPIC_IMAGE_AVAILABLE
  from flash.core.utilities.stages import RunningStage
  from flash.image import ImageClassificationData
  from pytorch_lightning import seed_everything
  from torch import Tensor
label_desc: Use image node_id 2 for calling the TestBaseViz obj's underlying member method code with example usage: obj.test_show(func_names, valid) without return types