code: def test_Random3AxisRotation(self):
      pos = np.asarray([[1, 0, 0], [0, 1, 0], [0, 0, 1]]).astype(
          np.float
      )
      data = Data(pos=torch.from_numpy(pos).float())
      t = Random3AxisRotation(
          apply_rotation=True, rot_x=0, rot_y=0, rot_z=180
      )
  
      u, v, w = data.pos
      u2, v2, w2 = t(data.clone()).pos
  
      self.assertEqual(np.array_equal(u, u2), False)
      self.assertEqual(np.array_equal(v, v2), False)
      npt.assert_array_equal(w, w2)
  
      t = Random3AxisRotation(
          apply_rotation=True, rot_x=180, rot_y=180, rot_z=180
      )
  
      u2, v2, w2 = t(data.clone()).pos
  
      self.assertEqual(np.array_equal(u, u2), False)
      self.assertEqual(np.array_equal(v, v2), False)
      self.assertEqual(np.array_equal(w, w2), False)
  
      with self.assertRaises(Exception):
          t = Random3AxisRotation(
              apply_rotation=True, rot_x=None, rot_y=None, rot_z=None
          )
  
      pos = np.asarray(
          [[1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 1, 1]]
      ).astype(np.float)
      data = Data(pos=torch.from_numpy(pos).float())
      t = Random3AxisRotation(
          apply_rotation=True, rot_x=0, rot_y=0, rot_z=180
      )
  
      self.assertEqual(t(data.clone()).pos.shape, torch.Size([4, 3]))
  
imports: import unittest
  import sys
  import os
  import torch_geometric.transforms
  import numpy
  import numpy.testing
  import torch
  from torch_geometric.data import Data
  from omegaconf.dictconfig import DictConfig
  from omegaconf.listconfig import ListConfig
  from omegaconf import OmegaConf
  from torch_points3d.core.data_transform import instantiate_transform, instantiate_transforms, GridSampling3D, MultiScaleTransform, Random3AxisRotation, AddFeatByKey, AddFeatsByKeys, RemoveAttributes, RandomDropout, ShiftVoxels, PCACompute, RandomCoordsFlip, XYZFeature, ScalePos, RandomWalkDropout, NormalizeFeature, SphereCrop, CubeCrop, RandomSphereDropout, DensityFilter, LotteryTransform, ClampBatchSize, RandomParamTransform, Select, ComposeTransform
  from torch_points3d.core.spatial_ops import RadiusNeighbourFinder, KNNInterpolate
  from torch_points3d.utils.enums import ConvolutionFormat
  from torch_points3d.datasets.multiscale_data import MultiScaleBatch
label_desc: Use image node_id 11 for calling the Testhelpers obj's underlying member method code with example usage: obj.test_Random3AxisRotation() without return types