code: def test_custom_run(self):
      dataset = fo.Dataset()
  
      self.assertFalse(dataset.has_runs)
      self.assertListEqual(dataset.list_runs(), [])
  
      config = dataset.init_run()
      config.foo = "bar"
      config.spam = "eggs"
      dataset.register_run("custom", config)
  
      results = dataset.init_run_results("custom")
      results.foo = "bar"
      results.spam = "eggs"
      dataset.save_run_results("custom", results)
  
      self.assertTrue(dataset.has_runs)
      self.assertListEqual(dataset.list_runs(), ["custom"])
  
      del config
      del results
      dataset.clear_cache()
  
      info = dataset.get_run_info("custom")
      config = info.config
      self.assertEqual(config.foo, "bar")
      self.assertEqual(config.spam, "eggs")
  
      delattr(config, "spam")
      config.foo = "eggs"
  
      dataset.update_run_config("custom", config)
  
      del config
      dataset.clear_cache()
  
      info = dataset.get_run_info("custom")
      config = info.config
      self.assertEqual(config.foo, "eggs")
      with self.assertRaises(AttributeError):
          _ = config.spam
  
      results = dataset.load_run_results("custom")
      self.assertEqual(results.foo, "bar")
      self.assertEqual(results.spam, "eggs")
  
      delattr(results, "spam")
      results.foo = "eggs"
  
      with self.assertRaises(ValueError):
          dataset.save_run_results("custom", results, overwrite=False)
  
      dataset.save_run_results("custom", results, overwrite=True)
  
      del results
      dataset.clear_cache()
  
      results = dataset.load_run_results("custom")
      self.assertEqual(results.foo, "eggs")
      with self.assertRaises(AttributeError):
          _ = results.spam
  
      dataset2 = dataset.clone()
  
      self.assertTrue(dataset2.has_runs)
      self.assertListEqual(dataset2.list_runs(), ["custom"])
  
      dataset.delete_run("custom")
  
      self.assertFalse(dataset.has_runs)
      self.assertListEqual(dataset.list_runs(), [])
  
      dataset2.rename_run("custom", "still_custom")
      dataset2.clear_cache()
  
      self.assertTrue(dataset2.has_runs)
      self.assertListEqual(dataset2.list_runs(), ["still_custom"])
  
      info = dataset2.get_run_info("still_custom")
      results = dataset2.load_run_results("still_custom")
  
      dataset2.delete_runs()
  
      self.assertFalse(dataset2.has_runs)
      self.assertListEqual(dataset2.list_runs(), [])
  
imports: import unittest
  import fiftyone
  from decorators import drop_datasets
label_desc: Use image node_id 1 for calling the RunTests obj's underlying member method code with example usage: obj.test_custom_run() without return types