code: def test_point_pair_features():
      transform = PointPairFeatures()
      assert str(transform) == "PointPairFeatures()"
  
      pos = torch.tensor([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0]])
      edge_index = torch.tensor([[0, 1], [1, 0]])
      norm = torch.tensor([[1.0, 0.0, 0.0], [1.0, 0.0, 0.0]])
      edge_attr = torch.tensor([1.0, 1.0])
      data = Data(edge_index=edge_index, pos=pos, norm=norm)
  
      data = transform(data)
      assert len(data) == 4
      assert data.pos.tolist() == pos.tolist()
      assert data.norm.tolist() == norm.tolist()
      assert data.edge_index.tolist() == edge_index.tolist()
      assert torch.allclose(
          data.edge_attr,
          torch.tensor([[1.0, 0.0, 0.0, 0.0], [1.0, PI, PI, 0.0]]),
          atol=1e-4,
      )
  
      data = Data(
          edge_index=edge_index, pos=pos, norm=norm, edge_attr=edge_attr
      )
      data = transform(data)
      assert len(data) == 4
      assert data.pos.tolist() == pos.tolist()
      assert data.norm.tolist() == norm.tolist()
      assert data.edge_index.tolist() == edge_index.tolist()
      assert torch.allclose(
          data.edge_attr,
          torch.tensor(
              [[1.0, 1.0, 0.0, 0.0, 0.0], [1.0, 1.0, PI, PI, 0.0]]
          ),
          atol=1e-4,
      )
  
imports: from math import pi
  import torch
  from torch_geometric.data import Data
  from torch_geometric.transforms import PointPairFeatures
label_desc: Use image node_id 1 for calling a global function with example usage: test_point_pair_features() without return types