From f5aa49f5e29f3a84d5a028f1d9b8e172cd8831da Mon Sep 17 00:00:00 2001 From: Neil Tomar Date: Sun, 6 Sep 2026 17:39:29 +0530 Subject: [PATCH 1/2] redesign the help statistics plot --- .../help/commands/HelpAccountSubcommand.java | 2 +- .../commands/HelpStatisticsSubcommand.java | 35 ++- .../net/discordjug/javabot/util/Plotter.java | 287 ++++++++++++++---- .../discordjug/javabot/util/PlotterTest.java | 90 ++++++ src/test/resources/PlotterTest.png | Bin 0 -> 87232 bytes 5 files changed, 334 insertions(+), 80 deletions(-) create mode 100644 src/test/java/net/discordjug/javabot/util/PlotterTest.java create mode 100644 src/test/resources/PlotterTest.png diff --git a/src/main/java/net/discordjug/javabot/systems/help/commands/HelpAccountSubcommand.java b/src/main/java/net/discordjug/javabot/systems/help/commands/HelpAccountSubcommand.java index 18042daec..6083f4e2f 100644 --- a/src/main/java/net/discordjug/javabot/systems/help/commands/HelpAccountSubcommand.java +++ b/src/main/java/net/discordjug/javabot/systems/help/commands/HelpAccountSubcommand.java @@ -125,7 +125,7 @@ private FileUpload generatePlot(User user) { plotData.add(new Pair<>(position.getMonth() + " " + position.getYear(), new Plotter.Bar(value))); } - BufferedImage plt = new Plotter(plotData, "gained help XP per month").plot(); + BufferedImage plt = new Plotter(plotData, "General Helper XP Gains","XP earned each month from general helper activity").plot(); try(ByteArrayOutputStream os = new ByteArrayOutputStream()){ ImageIO.write(plt, "png", os); return FileUpload.fromData(os.toByteArray(), "image.png"); diff --git a/src/main/java/net/discordjug/javabot/systems/help/commands/HelpStatisticsSubcommand.java b/src/main/java/net/discordjug/javabot/systems/help/commands/HelpStatisticsSubcommand.java index 50886eb09..1eb1a0dee 100644 --- a/src/main/java/net/discordjug/javabot/systems/help/commands/HelpStatisticsSubcommand.java +++ b/src/main/java/net/discordjug/javabot/systems/help/commands/HelpStatisticsSubcommand.java @@ -5,14 +5,8 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.time.LocalDate; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.PriorityQueue; import javax.imageio.ImageIO; @@ -24,6 +18,8 @@ import net.discordjug.javabot.util.Plotter; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; +import net.dv8tion.jda.api.interactions.commands.OptionMapping; +import net.dv8tion.jda.api.interactions.commands.OptionType; import net.dv8tion.jda.api.interactions.commands.build.SubcommandData; import net.dv8tion.jda.api.utils.FileUpload; import xyz.dynxsty.dih4jda.interactions.commands.application.SlashCommand; @@ -34,21 +30,30 @@ public class HelpStatisticsSubcommand extends SlashCommand.Subcommand { private static final List> COLORS = List.of( - new Pair<>("Red", Color.RED), new Pair<>("Blue", Color.BLUE), new Pair<>("Yellow", Color.YELLOW), - new Pair<>("Green", Color.GREEN), new Pair<>("Cyan", Color.CYAN), new Pair<>("Magenta", Color.MAGENTA), - new Pair<>("Orange", Color.ORANGE), new Pair<>("Pink", Color.PINK), new Pair<>("Light gray", Color.LIGHT_GRAY) + new Pair<>("Red", Color.decode("#D62728")), new Pair<>("Blue", Color.decode("#1F77B4")), new Pair<>("Yellow", Color.decode("#BCBD22")), + new Pair<>("Green", Color.decode("#2CA02C")), new Pair<>("Cyan", Color.decode("#17BECF")), new Pair<>("Magenta", Color.decode("#9467BD")), + new Pair<>("Orange", Color.decode("#FF7F0E")), new Pair<>("Pink", Color.decode("#E377C2")), new Pair<>("Light gray", Color.decode("#7F7F7F")) ); private final HelpTransactionRepository transactionRepository; - + + /** + * Creates the help statistics subcommand. + * + * @param transactionRepository repository for help transactions + */ public HelpStatisticsSubcommand(HelpTransactionRepository transactionRepository) { this.transactionRepository = transactionRepository; - setCommandData(new SubcommandData("stats", "Shows an general plot about help activity in this server")); + setCommandData(new SubcommandData("stats", "Shows an general plot about help activity in this server") + .addOption(OptionType.BOOLEAN, "darkmode", "generate a plot in dark mode.", false) + ); + } @Override public void execute(SlashCommandInteractionEvent event) { - + boolean darkMode = event.getOption("darkmode", false, OptionMapping::getAsBoolean); + event.deferReply().queue(); List> transactionWeights = transactionRepository.getTotalTransactionWeightByMonthAndUsers(LocalDate.now().withDayOfMonth(1).minusYears(1).atStartOfDay()); @@ -75,8 +80,8 @@ public void execute(SlashCommandInteractionEvent event) { } plotData.add(new Pair<>(position.getMonth() + " " + position.getYear(), new Plotter.Bar(entriesForThisMonth))); } - - BufferedImage plot = new Plotter(plotData, "General helper statistics").plot(); + + BufferedImage plot = new Plotter(plotData, "Help Statistics","Monthly assistance provided to community members",darkMode).plot(); try(ByteArrayOutputStream os = new ByteArrayOutputStream()){ ImageIO.write(plot, "png", os); FileUpload upload = FileUpload.fromData(os.toByteArray(), "image.png"); diff --git a/src/main/java/net/discordjug/javabot/util/Plotter.java b/src/main/java/net/discordjug/javabot/util/Plotter.java index 59ed2279e..03b2321b1 100644 --- a/src/main/java/net/discordjug/javabot/util/Plotter.java +++ b/src/main/java/net/discordjug/javabot/util/Plotter.java @@ -1,7 +1,6 @@ package net.discordjug.javabot.util; -import java.awt.Color; -import java.awt.Graphics2D; +import java.awt.*; import java.awt.image.BufferedImage; import java.util.List; @@ -9,92 +8,252 @@ * Creates diagrams. */ public class Plotter { - + private static final int WIDTH = 3000; + private static final int HEIGHT = 1500; + + private static final int GRID_LINES = 6; + private static final int PILL_MARGIN = 34; + private static final int PILL_HEIGHT = 42; + private static final int PILL_BOTTOM_MARGIN = 65; + private static final int LEFT_HEADING_MARGIN = (int) (WIDTH * 0.02); // 2% + private static final int LEFT_GRAPH_MARGIN = (int) (WIDTH * 0.05); // 5% + private static final int RIGHT_GRAPH_MARGIN = (int) (WIDTH * 0.02); // 2% + private static final int TOP_HEADING_MARGIN = (int) (HEIGHT * 0.06); // 6% + private static final int TOP_SUBHEADING_MARGIN = (int) (HEIGHT * 0.09); // 9% + private static final int TOP_GRAPH_MARGIN = (int) (HEIGHT * 0.15); // 15% + private static final int BOTTOM_GRAPH_MARGIN = (int) (HEIGHT * 0.09); // 9% + private static final int TITLE_SIZE = (int) (HEIGHT * 0.038); // 3.87% + private static final int SUBTITLE_SIZE = (int) (HEIGHT * 0.018); // 1.87% + private static final int AXIS_SIZE = (int) (HEIGHT * 0.016); // 1.6% + private static final int LABEL_SIZE = (int) (HEIGHT * 0.016); // 1.67% + private static final int VALUE_SIZE = (int) (HEIGHT * 0.016); // 1.6% + private static final int GRAPH_WIDTH = WIDTH - LEFT_GRAPH_MARGIN - RIGHT_GRAPH_MARGIN; + private static final int GRAPH_HEIGHT = HEIGHT - TOP_GRAPH_MARGIN - BOTTOM_GRAPH_MARGIN; + + private Color BOARDER_COLOR = Color.BLACK; + private Color BACKGROUND = Color.decode("#EAEDF5"); + private Color GRID = Color.decode("#B2B2B2"); + private Color GRID_STRONG = Color.decode("#606061"); + private Color TEXT = Color.decode("#2D2D2D"); + private Color TEXT_MUTED = Color.decode("#42474D"); + private Color TEXT_DIM = Color.decode("#59616D"); + private Color PILL = Color.decode("#D9D9D9"); + private String title; + private String subtitle; private final List> entries; - private int width=3000; - private int height=1500; - + /** * Creates the plotter. * @param entries a list of all data points to plot, each represented as a {@link Pair} consisting of the name and value of the data point * @param title the title of the plot + * @param subtitle the subtitle of plot */ - public Plotter(List> entries, String title) { + public Plotter(List> entries, String title, String subtitle) { this.entries = entries; this.title = title; + this.subtitle = subtitle; } - + + /** + * Creates the plotter. + * @param entries a list of all data points to plot, each represented as a {@link Pair} consisting of the name and value of the data point + * @param title the title of the plot + * @param subtitle the subtitle of plot + * @param darkMode the dark mode for plot + */ + public Plotter(List> entries, String title, String subtitle,boolean darkMode) { + this.entries = entries; + this.title = title; + this.subtitle = subtitle; + if (darkMode){ + BACKGROUND = Color.decode("#111318"); + GRID = Color.decode("#252A32"); + GRID_STRONG = Color.decode("#303640"); + TEXT = Color.decode("#F5F7FA"); + PILL = Color.decode("#171C23"); + } + } + /** * Create a diagram from the data supplied to the constructor. * @return the diagram as a {@link BufferedImage} */ public BufferedImage plot() { - BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - Graphics2D g2d = img.createGraphics(); - - g2d.setFont(ImageGenerationUtils.getResourceFont("assets/fonts/Uni-Sans-Heavy.ttf", 30).orElseThrow()); - - g2d.setBackground(Color.WHITE); - g2d.fillRect(0, 0, width, height); - g2d.setColor(Color.BLACK); - - centeredText(g2d, title, width/2, 50); - - plotEntries(g2d, 100, 100, width-200, height-200); - + BufferedImage img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); + Graphics2D graphics2D = img.createGraphics(); + + setBackground(graphics2D); + + drawHeading(graphics2D,LEFT_HEADING_MARGIN,TOP_HEADING_MARGIN,TOP_SUBHEADING_MARGIN); + drawGraph(graphics2D,LEFT_GRAPH_MARGIN,TOP_GRAPH_MARGIN,GRAPH_WIDTH,GRAPH_HEIGHT); + return img; } - private void plotEntries(Graphics2D g2d, int x, int y, int width, int height) { - double maxValue = entries.stream().map(Pair::second).mapToDouble(Bar::sum).max().orElse(0); - int stepSize = 2*(int)Math.pow(10,(int)Math.log10(maxValue)-1); - if (stepSize==0) { - stepSize=1; - } - maxValue += stepSize; - - int numEntries = entries.size(); - - int currentX = x; - - g2d.drawLine(x, y, x, y+height); - - if(maxValue>0) { - for (int current = 0; current < maxValue; current += stepSize) { - g2d.drawString(String.valueOf(current), 95-g2d.getFontMetrics().stringWidth(String.valueOf(current)), this.height-(y+(height*current)/(int)maxValue)+g2d.getFontMetrics().getHeight()/3); - } + private void drawHeading(Graphics2D graphics2D,int startX, int titleY, int subtitleY){ + Font titleFont = ImageGenerationUtils.getResourceFont("assets/fonts/Uni-Sans-Heavy.ttf", TITLE_SIZE).orElseThrow(); + Font subtitleFont = ImageGenerationUtils.getResourceFont("assets/fonts/Uni-Sans-Heavy.ttf", SUBTITLE_SIZE).orElseThrow(); + + graphics2D.setColor(TEXT); + graphics2D.setFont(titleFont); + graphics2D.drawString(title,startX,titleY); + + graphics2D.setColor(TEXT_MUTED); + graphics2D.setFont(subtitleFont); + graphics2D.drawString(subtitle,startX,subtitleY); + + } + + private void setBackground(Graphics2D graphics2D){ + graphics2D.setColor(BACKGROUND); + graphics2D.fillRect(-1, -1, WIDTH, HEIGHT); + } + + private void drawGraph(Graphics2D graphics2D, int startX, int startY, int width,int height){ + double maxValue = entries.stream() + .map(Pair::second) + .mapToDouble(Bar::sum) + .max().orElse(0); + + if(maxValue == 0) return; + double axisMax = niceMaximum(maxValue); + + drawLines(graphics2D,startX,startY,width,height,axisMax); + drawBars(graphics2D,startX,startY,width,height,axisMax); + } + + private void drawLines(Graphics2D graphics2D,int startX ,int startY,int width ,int height, double axisMax){ + Font axisFont = ImageGenerationUtils.getResourceFont("assets/fonts/Uni-Sans-Heavy.ttf", AXIS_SIZE).orElseThrow(); + graphics2D.setStroke(new BasicStroke(2, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); // Use a 2px stroke because a line is between pixels. + graphics2D.setFont(axisFont); + + for (int i = 0; i <= GRID_LINES; i++) { + double fraction = (double) i / GRID_LINES; + int gridY = startY + height - (int) (height * fraction); + + graphics2D.setColor(i == 0 ? GRID_STRONG : GRID); + graphics2D.drawLine(startX, gridY+1, startX + width, gridY+1); // Move 1px down so the 2px stroke aligns with the grid position. + + double value = axisMax * fraction; + + String label = formatValue(value); + graphics2D.setColor(TEXT_DIM); + graphics2D.drawString(label, startX - 25 - graphics2D.getFontMetrics().stringWidth(label), gridY + 8); } - - boolean shift=false; - for (Pair entry : entries) { - int shiftNum = shift ? g2d.getFontMetrics().getHeight() : 0; - centeredText(g2d, entry.first(), currentX+(width/(2*numEntries)), this.height-y/2+shiftNum); + } + + private void drawBars(Graphics2D graphics2D,int startX ,int startY,int width ,int height, double axisMax){ + int count = entries.size(); + int slotWidth = width / count; + int barWidth = Math.min(110, (int) (slotWidth * 0.42)); + + Font labelFont = ImageGenerationUtils.getResourceFont("assets/fonts/Uni-Sans-Heavy.ttf", LABEL_SIZE).orElseThrow(); + Font valueFont = ImageGenerationUtils.getResourceFont("assets/fonts/Uni-Sans-Heavy.ttf", VALUE_SIZE).orElseThrow(); + + for (int i = 0; i < count; i++) { + Pair entry = entries.get(i); Bar bar = entry.second(); - int totalBarHeight = 0; - - double barSum = 0; - - for (Pair barSquares : bar.elements()) { - int entryHeight = (int)(height*barSquares.second()/maxValue); - barSum += barSquares.second(); - g2d.setColor(barSquares.first()); - int start = this.height-y-entryHeight - totalBarHeight; - g2d.fillRect(currentX, start, width/numEntries, entryHeight); - g2d.setColor(Color.BLACK); - g2d.drawRect(currentX, start, width/numEntries, entryHeight); - totalBarHeight += entryHeight; + double total = bar.sum(); + int centerX = startX + (slotWidth * i )+ (slotWidth / 2); + int totalHeight = (int) (height * (total / axisMax)); + int barX = centerX - barWidth / 2; + int barBottom = startY + height; + + String totalText = formatValue(total); + graphics2D.setFont(valueFont); + int textWidth = graphics2D.getFontMetrics().stringWidth(totalText); + int pillWidth = textWidth + PILL_MARGIN; + int pillY = barBottom - totalHeight - PILL_BOTTOM_MARGIN; + + graphics2D.setColor(PILL); + graphics2D.fillRoundRect(centerX - pillWidth / 2, pillY, pillWidth, PILL_HEIGHT, 18, 18); + graphics2D.setColor(TEXT); + graphics2D.drawString(totalText, centerX - textWidth / 2, pillY + 29); + + int currentY = barBottom; + for (Pair element : bar.elements()) { + double value = element.second(); + int segmentHeight = (int) (height * (value / axisMax)); + if (segmentHeight <= 0) continue; + + currentY -=segmentHeight; + + graphics2D.setColor(element.first()); + graphics2D.fillRect(barX, currentY, barWidth, segmentHeight); + + graphics2D.setColor(BOARDER_COLOR); + graphics2D.drawRect(barX-1, currentY-1, barWidth+1, segmentHeight+1); } - centeredText(g2d, String.valueOf(Math.round(barSum*100)/100.0), currentX+(width/(2*numEntries)), this.height-y-totalBarHeight-10); - shift=!shift; - currentX += width/numEntries; + + graphics2D.setFont(labelFont); + graphics2D.setColor(TEXT_MUTED); + + String label = formatMonth(entry.first()); + int labelWidth = graphics2D.getFontMetrics().stringWidth(label); + graphics2D.drawString(label, centerX - labelWidth / 2, startY + height + 65); } } - - private void centeredText(Graphics2D g2d, String text, int x, int y) { - g2d.drawString(text, x-g2d.getFontMetrics().stringWidth(text)/2, y); + + private String formatValue(double value) { + if (value >= 1_000_000) { + return String.format("%.1fM", value / 1_000_000); + } + + if (value >= 1_000) { + return String.format("%.1fK", value / 1_000); + } + + if (value % 1 == 0) { + return String.format("%.0f", value); + } + + return String.format("%.2f", value); + } + + private String formatMonth(String month) { + String[] parts = month.split(" "); + + String monthName = parts[0]; + String year = parts[1]; + + String shortMonth = switch (monthName) { + case "JANUARY" -> "Jan"; + case "FEBRUARY" -> "Feb"; + case "MARCH" -> "Mar"; + case "APRIL" -> "Apr"; + case "MAY" -> "May"; + case "JUNE" -> "Jun"; + case "JULY" -> "Jul"; + case "AUGUST" -> "Aug"; + case "SEPTEMBER" -> "Sep"; + case "OCTOBER" -> "Oct"; + case "NOVEMBER" -> "Nov"; + case "DECEMBER" -> "Dec"; + default -> throw new IllegalArgumentException("Invalid month: " + monthName); + }; + + return shortMonth + " " + year.substring(2); } - + + private double niceMaximum(double value) { + double magnitude = Math.pow(10, Math.floor(Math.log10(value))); + double normalized = value / magnitude; + double nice; + + if (normalized <= 1) { + nice = 1; + } else if (normalized <= 2) { + nice = 2; + } else if (normalized <= 5) { + nice = 5; + } else { + nice = 10; + } + + return nice * magnitude; + } + /** * A single bar which should be plotted. * diff --git a/src/test/java/net/discordjug/javabot/util/PlotterTest.java b/src/test/java/net/discordjug/javabot/util/PlotterTest.java new file mode 100644 index 000000000..c7d6e4784 --- /dev/null +++ b/src/test/java/net/discordjug/javabot/util/PlotterTest.java @@ -0,0 +1,90 @@ +package net.discordjug.javabot.util; + +import org.junit.jupiter.api.Test; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.time.YearMonth; +import java.time.format.TextStyle; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Random; + +import static org.junit.jupiter.api.Assertions.assertTrue; + + +public class PlotterTest { + private static final Color[] PALETTE = { + new Color(0xF9C74F), new Color(0xF9506E), new Color(0x6C7280), + new Color(0x5B8CFF), new Color(0x43D9AD), new Color(0xC084FC), + new Color(0x22D3EE), new Color(0xFB923C) + }; + + @Test + public void ImageDifferenceTest(){ + List> testData = testData(); + BufferedImage img1 = new Plotter(testData, "General helper statistics","subtitle").plot(); + BufferedImage img2 = readImage("src/test/resources/PlotterTest.png"); + + assertTrue(compareImage(img1,img2)); + } + + public static BufferedImage readImage(String path){ + try { + File inputFile = new File(path); + BufferedImage image = ImageIO.read(inputFile); + if (image == null) { + throw new IOException("Image is null."); + } + return image; + } catch (IOException e) { + System.err.println("Error reading the image file: " + e.getMessage()); + return null; + } + } + + public static boolean compareImage(BufferedImage img1, BufferedImage img2) { + if (img1 == null || img2 == null) { + return false; + } + + if (img1.getWidth() != img2.getWidth() || + img1.getHeight() != img2.getHeight()) { + return false; + } + + for (int y = 0; y < img1.getHeight(); y++) { + for (int x = 0; x < img1.getWidth(); x++) { + if (img1.getRGB(x, y) != img2.getRGB(x, y)) { + return false; + } + } + } + return true; + } + + private static List> testData() { + Random random = new Random(42); + List> entries = new ArrayList<>(); + YearMonth month = YearMonth.of(2026,9); + + for (int i = 0; i < 13; i++) { + int segments = random.nextInt(3,5); + List> parts = new ArrayList<>(); + + for (int s = 0; s < segments; s++) { + double value = random.nextDouble(50,1800); + parts.add(new Pair<>(PALETTE[s % PALETTE.length], value)); + } + + String monthLabel = month.getMonth().getDisplayName(TextStyle.FULL, Locale.ENGLISH).toUpperCase(Locale.ROOT) + " " + month.getYear(); + entries.add(new Pair<>(monthLabel, new Plotter.Bar(parts))); + month = month.plusMonths(1); + } + return entries; + } +} diff --git a/src/test/resources/PlotterTest.png b/src/test/resources/PlotterTest.png new file mode 100644 index 0000000000000000000000000000000000000000..66eae255dd331afe1e1daff63ed3f981796bf500 GIT binary patch literal 87232 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 Date: Sat, 26 Sep 2026 20:47:18 +0530 Subject: [PATCH 2/2] fixed requested changes --- .../commands/HelpStatisticsSubcommand.java | 5 +- .../net/discordjug/javabot/util/Plotter.java | 298 ++++++++++-------- .../discordjug/javabot/util/PlotterTest.java | 227 +++++++++---- src/test/resources/PlotterTest.png | Bin 87232 -> 0 bytes .../PlotterTestImages/PlotterTest-Dark.png | Bin 0 -> 86836 bytes .../PlotterTest-LessData.png | Bin 0 -> 48478 bytes .../PlotterTestImages/PlotterTest-Light.png | Bin 0 -> 87269 bytes .../PlotterTestImages/PlotterTest-NoData.png | Bin 0 -> 22127 bytes 8 files changed, 332 insertions(+), 198 deletions(-) delete mode 100644 src/test/resources/PlotterTest.png create mode 100644 src/test/resources/PlotterTestImages/PlotterTest-Dark.png create mode 100644 src/test/resources/PlotterTestImages/PlotterTest-LessData.png create mode 100644 src/test/resources/PlotterTestImages/PlotterTest-Light.png create mode 100644 src/test/resources/PlotterTestImages/PlotterTest-NoData.png diff --git a/src/main/java/net/discordjug/javabot/systems/help/commands/HelpStatisticsSubcommand.java b/src/main/java/net/discordjug/javabot/systems/help/commands/HelpStatisticsSubcommand.java index 1eb1a0dee..a35f8294a 100644 --- a/src/main/java/net/discordjug/javabot/systems/help/commands/HelpStatisticsSubcommand.java +++ b/src/main/java/net/discordjug/javabot/systems/help/commands/HelpStatisticsSubcommand.java @@ -5,6 +5,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.time.LocalDate; +import java.time.format.TextStyle; import java.util.*; import java.util.Map.Entry; @@ -45,7 +46,7 @@ public class HelpStatisticsSubcommand extends SlashCommand.Subcommand { public HelpStatisticsSubcommand(HelpTransactionRepository transactionRepository) { this.transactionRepository = transactionRepository; setCommandData(new SubcommandData("stats", "Shows an general plot about help activity in this server") - .addOption(OptionType.BOOLEAN, "darkmode", "generate a plot in dark mode.", false) + .addOption(OptionType.BOOLEAN, "darkmode", "Generates the plot with a dark background.", false) ); } @@ -78,7 +79,7 @@ public void execute(SlashCommandInteractionEvent event) { correctMonth = false; } } - plotData.add(new Pair<>(position.getMonth() + " " + position.getYear(), new Plotter.Bar(entriesForThisMonth))); + plotData.add(new Pair<>(position.getMonth().getDisplayName(TextStyle.SHORT_STANDALONE, Locale.ROOT) + " '" + String.valueOf(position.getYear()).substring(2), new Plotter.Bar(entriesForThisMonth))); } BufferedImage plot = new Plotter(plotData, "Help Statistics","Monthly assistance provided to community members",darkMode).plot(); diff --git a/src/main/java/net/discordjug/javabot/util/Plotter.java b/src/main/java/net/discordjug/javabot/util/Plotter.java index 03b2321b1..79e064ac9 100644 --- a/src/main/java/net/discordjug/javabot/util/Plotter.java +++ b/src/main/java/net/discordjug/javabot/util/Plotter.java @@ -11,67 +11,93 @@ public class Plotter { private static final int WIDTH = 3000; private static final int HEIGHT = 1500; - private static final int GRID_LINES = 6; - private static final int PILL_MARGIN = 34; - private static final int PILL_HEIGHT = 42; - private static final int PILL_BOTTOM_MARGIN = 65; - private static final int LEFT_HEADING_MARGIN = (int) (WIDTH * 0.02); // 2% - private static final int LEFT_GRAPH_MARGIN = (int) (WIDTH * 0.05); // 5% - private static final int RIGHT_GRAPH_MARGIN = (int) (WIDTH * 0.02); // 2% - private static final int TOP_HEADING_MARGIN = (int) (HEIGHT * 0.06); // 6% - private static final int TOP_SUBHEADING_MARGIN = (int) (HEIGHT * 0.09); // 9% - private static final int TOP_GRAPH_MARGIN = (int) (HEIGHT * 0.15); // 15% - private static final int BOTTOM_GRAPH_MARGIN = (int) (HEIGHT * 0.09); // 9% - private static final int TITLE_SIZE = (int) (HEIGHT * 0.038); // 3.87% - private static final int SUBTITLE_SIZE = (int) (HEIGHT * 0.018); // 1.87% - private static final int AXIS_SIZE = (int) (HEIGHT * 0.016); // 1.6% - private static final int LABEL_SIZE = (int) (HEIGHT * 0.016); // 1.67% - private static final int VALUE_SIZE = (int) (HEIGHT * 0.016); // 1.6% - private static final int GRAPH_WIDTH = WIDTH - LEFT_GRAPH_MARGIN - RIGHT_GRAPH_MARGIN; - private static final int GRAPH_HEIGHT = HEIGHT - TOP_GRAPH_MARGIN - BOTTOM_GRAPH_MARGIN; - - private Color BOARDER_COLOR = Color.BLACK; - private Color BACKGROUND = Color.decode("#EAEDF5"); - private Color GRID = Color.decode("#B2B2B2"); - private Color GRID_STRONG = Color.decode("#606061"); - private Color TEXT = Color.decode("#2D2D2D"); - private Color TEXT_MUTED = Color.decode("#42474D"); - private Color TEXT_DIM = Color.decode("#59616D"); - private Color PILL = Color.decode("#D9D9D9"); - - private String title; - private String subtitle; + private static final int GRID_LINES = 5; + private static final int BAR_LABEL_MARGIN = 34; + private static final int BAR_LABEL_HEIGHT = 42; + private static final int BAR_LABEL_BOTTOM_MARGIN = 65; + private static final int TITLE_FONT_SIZE = 57; + private static final int SUBTITLE_FONT_SIZE = 27; + private static final int AXIS_FONT_SIZE = 24; + private static final int HEADING_MARGIN_LEFT = (int) (WIDTH * 0.02); // 2% + private static final int AXIS_LABEL_MARGIN_LEFT = (int) (WIDTH * 0.045); // 4.5% + private static final int GRAPH_MARGIN_LEFT = (int) (WIDTH * 0.05); // 5% + private static final int GRAPH_MARGIN_RIGHT = (int) (WIDTH * 0.02); // 2% + private static final int AXIS_LABEL_MARGIN_BOTTOM = (int) (HEIGHT * 0.043); // 4.3% + private static final int HEADING_MARGIN_TOP = (int) (HEIGHT * 0.06); // 6% + private static final int SUBHEADING_MARGIN_TOP = (int) (HEIGHT * 0.09); // 9% + private static final int GRAPH_MARGIN_TOP = (int) (HEIGHT * 0.15); // 15% + private static final int GRAPH_MARGIN_BOTTOM = (int) (HEIGHT * 0.09); // 9% + private static final int LABEL_SIZE = (int) (HEIGHT * 0.016); // 1.6% + private static final int VALUE_SIZE = (int) (HEIGHT * 0.016); // 1.6% + private static final int GRAPH_WIDTH = WIDTH - GRAPH_MARGIN_LEFT - GRAPH_MARGIN_RIGHT; + private static final int GRAPH_HEIGHT = HEIGHT - GRAPH_MARGIN_TOP - GRAPH_MARGIN_BOTTOM; + private static final int ARC_SIZE = 18; + private static final double BAR_WIDTH_RATIO = 0.42; + private static final int BAR_WIDTH_MAX = 110; + + private final Color borderColor; + private final Color backgroundColor; + private final Color gridLineColor; + private final Color gridLineColorStrong; + private final Color textColor; + private final Color textColorMuted; + private final Color textColorDim; + private final Color barLabelColor; + + private final String titleText; + private final String subtitleText; private final List> entries; /** * Creates the plotter. - * @param entries a list of all data points to plot, each represented as a {@link Pair} consisting of the name and value of the data point - * @param title the title of the plot - * @param subtitle the subtitle of plot + * + * @param entries a list of all data points to plot, each represented as a {@link Pair} consisting of the name and value of the data point + * @param titleText the title of the plot + * @param subtitleText the subtitle of plot */ - public Plotter(List> entries, String title, String subtitle) { + public Plotter(List> entries, String titleText, String subtitleText) { this.entries = entries; - this.title = title; - this.subtitle = subtitle; + this.titleText = titleText; + this.subtitleText = subtitleText; + borderColor = Color.BLACK; + backgroundColor = Color.decode("#EAEDF5"); + gridLineColor = Color.decode("#B2B2B2"); + gridLineColorStrong = Color.decode("#606061"); + textColor = Color.decode("#2D2D2D"); + textColorMuted = Color.decode("#42474D"); + textColorDim = Color.decode("#59616D"); + barLabelColor = Color.decode("#D9D9D9"); } /** * Creates the plotter. - * @param entries a list of all data points to plot, each represented as a {@link Pair} consisting of the name and value of the data point - * @param title the title of the plot - * @param subtitle the subtitle of plot - * @param darkMode the dark mode for plot + * + * @param entries a list of all data points to plot, each represented as a {@link Pair} consisting of the name and value of the data point + * @param titleText the title of the plot + * @param subtitleText the subtitle of plot + * @param darkMode {@code true} if the plot should be generated in dark mode, otherwise {@code false} */ - public Plotter(List> entries, String title, String subtitle,boolean darkMode) { + public Plotter(List> entries, String titleText, String subtitleText, boolean darkMode) { this.entries = entries; - this.title = title; - this.subtitle = subtitle; - if (darkMode){ - BACKGROUND = Color.decode("#111318"); - GRID = Color.decode("#252A32"); - GRID_STRONG = Color.decode("#303640"); - TEXT = Color.decode("#F5F7FA"); - PILL = Color.decode("#171C23"); + this.titleText = titleText; + this.subtitleText = subtitleText; + borderColor = Color.BLACK; + if (darkMode) { + backgroundColor = Color.decode("#111318"); + gridLineColor = Color.decode("#252A32"); + gridLineColorStrong = Color.decode("#303640"); + textColor = Color.decode("#F5F7FA"); + barLabelColor = Color.decode("#333333"); + textColorMuted = Color.decode("#C9C9C9"); + textColorDim = Color.decode("#E3E3E3"); + } else { + backgroundColor = Color.decode("#EAEDF5"); + gridLineColor = Color.decode("#B2B2B2"); + gridLineColorStrong = Color.decode("#606061"); + textColor = Color.decode("#2D2D2D"); + barLabelColor = Color.decode("#D9D9D9"); + textColorMuted = Color.decode("#42474D"); + textColorDim = Color.decode("#59616D"); } } @@ -83,118 +109,136 @@ public BufferedImage plot() { BufferedImage img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); Graphics2D graphics2D = img.createGraphics(); - setBackground(graphics2D); + fillBackground(graphics2D); - drawHeading(graphics2D,LEFT_HEADING_MARGIN,TOP_HEADING_MARGIN,TOP_SUBHEADING_MARGIN); - drawGraph(graphics2D,LEFT_GRAPH_MARGIN,TOP_GRAPH_MARGIN,GRAPH_WIDTH,GRAPH_HEIGHT); + drawHeadings(graphics2D); + drawGraph(graphics2D); return img; } - private void drawHeading(Graphics2D graphics2D,int startX, int titleY, int subtitleY){ - Font titleFont = ImageGenerationUtils.getResourceFont("assets/fonts/Uni-Sans-Heavy.ttf", TITLE_SIZE).orElseThrow(); - Font subtitleFont = ImageGenerationUtils.getResourceFont("assets/fonts/Uni-Sans-Heavy.ttf", SUBTITLE_SIZE).orElseThrow(); + private void drawHeadings(Graphics2D graphics2D) { + Font titleFont = ImageGenerationUtils.getResourceFont("assets/fonts/Uni-Sans-Heavy.ttf", TITLE_FONT_SIZE).orElseThrow(); + Font subtitleFont = ImageGenerationUtils.getResourceFont("assets/fonts/Uni-Sans-Heavy.ttf", SUBTITLE_FONT_SIZE).orElseThrow(); - graphics2D.setColor(TEXT); + graphics2D.setColor(textColor); graphics2D.setFont(titleFont); - graphics2D.drawString(title,startX,titleY); + graphics2D.drawString(titleText, HEADING_MARGIN_LEFT, HEADING_MARGIN_TOP); - graphics2D.setColor(TEXT_MUTED); + graphics2D.setColor(textColorMuted); graphics2D.setFont(subtitleFont); - graphics2D.drawString(subtitle,startX,subtitleY); + graphics2D.drawString(subtitleText, HEADING_MARGIN_LEFT, SUBHEADING_MARGIN_TOP); } - private void setBackground(Graphics2D graphics2D){ - graphics2D.setColor(BACKGROUND); + private void fillBackground(Graphics2D graphics2D) { + graphics2D.setColor(backgroundColor); graphics2D.fillRect(-1, -1, WIDTH, HEIGHT); } - private void drawGraph(Graphics2D graphics2D, int startX, int startY, int width,int height){ - double maxValue = entries.stream() - .map(Pair::second) - .mapToDouble(Bar::sum) - .max().orElse(0); + private void drawGraph(Graphics2D graphics2D) { + double maxValue = entries.stream().map(Pair::second).mapToDouble(Bar::sum).max().orElse(0); - if(maxValue == 0) return; + if (maxValue == 0) { + return; + } double axisMax = niceMaximum(maxValue); - drawLines(graphics2D,startX,startY,width,height,axisMax); - drawBars(graphics2D,startX,startY,width,height,axisMax); + drawGridLines(graphics2D, axisMax); + drawBars(graphics2D, axisMax); } - private void drawLines(Graphics2D graphics2D,int startX ,int startY,int width ,int height, double axisMax){ - Font axisFont = ImageGenerationUtils.getResourceFont("assets/fonts/Uni-Sans-Heavy.ttf", AXIS_SIZE).orElseThrow(); - graphics2D.setStroke(new BasicStroke(2, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); // Use a 2px stroke because a line is between pixels. + private void drawGridLines(Graphics2D graphics2D, double axisMax) { + Font axisFont = ImageGenerationUtils.getResourceFont("assets/fonts/Uni-Sans-Heavy.ttf", AXIS_FONT_SIZE).orElseThrow(); + graphics2D.setStroke(new BasicStroke(2, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); // Use a 2px stroke because a line is between pixels. graphics2D.setFont(axisFont); for (int i = 0; i <= GRID_LINES; i++) { double fraction = (double) i / GRID_LINES; - int gridY = startY + height - (int) (height * fraction); + int gridY = GRAPH_MARGIN_TOP + GRAPH_HEIGHT - (int) (GRAPH_HEIGHT * fraction); - graphics2D.setColor(i == 0 ? GRID_STRONG : GRID); - graphics2D.drawLine(startX, gridY+1, startX + width, gridY+1); // Move 1px down so the 2px stroke aligns with the grid position. + graphics2D.setColor(i == 0 ? gridLineColorStrong : gridLineColor); + graphics2D.drawLine(GRAPH_MARGIN_LEFT, gridY + 1, GRAPH_MARGIN_LEFT + GRAPH_WIDTH, gridY + 1); // Move 1px down so the 2px stroke aligns with the grid position. double value = axisMax * fraction; String label = formatValue(value); - graphics2D.setColor(TEXT_DIM); - graphics2D.drawString(label, startX - 25 - graphics2D.getFontMetrics().stringWidth(label), gridY + 8); + graphics2D.setColor(textColorDim); + graphics2D.drawString(label, AXIS_LABEL_MARGIN_LEFT - (graphics2D.getFontMetrics().stringWidth(label)), gridY + (graphics2D.getFontMetrics().getAscent() + graphics2D.getFontMetrics().getDescent()) / 2); } } - private void drawBars(Graphics2D graphics2D,int startX ,int startY,int width ,int height, double axisMax){ + private void drawBars(Graphics2D graphics2D, double axisMax) { int count = entries.size(); - int slotWidth = width / count; - int barWidth = Math.min(110, (int) (slotWidth * 0.42)); - + int slotWidth = GRAPH_WIDTH / count; Font labelFont = ImageGenerationUtils.getResourceFont("assets/fonts/Uni-Sans-Heavy.ttf", LABEL_SIZE).orElseThrow(); - Font valueFont = ImageGenerationUtils.getResourceFont("assets/fonts/Uni-Sans-Heavy.ttf", VALUE_SIZE).orElseThrow(); for (int i = 0; i < count; i++) { Pair entry = entries.get(i); Bar bar = entry.second(); - double total = bar.sum(); - int centerX = startX + (slotWidth * i )+ (slotWidth / 2); - int totalHeight = (int) (height * (total / axisMax)); + + int centerX = GRAPH_MARGIN_LEFT + (slotWidth * i) + (slotWidth / 2); + int barWidth = Math.min(BAR_WIDTH_MAX, (int) (slotWidth * BAR_WIDTH_RATIO)); int barX = centerX - barWidth / 2; - int barBottom = startY + height; - String totalText = formatValue(total); - graphics2D.setFont(valueFont); - int textWidth = graphics2D.getFontMetrics().stringWidth(totalText); - int pillWidth = textWidth + PILL_MARGIN; - int pillY = barBottom - totalHeight - PILL_BOTTOM_MARGIN; + drawBarLabel(graphics2D, axisMax, centerX, bar); + drawSegmentedBars(graphics2D, bar, barX, barWidth, axisMax); + + graphics2D.setFont(labelFont); + graphics2D.setColor(textColorMuted); + + String label = entry.first(); + drawStringCentered(graphics2D, label, centerX, GRAPH_MARGIN_TOP + GRAPH_HEIGHT + AXIS_LABEL_MARGIN_BOTTOM); + } + } - graphics2D.setColor(PILL); - graphics2D.fillRoundRect(centerX - pillWidth / 2, pillY, pillWidth, PILL_HEIGHT, 18, 18); - graphics2D.setColor(TEXT); - graphics2D.drawString(totalText, centerX - textWidth / 2, pillY + 29); + private void drawBarLabel(Graphics2D graphics2D, double axisMax, int centerX, Bar bar) { + int barBottom = GRAPH_MARGIN_TOP + GRAPH_HEIGHT; + double barTotal = bar.sum(); + int totalBarHeight = (int) (GRAPH_HEIGHT * (barTotal / axisMax)); + int barLabelY = barBottom - totalBarHeight - BAR_LABEL_BOTTOM_MARGIN; - int currentY = barBottom; - for (Pair element : bar.elements()) { - double value = element.second(); - int segmentHeight = (int) (height * (value / axisMax)); - if (segmentHeight <= 0) continue; + Font valueFont = ImageGenerationUtils.getResourceFont("assets/fonts/Uni-Sans-Heavy.ttf", VALUE_SIZE).orElseThrow(); + graphics2D.setFont(valueFont); - currentY -=segmentHeight; + String totalText = formatValue(barTotal); + int textWidth = graphics2D.getFontMetrics().stringWidth(totalText); + int barLabelWidth = textWidth + BAR_LABEL_MARGIN; + graphics2D.setColor(barLabelColor); + graphics2D.fillRoundRect(centerX - barLabelWidth / 2, barLabelY, barLabelWidth, BAR_LABEL_HEIGHT, ARC_SIZE, ARC_SIZE); + graphics2D.setColor(textColor); + drawStringCentered(graphics2D,totalText,centerX, barLabelY + 29); + } + + private void drawSegmentedBars(Graphics2D graphics2D, Bar bar,int barX, int barWidth, double axisMax) { + int barBottom = GRAPH_MARGIN_TOP + GRAPH_HEIGHT; + int barSum = 0; + int incrementalBarHeight = 0; + + for (Pair element : bar.elements()) { + double value = element.second(); + barSum += value; + int expectedBarHeight = (int) (GRAPH_HEIGHT * (barSum / axisMax)); + int segmentHeight = expectedBarHeight - incrementalBarHeight; + incrementalBarHeight += segmentHeight; + int currentY = barBottom - incrementalBarHeight; + + if (segmentHeight > 0) { graphics2D.setColor(element.first()); graphics2D.fillRect(barX, currentY, barWidth, segmentHeight); - graphics2D.setColor(BOARDER_COLOR); - graphics2D.drawRect(barX-1, currentY-1, barWidth+1, segmentHeight+1); + graphics2D.setColor(borderColor); + graphics2D.drawRect(barX - 1, currentY - 1, barWidth + 1, segmentHeight + 1); } - - graphics2D.setFont(labelFont); - graphics2D.setColor(TEXT_MUTED); - - String label = formatMonth(entry.first()); - int labelWidth = graphics2D.getFontMetrics().stringWidth(label); - graphics2D.drawString(label, centerX - labelWidth / 2, startY + height + 65); } } + private void drawStringCentered(Graphics2D graphics2D,String text,int x, int y){ + int textWidth = graphics2D.getFontMetrics().stringWidth(text); + graphics2D.drawString(text,x- textWidth / 2, y); + } + private String formatValue(double value) { if (value >= 1_000_000) { return String.format("%.1fM", value / 1_000_000); @@ -211,31 +255,6 @@ private String formatValue(double value) { return String.format("%.2f", value); } - private String formatMonth(String month) { - String[] parts = month.split(" "); - - String monthName = parts[0]; - String year = parts[1]; - - String shortMonth = switch (monthName) { - case "JANUARY" -> "Jan"; - case "FEBRUARY" -> "Feb"; - case "MARCH" -> "Mar"; - case "APRIL" -> "Apr"; - case "MAY" -> "May"; - case "JUNE" -> "Jun"; - case "JULY" -> "Jul"; - case "AUGUST" -> "Aug"; - case "SEPTEMBER" -> "Sep"; - case "OCTOBER" -> "Oct"; - case "NOVEMBER" -> "Nov"; - case "DECEMBER" -> "Dec"; - default -> throw new IllegalArgumentException("Invalid month: " + monthName); - }; - - return shortMonth + " " + year.substring(2); - } - private double niceMaximum(double value) { double magnitude = Math.pow(10, Math.floor(Math.log10(value))); double normalized = value / magnitude; @@ -243,8 +262,8 @@ private double niceMaximum(double value) { if (normalized <= 1) { nice = 1; - } else if (normalized <= 2) { - nice = 2; + } else if (normalized <= 2.5) { + nice = 2.5; } else if (normalized <= 5) { nice = 5; } else { @@ -256,14 +275,13 @@ private double niceMaximum(double value) { /** * A single bar which should be plotted. - * * @param elements any number of the entries to plot */ - public record Bar(List> elements) { + public record Bar(List> elements) { public Bar(double singleElement) { this(List.of(new Pair<>(Color.GRAY, singleElement))); } - + private double sum() { return elements.stream().mapToDouble(Pair::second).sum(); } diff --git a/src/test/java/net/discordjug/javabot/util/PlotterTest.java b/src/test/java/net/discordjug/javabot/util/PlotterTest.java index c7d6e4784..3a692a9ce 100644 --- a/src/test/java/net/discordjug/javabot/util/PlotterTest.java +++ b/src/test/java/net/discordjug/javabot/util/PlotterTest.java @@ -5,86 +5,201 @@ import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; -import java.io.File; +import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.time.YearMonth; -import java.time.format.TextStyle; -import java.util.ArrayList; +import java.net.URL; +import java.util.*; import java.util.List; -import java.util.Locale; -import java.util.Random; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; public class PlotterTest { - private static final Color[] PALETTE = { - new Color(0xF9C74F), new Color(0xF9506E), new Color(0x6C7280), - new Color(0x5B8CFF), new Color(0x43D9AD), new Color(0xC084FC), - new Color(0x22D3EE), new Color(0xFB923C) - }; + @Test + public void ImageDifferenceTest() throws IOException{ + List> testData = testData0(); + BufferedImage generatedImage = new Plotter(testData, "General helper statistics","subtitle").plot(); + BufferedImage expectedImage = readImage("PlotterTestImages/PlotterTest-Light.png"); + + assertTrue(assertImagesAreEqual(generatedImage,expectedImage)); + } @Test - public void ImageDifferenceTest(){ - List> testData = testData(); - BufferedImage img1 = new Plotter(testData, "General helper statistics","subtitle").plot(); - BufferedImage img2 = readImage("src/test/resources/PlotterTest.png"); + public void ImageDifferenceTestDarkMode() throws IOException{ + List> testData = testData0(); + BufferedImage generatedImage = new Plotter(testData, "General helper statistics","subtitle",true).plot(); + BufferedImage expectedImage = readImage("PlotterTestImages/PlotterTest-Dark.png"); - assertTrue(compareImage(img1,img2)); + assertTrue(assertImagesAreEqual(generatedImage,expectedImage)); } - public static BufferedImage readImage(String path){ - try { - File inputFile = new File(path); - BufferedImage image = ImageIO.read(inputFile); - if (image == null) { - throw new IOException("Image is null."); - } - return image; - } catch (IOException e) { - System.err.println("Error reading the image file: " + e.getMessage()); - return null; - } + @Test + public void ImageDifferenceTestLessData() throws IOException{ + List> testData = testData1(); + BufferedImage generatedImage = new Plotter(testData, "General helper statistics","subtitle").plot(); + BufferedImage expectedImage = readImage("PlotterTestImages/PlotterTest-LessData.png"); + + assertTrue(assertImagesAreEqual(generatedImage,expectedImage)); } - public static boolean compareImage(BufferedImage img1, BufferedImage img2) { - if (img1 == null || img2 == null) { - return false; - } + @Test + public void ImageDifferenceTestNoData() throws IOException{ + List> testData = testData2(); + BufferedImage generatedImage = new Plotter(testData, "General helper statistics","subtitle").plot(); + BufferedImage expectedImage = readImage("PlotterTestImages/PlotterTest-NoData.png"); - if (img1.getWidth() != img2.getWidth() || - img1.getHeight() != img2.getHeight()) { - return false; - } + assertTrue(assertImagesAreEqual(generatedImage,expectedImage)); + } + + private BufferedImage readImage(String fileName) throws IOException{ + URL resource = getClass().getClassLoader().getResource(fileName); + BufferedImage image = ImageIO.read(resource); + return image; + } + + public static boolean assertImagesAreEqual(BufferedImage actualImage, BufferedImage expectedImage) throws IOException { + assertNotNull(actualImage, "Generated Image is Null."); + assertNotNull(expectedImage, "Expected Image is Null."); + + String actualImageBase64 = convertToBase64(actualImage); - for (int y = 0; y < img1.getHeight(); y++) { - for (int x = 0; x < img1.getWidth(); x++) { - if (img1.getRGB(x, y) != img2.getRGB(x, y)) { - return false; - } + assertEquals(expectedImage.getWidth(), actualImage.getWidth(), "Image width does not match.\nActual image:"+actualImageBase64); + assertEquals(expectedImage.getHeight(), actualImage.getHeight(), "Image height does not match.\nActual image:"+actualImageBase64); + + for (int y = 0; y < actualImage.getHeight(); y++) { + for (int x = 0; x < actualImage.getWidth(); x++) { + assertEquals(actualImage.getRGB(x, y),expectedImage.getRGB(x, y),() -> "Image does not match.\nActual image:"+actualImageBase64); } } return true; } - private static List> testData() { - Random random = new Random(42); - List> entries = new ArrayList<>(); - YearMonth month = YearMonth.of(2026,9); + private static String convertToBase64(BufferedImage image) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ImageIO.write(image, "png", out); + return Base64.getEncoder().encodeToString(out.toByteArray()); + } - for (int i = 0; i < 13; i++) { - int segments = random.nextInt(3,5); - List> parts = new ArrayList<>(); + private static List> testData0() { + Color yellow = new Color(249,199,79); + Color red = new Color(249,80,110); + Color grey = new Color(108,114,128); + Color blue = new Color(91,140,255); - for (int s = 0; s < segments; s++) { - double value = random.nextDouble(50,1800); - parts.add(new Pair<>(PALETTE[s % PALETTE.length], value)); - } + List> entries = Arrays.asList( + new Pair<>("SEP '26", new Plotter.Bar(Arrays.asList( + new Pair<>(yellow, 145.6), + new Pair<>(red, 133.8), + new Pair<>(grey, 1698.6), + new Pair<>(blue, 1288.5) + ))), + new Pair<>("OCT '26", new Plotter.Bar(Arrays.asList( + new Pair<>(yellow, 1630.9), + new Pair<>(red, 695.3), + new Pair<>(grey, 532.5) + ))), + new Pair<>("NOV '26", new Plotter.Bar(Arrays.asList( + new Pair<>(yellow, 1383.6), + new Pair<>(red, 1796.8), + new Pair<>(grey, 315.9), + new Pair<>(blue, 819.6) + ))), + new Pair<>("DEC '2026", new Plotter.Bar(Arrays.asList( + new Pair<>(yellow, 726.5), + new Pair<>(red, 360.4), + new Pair<>(grey, 1090.1) + ))), + new Pair<>("JAN '27", new Plotter.Bar(Arrays.asList( + new Pair<>(yellow, 488.6), + new Pair<>(red, 689.0), + new Pair<>(grey, 327.6), + new Pair<>(blue, 529.8) + ))), + new Pair<>("FEB '27", new Plotter.Bar(Arrays.asList( + new Pair<>(yellow, 1049.3), + new Pair<>(red, 1065.0), + new Pair<>(grey, 1366.8) + ))), + new Pair<>("MAR '27", new Plotter.Bar(Arrays.asList( + new Pair<>(yellow, 603.9), + new Pair<>(red, 398.4), + new Pair<>(grey, 69.3), + new Pair<>(blue, 1396.6) + ))), + new Pair<>("APR '27", new Plotter.Bar(Arrays.asList( + new Pair<>(yellow, 1298.4), + new Pair<>(red, 891.0), + new Pair<>(grey, 560.4) + ))), + new Pair<>("MAY '27", new Plotter.Bar(Arrays.asList( + new Pair<>(yellow, 1092.8), + new Pair<>(red, 380.3), + new Pair<>(grey, 712.2) + ))), + new Pair<>("JUN '27", new Plotter.Bar(Arrays.asList( + new Pair<>(yellow, 680.4), + new Pair<>(red, 810.6), + new Pair<>(grey, 850.3), + new Pair<>(blue, 877.2) + ))), + new Pair<>("JUL '27", new Plotter.Bar(Arrays.asList( + new Pair<>(yellow, 1010.6), + new Pair<>(red, 115.4), + new Pair<>(grey, 142.0), + new Pair<>(blue, 1430.0) + ))), + new Pair<>("AUG '27", new Plotter.Bar(Arrays.asList( + new Pair<>(yellow, 541.0), + new Pair<>(red, 392.9), + new Pair<>(grey, 363.7), + new Pair<>(blue, 1564.9) + ))), + new Pair<>("SEP '27", new Plotter.Bar(Arrays.asList( + new Pair<>(yellow, 1009.2), + new Pair<>(red, 64.2), + new Pair<>(grey, 1375.8), + new Pair<>(blue, 1154.3) + ))) + ); + return entries; + } - String monthLabel = month.getMonth().getDisplayName(TextStyle.FULL, Locale.ENGLISH).toUpperCase(Locale.ROOT) + " " + month.getYear(); - entries.add(new Pair<>(monthLabel, new Plotter.Bar(parts))); - month = month.plusMonths(1); - } + private static List> testData1() { + Color yellow = new Color(249,199,79); + Color red = new Color(249,80,110); + Color grey = new Color(108,114,128); + Color blue = new Color(91,140,255); + + List> entries = Arrays.asList( + new Pair<>("SEP '26", new Plotter.Bar(Arrays.asList( + new Pair<>(yellow, 145.6), + new Pair<>(red, 133.8), + new Pair<>(grey, 1698.6), + new Pair<>(blue, 1288.5) + ))), + new Pair<>("OCT '26", new Plotter.Bar(Arrays.asList( + new Pair<>(yellow, 1630.9), + new Pair<>(red, 695.3), + new Pair<>(grey, 532.5) + ))), + new Pair<>("NOV '26", new Plotter.Bar(Arrays.asList( + new Pair<>(yellow, 1383.6), + new Pair<>(red, 1796.8), + new Pair<>(grey, 315.9), + new Pair<>(blue, 819.6) + ))), + new Pair<>("DEC '2026", new Plotter.Bar(Arrays.asList( + new Pair<>(yellow, 726.5), + new Pair<>(red, 360.4), + new Pair<>(grey, 1090.1) + ))) + ); return entries; } + + private static List> testData2() { + return new ArrayList>(); + } } diff --git a/src/test/resources/PlotterTest.png b/src/test/resources/PlotterTest.png deleted file mode 100644 index 66eae255dd331afe1e1daff63ed3f981796bf500..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87232 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