code: def test_binary_op_given_shape(
      self,
      func_name,
      shape_a,
      shape_b,
      kwargs=None,
      func_a=gs.ones,
      func_b=gs.ones,
  ):
      self._reset_dtype()
  
      kwargs = kwargs or {}
      gs_fnc = get_backend_fnc(func_name)
  
      for i, dtype_a_str in enumerate(self.dtypes_str):
          dtype_a = gs.as_dtype(dtype_a_str)
  
          a = func_a(shape_a, dtype=dtype_a)
  
          for j, dtype_b_str in enumerate(self.dtypes_str):
              dtype_b = gs.as_dtype(dtype_b_str)
  
              b = func_b(shape_b, dtype=dtype_b)
  
              out = gs_fnc(a, b, **kwargs)
              cmp_dtype = dtype_a if i > j else dtype_b
  
              self.assertDtype(out.dtype, cmp_dtype)
  
imports: import random
  import numpy
  import pytest
  import scipy
  import geomstats.backend
  from geomstats.test.test_case import TestCase
  from geomstats.test.vectorization import generate_vectorization_data
label_desc: Use image node_id 17 for calling the DtypeTestCase obj's underlying member method code with example usage: obj.test_binary_op_given_shape(func_name, shape_a, shape_b, kwargs, func_a, func_b) without return types