/**
   * Test of ChoiceIterator.
   *
   * @throws Exception
   */
  @Test
  public void testChoiceIterator() throws Exception {
    logger.info("TessResultIteratorGetChoiceIterator");
    String filename = String.format("%s/%s", this.testResourcesDataPath, "eurotext.tif");
    File tiff = new File(filename);
    BufferedImage image =
        ImageIO.read(new FileInputStream(tiff)); // require jai-imageio lib to read TIFF
    ByteBuffer buf = ImageIOHelper.convertImageData(image);
    int bpp = image.getColorModel().getPixelSize();
    int bytespp = bpp / 8;
    int bytespl = (int) Math.ceil(image.getWidth() * bpp / 8.0);
    TessAPI1.TessBaseAPIInit3(handle, datapath, language);
    TessAPI1.TessBaseAPISetImage(
        handle, buf, image.getWidth(), image.getHeight(), bytespp, bytespl);
    TessAPI1.TessBaseAPISetVariable(handle, "save_blob_choices", "T");
    TessAPI1.TessBaseAPISetRectangle(handle, 37, 228, 548, 31);
    ETEXT_DESC monitor = new ETEXT_DESC();
    ProgressMonitor pmo = new ProgressMonitor(monitor);
    pmo.start();
    TessAPI1.TessBaseAPIRecognize(handle, monitor);
    logger.info("Message: " + pmo.getMessage());
    TessResultIterator ri = TessAPI1.TessBaseAPIGetIterator(handle);
    int level = TessPageIteratorLevel.RIL_SYMBOL;

    if (ri != null) {
      do {
        Pointer symbol = TessAPI1.TessResultIteratorGetUTF8Text(ri, level);
        float conf = TessAPI1.TessResultIteratorConfidence(ri, level);
        if (symbol != null) {
          logger.info(String.format("symbol %s, conf: %f", symbol.getString(0), conf));
          boolean indent = false;
          TessChoiceIterator ci = TessAPI1.TessResultIteratorGetChoiceIterator(ri);
          do {
            if (indent) {
              System.out.print("\t");
            }
            System.out.print("\t- ");
            String choice = TessAPI1.TessChoiceIteratorGetUTF8Text(ci);
            logger.info(
                String.format("%s conf: %f", choice, TessAPI1.TessChoiceIteratorConfidence(ci)));
            indent = true;
          } while (TessAPI1.TessChoiceIteratorNext(ci) == TessAPI1.TRUE);
          TessAPI1.TessChoiceIteratorDelete(ci);
        }
        logger.info("---------------------------------------------");
        TessAPI1.TessDeleteText(symbol);
      } while (TessAPI1.TessResultIteratorNext(ri, level) == TessAPI1.TRUE);
    }

    assertTrue(true);
  }
  /**
   * Test of ResultIterator and PageIterator.
   *
   * @throws Exception
   */
  @Test
  public void testResultIterator() throws Exception {
    logger.info("TessBaseAPIGetIterator");
    File tiff = new File(this.testResourcesDataPath, "eurotext.tif");
    BufferedImage image =
        ImageIO.read(new FileInputStream(tiff)); // require jai-imageio lib to read TIFF
    ByteBuffer buf = ImageIOHelper.convertImageData(image);
    int bpp = image.getColorModel().getPixelSize();
    int bytespp = bpp / 8;
    int bytespl = (int) Math.ceil(image.getWidth() * bpp / 8.0);
    TessAPI1.TessBaseAPIInit3(handle, datapath, language);
    TessAPI1.TessBaseAPISetPageSegMode(handle, TessPageSegMode.PSM_AUTO);
    TessAPI1.TessBaseAPISetImage(
        handle, buf, image.getWidth(), image.getHeight(), bytespp, bytespl);
    ETEXT_DESC monitor = new ETEXT_DESC();
    ITessAPI.TimeVal timeout = new ITessAPI.TimeVal();
    timeout.tv_sec = new NativeLong(0L); // time > 0 causes blank ouput
    monitor.end_time = timeout;
    ProgressMonitor pmo = new ProgressMonitor(monitor);
    pmo.start();
    TessAPI1.TessBaseAPIRecognize(handle, monitor);
    logger.error("Message: " + pmo.getMessage());
    TessResultIterator ri = TessAPI1.TessBaseAPIGetIterator(handle);
    TessPageIterator pi = TessAPI1.TessResultIteratorGetPageIterator(ri);
    TessAPI1.TessPageIteratorBegin(pi);
    logger.info("Bounding boxes:\nchar(s) left top right bottom confidence font-attributes");
    int level = TessPageIteratorLevel.RIL_WORD;

    // int height = image.getHeight();
    do {
      Pointer ptr = TessAPI1.TessResultIteratorGetUTF8Text(ri, level);
      String word = ptr.getString(0);
      TessAPI1.TessDeleteText(ptr);
      float confidence = TessAPI1.TessResultIteratorConfidence(ri, level);
      IntBuffer leftB = IntBuffer.allocate(1);
      IntBuffer topB = IntBuffer.allocate(1);
      IntBuffer rightB = IntBuffer.allocate(1);
      IntBuffer bottomB = IntBuffer.allocate(1);
      TessAPI1.TessPageIteratorBoundingBox(pi, level, leftB, topB, rightB, bottomB);
      int left = leftB.get();
      int top = topB.get();
      int right = rightB.get();
      int bottom = bottomB.get();
      System.out.print(
          String.format("%s %d %d %d %d %f", word, left, top, right, bottom, confidence));
      // logger.info(String.format("%s %d %d %d %d", str, left, height - bottom, right, height -
      // top)); //
      // training box coordinates

      IntBuffer boldB = IntBuffer.allocate(1);
      IntBuffer italicB = IntBuffer.allocate(1);
      IntBuffer underlinedB = IntBuffer.allocate(1);
      IntBuffer monospaceB = IntBuffer.allocate(1);
      IntBuffer serifB = IntBuffer.allocate(1);
      IntBuffer smallcapsB = IntBuffer.allocate(1);
      IntBuffer pointSizeB = IntBuffer.allocate(1);
      IntBuffer fontIdB = IntBuffer.allocate(1);
      String fontName =
          TessAPI1.TessResultIteratorWordFontAttributes(
              ri, boldB, italicB, underlinedB, monospaceB, serifB, smallcapsB, pointSizeB, fontIdB);
      boolean bold = boldB.get() == TRUE;
      boolean italic = italicB.get() == TRUE;
      boolean underlined = underlinedB.get() == TRUE;
      boolean monospace = monospaceB.get() == TRUE;
      boolean serif = serifB.get() == TRUE;
      boolean smallcaps = smallcapsB.get() == TRUE;
      int pointSize = pointSizeB.get();
      int fontId = fontIdB.get();
      logger.info(
          String.format(
              "  font: %s, size: %d, font id: %d, bold: %b,"
                  + " italic: %b, underlined: %b, monospace: %b, serif: %b, smallcap: %b",
              fontName, pointSize, fontId, bold, italic, underlined, monospace, serif, smallcaps));
    } while (TessAPI1.TessPageIteratorNext(pi, level) == TRUE);

    assertTrue(true);
  }