docstr: Tests that projecting and unprojecting gives an identity mapping.
docstr_tok: ["Tests","that","projecting","and","unprojecting","gives","an","identity","mapping","."]
code: def test_project_unproject_random(self):
      """Tests that projecting and unprojecting gives an identity mapping."""
      tensor_size = np.random.randint(3)
      tensor_shape = np.random.randint(
          1, 10, size=(tensor_size)
      ).tolist()
      random_point_3d = np.random.normal(size=tensor_shape + [3])
      random_focal = np.random.normal(size=tensor_shape + [2])
      random_principal_point = np.random.normal(size=tensor_shape + [2])
      random_depth = np.expand_dims(random_point_3d[..., 2], axis=-1)
  
      point_2d = perspective.project(
          random_point_3d, random_focal, random_principal_point
      )
      point_3d = perspective.unproject(
          point_2d, random_depth, random_focal, random_principal_point
      )
  
      self.assertAllClose(random_point_3d, point_3d, rtol=1e-3)
  
imports: import math
  import sys
  from absl.testing import parameterized
  import numpy
  import tensorflow
  from tensorflow_graphics.rendering.camera import perspective
  from tensorflow_graphics.util import test_case
label_desc: Use image node_id 23 for calling the PerspectiveTest obj's underlying member method code with example usage: obj.test_project_unproject_random() without return types