code: def test_multiplication_of_bases(self, device, dtype):
      one = Quaternion.from_coeffs(1.0, 0.0, 0.0, 0.0).to(device, dtype)
      i = Quaternion.from_coeffs(0.0, 1.0, 0.0, 0.0).to(device, dtype)
      j = Quaternion.from_coeffs(0.0, 0.0, 1.0, 0.0).to(device, dtype)
      k = Quaternion.from_coeffs(0.0, 0.0, 0.0, 1.0).to(device, dtype)
  
      self.assert_close(i * i, j * j)
      self.assert_close(j * j, k * k)
      self.assert_close(k * k, i * j * k)
      self.assert_close(i * j * k, -one)
  
      self.assert_close(i * j, k)
      self.assert_close(i * i, -one)
      self.assert_close(i * k, -j)
      self.assert_close(j * i, -k)
      self.assert_close(j * j, -one)
      self.assert_close(j * k, i)
      self.assert_close(k * i, j)
      self.assert_close(k * j, -i)
      self.assert_close(k * k, -one)
      self.assert_close(i * j * k, -one)
  
imports: import pytest
  import torch
  from kornia.geometry.quaternion import Quaternion
  from kornia.testing import assert_close
label_desc: Use image node_id 10 for calling the TestQuaternion obj's underlying member method code with example usage: obj.test_multiplication_of_bases(device, dtype) without return types