code: def test_empty(self):
      mock_data = Data()
      mock_data.pos = torch.zeros((batch_size, num_points, 3))
      mock_data.y = torch.zeros((batch_size, num_points, 1))
      mock_data.pred = torch.zeros((batch_size, num_points, 1))
      data = {}
  
      self.run_path = os.path.join(DIR, "test_viz")
      if not os.path.exists(self.run_path):
          os.makedirs(self.run_path)
  
      mock_num_batches = {"train": 9, "test": 3, "val": 0}
      config = OmegaConf.load(
          os.path.join(DIR, "test_config/viz/viz_config_indices.yaml")
      )
      visualizer = Visualizer(
          config.visualization,
          mock_num_batches,
          batch_size,
          self.run_path,
          None,
      )
  
      for epoch in range(epochs):
          run(9, visualizer, epoch, "train", data)
          run(3, visualizer, epoch, "test", data)
          run(2, visualizer, epoch, "val", data)
  
      self.assertFalse(
          os.path.exists(os.path.join(self.run_path, "viz"))
      )
      shutil.rmtree(self.run_path)
  
file_path: torch-points3d/test/test_visualization.py
imports: import unittest
  import os
  import shutil
  import sys
  from omegaconf import OmegaConf
  import torch
  from torch_geometric.data import Data
  from torch_points3d.visualization import Visualizer
label_desc: Use image node_id 1 for calling the TestVisualizer obj's underlying member method code with example usage: obj.test_empty() without return types