| | |
| | | "custom day labels should change the rendered axis"); |
| | | } |
| | | |
| | | @Test |
| | | void pinsRequestedLineLabelToFixedAnchor() throws Exception { |
| | | HolidayTrendChartService service = new HolidayTrendChartService(); |
| | | HolidayTrendChartService.ChartSeries series = new HolidayTrendChartService.ChartSeries(); |
| | | series.setName("2026\u5e74"); |
| | | series.setValues(java.util.Collections.singletonList(new BigDecimal("72.4"))); |
| | | java.util.List<HolidayTrendChartService.ChartSeries> single = |
| | | java.util.Collections.singletonList(series); |
| | | |
| | | byte[] plain = service.lineChart("\u4e07\u4eba\u6b21", single, false, 2, 1100, 590); |
| | | byte[] emptyOverrides = service.lineChart("\u4e07\u4eba\u6b21", single, false, 2, |
| | | HolidayTrendChartService.DAY_LABELS, 1100, 590, |
| | | java.util.Collections.emptyList()); |
| | | assertArrayEquals(plain, emptyOverrides, |
| | | "an empty override list must keep the automatic placement"); |
| | | |
| | | byte[] unmatched = service.lineChart("\u4e07\u4eba\u6b21", single, false, 2, |
| | | HolidayTrendChartService.DAY_LABELS, 1100, 590, |
| | | java.util.Collections.singletonList(new HolidayTrendChartService.LineLabelOverride( |
| | | 0, 7, HolidayTrendChartService.LineLabelAnchor.ABOVE))); |
| | | assertArrayEquals(plain, unmatched, |
| | | "an override for a label that does not exist must not change rendering"); |
| | | |
| | | byte[] above = service.lineChart("\u4e07\u4eba\u6b21", single, false, 2, |
| | | HolidayTrendChartService.DAY_LABELS, 1100, 590, |
| | | java.util.Collections.singletonList(new HolidayTrendChartService.LineLabelOverride( |
| | | 0, 0, HolidayTrendChartService.LineLabelAnchor.ABOVE))); |
| | | byte[] below = service.lineChart("\u4e07\u4eba\u6b21", single, false, 2, |
| | | HolidayTrendChartService.DAY_LABELS, 1100, 590, |
| | | java.util.Collections.singletonList(new HolidayTrendChartService.LineLabelOverride( |
| | | 0, 0, HolidayTrendChartService.LineLabelAnchor.BELOW))); |
| | | |
| | | assertPng(above); |
| | | assertPng(below); |
| | | assertFalse(java.util.Arrays.equals(above, below), |
| | | "ABOVE and BELOW anchors must render differently"); |
| | | assertTrue(meanSeriesColorY(above) < meanSeriesColorY(below), |
| | | "the ABOVE anchor must place the label higher than the BELOW anchor"); |
| | | } |
| | | |
| | | private double meanSeriesColorY(byte[] data) throws Exception { |
| | | BufferedImage image = ImageIO.read(new ByteArrayInputStream(data)); |
| | | assertNotNull(image); |
| | | int target = 0xC0504D; |
| | | long count = 0; |
| | | long sum = 0; |
| | | for (int y = 0; y < image.getHeight() - 60; y++) { |
| | | for (int x = 0; x < image.getWidth(); x++) { |
| | | if ((image.getRGB(x, y) & 0xFFFFFF) == target) { |
| | | count++; |
| | | sum += y; |
| | | } |
| | | } |
| | | } |
| | | assertTrue(count > 0, "expected series-coloured pixels for the item label"); |
| | | return (double) sum / count; |
| | | } |
| | | |
| | | private void assertNoLargeLightGrayBackground(byte[] data) throws Exception { |
| | | BufferedImage image = ImageIO.read(new ByteArrayInputStream(data)); |
| | | int matches = 0; |