public void testTileStackImage() throws Exception {
    final SunTileCache tileCache = (SunTileCache) JAI.getDefaultInstance().getTileCache();
    tileCache.flush();
    long cacheTileCount = tileCache.getCacheTileCount();
    assertEquals(0, cacheTileCount);

    Operator operator =
        new Operator() {
          @Override
          public void initialize() throws OperatorException {
            Product product = new Product("name", "desc", 1, 1);

            RenderedOp d =
                ConstantDescriptor.create(
                    (float) product.getSceneRasterWidth(),
                    (float) product.getSceneRasterHeight(),
                    new Float[] {0.5f},
                    null);

            product.addBand("a", ProductData.TYPE_INT32);
            product.addBand("b", ProductData.TYPE_INT32);
            product.addBand("c", ProductData.TYPE_INT32);
            product.addBand("d", ProductData.TYPE_FLOAT32).setSourceImage(d);
            setTargetProduct(product);
          }

          @Override
          public void computeTileStack(
              Map<Band, Tile> targetTiles, Rectangle targetRectangle, ProgressMonitor pm)
              throws OperatorException {
            assertEquals(3, targetTiles.size());

            for (Tile tt : targetTiles.values()) {
              ProductData dataBuffer = tt.getDataBuffer();
              int numElems = dataBuffer.getNumElems();
              for (int i = 0; i < numElems; i++) {
                dataBuffer.setElemIntAt(i, i);
              }
            }

            assertEquals(0, tileCache.getCacheTileCount());
          }
        };

    Product targetProduct = operator.getTargetProduct();
    assertNotNull(targetProduct);
    assertEquals(4, targetProduct.getNumBands());

    MultiLevelImage sourceImage = targetProduct.getBandAt(0).getSourceImage();
    RenderedImage image = sourceImage.getImage(0);
    assertNotNull(image);
    assertEquals(OperatorImageTileStack.class, image.getClass());
    // pull data to trigger computation
    image.getData();

    cacheTileCount = tileCache.getCacheTileCount();
    assertEquals(3, cacheTileCount);
  }
 @Override
 public void dispose() {
   if (writtenProduct != null) {
     writtenProduct.dispose();
   }
   super.dispose();
 }