code: def test_discrete_wrapper_with_id_list(self) -> None:
      state_normalization_parameters = {
          i: _cont_norm() for i in range(1, 5)
      }
      state_preprocessor = Preprocessor(
          state_normalization_parameters, False
      )
      action_dim = 2
      state_feature_config = rlt.ModelFeatureConfig(
          float_feature_infos=[
              rlt.FloatFeatureInfo(name=str(i), feature_id=i)
              for i in range(1, 5)
          ],
          id_list_feature_configs=[
              rlt.IdListFeatureConfig(
                  name="id_list_feature_A",
                  feature_id=FAKE_STATE_FEATURE_ID,
                  id_mapping_name="Table_A",
              )
          ],
          id_mapping_config={
              "Table_A": rlt.IdMappingConfig(
                  embedding_table_size=100,
                  embedding_dim=32,
                  hashing=False,
              )
          },
      )
      embedding_concat = models.EmbeddingBagConcat(
          state_dense_dim=len(state_normalization_parameters),
          model_feature_config=state_feature_config,
      )
      dqn = models.Sequential(
          embedding_concat,
          rlt.TensorFeatureData(),
          models.FullyConnectedDQN(
              embedding_concat.output_dim,
              action_dim=action_dim,
              sizes=[16],
              activations=["relu"],
          ),
      )
  
      dqn_with_preprocessor = DiscreteDqnWithPreprocessor(
          dqn, state_preprocessor, state_feature_config
      )
      action_names = ["L", "R"]
      wrapper = DiscreteDqnPredictorWrapper(
          dqn_with_preprocessor, action_names, state_feature_config
      )
      input_prototype = dqn_with_preprocessor.input_prototype()[0]
      output_action_names, q_values = wrapper(input_prototype)
      self.assertEqual(action_names, output_action_names)
      self.assertEqual(q_values.shape, (1, 2))
  
      feature_id_to_name = {
          config.feature_id: config.name
          for config in state_feature_config.id_list_feature_configs
      }
      state_id_list_features = {
          feature_id_to_name[k]: v
          for k, v in input_prototype.id_list_features.items()
      }
      state_with_presence = input_prototype.float_features_with_presence
      expected_output = dqn(
          rlt.FeatureData(
              float_features=state_preprocessor(*state_with_presence),
              id_list_features_raw=state_id_list_features,
          )
      )
      self.assertTrue((expected_output == q_values).all())
  
imports: import random
  import unittest
  import numpy.testing
  import reagent.core.types
  import reagent.models
  import torch
  from reagent.model_utils.seq2slate_utils import Seq2SlateMode, Seq2SlateOutputArch
  from reagent.models.seq2slate import Seq2SlateTransformerNet
  from reagent.prediction.cfeval.predictor_wrapper import BanditRewardNetPredictorWrapper
  from reagent.prediction.predictor_wrapper import ActorPredictorWrapper, ActorWithPreprocessor, DiscreteDqnPredictorWrapper, DiscreteDqnWithPreprocessor, FAKE_STATE_FEATURE_ID, ParametricDqnPredictorWrapper, ParametricDqnWithPreprocessor, Seq2SlatePredictorWrapper, Seq2SlateWithPreprocessor
  from reagent.prediction.ranking.predictor_wrapper import DeterminantalPointProcessPredictorWrapper, Kernel
  from reagent.preprocessing.postprocessor import Postprocessor
  from reagent.preprocessing.preprocessor import Preprocessor
  from reagent.test.prediction.test_prediction_utils import _cont_action_norm, _cont_norm, change_cand_size_slate_ranking
label_desc: Use image node_id 2 for calling the TestPredictorWrapper obj's underlying member method code with example usage: obj.test_discrete_wrapper_with_id_list() without return types