@Override
  protected Object[][] createInputParam(Method candidate, Method validation) {
    Class<?> param[] = validation.getParameterTypes();
    String name = candidate.getName();

    ImageBase inputA = null;
    ImageBase inputSquare = null;

    for (int i = 0; i < param.length; i++) {
      if (ImageBase.class.isAssignableFrom(param[i])) {
        if (ImageGray.class.isAssignableFrom(param[i])) {
          inputA = GeneralizedImageOps.createSingleBand((Class) param[i], width, height);
          inputSquare = GeneralizedImageOps.createSingleBand((Class) param[i], width, width);
        } else {
          inputA = GeneralizedImageOps.createInterleaved((Class) param[i], width, height, numBands);
          inputSquare =
              GeneralizedImageOps.createInterleaved((Class) param[i], width, width, numBands);
        }
      }
    }
    if (inputA == null) throw new RuntimeException("Invalid funciton");

    Object[][] ret = new Object[1][param.length];

    if (name.equals("copy")) {
      ImageBase inputB = inputA.createNew(width, height);

      GImageMiscOps.fillUniform(inputA, rand, 0, 10);
      GImageMiscOps.fillUniform(inputB, rand, 0, 10);

      ret[0][0] = 10;
      ret[0][1] = 15;
      ret[0][2] = 12;
      ret[0][3] = 8;
      ret[0][4] = 5;
      ret[0][5] = 6;
      ret[0][6] = inputA;
      ret[0][7] = inputB;

    } else if (name.equals("fillBand")) {
      ret[0][0] = inputA;
      ret[0][1] = 1;
      ret[0][2] = 3;
    } else if (name.equals("fill")) {
      if (param[1].isArray()) {
        Object array = Array.newInstance(param[1].getComponentType(), numBands);
        for (int i = 0; i < numBands; i++) {
          Array.set(array, i, 2 * i + 1);
        }
        ret[0][0] = inputA;
        ret[0][1] = array;
      } else {
        ret[0][0] = inputA;
        ret[0][1] = 3;
      }
    } else if (name.equals("insertBand")) {
      ImageBase input = GeneralizedImageOps.createSingleBand((Class) param[0], width, height);
      ImageBase output =
          GeneralizedImageOps.createInterleaved((Class) param[2], width, height, numBands);

      GImageMiscOps.fillUniform(input, rand, 0, 10);
      GImageMiscOps.fillUniform(output, rand, 0, 10);

      ret[0][0] = input;
      ret[0][1] = 1;
      ret[0][2] = output;
    } else if (name.equals("fillBorder")) {
      ret[0][0] = inputA;
      ret[0][1] = 3;
      ret[0][2] = 2;
    } else if (name.equals("fillRectangle")) {
      ret[0][0] = inputA;
      ret[0][1] = 3;
      ret[0][2] = 5;
      ret[0][3] = 6;
      ret[0][4] = 3;
      ret[0][5] = 4;
    } else if (name.equals("fillGaussian")) {
      ret[0][0] = inputA;
      ret[0][1] = new Random(randomSeed);
      ret[0][2] = 5;
      ret[0][3] = 3;
      ret[0][4] = 1;
      ret[0][5] = 12;
    } else if (name.equals("fillUniform")) {
      ret[0][0] = inputA;
      ret[0][1] = new Random(randomSeed);
      ret[0][2] = 5;
      ret[0][3] = 30;
    } else if (name.equals("addGaussian")) {
      ret[0][0] = inputA;
      ret[0][1] = new Random(randomSeed);
      ret[0][2] = 5;
      ret[0][3] = 1;
      ret[0][4] = 10;
    } else if (name.equals("addUniform")) {
      ret[0][0] = inputA;
      ret[0][1] = new Random(randomSeed);
      ret[0][2] = 1;
      ret[0][3] = 10;
    } else if (name.equals("flipVertical")) {
      ret[0][0] = inputA;
    } else if (name.equals("flipHorizontal")) {
      ret[0][0] = inputA;
    } else if (name.equals("rotateCW")) {
      if (param.length == 1) {
        ret[0][0] = inputSquare;
      } else {
        ret[0][0] = inputA;
        ret[0][1] = inputA.createNew(height, width);
      }
    } else if (name.equals("rotateCCW")) {
      if (param.length == 1) {
        ret[0][0] = inputSquare;
      } else {
        ret[0][0] = inputA;
        ret[0][1] = inputA.createNew(height, width);
      }
    } else {
      throw new RuntimeException("Unknown function: " + name);
    }

    fillRandom(inputA);

    return ret;
  }