package com.trafficaudit.holiday.service;
|
|
import org.junit.jupiter.api.Test;
|
|
import javax.imageio.ImageIO;
|
import java.awt.image.BufferedImage;
|
import java.io.ByteArrayInputStream;
|
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
|
class HolidayTrendChartServiceTest {
|
|
@Test
|
void rendersLinePieAndStackedChartsAsPng() throws Exception {
|
HolidayTrendChartService service = new HolidayTrendChartService();
|
HolidayTrendChartService.ChartSeries first = new HolidayTrendChartService.ChartSeries();
|
first.setName("2026年");
|
first.setValues(java.util.Arrays.asList(
|
java.math.BigDecimal.ONE, java.math.BigDecimal.TEN, null));
|
HolidayTrendChartService.ChartSeries second = new HolidayTrendChartService.ChartSeries();
|
second.setName("2025年");
|
second.setValues(java.util.Arrays.asList(
|
java.math.BigDecimal.valueOf(2), java.math.BigDecimal.valueOf(8),
|
java.math.BigDecimal.valueOf(4)));
|
|
byte[] line = service.lineChart("万人次", java.util.Arrays.asList(first, second), false);
|
assertPng(line);
|
assertNoLargeLightGrayBackground(line);
|
|
HolidayTrendChartService.ChartCategory category = new HolidayTrendChartService.ChartCategory();
|
category.setName("铁路");
|
category.setValue(java.math.BigDecimal.TEN);
|
byte[] pie = service.pieChart("人次", java.util.Collections.singletonList(category), 400, 300);
|
assertPng(pie);
|
|
byte[] stacked = service.stackedBarChart("占比", java.util.Arrays.asList("10月1日", "10月2日"),
|
java.util.Arrays.asList(first, second), true, 500, 320);
|
assertPng(stacked);
|
assertNoLargeLightGrayBackground(stacked);
|
}
|
|
@Test
|
void rendersHigherPrecisionLineLabelsWhenRequested() {
|
HolidayTrendChartService service = new HolidayTrendChartService();
|
HolidayTrendChartService.ChartSeries congestion = new HolidayTrendChartService.ChartSeries();
|
congestion.setName("平均拥挤度");
|
congestion.setValues(java.util.Arrays.asList(
|
new java.math.BigDecimal("0.467029"),
|
new java.math.BigDecimal("0.490890"),
|
new java.math.BigDecimal("0.492414")));
|
|
byte[] twoDecimals = service.lineChart("拥挤度",
|
java.util.Collections.singletonList(congestion), false, 2, 1100, 590);
|
byte[] threeDecimals = service.lineChart("拥挤度",
|
java.util.Collections.singletonList(congestion), false, 3, 1100, 590);
|
|
assertPng(twoDecimals);
|
assertPng(threeDecimals);
|
assertFalse(java.util.Arrays.equals(twoDecimals, threeDecimals));
|
}
|
|
private void assertNoLargeLightGrayBackground(byte[] data) throws Exception {
|
BufferedImage image = ImageIO.read(new ByteArrayInputStream(data));
|
int matches = 0;
|
for (int y = 0; y < image.getHeight(); y++) {
|
for (int x = 0; x < image.getWidth(); x++) {
|
int rgb = image.getRGB(x, y) & 0xFFFFFF;
|
if (rgb == 0xF3F4F3) matches++;
|
}
|
}
|
assertTrue(matches < image.getWidth() * image.getHeight() / 20,
|
"chart still contains a large light-gray background area");
|
}
|
|
private void assertPng(byte[] data) {
|
assertNotNull(data);
|
assertTrue(data.length > 100);
|
assertTrue(data[0] == (byte) 0x89 && data[1] == 0x50
|
&& data[2] == 0x4e && data[3] == 0x47);
|
}
|
}
|