import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.geom.Dimension2D;
import java.awt.image.BufferedImage;
import sun.awt.image.MultiResolutionCachedImage;
public class MultiResolutionCachedImageTest {

    private static final Color TEST_COLOR = Color.BLUE;

    public static void main(String[] args) {

        Image image = new TestMultiResolutionCachedImage(100);
        try {
            image.getProperty(null, null);
            throw new RuntimeException("Expected NullPointerException for null property name");
        } catch (NullPointerException e) {
            // Expected behavior
        }
    }

    private static Dimension2D getDimension(int size) {
        return new Dimension(size, size);
    }

    private static Dimension2D[] getSizes(int size) {
        return new Dimension2D[]{getDimension(size), getDimension(2 * size)};
    }

    private static Image createImage(int width, int height) {
        BufferedImage buffImage = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        Graphics g = buffImage.createGraphics();
        g.setColor(TEST_COLOR);
        g.fillRect(0, 0, width, height);
        return buffImage;
    }

    private static class TestMultiResolutionCachedImage
            extends MultiResolutionCachedImage {

        private final int size;

        public TestMultiResolutionCachedImage(int size) {
            super(size, size, getSizes(size), (w, h) -> createImage(w, h));
            this.size = size;
        }

        @Override
        public Image getResolutionVariant(double width, double height) {
            if (width == size || height == size) {
                throw new RuntimeException("Base image is requested!");
            }
            return super.getResolutionVariant(width, height);
        }

        @Override
        protected Image getBaseImage() {
            throw new RuntimeException("Base image is used");
        }
    }
}