| | |
| | | assertFalse(java.util.Arrays.equals(twoDecimals, threeDecimals)); |
| | | } |
| | | |
| | | @Test |
| | | void rendersLineChartWithConfiguredDayLabels() { |
| | | HolidayTrendChartService service = new HolidayTrendChartService(); |
| | | HolidayTrendChartService.ChartSeries congestion = new HolidayTrendChartService.ChartSeries(); |
| | | congestion.setName("\u5e73\u5747\u62e5\u6324\u5ea6"); |
| | | congestion.setValues(java.util.Arrays.asList( |
| | | new BigDecimal("0.50"), new BigDecimal("0.48"), new BigDecimal("0.47"), |
| | | new BigDecimal("0.49"), new BigDecimal("0.49"), new BigDecimal("0.49"), |
| | | new BigDecimal("0.47"))); |
| | | java.util.List<String> sevenDays = java.util.Arrays.asList( |
| | | "10\u67081\u65e5", "10\u67082\u65e5", "10\u67083\u65e5", "10\u67084\u65e5", |
| | | "10\u67085\u65e5", "10\u67086\u65e5", "10\u67087\u65e5"); |
| | | |
| | | byte[] custom = service.lineChart("\u62e5\u6324\u5ea6", |
| | | java.util.Collections.singletonList(congestion), false, 2, sevenDays, 1100, 590); |
| | | byte[] defaults = service.lineChart("\u62e5\u6324\u5ea6", |
| | | java.util.Collections.singletonList(congestion), false, 2, 1100, 590); |
| | | |
| | | assertPng(custom); |
| | | assertPng(defaults); |
| | | assertFalse(java.util.Arrays.equals(custom, defaults), |
| | | "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; |