code: def test_fht(self, xp, scp, dtype):
      # test function, analytical Hankel transform is of the same form
      def f(r, mu):
          return r ** (mu + 1) * xp.exp(-(r**2) / 2)
  
      shape = self.shape
      r = xp.logspace(-4, 4, shape[-1])
      dln = xp.log(r[1] / r[0])
  
      if len(shape) == 2:
          r = xp.stack([r] * shape[0], axis=0)
  
      mu = self.mu
      bias = self.bias
      if self.offset == "optimal":
          offset = fhtoffset(dln.item(), mu, bias)
      else:
          offset = self.offset
  
      a = f(r, mu).astype(dtype)
      func = getattr(scp.fft, self.function)
      return func(a, dln, mu, offset=offset, bias=bias)
  
imports: import numpy
  import cupy
  import cupyx.scipy.fft
  from cupy import testing
label_desc: Use image node_id 1 for calling the TestFftlog obj's underlying member method code with example usage: obj.test_fht(xp, scp, dtype) and returns: func, unknown