code: def test_str(self) -> None:
      plan = ShardingPlan(
          {
              "ebc": EmbeddingModuleShardingPlan(
                  {
                      "user_id": ParameterSharding(
                          sharding_type="table_wise",
                          compute_kernel="dense",
                          ranks=[0],
                          sharding_spec=EnumerableShardingSpec(
                              [
                                  ShardMetadata(
                                      shard_offsets=[0, 0],
                                      shard_sizes=[4096, 32],
                                      placement="rank:0/cuda:0",
                                  ),
                              ]
                          ),
                      ),
                      "movie_id": ParameterSharding(
                          sharding_type="row_wise",
                          compute_kernel="dense",
                          ranks=[0, 1],
                          sharding_spec=EnumerableShardingSpec(
                              [
                                  ShardMetadata(
                                      shard_offsets=[0, 0],
                                      shard_sizes=[2048, 32],
                                      placement="rank:0/cuda:0",
                                  ),
                                  ShardMetadata(
                                      shard_offsets=[2048, 0],
                                      shard_sizes=[2048, 32],
                                      placement="rank:0/cuda:1",
                                  ),
                              ]
                          ),
                      ),
                  }
              )
          }
      )
      expected = """
  module: ebc
  
   param   | sharding type | compute kernel | ranks 
  -------- | ------------- | -------------- | ------
  user_id  | table_wise    | dense          | [0]   
  movie_id | row_wise      | dense          | [0, 1]
  
   param   | shard offsets | shard sizes |   placement  
  -------- | ------------- | ----------- | -------------
  user_id  | [0, 0]        | [4096, 32]  | rank:0/cuda:0
  movie_id | [0, 0]        | [2048, 32]  | rank:0/cuda:0
  movie_id | [2048, 0]     | [2048, 32]  | rank:0/cuda:1
  """
      self.assertEqual(expected.strip(), str(plan))
  
imports: import copy
  import unittest
  from typing import Any, Dict, List, Optional
  import hypothesis.strategies
  import torch
  from hypothesis import given, settings, Verbosity
  from torchrec import distributed
  from torchrec.distributed.sharding_plan import column_wise, construct_module_sharding_plan, data_parallel, EmbeddingBagCollectionSharder, EmbeddingCollectionSharder, FeatureProcessedEmbeddingBagCollectionSharder, FusedEmbeddingBagCollectionSharder, get_module_to_default_sharders, ManagedCollisionEmbeddingBagCollectionSharder, ManagedCollisionEmbeddingCollectionSharder, ParameterShardingGenerator, QuantEmbeddingBagCollectionSharder, QuantEmbeddingCollectionSharder, row_wise, table_row_wise, table_wise
  from torchrec.distributed.test_utils.multi_process import MultiProcessContext, MultiProcessTestBase
  from torchrec.distributed.test_utils.test_sharding import copy_state_dict
  from torchrec.distributed.types import EmbeddingModuleShardingPlan, EnumerableShardingSpec, ParameterSharding, ShardingEnv, ShardingPlan, ShardingType, ShardMetadata
  from torchrec.modules.embedding_configs import EmbeddingBagConfig
  from torchrec.modules.embedding_modules import EmbeddingBagCollection, EmbeddingCollection
  from torchrec.modules.fp_embedding_modules import FeatureProcessedEmbeddingBagCollection
  from torchrec.modules.fused_embedding_modules import FusedEmbeddingBagCollection
  from torchrec.modules.mc_embedding_modules import ManagedCollisionEmbeddingBagCollection, ManagedCollisionEmbeddingCollection
  from torchrec.quant.embedding_modules import EmbeddingBagCollection, EmbeddingCollection
  from torchrec.sparse.jagged_tensor import KeyedJaggedTensor
  from torchrec.test_utils import skip_if_asan_class
label_desc: Use image node_id 1 for calling the ShardingPlanTest obj's underlying member method code with example usage: obj.test_str() without return types