code: def test_uniform_three_table(self) -> None:
      tables = [
          EmbeddingBagConfig(
              num_embeddings=100 * i,
              embedding_dim=10 * i,
              name="table_" + str(i),
              feature_names=["feature_" + str(i)],
          )
          for i in range(1, 4)
      ]
      model = TestSparseNN(
          tables=tables, sparse_device=torch.device("meta")
      )
  
      mock_ebc_sharder = cast(
          ModuleSharder[torch.nn.Module],
          EmbeddingBagCollectionSharder(),
      )
      # TODO update this test for CW and TWCW sharding
      mock_ebc_sharder.sharding_types = MagicMock(
          return_value=[
              ShardingType.DATA_PARALLEL.value,
              ShardingType.TABLE_WISE.value,
              ShardingType.ROW_WISE.value,
              ShardingType.TABLE_ROW_WISE.value,
          ]
      )
  
      self.maxDiff = None
  
      search_space = self.enumerator.enumerate(
          module=model, sharders=[mock_ebc_sharder]
      )
      self.uniform_proposer.load(search_space)
  
      output = []
      proposal = self.uniform_proposer.propose()
      while proposal:
          proposal.sort(
              key=lambda sharding_option: (
                  max(
                      [
                          shard.perf.total
                          for shard in sharding_option.shards
                      ]
                  ),
                  sharding_option.name,
              )
          )
          output.append(
              [
                  (
                      candidate.name,
                      candidate.sharding_type,
                      candidate.compute_kernel,
                  )
                  for candidate in proposal
              ]
          )
          self.uniform_proposer.feedback(partitionable=True)
          proposal = self.uniform_proposer.propose()
  
      expected_output = [
          [
              (
                  "table_1",
                  "data_parallel",
                  "dense",
              ),
              (
                  "table_2",
                  "data_parallel",
                  "dense",
              ),
              (
                  "table_3",
                  "data_parallel",
                  "dense",
              ),
          ],
          [
              (
                  "table_1",
                  "table_wise",
                  "fused",
              ),
              (
                  "table_2",
                  "table_wise",
                  "fused",
              ),
              (
                  "table_3",
                  "table_wise",
                  "fused",
              ),
          ],
          [
              (
                  "table_1",
                  "row_wise",
                  "fused",
              ),
              (
                  "table_2",
                  "row_wise",
                  "fused",
              ),
              (
                  "table_3",
                  "row_wise",
                  "fused",
              ),
          ],
          [
              (
                  "table_1",
                  "table_row_wise",
                  "fused",
              ),
              (
                  "table_2",
                  "table_row_wise",
                  "fused",
              ),
              (
                  "table_3",
                  "table_row_wise",
                  "fused",
              ),
          ],
      ]
  
      self.assertEqual(expected_output, output)
  
imports: import unittest
  from typing import cast, List, Optional
  from unittest.mock import MagicMock
  import torch
  from torchrec.distributed.embedding_types import EmbeddingComputeKernel
  from torchrec.distributed.embeddingbag import EmbeddingBagCollectionSharder
  from torchrec.distributed.planner.constants import BATCH_SIZE
  from torchrec.distributed.planner.enumerators import EmbeddingEnumerator
  from torchrec.distributed.planner.proposers import EmbeddingOffloadScaleupProposer, GreedyProposer, GridSearchProposer, proposers_to_proposals_list, UniformProposer
  from torchrec.distributed.planner.types import Enumerator, ParameterConstraints, Proposer, ShardingOption, Topology
  from torchrec.distributed.test_utils.test_model import TestSparseNN
  from torchrec.distributed.types import CacheParams, CacheStatistics, ModuleSharder, ShardingType
  from torchrec.modules.embedding_configs import EmbeddingBagConfig
label_desc: Use image node_id 3 for calling the TestProposers obj's underlying member method code with example usage: obj.test_uniform_three_table() without return types