code: def test_resnet_block_layer(
      img_height: int,
      img_width: int,
      first_in_channels: int,
      out_channels: int,
      is_bottleneck: bool,
      block_fn: Union[ResNetBlock, ResNetBottleneckBlock],
      num_blocks: int,
  ):
      resnet_block_layer = ResNetBlockLayer(
          img_height=img_height,
          img_width=img_width,
          first_in_channels=first_in_channels,
          out_channels=out_channels,
          is_bottleneck=is_bottleneck,
          block_fn=block_fn,
          num_blocks=num_blocks,
      )
      input_tensor = torch.rand(
          2, first_in_channels, img_height, img_width
      )
      output_tensor = resnet_block_layer(input_tensor)
      assert output_tensor.shape[1:] == resnet_block_layer.output_shape
  
file_path: ludwig/tests/ludwig/modules/test_convolutional_modules.py
imports: from typing import Callable, Dict, List, Optional, Tuple, Union
  import pytest
  import torch
  from ludwig.modules.convolutional_modules import Conv1DLayer, Conv1DStack, Conv2DLayer, Conv2DLayerFixedPadding, Conv2DStack, ParallelConv1D, ParallelConv1DStack, ResNet, ResNetBlock, ResNetBlockLayer, ResNetBottleneckBlock
  from ludwig.utils.image_utils import get_img_output_shape
  from tests.integration_tests.parameter_update_utils import check_module_parameters_updated
label_desc: Use image node_id 11 for calling a global function with example usage: test_resnet_block_layer(img_height, img_width, first_in_channels, out_channels, is_bottleneck, block_fn, num_blocks) without return types