code: def testStruct(self):
      for dtype1 in datatypes:
          for dtype2 in datatypes:
              dtypes = (dtype1, dtype2)
              blocklengths = (2, 3)
              displacements = [0]
              for dtype in dtypes[:-1]:
                  stride = displacements[-1] + dtype.extent
                  displacements.append(stride)
              factory = MPI.Datatype.Create_struct
              args = (blocklengths, displacements, dtypes)
              self.check(None, factory, *args)
      for dtype in datatypes:
          factory = MPI.Datatype.Create_struct
          dtypes = [dtype.Dup()]
          dtypes.append(dtypes[-1].Create_contiguous(2))
          dtypes.append(dtypes[-1].Dup())
          dtypes.append(
              dtypes[-1].Create_struct([1], [0], [dtypes[-1]])
          )
          dtypes.append(dtypes[-1].Dup())
          dtypes.append(dtypes[-1].Create_resized(0, dtypes[-1].extent))
          dtypes.append(dtypes[-1].Dup())
          for dt in dtypes:
              args = [[1, 1], [0, dt.extent * 2], (dt, dt)]
              self.check(None, factory, *args)
              dt.Free()
      with self.assertRaises(ValueError):
          factory = MPI.Datatype.Create_struct
          factory([1], [0], [MPI.INT, MPI.FLOAT])
  
imports: from mpi4py import MPI
  import mpiunittest
  import struct
label_desc: Use image node_id 12 for calling the BaseTestDatatypeCreateMixin obj's underlying member method code with example usage: obj.testStruct() without return types