code: def test_extend(self):
      B = 5
      mesh = init_mesh(B, 30, 50)
      V = mesh._V
      num_faces = mesh.num_faces_per_mesh()
      num_verts = mesh.num_verts_per_mesh()
      faces_uvs_list = [
          torch.randint(size=(f, 3), low=0, high=V) for f in num_faces
      ]
      verts_uvs_list = [torch.rand(v, 2) for v in num_verts]
      tex_uv = TexturesUV(
          maps=torch.ones((B, 16, 16, 3)),
          faces_uvs=faces_uvs_list,
          verts_uvs=verts_uvs_list,
      )
      tex_mesh = Meshes(
          verts=mesh.verts_list(),
          faces=mesh.faces_list(),
          textures=tex_uv,
      )
      N = 2
      new_mesh = tex_mesh.extend(N)
  
      self.assertEqual(len(tex_mesh) * N, len(new_mesh))
  
      tex_init = tex_mesh.textures
      new_tex = new_mesh.textures
  
      new_tex_num_verts = new_mesh.num_verts_per_mesh()
      for i in range(len(tex_mesh)):
          for n in range(N):
              tex_nv = new_tex_num_verts[i * N + n]
              self.assertClose(
                  # The original textures were initialized using
                  # verts uvs list
                  tex_init.verts_uvs_list()[i],
                  # In the new textures, the verts_uvs are initialized
                  # from padded. The verts per mesh are not used to
                  # convert from padded to list. See TexturesUV for an
                  # explanation.
                  new_tex.verts_uvs_list()[i * N + n][:tex_nv, ...],
              )
              self.assertClose(
                  tex_init.faces_uvs_list()[i],
                  new_tex.faces_uvs_list()[i * N + n],
              )
              self.assertClose(
                  tex_init.maps_padded()[i, ...],
                  new_tex.maps_padded()[i * N + n],
              )
              self.assertClose(
                  tex_init._num_faces_per_mesh[i],
                  new_tex._num_faces_per_mesh[i * N + n],
              )
  
      self.assertAllSeparate(
          [
              tex_init.faces_uvs_padded(),
              new_tex.faces_uvs_padded(),
              tex_init.verts_uvs_padded(),
              new_tex.verts_uvs_padded(),
              tex_init.maps_padded(),
              new_tex.maps_padded(),
          ]
      )
  
      with self.assertRaises(ValueError):
          tex_mesh.extend(N=-1)
  
imports: import unittest
  import torch
  import torch.nn.functional
  from pytorch3d.renderer.mesh.rasterizer import Fragments
  from pytorch3d.renderer.mesh.textures import _list_to_padded_wrapper, TexturesAtlas, TexturesUV, TexturesVertex
  from pytorch3d.renderer.mesh.utils import pack_rectangles, pack_unique_rectangles, Rectangle
  from pytorch3d.structures import list_to_packed, Meshes, packed_to_list
  from .common_testing import TestCaseMixin
  from .test_meshes import init_mesh
label_desc: Use image node_id 7 for calling the TestTexturesUV obj's underlying member method code with example usage: obj.test_extend() without return types