code: def test_no_perform(self):
      class IncOneC(COp):
          """An Op with only a C (c_code) implementation"""
  
          __props__ = ()
  
          def make_node(self, input):
              input = ps.as_scalar(input)
              output = input.type()
              return Apply(self, [input], [output])
  
          def c_code(self, node, name, inputs, outputs, sub):
              (x,) = inputs
              (z,) = outputs
              return f"{z} = {x} + 1;"
  
          def perform(self, *args, **kwargs):
              raise NotImplementedError(
                  "No Python implementation available."
              )
  
      i = ps.int32("i")
      o = IncOneC()(i)
  
      # Check that the perform function is not implemented
      with pytest.raises((NotImplementedError, MethodNotDefined)):
          o.owner.op.perform(o.owner, 0, [None])
  
      storage_map = {i: [np.int32(3)], o: [None]}
      compute_map = {i: [True], o: [False]}
  
      thunk = o.owner.op.make_thunk(
          o.owner, storage_map, compute_map, no_recycling=[]
      )
      if config.cxx:
          required = thunk()
          # Check everything went OK
          assert not required  # We provided all inputs
          assert compute_map[o][0]
          assert storage_map[o][0] == 4
      else:
          with pytest.raises((NotImplementedError, MethodNotDefined)):
              thunk()
  
imports: import os
  import subprocess
  import sys
  import tempfile
  from pathlib import Path
  import numpy
  import pytest
  import pytensor
  from pytensor import scalar
  from pytensor.configdefaults import config
  from pytensor.graph.basic import Apply
  from pytensor.graph.utils import MethodNotDefined
  from pytensor.link.c.op import COp
label_desc: Use image node_id 2 for calling the TestMakeThunk obj's underlying member method code with example usage: obj.test_no_perform() and returns: Apply, z, str, x, str