code: def test_define_and_call(self):
      x1 = keras_tensor.KerasTensor((2, 3))
      x2 = keras_tensor.KerasTensor((2, 3))
      x = knp.add(x1, x2)
      y1 = x * 3
      y2 = x**2
      fn = function.Function(
          inputs=[x1, x2], outputs=[y1, y2], name="test_function"
      )
      self.assertEqual(fn.name, "test_function")
  
      # Eager call
      y_val = fn([np.ones((2, 3)), np.ones((2, 3))])
      self.assertIsInstance(y_val, list)
      self.assertAllClose(y_val[0], np.ones((2, 3)) * 6)
      self.assertAllClose(y_val[1], np.ones((2, 3)) * 4)
  
      # Symbolic call
      x1_alt = keras_tensor.KerasTensor((2, 3))
      x2_alt = keras_tensor.KerasTensor((2, 3))
      y_val = fn([x1_alt, x2_alt])
      self.assertIsInstance(y_val[0], keras_tensor.KerasTensor)
      self.assertEqual(y_val[0].shape, (2, 3))
      self.assertIsInstance(y_val[1], keras_tensor.KerasTensor)
      self.assertEqual(y_val[1].shape, (2, 3))
  
      # Recursion
      fn = function.Function(inputs=[x1_alt, x2_alt], outputs=y_val)
      y_val = fn([np.ones((2, 3)), np.ones((2, 3))])
      self.assertIsInstance(y_val, list)
      self.assertAllClose(y_val[0], np.ones((2, 3)) * 6)
      self.assertAllClose(y_val[1], np.ones((2, 3)) * 4)
  
file_path: keras/keras/ops/function_test.py
imports: import numpy
  from keras import testing
  from keras.backend.common import keras_tensor
  from keras.ops import function
  from keras.ops import numpy
label_desc: Use image node_id 1 for calling the FunctionTest obj's underlying member method code with example usage: obj.test_define_and_call() without return types