docstr: `st.experimental_singleton` is effectively an alias for `st.cache_resource`, and we
  support both APIs while experimental_singleton is being deprecated.
code: def test_multiple_api_names(self):
      """`st.experimental_singleton` is effectively an alias for `st.cache_resource`, and we
      support both APIs while experimental_singleton is being deprecated.
      """
      num_calls = [0]
  
      def foo():
          num_calls[0] += 1
          return 42
  
      # Annotate a function with both `cache_resource` and `experimental_singleton`.
      cache_resource_func = st.cache_resource(foo)
      singleton_func = st.experimental_singleton(foo)
  
      # Call both versions of the function and assert the results.
      self.assertEqual(42, cache_resource_func())
      self.assertEqual(42, singleton_func())
  
      # Because these decorators share the same cache, calling both functions
      # results in just a single call to the decorated function.
      self.assertEqual(1, num_calls[0])
  
imports: import threading
  import unittest
  from typing import Any, List
  from unittest.mock import Mock, patch
  from parameterized import parameterized
  import streamlit
  from streamlit.runtime.caching import cache_resource_api, get_resource_cache_stats_provider
  from streamlit.runtime.caching.cache_type import CacheType
  from streamlit.runtime.caching.cached_message_replay import MultiCacheResults
  from streamlit.runtime.caching.hashing import UserHashError
  from streamlit.runtime.scriptrunner import add_script_run_ctx
  from streamlit.runtime.stats import CacheStat
  from streamlit.vendor.pympler.asizeof import asizeof
  from tests.streamlit.runtime.caching.common_cache_test import as_cached_result
  from tests.testutil import create_mock_script_run_ctx
label_desc: Use image node_id 4 for calling the CacheResourceTest obj's underlying member method code with example usage: obj.test_multiple_api_names() and returns: int