code: def test_estimated_steps_in_fit(self) -> None:
      dl = generate_random_dataloader(
          num_samples=1,
          input_dim=1,
          batch_size=1,
      )
  
      with patch(
          "torchtnt.utils.progress.estimated_steps_in_loop",
          side_effect=[100, 20]
          * 4,  # for 4 test cases, make sure that number of steps returned is 100 for training and 20 for eval
      ):
          self.assertEqual(
              estimated_steps_in_fit(
                  train_dataloader=dl,
                  eval_dataloader=dl,
                  epochs=4,
                  max_steps=None,
                  max_train_steps_per_epoch=None,
                  max_eval_steps_per_epoch=None,
                  eval_every_n_steps=10,
                  eval_every_n_epochs=2,
              ),
              340,  # 100 (training) + 20 * 12 (steps per eval epoch * number of eval epochs: 100/10 + 4/2)
          )
  
          self.assertEqual(
              estimated_steps_in_fit(
                  train_dataloader=dl,
                  eval_dataloader=dl,
                  epochs=3,
                  max_steps=None,
                  max_train_steps_per_epoch=None,
                  max_eval_steps_per_epoch=None,
                  eval_every_n_steps=None,
                  eval_every_n_epochs=2,
              ),
              120,  # 100 (training) + 20 (single eval epoch)
          )
  
          self.assertEqual(
              estimated_steps_in_fit(
                  train_dataloader=dl,
                  eval_dataloader=dl,
                  epochs=3,
                  max_steps=None,
                  max_train_steps_per_epoch=None,
                  max_eval_steps_per_epoch=None,
                  eval_every_n_steps=49,
                  eval_every_n_epochs=None,
              ),
              140,  # 100 (training) + 20 * 2 (two eval epochs)
          )
  
          self.assertEqual(
              estimated_steps_in_fit(
                  train_dataloader=dl,
                  eval_dataloader=dl,
                  epochs=3,
                  max_steps=None,
                  max_train_steps_per_epoch=None,
                  max_eval_steps_per_epoch=None,
                  eval_every_n_steps=None,
                  eval_every_n_epochs=None,
              ),
              100,  # just training
          )
  
      with patch(
          "torchtnt.utils.progress.estimated_steps_in_loop",
          side_effect=[100, None],
      ):
          self.assertEqual(
              estimated_steps_in_fit(
                  train_dataloader=dl,
                  eval_dataloader=dl,
                  epochs=4,
                  max_steps=None,
                  max_train_steps_per_epoch=None,
                  max_eval_steps_per_epoch=None,
                  eval_every_n_steps=10,
                  eval_every_n_epochs=2,
              ),
              None,  # if the returned number of eval steps per eval epoch is None, we return None
          )
  
      with patch(
          "torchtnt.utils.progress.estimated_steps_in_loop",
          side_effect=[None, 20],
      ):
          self.assertEqual(
              estimated_steps_in_fit(
                  train_dataloader=dl,
                  eval_dataloader=dl,
                  epochs=4,
                  max_steps=None,
                  max_train_steps_per_epoch=None,
                  max_eval_steps_per_epoch=None,
                  eval_every_n_steps=10,
                  eval_every_n_epochs=2,
              ),
              None,  # if the returned number of training steps is None, we return None
          )
  
file_path: tnt/tests/utils/test_progress.py
imports: import unittest
  from unittest.mock import patch
  from torchtnt.framework._test_utils import generate_random_dataloader, generate_random_iterable_dataloader
  from torchtnt.utils.progress import estimated_steps_in_epoch, estimated_steps_in_fit, estimated_steps_in_loop, Progress
label_desc: Use image node_id 4 for calling the ProgressTest obj's underlying member method code with example usage: obj.test_estimated_steps_in_fit() without return types